BERT

Материал из Материалы по машинному обучению
Перейти к: навигация, поиск

BERT -- Bidirectional Encoder Representations from Transformers. Официальное описание (GitHub): BERT is a method of pre-training language representations, meaning that we train a general-purpose "language understanding" model on a large text corpus (like Wikipedia), and then use that model for downstream NLP tasks that we care about (like question answering). BERT outperforms previous methods because it is the first unsupervised, deeply bidirectional system for pre-training NLP.

BERT was built upon recent work in pre-training contextual representations — including Semi-supervised Sequence Learning, Generative Pre-Training, ELMo, and ULMFit — but crucially these models are all unidirectional or shallowly bidirectional. This means that each word is only contextualized using the words to its left (or right). For example, in the sentence “I made a bank deposit” the unidirectional representation of “bank” is only based on “I made a” but not “deposit”. Some previous work does combine the representations from separate left-context and right-context models, but only in a "shallow" manner. BERT represents "bank" using both its left and right context — “I made a ... deposit” — starting from the very bottom of a deep neural network, so it is deeply bidirectional.

BERT uses a simple approach for this: We mask out 15% of the words in the input, run the entire sequence through a deep bidirectional Transformer encoder, and then predict only the masked words.

Исходный код работает на Tensorflow.

Сторонние библиотеки

pytorch-pretrained-BERT - PyTorch-имплементация
bert-as-language-model - использование BERT в качестве языковой модели
bert-as-service - позволяет получать векторы для предложений
bert-embedding - выдаёт векторы для отдельных слов
ner-bert - библиотека для выделения именованных сущностей от Сбербанка

Использование

Для работы с русским языком доступна предобученная модель “BERT-Base, Multilingual Cased” (использование Uncased-модели с нелатинскими алфавитами не рекомендовано).

Процесс дообучения описан в документации на GitHub на примере XNLI-датасета (он представляет собой корпус SNLI/MultiNLI, переведённый на 15 языков). Однако этот способ имеет ограничения: 1. при создании обучающего датасета использован машинный перевод 2. «из коробки» BERT поддерживает обучение на XNLI, но не тестирование классификатора (таким образом, для того, чтобы проверить результат, необходимо изменить исходный код).

Процесс создания датасета, предобучения модели и использования классификатора описан в документации на GitHub. Сохранение модели происходит в формате tensorflow checkpoint (.ckpt), данные для обучения готовятся в формате .tsv и с помощью скрипта create_pretraining_data автоматически конвертируются в формат tfrecord, который и подаётся на вход при обучении. При обучении с нуля на собственном словаре, необходимо вручную прописать его размер в параметре vocab_size в файле bert_config.json. При обучении на основе существующего чекпоинта, необходимо уменьшить параметр learning_rate, по сравнению со значением, использованным в оригинальной работе (к примеру, до 2e-5).

Классификатор «из коробки» поддерживает следующие корпуса:

- MRPC 
- MNLI
- COLA

Считывание данных производится классом DataProcessor и его «потомками» в run_classifier. Каждый из классов предназначен для обработки строго определённого формата данных, поэтому для сторонних наборов данных необходимо создавать свои процессоры, по аналогии с существующими.

Материалы и ссылки

  1. https://en.wikipedia.org/wiki/BERT_(language_model)
  2. BERT — state-of-the-art языковая модель для 104 языков. Туториал по запуску BERT локально и на Google Colab - https://habr.com/ru/post/436878/
  3. Оригинальная статья: BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding https://arxiv.org/pdf/1810.04805.pdf
  4. Оригинальные исходники: https://github.com/google-research/bert
  5. The Illustrated BERT, ELMo, and co. (How NLP Cracked Transfer Learning) http://jalammar.github.io/illustrated-bert/
  6. Исходники https://github.com/xu-song/bert-as-language-model