Берт что это такое

Берт что это такое

Смотреть что такое «Берт» в других словарях:

Берт — Род: муж. Иноязычные аналоги: англ. Bert Связанные статьи: начинающиеся с «Берт» все статьи с «Берт» … Википедия

Берті — Sp Bèrtis Ap Берті/Berti L k. P Ukrainoje (Karpatuose) … Pasaulio vietovardžiai. Internetinė duomenų bazė

БЕРТ — (Burt) Сирил Лодовик (3.3.1883, Стратфорд он Эйвон, 10.10.1971, Лондон), англ, психолог. Окончил Оксфордский ун т (1908). Преподавал в Ливерпульском (1909 13) и Кембриджском (1912 1913) ун тах. Чл. Муниципального совета Лондона по отделу… … Российская педагогическая энциклопедия

Берт — Bert сокр. от Касберт. См. Касберт Олгуд … Тёмная башня Стивена Кинга. Толковый словарь к книге.

Берт Ригби — Берт Ригби, ты дурак Берт Ригби, ты дурак Bert Rigby, You re A Fool Жанр комедия Режиссёр Карл Райнер Продюсер Дурак … Википедия

Берт Лар — Bert Lahr Студийная фотографи … Википедия

Берт Ригби, ты — дурак Bert Rigby, You re A Fool Жанр комедия Режиссёр Карл Райнер … Википедия

Берт Ригби, ты — дурак (фильм) — Берт Ригби, ты дурак Bert Rigby, You re A Fool Жанр комедия Режиссёр Карл Райнер Автор сценария Карл Райнер В главных ролях Роберт Линдси, Роберт Колтрэйн Дли … Википедия

Берт Ригби, ты — дурак — Bert Rigby, You re A Fool Жанр комедия Режиссёр Карл Райнер Автор сценария Карл Райнер В главных ролях Роберт Линдси, Роберт Колтрэйн Дли … Википедия

Берт Ланкастер — Burt Lancaster В фильме «Убийцы» (1946) Имя при рождении: Burton Stephen Lancaster Дата рождения: 2 ноября 1913 … Википедия

Источник

Ваш первый BERT: иллюстрированное руководство

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

Прогресс в области машинного обучения для обработки естественного языка существенно ускорился за последние несколько лет. Модели покинули исследовательские лаборатории и стали основой ведущих цифровых продуктов. Хорошей иллюстрацией этому служит недавнее заявление о том, что основным компонентом, стоящим за поиском Google, стала модель BERT. Google верит, что этот шаг (т.е. внедрение передовой модели понимания естественного языка в поисковую систему) представляет собой «величайший прорыв за последние пять лет и один из знаменательнейших во всей истории поисковых систем».

Данная статья – это простое руководство по использованию одной из версий BERT’а для классификации предложений. Пример, рассмотренный нами, одновременно и достаточно простой для первого знакомства с моделью, и достаточно продвинутый для того, чтобы продемонстрировать ключевые концепты.

Помимо этой статьи был подготовлен ноутбук, который можно посмотреть в репозитории или запустить в Colab.

Данные: SST2

В нашем примере мы будем использовать набор данных SST2, содержащий предложения из отзывов о фильмах, каждое из которых имеет либо положительную метку (значение 1), либо отрицательную (значение 0):

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

Модели: классификация тональности предложений

Наша цель – создать модель, которая берет одно предложение (вроде тех, что в нашем наборе данных) и выдает или 1 (что будет указывать на положительную тональность предложения), или 0 (отрицательная тональность). Мы можем схематично изобразить это так:

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

Под капотом же модель будет содержать целых две модели:

Данные, которые мы передаем между двумя моделями, представляют собой вектор размерности 768. Можно считать этот вектор эмбеддингом предложения, который мы используем для классификации.

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

Для тех, кто читал предыдущую статью BERT, ELMO и Ко в картинках (как в NLP пришло трансферное обучение): этот вектор является результатом первой позиции (которая получает на вход токен [CLS]).

Обучение модели

Несмотря на то, что мы используем две модели, обучать мы будем лишь логистическую регрессию. Что касается DistilBERT’а, то мы воспользуемся уже предобученной моделью для английского языка. И хотя она не была ни обучена, ни настроена для задачи классификации, мы можем воспользоваться некоторыми «навыками» BERT’а, которыми он обладает для решения общих задач. В первую очередь, имеется в виду тот факт, что BERT подает на выход вычисления по первой позиции, связанной с [CLS] токеном. Вероятно, этот навык он приобрел в связи с такой задачей, как классификация следующего предложения. Для ее выполнения, судя по всему, BERT и обучается включать смысл всего предложения в вывод по первой позиции.

В библиотеке transformers содержатся реализации DistilBERT’а, а также предобученные версии модели.

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

Обзор руководства

Итак, вот план нашей игры. Сначала мы воспользуемся обученным DistilBERT’ом для создания эмбеддингов для 2 тысяч предложений.

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

После этого мы больше не будем касаться DistilBERT’а. Далее вся работа будет проходить со Scikit Learn. Мы, как обычно, разбиваем наш набор данных на обучающую и тестовую выборки:

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

Разделение на обучающую и тестовую выборки для выхода distilBERT’а (модель #1) создает наборы данных, на которых мы будем обучать и оценивать модель логистической регрессии (модель #2). Имейте в виду, что в реальности sklearn перемешивает примеры перед тем, как разделять на выборки, а не просто берет первые 75% примеров так, как они хранятся в исходном наборе данных

Далее мы обучаем логистическую регрессию на обучающей выборке:

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

Как вычисляется предсказанное значение

Прежде чем мы углубимся в код и объясним, как обучать модель, давайте посмотрим на то, как обученная модель подсчитывает предсказанное значение.

Давайте попробуем классифицировать предложение «a visually stunning rumination on love». Первым делом используем токенизатор BERT’а для того, чтобы разбить предложение на токены. Далее добавим специальные токены, которые нужны для классификации предложения (а именно токен [CLS] на первой позиции и [SEP] в конце предложения).

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

Третьим шагом будет замена каждого токена его идентификатором из таблицы эмбеддингов, которую мы получаем вместе с обученной моделью. Подробнее об эмбеддингах слов можно посмотреть в статье Word2vec в картинках.

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

Все эти три действия токенизатор делает одной строчкой кода:

Наше входное предложение теперь имеет подходящую форму для обработки в DistilBERT’е.

Если вы читали статью BERT, ELMO и Ко в картинках (как в NLP пришло трансферное обучение), то вам будет понятна следующая иллюстрация:

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

Проходя через DistilBERT

Порядок обработки входного вектора в DistilBERT’е точно такой же, как и в обычном BERT’е. На выходе будет вектор для каждого входного токена, состоящий из 768 чисел с плавающей точкой.

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

Поскольку перед нами стоит задача классификации предложений, мы игнорируем все, кроме первого вектора (связанного с [CLS] токеном). Этот вектор мы передаем в качестве входного в модель логистической регрессии.

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

С этого момента эстафета переходит к модели логистической регрессии, которая должна классифицировать этот вектор на основании того, чему она научилась на этапе обучения. Можно схематично представить процесс подсчета предсказанного значения следующим образом:

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

Обучение мы обсудим в следующей части, где также рассмотрим код для всего этого процесса.

В этой части мы приведем код для обучения модели классификации предложений. Ноутбук со всем этим кодом доступен в Colab и на github.

Начнем с загрузки необходимых библиотек:

Набор данных доступен отдельным файлом на github, так что мы просто импортируем его напрямую в датафрейм pandas:

Можно использовать df.head() для того, чтобы отобразить первые 5 строк датафрейма и посмотреть, что из себя представляют данные:

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

Загрузка предобученной модели DistilBERT и токенизатора

Теперь мы можем токенизировать набор данных. Обратите внимание, что мы будет делать все немного не так, как написано в примере выше. Там токенизируется только одно предложение. Здесь же мы токенизируем и обрабатываем все предложения вместе в одном пакете (в демонстрационном ноутбуке из соображений экономии ресурсов обрабатывается небольшая группа примеров, около 2000).

Токенизация

Этот код преобразует каждое предложение в список идентификаторов.

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

Набор данных теперь представляет собой список (или объект Series/DataFrame из pandas) списков. Прежде чем DistilBERT обработает его на входе, мы должны привести векторы к одному размеру путем прибавления к более коротким векторам идентификатора 0 (padding). Вы можете посмотреть, как это реализовано в ноутбуке (по сути, все сводится к простым манипуляциям с базовыми строками и массивами в Python).

Таким образом, мы получаем матрицу/тензор, который можно передавать BERT’у:

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

Обработка в DistilBERT’е

Теперь создадим входной вектор из матрицы токенов и передадим его в DistilBERT.

После запуска этого кода переменная last_hidden_states будет содержать вывод DistilBERT’а, который представляет собой кортеж формы (число примеров, максимальное число токенов в предложении, число скрытых нейронов в модели DistilBERT). В нашем случае, это будет 2000 (т.к. мы ограничили себя 2000 примеров), 66 (что представляет собой число токенов в самом длинном предложении из 2000 примеров), 278 (число скрытых нейронов в модели DistilBERT).

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

Распаковка выходного тензора BERT’а

Давайте распакуем этот 3-d выходной тензор. Мы можем для начала поисследовать его измерения:

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

Путешествие подходит к концу

Каждая строка соответствует предложению из нашего набора данных. Завершение обработки первого предложения можно изобразить следующим образом:

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

Получение самой важной части

Для классификации предложений нас интересует только выход BERT’а для токена [CLS]. Поэтому мы выбираем эту часть куба и отбрасываем все остальное.

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

Таким образом, мы разрезаем этот 3d тензор для того, чтобы получить нужный нам 2d тензор:

Теперь в переменной features содержится 2d массив numpy, который состоит из эмбеддингов всех предложений нашего набора данных.

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

Тензор, который мы вырезали из выхода BERT’а

Набор данных для логистической регрессии

Теперь, когда у нас есть выход из BERT’а, мы получили набор данных, который нам нужен для обучения модели логистической регрессии. Признаками являются 768 столбцов, а метки мы получили из нашего изначального набора данных.

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

Размеченный набор данных, на котором мы тренируем логистическую регрессию. Параметрами являются выходные векторы BERT’а для токена [CLS] (позиция #0), которые мы вырезали (см. предыдущую картинку). Каждая строка соответствует предложению в нашем наборе данных, а каждый столбец – выходу скрытых нейронов из сети прямого распространения, находящейся над блоком Трансформера в модели BERT/DistilBERT

После того, как было произведено традиционное для машинного обучения разделение на обучающую и тестовую выборки, мы можем создать модель логистической регрессии и обучить ее на нашем наборе данных.

Код выше разделяет набор данных на обучающую и тестовую выборки:

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

Далее мы обучаем модель логистической регрессии на обучающей выборке.

Модель обучена, и мы можем подсчитать метрики на тестовой выборке.

Выполнив этот код, получим показатель точности (accuracy) модели – 81%.

Бенчмарки

Для сравнения: наибольший показатель точности для этого набора данных – 96.8. DistilBERT может быть дообучен для того, чтобы улучшить результат решения этой задачи – процесс, называемый тонкой настройкой. В ходе него BERT обновляет свои веса для того, чтобы лучше справляться с классификацией предложений (что мы можем назвать downstream task). Тонкая настройка DistilBERT’а позволяет достичь показателя точности в 90.7. Полноразмерная модель BERT’а достигает 94.9.

Ноутбук

Перейдите прямо в нотбук или запустите его в Colab.

Вот и все! Хорошее первое знакомство получилось. Следующим шагом будет обратиться к документации и попробовать провести тонкую настройку своими руками. Вы также можете вернуться немного назад и перейти от distilBERT’а к BERT’у и посмотреть, как это сработает.

Благодарности Clément Delangue, Victor Sanh, а также команде Huggingface, которая предоставила отзыв о ранних версиях этого руководства.

Источник

Русские Блоги

Расшифровать Берт

Эта статья передана из «разработчика AI» (Okweiwu)

Введение в Берт

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

Что такое Берт?

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

От Word2Vec для Берта: Разведка NLP на язык

Word2Vec и перчатка

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

Элмо с ульмфитом

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

Открыл

Берт родился

Как работает Берт? Объяснение сухого товара

1. Берт Структура

Берт База: 12 этаж (трансформаторный модуль), 12-слойный привлечение, 110 миллионов параметров

Берт Большой: 24-й этаж (модуль трансформатора), 16-этажное внимание, 340 миллионов параметров

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

3. Предварительные тренировочные задачи

Модель маскировки языка

Следующий прогноз предложения

а. масорирование языковой модели (двустороннее)

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

Для того, чтобы предотвратить слишком сосредоточенность модели на конкретном месте или скрытой отметке, исследователь случайным образом маскирует 15% слов

Слова в масках не всегда [маска], а стадия тонкой настройки для конкретной задачи не требуется [маска] с меткой

С этой целью общая практика исследователей: (требуется 15% [маска] слова)

(15%) 80% слов были замаскированы [маска]

Остальные 10% слов заменяются другими случайными словами

Остальные 10% слов остаются без изменений

б. Следующий прогноз предложения

50% в учебных данных, второе предложение является настоящим предложением

Источник

BERT — state-of-the-art языковая модель для 104 языков. Туториал по запуску BERT локально и на Google Colab

Берт что это такое. Смотреть фото Берт что это такое. Смотреть картинку Берт что это такое. Картинка про Берт что это такое. Фото Берт что это такое

BERT — это нейронная сеть от Google, показавшая с большим отрывом state-of-the-art результаты на целом ряде задач. С помощью BERT можно создавать программы с ИИ для обработки естественного языка: отвечать на вопросы, заданные в произвольной форме, создавать чат-ботов, автоматические переводчики, анализировать текст и так далее.

Google выложила предобученные модели BERT, но как это обычно и бывает в Machine Learning, они страдают от недостатка документации. Поэтому в этом туториале мы научимся запускать нейронную сеть BERT на локальном компьютере, а также на бесплатном серверном GPU на Google Colab.

Зачем это вообще нужно

Чтобы подавать на вход нейронной сети текст, нужно его как-то представить в виде чисел. Проще всего это делать побуквенно, подавая на каждый вход нейросети по одной букве. Тогда каждая буква будет кодироваться числом от 0 до 32 (плюс какой-то запас на знаки препинания). Это так называемый character-level.

Но гораздо лучше результаты получаются, если мы предложения будем представлять не по одной букве, а подавая на каждый вход нейросети сразу по целому слову (или хотя бы слогами). Это уже будет word-level. Самый простой вариант — составить словарь со всеми существующими словами, и скармливать сети номер слова в этом словаре. Например, если слово «собака» стоит в этом словаре на 1678 месте, то на вход нейросети для этого слова подаем число 1678.

Вот только в естественном языке при слове «собака» у человека всплывает сразу множество ассоциаций: «пушистая», «злая», «друг человека». Нельзя ли как-то закодировать эту особенность нашего мышления в представлении для нейросети? Оказывается, можно. Для этого достаточно так пересортировать номера слов, чтобы близкие по смыслу слова стояли рядом. Пусть будет, например, для «собака» число 1678, а для слова «пушистая» число 1680. А для слова «чайник» число 9000. Как видите, цифры 1678 и 1680 находятся намного ближе друг к другу, чем цифра 9000.

На практике, каждому слову назначают не одно число, а несколько — вектор, скажем, из 32 чисел. И расстояния измеряют как расстояния между точками, на которые указывают эти вектора в пространстве соответствущей размерности (для вектора длиной в 32 числа, это пространство с 32 размерностями, или с 32 осями). Это позволяет сопоставлять одному слову сразу несколько близких по смыслу слов (смотря по какой оси считать). Более того, с векторами можно производить арифметические операции. Классический пример: если из вектора, обозначающего слово «король», вычесть вектор «мужчина» и прибавить вектор для слова «женщина», то получится некий вектор-результат. И он чудесным образом будет соответствовать слову «королева». И действительно, «король — мужчина + женщина = королева». Магия! И это не абстрактный пример, а реально так происходит. Учитывая, что нейронные сети хорошо приспособлены для математических преобразований над своими входами, видимо это и обеспечивает такую высокую эффективность этого метода.

Такой подход получил название Embeddings. Все пакеты машинного обучения (TensorFlow, PyTorch) позволяют первым слоем нейросети поставить специальный слой Embedding Layer, который делает это автоматически. То есть на вход нейросети подаем обычный номер слова в словаре, а Embedding Layer, самообучаясь, переводит каждое слово в вектор указанной длины, скажем, в 32 числа.

Но быстро поняли, что намного выгоднее заранее обучить подобное векторное представление слов на каком-нибудь огромном корпусе текстов, например на всей Wikipedia, а в конкретных нейронных сетях использовать уже готовые векторы слов, а не обучать их каждый раз заново.

Существует несколько способов представлять слова векторами, они постепенно эволюционирвали: word2vec, GloVe, Elmo.

Летом 2018 года в OpenAI заметили, что если предобучить нейронную сеть на архитектуре Transformer на больших объемах текста, то она неожиданно и с большим отрывом показывает отличные результаты на множестве самых разных задач по обработке естественного языка. По сути, такая нейронная сеть на своем выходе создает векторные представления для слов, и даже целых фраз. А навесив сверху над такой языковой моделью небольшой блок из пары дополнительных слоев нейронов, можно дообучить эту нейронную сеть на любые задачи.

BERT от Google — это усовершенствованная сеть GPT от OpenAI (двунаправленная вместо однонаправленной и т.д.), тоже на архитектуре Transformer. На данный момент BERT является state-of-the-art практически на всех популярных бенчмарках NLP.

Как они это сделали

Идея в основе BERT лежит очень простая: давайте на вход нейросети будем подавать фразы, в которых 15% слов заменим на [MASK], и обучим нейронную сеть предсказывать эти закрытые маской слова.

Например, если подаем на вход нейросети фразу «Я пришел в [MASK] и купил [MASK]», она должна на выходе показать слова «магазин» и «молоко». Это упрощенный пример с официальной страницы BERT, на более длинных предложениях разброс возможных вариантов становится меньше, а ответ нейросети однозначнее.

А для того, чтобы нейросеть научилась понимать соотношения между разными предложениями, дополнительно обучим ее предсказывать, является ли вторая фраза логичным продолжением первой. Или это какая-то случайная фраза, не имеющая никакого отношения к первой.

Так, для двух предложений: «Я пошел в магазин.» и «И купил там молоко.», нейросеть должна ответить, что это логично. А если вторая фраза будет «Карась небо Плутон», то должна ответить, что это предложение никак не связано с первым. Ниже мы поиграемся с обоими этими режимами работы BERT.

Обучив таким образом нейронную сеть на корпусе текстов из Wikipedia и сборнике книг BookCorpus в течении 4 дней на 16 TPU, получили BERT.

Установка и настройка

Примечание: в этом разделе мы запустим и поиграемся с BERT на локальном компьютере. Для запуска этой нейронной сети на локальном GPU, вам понадобится NVidia GTX 970 с 4 Гб видеопамяти или выше. Если вы хотите просто запустить BERT в браузере (для этого даже не нужно наличие GPU на компьютере), то перейдите к разделу Google Colab.

Первым делом установите TensorFlow, если его у вас еще нет, следуя инструкциям с https://www.tensorflow.org/install. Для поддержки GPU надо сначала установить CUDA Toolkit 9.0, потом cuDNN SDK 7.2, а уже потом сам TensorFlow с поддержкой GPU:

В принципе, этого достаточно для запуска BERT. Но инструкции как таковой нет, ее можно самостоятельно составить, разобравшись с исходниками в файле run_classifier.py (обычная ситуация в Machine Learning, когда вместо документации приходится лезть в исходники). Но мы поступим проще и воспользуемся оболочкой Keras BERT (она также может вам пригодится для fine-tuning сети позднее, т.к. дает удобный Keras интерфейс).

Для этого дополнительно установим сам Keras:

И после Keras BERT:

Нам также потребуется файл tokenization.py из оригинального github BERT. Либо нажмите кнопку Raw и сохраните его в папку с будущим скриптом, либо скачайте весь репозиторий и возьмите файл оттуда, либо возьмите копию из репозитория с этим кодом https://github.com/blade1780/bert.

Теперь пришло время скачать предобученную нейронную сеть. Существует несколько вариантов BERT, все они перечислены на официальной странице github.com/google-research/bert. Мы возьмем универсальную мультиязычную «BERT-Base, Multilingual Cased», для 104 языков. Скачайте файл multi_cased_L-12_H-768_A-12.zip (632 Мб) и распакуйте в папку с будущим скриптом.

Все готово, создайте файл BERT.py, дальше будет немного кода.

Импорт необходимых библиотек и задание путей

Так как нам придется переводить обычные строки текста в специальный формат токенов, то создадим специальный объект для этого. Обратите внимание на do_lower_case=False, так как мы используем Cased модель BERT, которая чувствительна к регистру.

BERT может работать в двух режимах: угадывать пропущенные в фразе слова, либо угадывать является ли вторая фраза логично идущей после первой. Мы сделаем оба варианта.

Для первого режима на вход нейросети нужно подать фразу в формате:

Нейросеть должна вернуть полное предложение с заполненными словами на месте масок: «Я пришел в магазин и купил молоко.»

Для второго режима на вход нейросети нужно подать обе фразы, разделенные сепаратором:

Нейросеть должна ответить, является ли вторая фраза логичным продолжением первой. Или это случайная фраза, не имеющая никакого отношения к первой.

Для работы BERT нужно подготовить три вектора, каждый длиной 512 чисел: token_input, seg_input и mask_input.

В token_input будет храниться наш исходный текст, переведенный в токены с помощью tokenizer. Фраза в виде индексов в словаре будет находится в начале этого вектора, а остальная часть будет заполнена нулями.

В mask_input мы должны для всех позиций где стоит маска [MASK], поставить 1, а остальное заполнить нулями.

В seg_input мы должны первую фразу (включая начальный CLS и сеператор SEP) обозначить как 0, вторую фразу (включая конечный SEP) обозначить как 1, а остальное до конца вектора заполнить нулями.

BERT не использует словарь из целых слов, скорее из наиболее распространенных слогов. Хотя и целые слова в нем тоже есть. Вы можете открыть файл vocab.txt в скачанной нейросети и посмотреть, какие слова нейросеть использует на своем входе. Там есть как целые слова, например «Франция». Но большинство русских слов нужно разбивать на подобие слогов. Так, слово «пришел» должно быть разбито на «при» и «##шел». Для помощи в преобразовании обычных строк текста в формат, требуемый для BERT, воспользуемся модулем tokenization.py.

Режим 1: предсказание слов, закрытых токеном [MASK] в фразе

Входная фраза, которая подается на вход нейросети

Преобразуем ее в токены. Проблема в том, что tokenizer не умеет обрабатывать служебные отметки вроде [CLS] и [MASK], хотя в словаре vocab.txt они есть. Поэтому придется вручную разбивать нашу строку с маркерами [MASK] и выделять из нее куски обычного текста, чтобы преобразовать его в BERT токены с помощью tokenizer. А также добавлять [CLS] в начало и [SEP] в конец фразы.

В tokens теперь токены, которые гарантированно по словарю преобразуются в индексы. Сделаем это:

Теперь в token_input идет ряд чисел (номера слов в словаре vocab.txt), которые нужно подать на вход нейросети. Осталось только удлинить этот вектор до длины 512 элементов. Python конструкция [0]*length создает массив длиной length, заполненный нулями. Просто добавляем его к нашим токенам, что в питоне объединяет два массива в один.

Теперь создаем маску маску длиной 512, поставив везде 1, где в токенах встречается число 103 (что соответствует в словаре vocab.txt маркеру [MASK]), а остальное заполнив 0:

Для первого режима работы BERT seg_input должен быть весь заполнен нулями:

Последний шаг, необходимо python массивы преобразовать в numpy массивы c shape (1,512), для чего помещаем их в подмассив []:

Ок, готово. Теперь запускаем предсказание нейросети!

Теперь отформатируем результат из токенов обратно в строку, разделенную пробелами

И выводим результат:

В нашем примере, для фразы «Я пришел в [MASK] и купил [MASK].» нейросеть выдала результат «дом» и «его»: «Я пришел в дом и купил его». Ну, не так уж и плохо, для первого раза. Купить дом определенно лучше, чем молоко ).

Земля это третья [MASK] от Солнца
Result: звезда

бутерброд лучше всего [MASK] с маслом
Result: встречается

после [MASK] обеда полагается поспать
Result: этого

отойди от [MASK]
Result: ##ой — это что, какое-то ругательство? )

[MASK] от двери
Result: вид

При [MASK] молотка и гвоздей можно сделать шкаф
Result: помощи

А если завтра не будет? Сегодня, например, его не [MASK]!
Result: будет

Как может надоесть игнорировать [MASK]?
Result: её

Есть бытовая логика, есть женская логика, а о мужской [MASK] ничего не известно
Result: философии

У женщин к тридцати годам формируется образ принца, под который подходит любой [MASK].
Result: человек

Большинством голосов Белоснежка и семь гномов проголосовали за [MASK], при одном голосе против.
Result: село — первая буква правильная

Оцените степень своего занудства по 10 бальной шкале: [MASK] баллов
Result: 10

Вашу [MASK], [MASK] и [MASK]!
Result: любовь я я — нет, BERT, я имел ввиду совсем не это

Можно вводить и английские фразы (и любые на 104 языках, список которых есть тут)

[MASK] must go on!
Result: I

Режим 2: проверка логичности двух фраз

Задаем две последовательные фразы, которые будут поданы на вход нейросети

Сформируем токены в формате [CLS] фраза_1 [SEP] фраза_2 [SEP], преобразуя обычный текст в токены с помощью tokenizer:

Преобразуем строковые токены в числовые индексы (номера слов в словаре vocab.txt) и удлиняем вектор до 512:

Маска слов в данном случае полностью заполнена нулями

А вот маску предложений нужно под второй фразой (включая конечный SEP) заполнить единицами, а все остальное нулями:

Пропускаем фразы через нейросеть (в этот раз результат в [1], а не в [0], как было выше)

И выводим вероятность того, что вторая фраза является нормальной, а не случайным набором слов

Sentence is okey: 99 %

А если вторая фраза будет «Карась небо Плутон», то ответ будет:

Sentence is okey: 4 %

Google Colab

Google предоставляет бесплатный серверный GPU Tesla K80 c 12 Gb видеопамяти (сейчас доступны и TPU, но их настройка немного сложнее). Весь код для Colab должен быть оформлен как jupyter notebook. Чтобы запустить BERT в браузере, просто откройте ссылку

В меню Runtime выберите Run All, чтобы в первый раз запустились все ячейки, скачалась модель и подключились нужные библиотеки. Согласитесь сбросить все Runtime, если потребуется.

Если кнопка подключения не активна, нажмите ее, чтобы стало Connected.

Теперь меняйте входные строки sentence, sentence_1 и sentence_2, и нажимайте слева значок Play для запуска только текущей ячейки. Запускать весь notebook уже не нужно.

Запустить BERT в Google Colab можно даже со смартфона, но если не открывается, может потребоваться включить галку Полная версия в настройках браузера.

Что дальше?

Чтобы дообучить BERT под конкретную задачу, необходимо поверх него добавить один-два слоя простой Feed Forward сети, и дообучать только ее, не трогая основную сеть BERT. Это можно сделать либо на голом TensorFlow, либо через оболочку Keras BERT. Такое дообучение под конкретный домен происходит очень быстро и полностью аналогично Fine Tuning в сверточных сетях. Так, под задачу SQuAD можно дообучить нейросеть на одном TPU всего за 30 минут (по сравнению с 4 днями на 16 TPU для обучения самого BERT).

Для этого вам придется изучить как в BERT представлены последние слои, а также иметь подходящий датасет. На официальной странице BERT https://github.com/google-research/bert есть несколько примеров под разные задачи, а также инструкция как запустить дообучение на облачных TPU. А все остальное придется смотреть в исходниках в файлах run_classifier.py и extract_features.py.

Представленный здесь код и jupyter notebook для Google Colab размещены в репозитории.

Чудес ждать не стоит. Не ждите, что BERT заговорит как человек. Статус state-of-the-art вовсе не значит, что прогресс в NLP достиг приемлемого уровня. Это всего лишь означает, что BERT лучше предыдущих моделей, которые были еще хуже. До сильного разговорного ИИ еще очень далеко. Кроме того, BERT — это в первую очередь языковая модель, а не готовый чат-бот, поэтому хорошие результаты она показывает только после дообучения под конкретную задачу.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *