Введение в BERT

После ELMo (встраивания из языковой модели) и открытого ИИ GPT (генеративный предварительно обученный преобразователь) Google выпускает новый современный документ по НЛП. Они называют этот подход BERT (двунаправленные представления кодировщика от трансформаторов).

И Open AI GPT, и BERT используют архитектуру преобразователя для изучения текстовых представлений. Одно из различий заключается в том, что BERT использует двунаправленный преобразователь (как слева направо, так и справа налево), а не словарный преобразователь (направление слева направо). С другой стороны, оба ELMo используют двунаправленную языковую модель для изучения текстовых представлений. Однако ELMo использует неглубокий слой конкатенации, в то время как BERT использует глубокую нейронную сеть.

Прочитав этот пост, вы поймете:

  • BERT Дизайн и архитектура
  • Модельное обучение
  • Эксперименты
  • Реализация
  • Забрать

BERT Дизайн и архитектура

Входное представление

BERT использует три вложения для вычисления входных представлений. Это встраивание токенов, встраивание сегментов и встраивание позиций. «CLS» - это зарезервированный токен, представляющий начало последовательности, а «SEP» - отдельный сегмент (или предложение). Эти входы

  • Вложения токенов: общие вложения слов. Короче говоря, он использует вектор для представления токена (или слова). Вы можете ознакомиться с этой историей, чтобы узнать подробности.
  • Вложения сегментов: вложения предложений в другое слово. Если ввод включает 2 предложения, соответствующие вложения предложений будут присвоены определенным словам. Если ввод включает только одно предложение, будет использоваться одно и только одно вложение предложения. Вложения сегментов изучаются до вычисления BERT. Что касается встраивания предложений, вы можете ознакомиться с этой историей за подробностями.
  • Встраивание позиций: см. Последовательность ввода токенов. Даже если есть 2 предложения, позиция будет накапливаться.

Задачи обучения

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

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

Первыми задачами предварительной подготовки является использование модели скрытого языка (Masked LM). Вместо традиционной модели направленности BERT использует двунаправленную модель в качестве цели предварительного обучения. Если использовать традиционный подход для обучения двунаправленной модели, каждое слово сможет видеть «себя» косвенно. Поэтому BERT использует подход модели маскированного языка (MLM). Случайным образом маскируя некоторые токены, используя другой токен, чтобы спрогнозировать эти замаскированные токены для изучения представлений. В отличие от других подходов, BERT предсказывает замаскированный токен, а не весь ввод.

Таким образом, эксперимент случайным образом выбирает 15% токенов для замены. Однако есть и недостатки. Первый недостаток заключается в том, что токен MASK (фактический токен будет заменен этим токеном) никогда не будет отображаться на этапе точной настройки и фактического прогнозирования. Следовательно, Devlin et al., Выбранный токен для маскировки не всегда будет маскироваться, а

  • A: 80% времени он будет заменен токеном [MASK]
  • B: 10% времени он будет заменен другим актуальным токеном
  • C: 10% времени, он будет сохранен в оригинале.

Например, исходное предложение - «Я изучаю НЛП». Предполагая, что «NLP» - это выбранный токен для маскировки. Затем в 80% случаев это будет отображаться как «Я изучаю [МАСКУ] (Сценарий A). «Я изучаю OpenCV» в 10% случаев (сценарий B). Остальные 10% времени он будет отображаться как оригинальный, что означает «Я изучаю НЛП» (Сценарий C). Хотя случайная замена (сценарий B) происходит и может повредить смысл предложения. Но это всего лишь 1,5% (всего лишь маскирует 15% токена из всего набора данных и 10% из этих 15%), действительно, авторы считают, что это не повредит модели.

Другим недостатком является то, что маскируется (прогнозируется) только 15% токенов на пакет, поэтому на обучение уходит больше времени.

Предсказание следующего предложения

Второе предтренировочное задание будет предсказывать следующее предложение. Этот подход решает проблему первой задачи, поскольку он не может изучить отношения между предложениями. Задача очень проста. Только классификация, является ли второе предложение следующим предложением или нет. Например,

Вход 1: Я изучаю НЛП.

Ввод 2: NLG является частью NLP.

Ожидаемый результат - isNextSentence или notNextSentence.

При генерации обучающих данных для этой задачи 50% данных notNextSentence будут выбраны случайным образом.

Модельное обучение

В BERT применяется двухэтапное обучение. Использование общего набора данных для выполнения первого обучения и его точной настройки путем предоставления набора данных для конкретной предметной области.

Предтренировочный этап

На этапе подготовки к обучению предложения извлекаются из BooksCorpus (800 млн слов) (Zhu et al., 2015) и английской Википедии (2500 млн слов).

  • Маскированный LM: будет использоваться 512 токенов на последовательность (2 конкатенированных предложения) и 256 последовательностей на пакет. На обучение модели положено около 40 эпох. Конфигурация:
  • Адам со скоростью обучения 1e-4, β1 = 0,9, β2 = 0,999
  • Снижение веса L2 0,01
  • 0,1 отсева для всех слоев
  • Использование gelu для активации

Как описано ранее, для задачи предварительного обучения «предсказание следующего предложения» выбираются два предложения. В 50% случаев другое предложение выбирается случайным образом и помечается как «notNextSentence», а в 50% случаев другое предложение является действительным следующим предложением.

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

Этап точной настройки

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

  • Размер партии: 16, 32
  • Скорость обучения: 5e-5, 3e-5, 2e-5
  • Количество эпох: 3, 4

Процедура тонкой настройки разная и зависит от последующих задач.

Классификация

Для токена [CLS] он будет передаваться как последнее скрытое состояние. Вероятности метки (C) вычисляются с softmax. После этого он настраивается, чтобы максимизировать логарифмическую вероятность правильной метки.

Признание именованных сущностей

Окончательное скрытое представление токена будет передано в слой классификации. Окружающие слова будут учтены при предсказании. Другими словами, классификация сосредоточена только на самом токене, а не на условном случайном поле (CRF).

Эксперименты

Пока что BERT дает лучший результат по сравнению с другими современными моделями НЛП.

Реализация

Модель точной настройки (воспроизвести эксперимент)

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

export BERT_BASE_DIR=/downloaded_model_path/bert
export GLUE_DIR=/downloaded_data_path/glue
export BERT_OUTPUT_DIR=/trained/model/bert/
  • Выполните следующую команду, чтобы начать тонкую настройку
python run_classifier.py \
  --task_name=MRPC \
  --do_train=true \
  --do_eval=true \
  --data_dir=$GLUE_DIR/MRPC \
  --vocab_file=$BERT_BASE_DIR/vocab.txt \
  --bert_config_file=$BERT_BASE_DIR/bert_config.json \
  --init_checkpoint=$BERT_BASE_DIR/bert_model.ckpt \
  --max_seq_length=128 \
  --train_batch_size=32 \
  --learning_rate=2e-5 \
  --num_train_epochs=3.0 \
  --output_dir=$BERT_OUTPUT_DIR
  • Я использовал машину с 20-ядерным процессором, чтобы воспроизвести ее, и потратил около часа на завершение тонкой настройки.
INFO:tensorflow:***** Eval results *****
INFO:tensorflow:  eval_accuracy = 0.84313726
INFO:tensorflow:  eval_loss = 0.5097478
INFO:tensorflow:  global_step = 343
INFO:tensorflow:  loss = 0.5097478

Извлечь фиксированные векторы

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

Вы можете посетить официальную страницу или следуя инструкции к ней.

  • Создать образец файла для текущего направленного
echo 'Who was Jim Henson ? ||| Jim Henson was a puppeteer' > input.txt
  • Выполните следующую команду, чтобы извлечь векторы символов
python extract_features.py \
  --input_file=input.txt \
  --output_file=$BERT_OUTPUT_DIR/output.jsonl \
  --vocab_file=$BERT_BASE_DIR/vocab.txt \
  --bert_config_file=$BERT_BASE_DIR/bert_config.json \
  --init_checkpoint=$BERT_BASE_DIR/bert_model.ckpt \
  --layers=-1,-2,-3,-4 \
  --max_seq_length=128 \
  --batch_size=8
  • Выходной файл содержит следующий объект
- features
  - token: Token value (e.g. Who)
  - layers
    - index: Layer number (from -1 to -4) per token
    - values: Vector values. Default model dimension is 768

Параметр

Будет полезно, если мы разберемся, как можно изменять параметры. Вот некоторые полезные объяснения параметров:

data_dir: Направление данных

task_name: Конкретно, какую задачу вы используете. Процессоры для конкретных задач готовы к использованию. Возможные task_name: «кола», «мнли», «mrpc» и «xnli». Вы можете реализовать свой собственный процессор данных, расширив класс DataProcessor.

do_train: Включите шаг обучения. Любой из do_train, do_eval или do_test должен быть включен.

do_eval: Включите этап оценки. Любой из do_train, do_eval или do_test должен быть включен.

do_test: Включить тестовый шаг. Любой из do_train, do_eval или do_test должен быть включен.

Обо мне

Я специалист по анализу данных в Bay Area. Сосредоточение внимания на новейших достижениях науки о данных, искусственного интеллекта, особенно в области НЛП и связанных с платформами. Вы можете связаться со мной из Medium Blog, LinkedIn или Github.

Ссылка

Девлин Дж., Чанг М. В., Ли К., Тутанова К., 2018. BERT: предварительная подготовка глубоких двунаправленных преобразователей для понимания языка

BERT в Tensorflow (Оригинал)

BERT в PyTorch

BERT в цепочке

Word2vec, glove и fastText Story (вложения слов)

История пропуска мыслей (вложения предложений)

История ELMo

NER Story

Подробное объяснение трансформатора