Bert reader device что это
В октябре Google запустил крупнейшее обновление поисковых алгоритмов за последние пять лет – BERT Update. Внедрение этого алгоритма было призвано улучшить понимание запросов на естественном языке и стоящего за ними намерения. Как результат, Google теперь сможет предоставлять более релевантные результаты поиска.
BERT охватывает 10% поисковых запросов, а это значит, что он может в некоторой степени влиять на видимость и трафик в органическом поиске.
Ниже – обзор частых вопросов на тему BERT, подготовленный Search Engine Land.
Как они это сделали
Идея в основе BERT лежит очень простая: давайте на вход нейросети будем подавать фразы, в которых 15% слов заменим на [MASK], и обучим нейронную сеть предсказывать эти закрытые маской слова.
Например, если подаем на вход нейросети фразу "Я пришел в [MASK] и купил [MASK]", она должна на выходе показать слова "магазин" и "молоко". Это упрощенный пример с официальной страницы BERT, на более длинных предложениях разброс возможных вариантов становится меньше, а ответ нейросети однозначнее.
А для того, чтобы нейросеть научилась понимать соотношения между разными предложениями, дополнительно обучим ее предсказывать, является ли вторая фраза логичным продолжением первой. Или это какая-то случайная фраза, не имеющая никакого отношения к первой.
Так, для двух предложений: "Я пошел в магазин." и "И купил там молоко.", нейросеть должна ответить, что это логично. А если вторая фраза будет "Карась небо Плутон", то должна ответить, что это предложение никак не связано с первым. Ниже мы поиграемся с обоими этими режимами работы BERT.
Обучив таким образом нейронную сеть на корпусе текстов из Wikipedia и сборнике книг BookCorpus в течении 4 дней на 16 TPU, получили BERT.
Обучение
Процесс обучения состоит из двух этапов: предварительное обучение и точная настройка.
Предварительное обучение
Предварительное обучение выполняется с помощью run_pretraining.py вместе с параметрами, определёнными в scripts/run_pretraining.sh .
run_pretraining.sh запускает процесс обучения модели BERT-Large с нуля, используя датасеты Wikipedia и Book corpus. По умолчанию он:
— работает на 8 GPU с размером обучающего пакета 14 и размером оценочного пакета 8 на каждом GPU
— использует точность FP16
— работает за 1144000 шагов с 10000 предварительных шагов
— сохраняет контрольную точку каждые 5000 итераций и в конце обучения. Все контрольные точки, результаты оценки и логи обучения сохраняются в каталоге /results (в контейнере, который можно установить в локальный каталог)
— создаёт лог-файл, содержащий все выходные данные
— оценивает модель в конце обучения. Чтобы пропустить оценку, измените --do_eval на False .
С этими параметрами можно обучить модель до приемлемой точности на DGX1 с графическими процессорами V100 32 ГБ. Если вы хотите добиться лучших результатов, продемонстрированных Google, нужно либо удвоить число шагов (до 2288000) на DGX1, либо проводить обучение с 16-ю графическими процессорами на DGX2.
— training_batch_size >: размер пакета для каждого процессора во время обучения. Чем больше размер пакета, тем эффективнее обучение, но это требует больше памяти
— eval_batch_size >: размер пакета для каждого GPU во время оценки
— learning_rate >: скорость обучения, по умолчанию 1e-4 (подходит для пакета размером 256)
— precision >: тип арифметики вашей модели (fp32, fp16, fp16_xla, fastmath, amp_fm, amp_fm_xla, amp или amp_xla):
- fp32 : 32-битное число IEEE с плавающей запятой одинарной точности
- fp16 : заданное вручную 16- и 32-битное число с плавающей запятой смешанной точности
- fp16_xla : заданное вручную число с плавающей запятой смешанной точности, JIT-скомпилированное с XLA
- fastmath : Matmuls выполняется тензорными ядрами со смешанной точностью, остальное - в FP32
- amp_fm : альтернативная реализация FastMath, которая работает с вычислительным графом TensorFlow
- amp_fm_xla : amp_fm и компиляция XLA JIT
- amp : автоматически переназначает вычислительному графу TensorFlow использовать 16-битную арифметику всякий раз, когда это допустимо.
- amp_xla : amp и компиляция XLA JIT
— num_gpus >: количество графических процессоров для обучения. Должно быть равно или меньше количества GPU, подключенных к вашему узлу
— warmup_steps >: количество предварительных шагов в начале обучения
— save_checkpoint_steps >: управляет частотой сохранения контрольных точек (по умолчанию каждые 5000 шагов)
— create_logfile >: должен ли вывод быть записан в лог-файл (допустимые значения — "true" или "false" )
Эта команда запускает обучение BERT-Large с нуля на одном DGX-2 с использованием арифметики FP16. Это займёт около 156 часов (6,5 дней). Контрольные точки записываются каждые 5000 шагов, и все выводы сохраняются в лог-файл.
Точная настройка
Точная настройка выполняется с помощью run_squad.py вместе с параметрами, определёнными в scripts/run_squad.sh .
Скрипт run_squad.sh обучает модель и подготавливает оценку на датасете SQuaD v1.1. По умолчанию он:
— использует 8 графических процессоров и размер пакета 10 на каждом GPU
— использует точность FP16
— работает в течение 2 эпох
— сохраняет контрольную точку каждые 1000 итераций и в конце обучения. Все контрольные точки, результаты оценки и логи обучения сохраняются в каталоге /results (в контейнере, который можно установить в локальный каталог)
— оценивает модель в конце обучения. Чтобы пропустить оценку, измените --do_predict на False .
Лог обучения содержит:
— потери на последнем шаге
— эффективность обучения и оценки
— F1-меру и оценку полного совпадения на наборе Dev.
Результат обучения выводится в следующем формате:
Мультипроцессорное обучение можно включить с помощью модуля Horovod TensorFlow. Пример обучения на 8 GPU:
Результаты Google
Результаты Google для обучающего скрипта run_squad.py были получены с контейнером TensorFlow 19.03-py3 NGC на NVIDIA DGX-1 с 8 видеокартами Tesla V100 32ГБ.
Количество графических процессоров | Размер партии на один графический процессор | Время обучения с FP16 (в минутах) | Время обучения с FP32 (в минутах) |
8 | 4 | 31 | 46 |
В следующих таблицах сравниваются F1-меры для 5 запусков обучения с различными начальными значениями для FP16 и FP32 соответственно:
Таблица с результатами производительности (в предложениях в секунду). Числа усреднены для всех эпох обучения:
Число GPU | Размер партии на один GPU | FP32 предл / сек | FP16 предл / сек | Ускорение со смешанной точностью | Multi-GPU слабая масштабируемость с FP32 | Multi-GPU слабая масштабируемость с FP16 |
1 | 4 | 8,55 | 18,14 | 2,12 | 1,0 | 1,0 |
4 | 4 | 32,13 | 52,85 | 1,64 | 3,76 | 2,91 |
8 | 4 | 62,83 | 95,28 | 1,51 | 7,35 | 5,25 |
Максимальная точность модели составила 91.17% для F1-меры и 84.34% для оценки полного совпадения.
BERT — большой шаг вперёд для NLP, и NVIDIA продолжает ускорять современные нейросети для любых применений Deep Learning. Теперь, используя открытый исходный код, любой может обучить свою вопросно-ответную систему для разных задач. Это должно послужить толчком к созданию не только развлекательных ботов, но и полноценных голосовых помощников.
С оригинальными материалами можно ознакомиться на сайте и в репозитории NVIDIA.
Сравнение моделей
В оригинальной статье наилучшие результаты классификации на SST-2 получаются при a=0, когда модель учится только подражать, не учитывая реальные лейблы. Accuracy всё ещё меньше, чем у BERT, но значительно лучше обычной BiLSTM.
Я старался повторить результаты из статьи, но в моих экспериментах лучший результат получался при a=0,5.
Так выглядят графики loss и accuracy при обучении LSTM обычным способом. Судя по поведению loss, модель быстро обучилась, а где-то после шестой эпохи пошло переобучение.
Графики при дистилляции:
Дистиллированная BiLSTM стабильно лучше обычной. Важно, что по архитектуре они абсолютно идентичны, разница только в способе обучения. Полный код обучения я выложил на ГитХаб.
Задача
Давайте разберём дистилляцию на примере бинарной классификации. Возьмём открытый датасет SST-2 из стандартного набора задач, на которых тестируют модели для NLP.
Этот датасет представляет собой набор обзоров фильмов с IMDb с разбивкой на эмоциональный окрас — позитивный или негативный. В качестве метрики на этом датасете используют accuracy.
Где можно узнать больше о BERT?
Ниже – небольшая подборка ссылок на те материалы, которые можно изучить для лучшего понимания BERT. Все они на английском языке.
Если вы интересуетесь машинным обучением, то наверняка слышали про BERT и трансформеры.
BERT — это языковая модель от Google, показавшая state-of-the-art результаты с большим отрывом на целом ряде задач. BERT, и вообще трансформеры, стали совершенно новым шагом развития алгоритмов обработки естественного языка (NLP). Статью о них и «турнирную таблицу» по разным бенчмаркам можно найти на сайте Papers With Code.
С BERT есть одна проблема: её проблематично использовать в промышленных системах. BERT-base содержит 110М параметров, BERT-large — 340М. Из-за такого большого числа параметров эту модель сложно загружать на устройства с ограниченными ресурсами, например мобильные телефоны. К тому же, большое время инференса делает эту модель непригодной там, где скорость ответа критична. Поэтому поиск путей ускорения BERT является очень горячей темой.
Нам в Авито часто приходится решать задачи текстовой классификации. Это типичная задача прикладного машинного обучения, которая хорошо изучена. Но всегда есть соблазн попробовать что-то новое. Эта статья родилась из попытки применить BERT в повседневных задачах машинного обучения. В ней я покажу, как можно значительно улучшить качество существующей модели с помощью BERT, не добавляя новых данных и не усложняя модель.
Обучение со смешанной точностью
Такое обучение значительно ускоряет вычисление, поскольку операции выполняются с половинной точностью, но при этом сохраняется минимальная информация с единичной точностью для критических участков сети. Это возможно благодаря тензорным ядрам в архитектурах Volta и Turing, которые обеспечивают ускорение до трёх раз.
Для обучения со смешанной точностью нужно:
1. Портировать модель для использования типа данных FP16 там, где это необходимо.
2. Добавить масштабирование потерь для сохранения малых значений градиента. Теперь это можно сделать автоматически с помощью механизма AMP (Automatic Mixed Precision) для Tensorflow (TF-AMP).
Более подробная информация:
Когда BERT был запущен в поиске Google?
Запуск BERT в поисковой системе Google для запросов на английском языке был начат 21 октября 2019 года.
В будущем Google планирует расширить этот алгоритм на все языки, поддерживаемые поисковой системой, но точного графика у компании пока нет. Модель BERT также используется для улучшения блоков с ответами (featured snippets) в более чем 20 странах.
Что дальше?
Чтобы дообучить BERT под конкретную задачу, необходимо поверх него добавить один-два слоя простой Feed Forward сети, и дообучать только ее, не трогая основную сеть BERT. Это можно сделать либо на голом TensorFlow, либо через оболочку Keras BERT. Такое дообучение под конкретный домен происходит очень быстро и полностью аналогично Fine Tuning в сверточных сетях. Так, под задачу SQuAD можно дообучить нейросеть на одном TPU всего за 30 минут (по сравнению с 4 днями на 16 TPU для обучения самого BERT).
Представленный здесь код и jupyter notebook для Google Colab размещены в репозитории.
Чудес ждать не стоит. Не ждите, что BERT заговорит как человек. Статус state-of-the-art вовсе не значит, что прогресс в NLP достиг приемлемого уровня. Это всего лишь означает, что BERT лучше предыдущих моделей, которые были еще хуже. До сильного разговорного ИИ еще очень далеко. Кроме того, BERT — это в первую очередь языковая модель, а не готовый чат-бот, поэтому хорошие результаты она показывает только после дообучения под конкретную задачу.
Прогресс в области машинного обучения для обработки естественного языка существенно ускорился за последние несколько лет. Модели покинули исследовательские лаборатории и стали основой ведущих цифровых продуктов. Хорошей иллюстрацией этому служит недавнее заявление о том, что основным компонентом, стоящим за поиском Google, стала модель BERT. Google верит, что этот шаг (т.е. внедрение передовой модели понимания естественного языка в поисковую систему) представляет собой «величайший прорыв за последние пять лет и один из знаменательнейших во всей истории поисковых систем».
Данная статья – это простое руководство по использованию одной из версий BERT'а для классификации предложений. Пример, рассмотренный нами, одновременно и достаточно простой для первого знакомства с моделью, и достаточно продвинутый для того, чтобы продемонстрировать ключевые концепты.
Помимо этой статьи был подготовлен ноутбук, который можно посмотреть в репозитории или запустить в Colab.
В нашем примере мы будем использовать набор данных SST2, содержащий предложения из отзывов о фильмах, каждое из которых имеет либо положительную метку (значение 1), либо отрицательную (значение 0):
Наша цель – создать модель, которая берет одно предложение (вроде тех, что в нашем наборе данных) и выдает или 1 (что будет указывать на положительную тональность предложения), или 0 (отрицательная тональность). Мы можем схематично изобразить это так:
Под капотом же модель будет содержать целых две модели:
-
обрабатывает предложения и передает извлеченную им информацию в следующую модель. DistilBERT представляет собой уменьшенную версию BERT'а, разработанную и выложенную в отрытый доступ группой разработчиков HuggingFace. Она быстрее и легче своего старшего собрата, но при этом вполне сравнима в результативности.
- Следующая модель – базовая логистическая регрессия из библиотеки scikit learn, которая берет результат обработки DistilBERT'ом и классифицирует предложение как положительное или отрицательное (1 или 0 соответственно).
Данные, которые мы передаем между двумя моделями, представляют собой вектор размерности 768. Можно считать этот вектор эмбеддингом предложения, который мы используем для классификации.
Для тех, кто читал предыдущую статью BERT, ELMO и Ко в картинках (как в NLP пришло трансферное обучение): этот вектор является результатом первой позиции (которая получает на вход токен [CLS]).
Несмотря на то, что мы используем две модели, обучать мы будем лишь логистическую регрессию. Что касается DistilBERT'а, то мы воспользуемся уже предобученной моделью для английского языка. И хотя она не была ни обучена, ни настроена для задачи классификации, мы можем воспользоваться некоторыми «навыками» BERT'а, которыми он обладает для решения общих задач. В первую очередь, имеется в виду тот факт, что BERT подает на выход вычисления по первой позиции, связанной с [CLS] токеном. Вероятно, этот навык он приобрел в связи с такой задачей, как классификация следующего предложения. Для ее выполнения, судя по всему, BERT и обучается включать смысл всего предложения в вывод по первой позиции.
В библиотеке transformers содержатся реализации DistilBERT'а, а также предобученные версии модели.
Итак, вот план нашей игры. Сначала мы воспользуемся обученным DistilBERT'ом для создания эмбеддингов для 2 тысяч предложений.
После этого мы больше не будем касаться DistilBERT'а. Далее вся работа будет проходить со Scikit Learn. Мы, как обычно, разбиваем наш набор данных на обучающую и тестовую выборки:
Далее мы обучаем логистическую регрессию на обучающей выборке:
Прежде чем мы углубимся в код и объясним, как обучать модель, давайте посмотрим на то, как обученная модель подсчитывает предсказанное значение.
Давайте попробуем классифицировать предложение «a visually stunning rumination on love». Первым делом используем токенизатор BERT'а для того, чтобы разбить предложение на токены. Далее добавим специальные токены, которые нужны для классификации предложения (а именно токен [CLS] на первой позиции и [SEP] в конце предложения).
Третьим шагом будет замена каждого токена его идентификатором из таблицы эмбеддингов, которую мы получаем вместе с обученной моделью. Подробнее об эмбеддингах слов можно посмотреть в статье Word2vec в картинках.
Все эти три действия токенизатор делает одной строчкой кода:
Наше входное предложение теперь имеет подходящую форму для обработки в DistilBERT'е.
Если вы читали статью BERT, ELMO и Ко в картинках (как в NLP пришло трансферное обучение), то вам будет понятна следующая иллюстрация:
Порядок обработки входного вектора в DistilBERT'е точно такой же, как и в обычном BERT'е. На выходе будет вектор для каждого входного токена, состоящий из 768 чисел с плавающей точкой.
Поскольку перед нами стоит задача классификации предложений, мы игнорируем все, кроме первого вектора (связанного с [CLS] токеном). Этот вектор мы передаем в качестве входного в модель логистической регрессии.
С этого момента эстафета переходит к модели логистической регрессии, которая должна классифицировать этот вектор на основании того, чему она научилась на этапе обучения. Можно схематично представить процесс подсчета предсказанного значения следующим образом:
Обучение мы обсудим в следующей части, где также рассмотрим код для всего этого процесса.
В этой части мы приведем код для обучения модели классификации предложений. Ноутбук со всем этим кодом доступен в Colab и на github.
Начнем с загрузки необходимых библиотек:
Набор данных доступен отдельным файлом на github, так что мы просто импортируем его напрямую в датафрейм pandas:
Можно использовать df.head() для того, чтобы отобразить первые 5 строк датафрейма и посмотреть, что из себя представляют данные:
Теперь мы можем токенизировать набор данных. Обратите внимание, что мы будет делать все немного не так, как написано в примере выше. Там токенизируется только одно предложение. Здесь же мы токенизируем и обрабатываем все предложения вместе в одном пакете (в демонстрационном ноутбуке из соображений экономии ресурсов обрабатывается небольшая группа примеров, около 2000).
Этот код преобразует каждое предложение в список идентификаторов.
Набор данных теперь представляет собой список (или объект Series/DataFrame из pandas) списков. Прежде чем DistilBERT обработает его на входе, мы должны привести векторы к одному размеру путем прибавления к более коротким векторам идентификатора 0 (padding). Вы можете посмотреть, как это реализовано в ноутбуке (по сути, все сводится к простым манипуляциям с базовыми строками и массивами в Python).
Таким образом, мы получаем матрицу/тензор, который можно передавать BERT'у:
Теперь создадим входной вектор из матрицы токенов и передадим его в DistilBERT.
После запуска этого кода переменная last_hidden_states будет содержать вывод DistilBERT'а, который представляет собой кортеж формы (число примеров, максимальное число токенов в предложении, число скрытых нейронов в модели DistilBERT). В нашем случае, это будет 2000 (т.к. мы ограничили себя 2000 примеров), 66 (что представляет собой число токенов в самом длинном предложении из 2000 примеров), 278 (число скрытых нейронов в модели DistilBERT).
Давайте распакуем этот 3-d выходной тензор. Мы можем для начала поисследовать его измерения:
Каждая строка соответствует предложению из нашего набора данных. Завершение обработки первого предложения можно изобразить следующим образом:
Для классификации предложений нас интересует только выход BERT'а для токена [CLS]. Поэтому мы выбираем эту часть куба и отбрасываем все остальное.
Таким образом, мы разрезаем этот 3d тензор для того, чтобы получить нужный нам 2d тензор:
Теперь в переменной features содержится 2d массив numpy, который состоит из эмбеддингов всех предложений нашего набора данных.
Тензор, который мы вырезали из выхода BERT'а
Теперь, когда у нас есть выход из BERT'а, мы получили набор данных, который нам нужен для обучения модели логистической регрессии. Признаками являются 768 столбцов, а метки мы получили из нашего изначального набора данных.
После того, как было произведено традиционное для машинного обучения разделение на обучающую и тестовую выборки, мы можем создать модель логистической регрессии и обучить ее на нашем наборе данных.
Код выше разделяет набор данных на обучающую и тестовую выборки:
Далее мы обучаем модель логистической регрессии на обучающей выборке.
Модель обучена, и мы можем подсчитать метрики на тестовой выборке.
Выполнив этот код, получим показатель точности (accuracy) модели – 81%.
Для сравнения: наибольший показатель точности для этого набора данных – 96.8. DistilBERT может быть дообучен для того, чтобы улучшить результат решения этой задачи – процесс, называемый тонкой настройкой. В ходе него BERT обновляет свои веса для того, чтобы лучше справляться с классификацией предложений (что мы можем назвать downstream task). Тонкая настройка DistilBERT'а позволяет достичь показателя точности в 90.7. Полноразмерная модель BERT'а достигает 94.9.
Перейдите прямо в нотбук или запустите его в Colab.
Вот и все! Хорошее первое знакомство получилось. Следующим шагом будет обратиться к документации и попробовать провести тонкую настройку своими руками. Вы также можете вернуться немного назад и перейти от distilBERT'а к BERT'у и посмотреть, как это сработает.
Благодарности Clément Delangue, Victor Sanh, а также команде Huggingface, которая предоставила отзыв о ранних версиях этого руководства.
В конце прошлого года команде NVIDIA удалось достичь четырёхкратного ускорения нейронной сети BERT (Bidirectional Encoder Representations from Transformers). С тех пор эта ускоренная реализация была доработана и выложена на GitHub и NGC. TensorFlow-скрипт поддерживает точную настройку SQuAD QA, конфигурации серверов DGX-1 и DGX-2, а также использует новую функцию Automatic Mixed Precision (автоматический режим смешанной точности).
BERT — современная NLP-сеть, способная по воспроизводимой точности превзойти человека. Одна из ключевых инноваций — её двунаправленность (“B” — Biderectional). Предыдущие модели NLP обычно использовали однонаправленное сканирование (слева направо, справа налево или оба) для распознавания слов как в контекстном, так и в контекстно-свободном представлении. Кроме того, BERT может анализировать целые предложения для более точного изучения контекста, основываясь на окружении слова в обоих направлениях. Этот подход повышает точность модели, но предъявляет очень высокие вычислительные требования.
Чтобы обучить BERT с нуля, начните с большого набора данных (например, Википедии) или комбинации нескольких датасетов. Вы можете добавить 1-2 слоя в конце, чтобы настроить сеть для конкретной задачи, такой как классификация предложений или «вопрос-ответ». Поскольку новые слои требуют дополнительных параметров, вам необходимо использовать определённый набор данных для каждой модели. Для достижения оптимальных результатов вам понадобиться не только установить параметры для этих дополнительных слоёв, но ещё и точно настроить обучение всей BERT. Можете начать с параметров предварительно обученной сети или воспользоваться теми, которые предлагает Google для своей модели.
В зависимости от задачи, по умолчанию вам доступны две конфигурации BERT:
Модель | Скрытые слои | Размер скрытой единицы (hidden unit) | Слои Attention Heads | Размер фильтра прямой связи | Максимальная длина последовательности | Параметры |
BERTBASE | 12 | 768 | 12 | 4 x 768 | 512 | 110M |
BERTLARGE | 14 | 1024 | 16 | 4 x 1024 | 512 | 330M |
Дистилляция
Идея этого способа дистилляции взята из статьи исследователей из Университета Ватерлоо. Как я говорил выше, «ученик» должен научиться имитировать поведение «учителя». Что именно является поведением? В нашем случае это предсказания модели-учителя на обучающей выборке. Причём ключевая идея — использовать выход сети до применения функции активации. Предполагается, что так модель сможет лучше выучить внутреннее представление, чем в случае с финальными вероятностями.
В оригинальной статье предлагается в функцию потерь добавить слагаемое, которое будет отвечать за ошибку «подражания» — MSE между логитами моделей.
Для этих целей сделаем два небольших изменения: изменим количество выходов сети с 1 до 2 и поправим функцию потерь.
Можно переиспользовать весь код, который мы написали, переопределив только модель и loss:
Вот и всё, теперь наша модель учится «подражать».
Установка
Требования
Репозиторий с BERT содержит Dockerfile, который расширяет контейнер TensorFlow NGC и инкапсулирует некоторые зависимости. Помимо этого, убедитесь, что у вас присутствуют следующие компоненты:
Дополнительная информация о работе с контейнерами NGC доступна в документации по облачным GPU NVIDIA и документации Deep Learning:
Как BERT повлияет на мои избранные сниппеты?
Как мы видели на примере выше, BERT также может влиять на те результаты, которые появляются в блоках с ответами (featured snippets или «избранные сниппеты»).
На примере ниже Google сравнивает избранные сниппеты по запросу [parking on a hill with no curb] (парковка на возвышенности без бордюра), объясняя:
«В прошлом такой запрос приводил наши системы в замешательство – мы уделяли слишком много внимания слову “curb” и игнорировали слово “no”, не понимая, несколько критичным оно было для надлежащего ответа на этот запрос. Поэтому мы возвращали результаты для парковки на возвышенности с бордюром».
Что такое обработка естественного языка?
Обработка естественного языка (Natural language processing, NLP) относится к области искусственного интеллекта, которая занимается лингвистикой, чтобы дать компьютерам возможность понять, как люди общаются.
К примерам достижений в области NLP можно отнести инструменты мониторинга социальных сетей, чат-боты и т.п.
В целом NLP – это не новая функция для поисковых систем. При этом BERT представляет собой прогресс в NLP, достигнутый с помощью двунаправленного обучения (подробнее об этом ниже).
Получение данных
Для предварительного обучения BERT используются совмещённые датасеты Википедии (2500 млн слов) и Book Corpus (800 млн слов). Из Википедии извлекаются только текстовые блоки без заголовков, списков и таблиц. Они структурированы в виде единого набора документов, а не набора предложений, поскольку важно сохранять контекст.
Следующий шаг – запуск create_pretraining_data.py , который генерирует входные данные и метки для моделирования регулярных выражений и прогнозирования следующего предложения. Предварительное обучение можно выполнить на любом другом датасете. Набор скриптов для генерирования данных должен быть модульным, чтобы можно было вносить изменения в этапы предварительной обработки или дополнять данные.
Используется ли BERT для понимания всех запросов?
Нет. BERT помогает Google понимать 1 из 10 запросов на английском языке в США.
«В частности, в случае более длинных, более разговорных запросов, где предлоги, такие как “for” и “to” имеют большое значение, поисковая система [теперь] сможет понять контекст слов в вашем запросе», - говорится в блоге Google.
При этом не все запросы являются разговорными или включают предлоги. Брендовые запросы и более короткие фразы – это лишь два примера тех запросов, которые не требуют применения BERT.
Заключение
В этом руководстве я постарался объяснить базовую идею подхода дистилляции. Конкретная архитектура ученика будет зависеть от решаемой задачи. Но в целом этот подход применим в любой практической задаче. За счёт усложнения на этапе обучения модели, можно получить значительный прирост её качества, сохранив изначальную простоту архитектуры.
BERT — это нейронная сеть от Google, показавшая с большим отрывом state-of-the-art результаты на целом ряде задач. С помощью BERT можно создавать программы с ИИ для обработки естественного языка: отвечать на вопросы, заданные в произвольной форме, создавать чат-ботов, автоматические переводчики, анализировать текст и так далее.
Google выложила предобученные модели BERT, но как это обычно и бывает в Machine Learning, они страдают от недостатка документации. Поэтому в этом туториале мы научимся запускать нейронную сеть BERT на локальном компьютере, а также на бесплатном серверном GPU на Google Colab.
Результаты
Вы можете запустить тесты, измеряющие эффективность модели в режимах обучения и вывода. Оба скрипта запускают BERT для точной настройки. С помощью аргументов для них вы можете указать, выполнять ли сравнительный анализ FP16 или FP32.
Тест эффективности обучения
Тест эффективности вывода
Быстрый старт
Здесь описана предварительная подготовка и настройки модели для задач «вопрос-ответ» с использованием тензорных ядер и смешанной точности, или же с помощью FP32. Выполните следующие шаги с параметрами по умолчанию:
1. Клонируйте репозиторий
2. Соберите контейнер BERT TensorFlow NGC
3. Загрузите и подготовьте набор данных
В репозитории есть скрипты, с помощью которых вы можете загрузить, проверить и извлечь датасет SQuaD и предварительно обученные веса для точной настройки, а также набор данных Wikipedia + BookCorpus для предварительного обучения.
Сценарий запускает Docker-контейнер в текущем каталоге и загружает датасеты в папку data/ .
4. Запустите интерактивную сессию в контейнере NGS для начала обучения/вывода
После загрузки контейнера и подготовки данных вы можете запустить сессию CLI (Command Line Interface):
Сценарий launch.sh предполагает, что наборы данных находятся в местах по умолчанию:
— Squad v1.1: data/squad/v1.1
— BERT: data/pretrained_models_google/uncased_L-24_H-1024_A-16
— Wikipedia: data/wikipedia_corpus/final_tfrecords_sharded
— BookCorpus: data/bookcorpus/final_tfrecords_sharded
5. Начните предварительное обучение
Следующие скрипты выполняют предварительное обучение BERT на датасете Wikipedia+Book Corpus. Вы можете использовать любой другой набор данных на ваш выбор.
Для обучения FP16 с XLA с использованием DGX-1 V100 32G выполните:
Для обучения FP32 без XLA с использованием DGX-1 V100 32G выполните:
6. Начните точную настройку
Предварительно обученные представления BERT можно точно настроить с помощью одного дополнительного выходного слоя для системы «вопрос-ответ». Вы можете использовать следующий скрипт внутри контейнера для настройки SQuaD:
Для обучения FP16 с XLA с использованием DGX-1 V100 32G:
Для обучения FP32 без XLA с использованием DGX-1 V100 32G:
7. Начните проверку/оценку
Скрипт run_squad_inference.sh запускает вывод SQuaD на контрольной точке и оценивает прогнозирование с помощью полных совпадений и F1-меры.
Для вывода FP16 с XLA с использованием DGX-1 V100 32G:
Для вывода FP32 без XLA с использованием DGX-1 V100 32G:
Режим 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: село — первая буква правильная
Оцените степень своего занудства по 10 бальной шкале: [MASK] баллов
Result: 10
Вашу [MASK], [MASK] и [MASK]!
Result: любовь я я — нет, BERT, я имел ввиду совсем не это
Можно вводить и английские фразы (и любые на 104 языках, список которых есть тут)
[MASK] must go on!
Result: I
Можно ли оптимизировать сайт для BERT?
По словам евангелиста поиска Дэнни Салливана (Danny Sullivan): «Нет ничего, что можно было оптимизировать для BERT, и что следовало бы переосмыслить. Наше фундаментальное стремление вознаграждать отличный контент остаётся неизменным».
Для хорошего ранжирования Google стабильно советует фокусироваться на пользователях и создавать контент, который удовлетворяет их поисковый интент. Поскольку BERT предназначен для интерпретации этого намерения, то становится понятным, почему предоставление пользователю того, что он хочет, по-прежнему является рекомендацией Google.
«Оптимизация» теперь означает, что вы можете больше сосредоточиться на качественном и чётко написанном контенте вместо того, чтобы искать компромисс между созданием контента для своей аудитории и построением линейных фраз для машин.
Режим 2: проверка логичности двух фраз
Задаем две последовательные фразы, которые будут поданы на вход нейросети
Сформируем токены в формате [CLS] фраза_1 [SEP] фраза_2 [SEP], преобразуя обычный текст в токены с помощью tokenizer:
Преобразуем строковые токены в числовые индексы (номера слов в словаре vocab.txt) и удлиняем вектор до 512:
Маска слов в данном случае полностью заполнена нулями
А вот маску предложений нужно под второй фразой (включая конечный SEP) заполнить единицами, а все остальное нулями:
Пропускаем фразы через нейросеть (в этот раз результат в [1], а не в [0], как было выше)
И выводим вероятность того, что вторая фраза является нормальной, а не случайным набором слов
Я пришел в магазин. -> И купил молоко.
Sentence is okey: 99 %
А если вторая фраза будет "Карась небо Плутон", то ответ будет:
Sentence is okey: 4 %
Обучение «ученика»
В качестве ученика можно взять любую архитектуру: нейронную сеть, линейную модель, дерево решений. Давайте для большей наглядности попробуем обучить BiLSTM. Для начала обучим BiLSTM без BERT.
Чтобы подавать на вход нейронной сети текст, нужно представить его в виде вектора. Один из самых простых способов — это сопоставить каждому слову его индекс в словаре. Словарь будет состоять из топ-n самых популярных слов в нашем датасете плюс два служебных слова: “pad” — «слово-пустышка», чтобы все последовательности были одной длины, и “unk” — для слов за пределами словаря. Построим словарь с помощью стандартного набора инструментов из torchtext. Для простоты я не стал использовать предобученные эмбеддинги слов.
Вывод
Вывод выполняется скриптом run_squad.py вместе с параметрами, определёнными в scripts/run_squad_inference.sh . Вывод поддерживает только один GPU.
Скрипт run_squad_inference.sh обучает модель и выполняет оценку на датасете SQuaD v1.1. По умолчанию он:
— использует точность FP16
— оценивает последнюю контрольную точку в /results с размером пакета 8.
Скрипт создаёт файл прогнозов /results/predictions.json и вычисляет F1-меру и полные совпадения с помощью evaluate-v1.1.py .
Выходной лог содержит:
— оценку эффективности модели
— F1-меру и оценку полного совпадения на наборе Dev.
Результат вывода выглядит следующим образом:
Параметры командной строки
Для просмотра полного списка доступных параметров и их описания, введите в командной строке -h или -help , например:
Помимо опций для настройки гиперпараметров скрипта run_pretraining.py также можно использовать:
Для скрипта run_squad.py :
Зачем это вообще нужно
Чтобы подавать на вход нейронной сети текст, нужно его как-то представить в виде чисел. Проще всего это делать побуквенно, подавая на каждый вход нейросети по одной букве. Тогда каждая буква будет кодироваться числом от 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.
Обучение
Для этой модели размерность выходного вектора будет (batch_size, output_dim). При обучении будем использовать обычный logloss. В PyTorch есть класс BCEWithLogitsLoss, который комбинирует сигмоиду и кросс-энтропию. То, что надо.
Код для одной эпохи обучения:
Код для проверки после эпохи:
Если это всё собрать воедино, то получится такой код для обучения модели:
Google Colab
Google предоставляет бесплатный серверный GPU Tesla K80 c 12 Gb видеопамяти (сейчас доступны и TPU, но их настройка немного сложнее). Весь код для Colab должен быть оформлен как jupyter notebook. Чтобы запустить BERT в браузере, просто откройте ссылку
В меню Runtime выберите Run All, чтобы в первый раз запустились все ячейки, скачалась модель и подключились нужные библиотеки. Согласитесь сбросить все Runtime, если потребуется.
Убедитесь, что в меню Runtime -> Change runtime type выбрано GPU и Python 3
Если кнопка подключения не активна, нажмите ее, чтобы стало Connected.
Теперь меняйте входные строки sentence, sentence_1 и sentence_2, и нажимайте слева значок Play для запуска только текущей ячейки. Запускать весь notebook уже не нужно.
Запустить BERT в Google Colab можно даже со смартфона, но если не открывается, может потребоваться включить галку Полная версия в настройках браузера.
Как работает BERT?
Прорывной в работе BERT является его способность обучать языковые модели на основе всего набора слов в приложении или запросе (двунаправленное обучение), тогда как в традиционном обучении анализируется упорядоченная последовательность слов (слева направо или справа налево). BERT позволяет языковой модели понимать контекст слова на основе окружающих его слов, а не только того слова, которое ему предшествует или следует сразу за ним.
Google называет BERT «глубоко двунаправленным», поскольку контекстные представления слов начинаются «с самого низа глубокой нейронной сети».
«Например, слово “bank” будет иметь одинаковое свободное от контекста представление в “bank account” (банковский счёт) и “bank of river” (берег реки). Контекстные модели вместо этого генерируют представления каждого слова, основанные на других словах в предложении. Например, в предложении «I accessed the bank account» (я получил доступ к банковскому счёту) однонаправленная контекстная модель будет представлять “bank” на основе “I accessed the”, но не “account”. При этом BERT представляет “bank”, используя и предыдущий, и следующий контекст: “I accessed the… account”».
Google показал несколько примеров того, как применение BERT в поиске может влиять на результаты. Так, по запросу [math practice books for adults] (учебники по математике для взрослых) в топе поисковой выдачи раньше выводился учебник для 6-8 классов. После запуска BERT в топе SERP находится книга под названием «Math for Grownups» ("Математика для взрослых").
Учебник для 6-8 классов всё ещё выводится на первой странице по этому запросу, но в выдаче также есть две книги, ориентированные именно на взрослых, которые ранжируются выше, включая блок с ответом.
Изменение результатов поиска, подобное приведённому выше, отражает новое понимание запроса с использованием BERT.
Что такое нейронная сеть?
Говоря простым языком, нейронные сети – это алгоритмы, предназначенные для выявления паттернов. Распределение изображений по категориям, распознавание рукописного текста и даже прогнозирование тенденций на финансовых рынках - это обычные области применения нейросетей. Их также используют в работе поисковых систем.
Чтобы распознавать паттерны, нейросети обучаются на наборах данных. Предварительное обучение BERT происходило на корпусе простых текстов из Wikipedia, о чём Google рассказал, когда открыл исходный код технологии.
Обучение BERT-based модели или «учителя»
Прежде всего необходимо обучить «большую» BERT-based модель, которая станет учителем. Самый простой способ это сделать — взять эмбеддинги из BERT и обучить классификатор поверх них, добавив один слой в сеть.
Благодаря библиотеке tranformers сделать это довольно легко, потому что там есть готовый класс модели BertForSequenceClassification. На мой взгляд, самое подробное и понятное руководство по обучению этой модели опубликовал Thilina Rajapakse на Towards Data Science.
Давайте представим, что мы получили обученную модель BertForSequenceClassification. В нашем случае num_labels=2, так как у нас бинарная классификация. Эту модель мы будем использовать в качестве «учителя».
Подробности
В этом разделе вы можете подробнее узнать о наборах данных, обучении, выводе и результатах.
Что такое BERT?
BERT (Bidirectional Encoder Representations from Transformers) – это метод обработки естественного языка, основанный на использовании нейросетей новой архитектуры для работы с последовательностями, известных как «трансформеры». Эта технология помогает Google лучше определять контекст слов в поисковых запросах.
Например, в фразах «nine to five» (от девяти до пяти) и «a quarter to five» (без четверти пять) предлог «to» имеет два разных значения, что очевидно для людей, но менее понятно для поисковых систем. BERT предназначен для разграничения таких нюансов, чтобы облегчить Google формирование более релевантных результатов.
Knowledge distillation как метод ускорения нейронных сетей
Существует несколько способов ускорения/облегчения нейронных сетей. Самый подробный их обзор, который я встречал, опубликован в блоге Intento на Медиуме.
Способы можно грубо разделить на три группы:
- Изменение архитектуры сети.
- Сжатие модели (quantization, pruning).
- Knowledge distillation.
Если первые два способа сравнительно известны и понятны, то третий менее распространён. Впервые идею дистилляции предложил Рич Каруана в статье “Model Compression”. Её суть проста: можно обучить легковесную модель, которая будет имитировать поведение модели-учителя или даже ансамбля моделей. В нашем случае учителем будет BERT, учеником — любая легкая модель.
На какие другие продукты Google может оказывать влияние BERT?
Заявление Google о запуске BERT относится только к поиску, однако это обновление также будет в какой-то мере влиять и на Assistant. Когда по запросам, выполняемым Assistant, возвращаются готовые ответы или результаты из основного поиска, то эти результаты могут подвергаться влиянию BERT.
В комментарии Search Engine Land представитель Google заявил, что в настоящее время BERT не используется для рекламы, но если он будет интегрирован в эту вертикаль в будущем, то это может помочь улучшить некоторые из неудачных близких вариантов, которые мешают рекламодателям.
В чём разница между BERT и RankBrain?
Некоторые из возможностей BERT напоминают первый внедрённый Google метод для понимания запросов на базе ИИ – RankBrain. Но это два отдельных алгоритма, которые могут использоваться для улучшения результатов поиска.
«Первое, что нужно понять о RankBrain, - это то, что он работает параллельно с обычными алгоритмами ранжирования в органическом поиске и используется для корректировки результатов, рассчитанных этими алгоритмами», - отмечает Эрик Энж (Eric Enge), главный менеджер Perficient Digital.
RankBrain корректирует результаты, просматривая текущий запрос и находя похожие прошлые запросы. Затем он проверяет эффективность результатов поиска для этих исторических запросов. «На основании того, что он видит, RankBrain может регулировать вывод результатов обычных алгоритмов ранжирования», - добавил Энж.
RankBrain также помогает Google интерпретировать поисковые запросы, чтобы он мог отображать результаты, которые не содержат тех слов, что есть в запросе. В приведённом ниже примере Google удалось установить, что пользователь ищет информацию об Эйфелевой башне, несмотря на то, что название башни не фигурирует в запросе [высота символа Парижа].
«BERT работает совершенно по-другому», - продолжает Энж. «Традиционные алгоритмы пытаются анализировать контент на странице, чтобы понять, о чём он и к чему он может относиться. При этом традиционные алгоритмы NLP, как правило, способны только просматривать контент перед словом ИЛИ после слова для лучшего понимания значения и релевантности этого слова. Двунаправленный компонент BERT - это то, что его отличает».
Как упоминалось выше, BERT просматривает содержимое до и после слова, чтобы прояснить своё понимание значения и релевантности этого слова. «Это критическое улучшение в обработке естественного языка, поскольку человеческое общение по своей природе многоуровневое и сложное», - отметил Энж.
И BERT, и RankBrain используются Google для обработки запросов и содержимого веб-страниц, чтобы лучше понять, что означают используемые в них слова.
BERT – это не замена RankBrain. Google может использовать несколько методов для понимания запроса, а это значит, что BERT может применяться самостоятельно, наряду с другими алгоритмами Google, в тандеме с RankBrain, в любой комбинации или не использоваться вообще – в зависимости от поискового запроса.
Когда BERT был запущен в поиске Google?
Запуск BERT в поисковой системе Google для запросов на английском языке был начат 21 октября 2019 года.
В будущем Google планирует расширить этот алгоритм на все языки, поддерживаемые поисковой системой, но точного графика у компании пока нет. Модель BERT также используется для улучшения блоков с ответами (featured snippets) в более чем 20 странах.
Установка и настройка
Примечание: в этом разделе мы запустим и поиграемся с BERT на локальном компьютере. Для запуска этой нейронной сети на локальном GPU, вам понадобится NVidia GTX 970 с 4 Гб видеопамяти или выше. Если вы хотите просто запустить BERT в браузере (для этого даже не нужно наличие GPU на компьютере), то перейдите к разделу Google Colab.
В принципе, этого достаточно для запуска BERT. Но инструкции как таковой нет, ее можно самостоятельно составить, разобравшись с исходниками в файле run_classifier.py (обычная ситуация в Machine Learning, когда вместо документации приходится лезть в исходники). Но мы поступим проще и воспользуемся оболочкой Keras BERT (она также может вам пригодится для fine-tuning сети позднее, т.к. дает удобный Keras интерфейс).
Для этого дополнительно установим сам Keras:
И после Keras 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, а остальное до конца вектора заполнить нулями.
Модель BiLSTM
Код для модели будет выглядеть так:
Читайте также: