Изменения

Перейти к: навигация, поиск

BERT (языковая модель)

506 байт добавлено, 24 январь
м
russian comments
=== Представление данных ===
[[Файл:BERT_input-repr.png|450px|thumb|right|Рис.Рисунок 1, представление входных данных модели]]
При подаче текста на вход сети сначала выполняется его [[Обработка_естественного_языка#.D0.9F.D1.80.D0.B5.D0.B4.D0.BE.D0.B1.D1.80.D0.B0.D0.B1.D0.BE.D1.82.D0.BA.D0.B0_.D1.82.D0.B5.D0.BA.D1.81.D1.82.D0.B0 | токенизация]]. Токенами служат слова, доступные в словаре, или их составные части {{---}} если слово отсутствует в словаре, оно разбивается на части, которые в словаре присутствуют (см. рис. 1).
Словарь является составляющей модели {{---}} так, в BERT-Base<ref>[https://github.com/google-research/bert#bert Github — Google Research — BERT]</ref> используется словарь около 30,000 слов.
=== Предобучение ===
[[Файл:BERT_pre-training.png|350px|thumb|right|Рис.Рисунок 2, Схема этапа предобучения BERT]]
BERT обучается одновременно на двух задачах {{---}} предсказания следующего предложения (англ. ''next sentence prediction'') и генерации пропущенного токена (англ. ''masked language modeling''). На вход BERT подаются токенизированные пары предложений, в которых некоторые токены скрыты (см. рис. 2). Таким образом, благодаря маскированию токенов, сеть обучается глубокому двунаправленному представлению языка, учится понимать контекст предложения. Задача же предсказания следующего предложения есть задача бинарной классификации {{---}} является ли второе предложение продолжением первого. Благодаря ей сеть можно обучить различать наличие связи между предложениями в тексте.
=== Данные и оценка качества ===
Предобучение ведётся на текстовых данных корпуса BooksCorpus<ref>[https://arxiv.org/abs/1506.06724 Aligning Books and Movies: Towards Story-like Visual Explanations by Watching Movies and Reading Books]</ref> (800 млн. слов), а также на текстах англоязычной [https://www.wikipedia.org/ Википедии] (2.5 млрд. слов).
Качество модели авторы оценивают на популярном для обучения моделей [[Обработка_естественного_языка | обработки естественного языка]] наборе задач [https://gluebenchmark.com/tasks GLUE].<ref>[https://arxiv.org/abs/1804.07461 GLUE: A Multi-Task Benchmark and Analysis Platform for Natural Language Understanding]</ref>.
== Реализация ==
В [https://github.com/google-research/bert#bert репозитории] Google Research доступны для загрузки и использования несколько вариантов обученной сети в формате контрольных точек обучения модели популярного фреймворка TensorFlow<ref>[https://www.tensorflow.org/ TensorFlow]</ref>. В таблице в репозитории приведено соответствие параметров <tex>L</tex> и <tex>H</tex> и моделей. Использование моделей с малыми значениями гиперпараметров на устройствах с меньшей вычислительной мощностью позволяет сохранять баланс между производительностью и потреблением ресурсов. Также представлены модели с различным типом скрытия токенов при обучении, доступны два варианта: скрытие слова целиком (англ. ''whole word masking'') или скрытие составных частей слов (англ. ''WordPiece masking'').
Также модель доступна для использования с помощью популярной библиотеки PyTorch.<ref>[https://pytorch.org/ PyTorch]</ref>.
=== Пример использования ===
 Приведём пример предказания пропущенного токена при помощи BERT в составе PyTorch: '''import''' torch<font color=darkgreen># Загрузка токенизатора и входные данные</font>
tokenizer = torch.hub.load('huggingface/pytorch-transformers', 'tokenizer', 'bert-base-cased')
text_1 = "Who was Jim Henson ?"
text_2 = "Jim Henson was a puppeteer"
<font color=darkgreen># Tokenized input with special tokens around it (for BERT: [CLS] at the beginning and [SEP] at the end)Токенизация ввода, также добавляются специальные токены начала и конца предложения.</font>
indexed_tokens = tokenizer.encode(text_1, text_2, add_special_tokens=True)
segments_ids = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1]
<font color=darkgreen># Convert inputs to Конвертирвание ввода в формат тензоров PyTorch tensors</font>
segments_tensors = torch.tensor([segments_ids])
tokens_tensor = torch.tensor([indexed_tokens])
  with torch.no_grad(): encoded_layers, _ = model(tokens_tensor, token_type_ids=segments_tensors)
<font color=darkgreen># Mask a token that we will try to predict back with BertForMaskedLMВыбираем токен, который будет скрыт и позднее предсказан моделью</font>
masked_index = 8
indexed_tokens[masked_index] = tokenizer.mask_token_id
tokens_tensor = torch.tensor([indexed_tokens])
<font color=darkgreen># Загрузка модели</font>
masked_lm_model = torch.hub.load('huggingface/pytorch-transformers', 'modelWithLMHead', 'bert-base-cased')
with torch.no_grad(): predictions = masked_lm_model(tokens_tensor, token_type_ids=segments_tensors)
<font color=darkgreen># Get the predicted tokenПредсказание скрытого токена</font>
predicted_index = torch.argmax(predictions[0][0], dim=1)[masked_index].item()
predicted_token = tokenizer.convert_ids_to_tokens([predicted_index])[0]
8
правок

Навигация