BERT был притчей во языцех в течение последнего года. Это уникальная техника обработки естественного языка (NLP), исходный код которой был открыт исследователями Google AI Language в конце 2018 года. Это важная инновация, которая покорила мир глубокого обучения благодаря своей выдающейся производительности.

BERT расшифровывается как Двунаправленные представления кодировщика от преобразователей и был разработан для предварительной подготовки глубоких двунаправленных представлений из немаркированных текстовых данных путем обработки всех слоев как в левом, так и в правом контексте. BERT обычно используется для ответов на вопросы и языкового вывода без значительных модификаций архитектуры для конкретных задач. Его цель — создать языковую модель.

BERT концептуально прост и эмпирически мощен.

Сначала я расскажу о теоретических аспектах BERT. Итак, вы можете подумать, зачем на самом деле нужен BERT. Что ж, отсутствие достаточных данных для обучения — одна из самых серьезных проблем в НЛП. Несмотря на то, что доступно огромное количество текстовых данных, мы должны разделить их на множество различных полей, чтобы создать наборы данных для конкретных задач. И когда мы делаем это, мы получаем только несколько тысяч или несколько сотен тысяч помеченных человеком обучающих экземпляров. Увы, модели НЛП, основанные на глубоком обучении, требуют значительно больше данных для хорошей работы — они значительно увеличиваются при обучении на миллионах, если не миллиардах, аннотированных обучающих примеров.

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

Вот почему BERT является таким крупным открытием. Это позволяет более точно предварительно обучать модели с меньшим объемом данных. Еще одним преимуществом BERT является то, что его можно бесплатно загрузить и использовать. Мы можем использовать модели BERT для извлечения высококачественных языковых характеристик из наших текстовых данных, или мы можем точно настроить эти модели для конкретной задачи, такой как анализ настроений и ответы на вопросы, с нашими собственными данными, чтобы обеспечить состояние -художественные предсказания. Поскольку он использует двунаправленный подход, он узнает больше о контексте слова, чем если бы он обучался только в одном направлении. С этой дополнительной информацией он может использовать другую технику, известную как маскирование LM.

Какова основная идея BERT?

По сути, задача языкового моделирования состоит в том, чтобы «заполнить пробел» в зависимости от контекста. До BERT языковая модель рассматривала заданную текстовую последовательность во время обучения либо слева направо, либо в сочетании слева направо и справа налево. Этот однонаправленный подход хорошо работает для создания предложений — мы можем предсказать следующее слово, добавить его к последовательности, а затем предсказать следующее слово, пока не получим полное предложение. Теперь приходит BERT, языковая модель с двунаправленным обучением. Это означает, что теперь мы можем лучше понимать языковой контекст и поток, контрастирующий с однонаправленными языковыми моделями.

Более того, BERT основан на архитектуре модели трансформатора, а не на LSTM. Трансформер работает, повторяя небольшое количество шагов снова и снова. Он использует механизм внимания на каждом этапе, чтобы уловить отношения между всеми словами в предложении, независимо от их положения. Учитывая строку Я прибыл на берег после пересечения реки, Трансформер может научиться сосредотачиваться на слове река и принимать это решение за один шаг.

Какой подход стоит за этим?

BERT зависит от преобразователя (механизм внимания, который изучает контекстные отношения между словами в тексте). Базовый Transformer состоит из кодировщика, который считывает вводимый текст, и декодера, который выдает предсказание задачи. BERT просто требует часть кодировщика, потому что его цель состоит в том, чтобы построить модель языкового представления. Кодировщик для BERT получает последовательность токенов, которые впоследствии преобразуются в векторы и обрабатываются в нейронной сети. Чтобы заставить BERT работать с вашим набором данных, вы должны сначала добавить некоторые метаданные. Внедрение токенов потребуется для обозначения начала и конца предложений. Чтобы иметь возможность различать предложения, необходимы встраивания сегментов. Наконец, позиционные вложения необходимы для определения положения слов в предложении.

Мы используем две разные стратегии для обучения модели:

1. Маскированный ЛМ (МЛМ):

Идея здесь заключается в том, что мы случайным образом маскируем 15% слов во входных данных с помощью токена [MASK], затем запускаем полную последовательность через кодировщик на основе внимания BERT и прогнозируем только замаскированные слова, заданные в контексте, предоставленном другим незамаскированным. слова в последовательности. Однако у этой базовой стратегии маскирования есть недостаток: модель пытается предсказать правильные токены только тогда, когда во входных данных присутствует токен [MASK], в то время как мы хотим, чтобы модель пыталась предсказать правильные токены независимо от того, какой токен присутствует во входных данных. ввод. Чтобы решить эту проблему, среди 15% токенов, выбранных для маскировки:

→80% жетонов фактически заменяются жетоном [MASK].
→ Жетоны заменяются в 10% случаев случайным жетоном.
→ Жетоны остаются неизменными в 10% случаев.

Во время обучения функция потерь BERT рассматривает только предсказания замаскированных токенов и игнорирует предсказания не замаскированных токенов. В результате модель сходится гораздо медленнее, чем модели слева направо или справа налево.

2. Предсказание следующего предложения (NSP):

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

BERT использует специальный токен [SEP] для разделения предложений, как мы видели ранее. Во время обучения модели подаются два входных предложения за раз следующим образом:

Второе предложение появляется в 50 % случаев после первого.
В 50 % случаев это случайное предложение из корпуса.

Чтобы определить, связана ли вторая фраза с первой, вся входная последовательность проходит через модель на основе Transformer, вывод токена [CLS] преобразуется в вектор в форме 2 × 1 с использованием простого слоя классификации и IsNext-Label назначается с помощью softmax.

И Masked LM, и Next Sentence Prediction используются для обучения модели. Цель состоит в том, чтобы уменьшить комбинированную функцию потерь двух методов — «лучше вместе».

Архитектура БЕРТ:

BERT также предлагает четыре типа предварительно обученных версий, в зависимости от масштаба архитектуры модели. Они есть:

BERT-Base, Uncased: 12 слоев, 768 скрытых, 12 заголовков, 110 млн параметров.

BERT-Large, Uncased: 24 слоя, 1024 скрытых, 16 заголовков, 340 млн параметров.

BERT-Base, Cased: 12 уровней, 768 скрытых, 12 заголовков, 110 млн параметров.

BERT-Large, Cased: 24 слоя, 1024 скрытых, 16 заголовков, 340 млн параметров.

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

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

Чтобы начать кодирование, я сначала устанавливаю ktrain, поскольку он не установлен по умолчанию в Google Colab, а затем импортирую некоторые другие библиотеки, такие как os.path, который используется при загрузке набора данных IMDB, а затем импортирую numpy, tensorflow и ktrain. библиотеки.

Импорт библиотек

!pip3 install ktrain
import os.path
import numpy as np
import tensorflow as tf
import ktrain
from ktrain import text

Часть 1: Предварительная обработка данных

Загрузка набора данных IMDB

Набор данных выбирается непосредственно с веб-сайта stanford.edu, затем набор данных загружается с помощью библиотеки keras через get_file. Затем мы переходим к пути к папке каталога, ведущему к набору данных, а затем распечатываем его.

dataset = tf.keras.utils.get_file(fname="aclImdb_v1.tar.gz",origin="http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz",extract=True)
IMDB_DATADIR = os.path.join(os.path.dirname(dataset), 'aclImdb')
print(os.path.dirname(dataset))
print(IMDB_DATADIR)

Создание обучающих и тестовых наборов

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

(x_train, y_train), (x_test, y_test), preproc = text.texts_from_folder(datadir=IMDB_DATADIR,
                       classes=['pos','neg'],
                       maxlen=500,
                       train_test_names=['train','test'],
                       preprocess_mode='bert')

Часть 2: Построение модели BERT

В этой строке кода модель будет собирать то, что будет получено функцией text_classifier из текстового модуля, и строит модель BERT.

model = text.text_classifier(name='bert',
                             train_data=(x_train, y_train),  
                             preproc=preproc)

Часть 3: Обучение модели BERT

Этот код содержит функцию get_learner(), взятую из библиотеки ktrain и обучающую модель BERT.

learner = ktrain.get_learner(model=model,
                             train_data=(x_train,y_train),
                             val_data=(x_test, y_test),batch_size=6)
                             learner.fit_onecycle(lr=2e-5,epochs=1)
learner.fit_onecycle(lr=2e-5,epochs=1)

Это будет выход модели BERT. Мы получаем точность 94,01% для набора данных IMDB.

Заключение:

BERT — это очень сложная модель языкового представления, которая стала важной вехой в области НЛП — она существенно расширила наши возможности по переносу обучения в НЛП. BERT все еще очень новый, он был запущен только в 2018 году, но он уже доказал свою точность, чем предыдущие модели, несмотря на то, что он медленнее. Если вы хотите попасть в модель BERT, просто пройдите оригинальную бумагу.