BERT (языковая модель) — различия между версиями
м (rollbackEdits.php mass rollback) |
|||
(не показано 5 промежуточных версий 2 участников) | |||
Строка 1: | Строка 1: | ||
− | '''BERT''' (англ. '''B'''idirectional '''E'''ncoder '''R'''epresentations from '''T'''ransformers) — языковая модель, основанная на архитектуре | + | '''BERT''' (англ. '''B'''idirectional '''E'''ncoder '''R'''epresentations from '''T'''ransformers) — языковая модель, основанная на архитектуре [https://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%B0%D0%BD%D1%81%D1%84%D0%BE%D1%80%D0%BC%D0%B5%D1%80_(%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BC%D0%B0%D1%88%D0%B8%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8F) трансформер], предназначенная для предобучения языковых представлений с целью их последующего применения в широком спектре задач [[Обработка_естественного_языка | обработки естественного языка]]. |
− | |||
− | |||
+ | == Модель и архитектура == | ||
BERT представляет собой нейронную сеть, основу которой составляет композиция ''кодировщиков'' трансформера. BERT является [[Автокодировщик | автокодировщиком]]. | BERT представляет собой нейронную сеть, основу которой составляет композиция ''кодировщиков'' трансформера. BERT является [[Автокодировщик | автокодировщиком]]. | ||
+ | В каждом слое кодировщика применяется двустороннее [[Механизм_внимания | внимание]], что позволяет модели учитывать контекст с обеих сторон от рассматриваемого токена, а значит, точнее определять значения токенов. | ||
=== Представление данных === | === Представление данных === | ||
− | + | [[Файл:BERT_input-repr.png|450px|thumb|right|Рисунок 1. Представление входных данных модели]] | |
− | [[Файл:BERT_input-repr.png|450px|thumb|right| | + | При подаче текста на вход сети сначала выполняется его [[Обработка_естественного_языка#.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-Base<ref>[https://github.com/google-research/bert Github — Google Research — BERT]</ref> используется словарь около 30,000 слов. | ||
В самой нейронной сети токены кодируются своими [[Векторное_представление_слов | векторными представлениями]] (англ. ''embeddings''), а именно, соединяются представления самого токена (предобученные), номера его предложения, а также позиции токена внутри своего предложения. Входные данные поступают на вход и обрабатываются сетью параллельно, а не последовательно, но информация о взаимном расположении слов в исходном предложении сохраняется, будучи включённой в позиционную часть эмбеддинга соответствующего токена. | В самой нейронной сети токены кодируются своими [[Векторное_представление_слов | векторными представлениями]] (англ. ''embeddings''), а именно, соединяются представления самого токена (предобученные), номера его предложения, а также позиции токена внутри своего предложения. Входные данные поступают на вход и обрабатываются сетью параллельно, а не последовательно, но информация о взаимном расположении слов в исходном предложении сохраняется, будучи включённой в позиционную часть эмбеддинга соответствующего токена. | ||
− | Выходной слой основной сети имеет следующий вид: поле, отвечающее за ответ в задаче | + | Выходной слой основной сети имеет следующий вид: поле, отвечающее за ответ в задаче предсказания следующего предложения, а также токены в количестве, равном входному. |
Обратное преобразование токенов в вероятностное распределение слов осуществляется полносвязным слоем с количеством нейронов, равным числу токенов в исходном словаре. | Обратное преобразование токенов в вероятностное распределение слов осуществляется полносвязным слоем с количеством нейронов, равным числу токенов в исходном словаре. | ||
− | |||
== Обучение == | == Обучение == | ||
=== Предобучение === | === Предобучение === | ||
− | [[Файл:BERT_pre-training.png|350px|thumb|right|Схема этапа предобучения BERT]] | + | [[Файл:BERT_pre-training.png|350px|thumb|right|Рисунок 2. Схема этапа предобучения BERT]] |
− | BERT обучается одновременно на двух задачах {{---}} предсказания следующего предложения (англ. ''next sentence prediction'') и генерации пропущенного токена (англ. ''masked language modeling''). На вход BERT подаются токенизированные пары предложений, в которых некоторые токены скрыты. Таким образом, благодаря маскированию токенов, сеть обучается глубокому двунаправленному представлению языка, учится понимать контекст предложения. Задача же предсказания следующего предложения есть задача бинарной классификации {{---}} является ли второе предложение продолжением первого. Благодаря ей сеть можно обучить различать наличие связи | + | BERT обучается одновременно на двух задачах {{---}} предсказания следующего предложения (англ. ''next sentence prediction'') и генерации пропущенного токена (англ. ''masked language modeling''). На вход BERT подаются токенизированные пары предложений, в которых некоторые токены скрыты (см. рис. 2). Таким образом, благодаря маскированию токенов, сеть обучается глубокому двунаправленному представлению языка, учится понимать контекст предложения. Задача же предсказания следующего предложения есть задача бинарной классификации {{---}} является ли второе предложение продолжением первого. Благодаря ей сеть можно обучить различать наличие связи между предложениями в тексте. |
Интерпретация этапа предобучения {{---}} обучение модели языку. | Интерпретация этапа предобучения {{---}} обучение модели языку. | ||
Строка 30: | Строка 28: | ||
Интерпретация этапа fine-tuning {{---}} обучение решению конкретной задачи при уже имеющейся общей модели языка. | Интерпретация этапа fine-tuning {{---}} обучение решению конкретной задачи при уже имеющейся общей модели языка. | ||
+ | |||
+ | === Гиперпараметры === | ||
+ | Гиперпараметрами модели являются <tex>H</tex> {{---}} размерность скрытого пространства кодировщика, <tex>L</tex> {{---}} количество слоёв-кодировщиков, <tex>A</tex> {{---}} количество голов<ref>[https://arxiv.org/abs/2006.16362 Multi-Head Attention: Collaborate Instead of Concatenate]</ref> в [[Механизм_внимания | механизме внимания]]. | ||
+ | === Данные и оценка качества === | ||
+ | Предобучение ведётся на текстовых данных корпуса 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. Скрытый токен {{---}} первое слово второго предложения. | ||
+ | <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># Токенизация ввода, также добавляются специальные токены начала и конца предложения.</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># Конвертирвание ввода в формат тензоров PyTorch</font> | ||
+ | segments_tensors = torch.tensor([segments_ids]) | ||
+ | tokens_tensor = torch.tensor([indexed_tokens]) | ||
+ | encoded_layers, _ = model(tokens_tensor, token_type_ids=segments_tensors) | ||
+ | |||
+ | <font color=darkgreen># Выбираем токен, который будет скрыт и позднее предсказан моделью</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') | ||
+ | predictions = masked_lm_model(tokens_tensor, token_type_ids=segments_tensors) | ||
+ | |||
+ | <font color=darkgreen># Предсказание скрытого токена</font> | ||
+ | predicted_index = torch.argmax(predictions[0][0], dim=1)[masked_index].item() | ||
+ | predicted_token = tokenizer.convert_ids_to_tokens([predicted_index])[0] | ||
+ | assert predicted_token == 'Jim' | ||
+ | |||
== Возможности == | == Возможности == | ||
+ | === Преимущества === | ||
+ | В отличие от прежних классических языковых моделей, BERT обучает контексто-зависимые представления. Например, [[Векторное_представление_слов#word2vec | word2vec]]<ref>[https://code.google.com/archive/p/word2vec word2vec] </ref> генерирует единственный эмбеддинг для одного слова, даже если слово многозначное и его смысл зависит от контекста. Использование BERT же позволяет учитывать окружающий контекст предложения, и генерировать различные эмбеддинги в таких случаях. | ||
− | + | Контексто-зависимые модели в основном позволялют учитывать лишь левый или правый контекст токена. BERT же учитывает двусторонний контекст, что помогает модели лучше понимать смысл многозначных слов. | |
+ | |||
+ | === Применение === | ||
+ | В 2019 году компания Google объявила об использовании BERT для анализа англоязычных поисковых запросов.<ref>[https://www.blog.google/products/search/search-language-understanding-bert/ Google Blog — Understanding searches better than ever before]</ref> В конце того же года также было начато использование модели в алгоритме поиска на других языках.<ref>[https://www.searchenginejournal.com/google-bert-rolls-out-worldwide/339359/ Search Engine Journal — Google's BERT Rolls Out Worldwide]</ref> | ||
== См. также == | == См. также == | ||
Строка 44: | Строка 90: | ||
# [https://arxiv.org/abs/1810.04805 BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding] {{---}} Оригинальная статья | # [https://arxiv.org/abs/1810.04805 BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding] {{---}} Оригинальная статья | ||
# [https://en.wikipedia.org/wiki/BERT_(language_model) BERT (language model)] {{---}} статья в англоязычной Википедии | # [https://en.wikipedia.org/wiki/BERT_(language_model) BERT (language model)] {{---}} статья в англоязычной Википедии | ||
+ | |||
+ | [[Категория: Машинное обучение]] | ||
+ | [[Категория: Обработка естественного языка]] |
Текущая версия на 19:08, 4 сентября 2022
BERT (англ. Bidirectional Encoder Representations from Transformers) — языковая модель, основанная на архитектуре трансформер, предназначенная для предобучения языковых представлений с целью их последующего применения в широком спектре задач обработки естественного языка.
Содержание
Модель и архитектура
BERT представляет собой нейронную сеть, основу которой составляет композиция кодировщиков трансформера. BERT является автокодировщиком. В каждом слое кодировщика применяется двустороннее внимание, что позволяет модели учитывать контекст с обеих сторон от рассматриваемого токена, а значит, точнее определять значения токенов.
Представление данных
При подаче текста на вход сети сначала выполняется его токенизация. Токенами служат слова, доступные в словаре, или их составные части — если слово отсутствует в словаре, оно разбивается на части, которые в словаре присутствуют (см. рис. 1). Словарь является составляющей модели — так, в BERT-Base[1] используется словарь около 30,000 слов. В самой нейронной сети токены кодируются своими векторными представлениями (англ. embeddings), а именно, соединяются представления самого токена (предобученные), номера его предложения, а также позиции токена внутри своего предложения. Входные данные поступают на вход и обрабатываются сетью параллельно, а не последовательно, но информация о взаимном расположении слов в исходном предложении сохраняется, будучи включённой в позиционную часть эмбеддинга соответствующего токена.
Выходной слой основной сети имеет следующий вид: поле, отвечающее за ответ в задаче предсказания следующего предложения, а также токены в количестве, равном входному. Обратное преобразование токенов в вероятностное распределение слов осуществляется полносвязным слоем с количеством нейронов, равным числу токенов в исходном словаре.
Обучение
Предобучение
BERT обучается одновременно на двух задачах — предсказания следующего предложения (англ. next sentence prediction) и генерации пропущенного токена (англ. masked language modeling). На вход BERT подаются токенизированные пары предложений, в которых некоторые токены скрыты (см. рис. 2). Таким образом, благодаря маскированию токенов, сеть обучается глубокому двунаправленному представлению языка, учится понимать контекст предложения. Задача же предсказания следующего предложения есть задача бинарной классификации — является ли второе предложение продолжением первого. Благодаря ей сеть можно обучить различать наличие связи между предложениями в тексте.
Интерпретация этапа предобучения — обучение модели языку.
Точная настройка (Fine-tuning)
Этот этап обучения зависит от задачи, и выход сети, полученной на этапе предобучения, может использоваться как вход для решаемой задачи. Так, например, если решаем задачу построения вопросно-ответной системы, можем использовать в качестве ответа последовательность токенов, следующую за разделителем предложений. В общем случае дообучаем модель на данных, специфичных задаче: знание языка уже получено на этапе предобучения, необходима лишь коррекция сети.
Интерпретация этапа fine-tuning — обучение решению конкретной задачи при уже имеющейся общей модели языка.
Гиперпараметры
Гиперпараметрами модели являются [2] в механизме внимания.
— размерность скрытого пространства кодировщика, — количество слоёв-кодировщиков, — количество головДанные и оценка качества
Предобучение ведётся на текстовых данных корпуса BooksCorpus[3] (800 млн. слов), а также на текстах англоязычной Википедии (2.5 млрд. слов). Качество модели авторы оценивают на популярном для обучения моделей обработки естественного языка наборе задач GLUE.[4]
Реализация
В репозитории Google Research доступны для загрузки и использования несколько вариантов обученной сети в формате контрольных точек обучения модели популярного фреймворка TensorFlow[5]. В таблице в репозитории приведено соответствие параметров и и моделей. Использование моделей с малыми значениями гиперпараметров на устройствах с меньшей вычислительной мощностью позволяет сохранять баланс между производительностью и потреблением ресурсов. Также представлены модели с различным типом скрытия токенов при обучении, доступны два варианта: скрытие слова целиком (англ. whole word masking) или скрытие составных частей слов (англ. WordPiece masking).
Также модель доступна для использования с помощью популярной библиотеки PyTorch.[6]
Пример использования
Приведём пример предказания пропущенного токена при помощи BERT в составе PyTorch. Скрытый токен — первое слово второго предложения.
# Загрузка токенизатора и входные данные tokenizer = torch.hub.load('huggingface/pytorch-transformers', 'tokenizer', 'bert-base-cased') text_1 = "Who was Jim Henson ?" text_2 = "Jim Henson was a puppeteer" # Токенизация ввода, также добавляются специальные токены начала и конца предложения. 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] # Конвертирвание ввода в формат тензоров PyTorch segments_tensors = torch.tensor([segments_ids]) tokens_tensor = torch.tensor([indexed_tokens]) encoded_layers, _ = model(tokens_tensor, token_type_ids=segments_tensors) # Выбираем токен, который будет скрыт и позднее предсказан моделью masked_index = 8 indexed_tokens[masked_index] = tokenizer.mask_token_id tokens_tensor = torch.tensor([indexed_tokens]) # Загрузка модели masked_lm_model = torch.hub.load('huggingface/pytorch-transformers', 'modelWithLMHead', 'bert-base-cased') predictions = masked_lm_model(tokens_tensor, token_type_ids=segments_tensors) # Предсказание скрытого токена predicted_index = torch.argmax(predictions[0][0], dim=1)[masked_index].item() predicted_token = tokenizer.convert_ids_to_tokens([predicted_index])[0] assert predicted_token == 'Jim'
Возможности
Преимущества
В отличие от прежних классических языковых моделей, BERT обучает контексто-зависимые представления. Например, word2vec[7] генерирует единственный эмбеддинг для одного слова, даже если слово многозначное и его смысл зависит от контекста. Использование BERT же позволяет учитывать окружающий контекст предложения, и генерировать различные эмбеддинги в таких случаях.
Контексто-зависимые модели в основном позволялют учитывать лишь левый или правый контекст токена. BERT же учитывает двусторонний контекст, что помогает модели лучше понимать смысл многозначных слов.
Применение
В 2019 году компания Google объявила об использовании BERT для анализа англоязычных поисковых запросов.[8] В конце того же года также было начато использование модели в алгоритме поиска на других языках.[9]
См. также
Примечания
- ↑ Github — Google Research — BERT
- ↑ Multi-Head Attention: Collaborate Instead of Concatenate
- ↑ Aligning Books and Movies: Towards Story-like Visual Explanations by Watching Movies and Reading Books
- ↑ GLUE: A Multi-Task Benchmark and Analysis Platform for Natural Language Understanding
- ↑ TensorFlow
- ↑ PyTorch
- ↑ word2vec
- ↑ Google Blog — Understanding searches better than ever before
- ↑ Search Engine Journal — Google's BERT Rolls Out Worldwide
Источники информации
- BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding — Оригинальная статья
- BERT (language model) — статья в англоязычной Википедии