Подробный BERT (с введением ELMo, GPT)

искусственный интеллект алгоритм

Это 29-й день моего участия в августовском испытании обновлений. Ознакомьтесь с подробностями мероприятия: Испытание августовского обновления

Сначала я подробно расскажу о принципе BERT, а затем кратко расскажу об ELMO и GPT.

Подробное объяснение BERT

Полное имя БЕРТBidirectional Encoder Representation from Transformer, является неконтролируемое использование компанией GoogleБез меткиЯзыковая модель "рафинированного" текста, его архитектура - Кодировщик в Трансформере (BERT=Кодировщик Трансформера)

я здесьДетали трансформатораВсе концепции, связанные с Transformer, были подробно объяснены в , поэтому я не буду повторять их здесь.

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

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

С течением времени у многих людей, естественно, возникает эта идея, и BERT является одним из примеров воплощения этой концепции на практике.

Google предварительно обучил BERT, чтобы он выполнял две задачи одновременно:

  1. Заполните пропуски (cloze), академическая точка зренияMasked Language Model
  2. Определить, связано ли второе предложение с первым предложением в исходном тексте (Next Sentence Prediction)

Для обычного человека очень просто выполнить обе задачи. Просто взглянитеконтекстПросто знайте, что задача закрыть[MASK]следует заполнить退了醒醒吧с последующим你没有妹妹также очень разумно

Далее я подробно опишу детали дизайна этих двух задач в документе.

Задача 1 языковой модели BERT: Маскированная языковая модель

В BERT Masked LM (Masked Language Model) создает языковую модель, которая простоСлучайно замаскировать или заменитьЛюбое слово или слово в предложении, а затем пусть модель предскажет, какая часть покрыта или заменена контекстом, а затемПри выполнении Убытка рассчитывается только Убыток покрываемой части., это на самом деле очень простая для понимания задача, фактическая операция выглядит следующим образом:

  1. Случайным образом замените 15% токенов (слов или слов) в предложении следующим:
    1. Эти жетоны с вероятностью 80% будут заменены на[MASK], например, моя собака волосатая → моя собака [МАСКА]
    2. Существует 10% вероятность замены на любой другой токен, например моя собака волосатая → моя собака яблоко
    3. Есть 10% шанс, что он останется целым, например, моя собака волосатая → моя собака волосатая
  2. Тогда пусть модельПрогнозировать и восстанавливатьДля той части, которая покрыта или заменена, при расчете потерь она рассчитывается только на первом этапе.Случайно замаскировать или заменитьЧасть

Преимущество этого в том, что BERT не знает, какое слово [MASK] заменяет, и любое слово может быть заменено, например, яблоко, которое он видит, может быть замененным словом. Это заставляет модель не слишком полагаться на текущее слово при кодировании слова в текущий момент, а учитывать его контекст и даже выполнять «исправление ошибок» в соответствии с контекстом. Например, в приведенном выше примере, когда модель кодирует яблоко, в соответствии с контекстом, которым является моя собака, она должна кодировать яблоко в волосатой семантике вместо семантики яблока.

Языковая модель BERT, задача 2: прогнозирование следующего предложения

Сначала мы получаем пару предложений, которые принадлежат контексту, то есть два предложения, а затем нам нужно добавить к этим двум предложениям какие-то специальные токены:[CLS]上一句话[SEP]下一句话[SEP]. то есть добавить[CLS], добавить между и в конце двух предложений[SEP], в частности, как показано на следующем рисунке

Видно, что два предложения на картинке выше явно непрерывны. Если есть такое слово сейчас[CLS]我的狗很可爱[SEP]企鹅不擅长飞行[SEP], видно, что эти два предложения не являются непрерывными. В реальном обучении мы сделаем количество этих двух случаев равным1:1

Token Embeddingэто обычный вектор слов, то есть в PyTorchnn.Embedding()

Segment EmbeddingФункция состоит в том, чтобы использовать информацию о встраивании, чтобы модель разделяла верхние и нижние предложения Мы даем токену предыдущего предложения все 0, а токену следующего предложения все 1, чтобы модель могла судить о начальной и конечной позициях. верхних и нижних предложений, например

[CLS]我的狗很可爱[SEP]企鹅不擅长飞行[SEP]
 0   0 0 0 0 0 0 0  1 1 1 1 1 1 1 1

Position EmbeddingВ отличие от Трансформера, это не тригонометрическая функция, а заученная

Multi-Task Learning

Этап предварительной подготовки BERT фактически объединяет две вышеупомянутые задачи, а затем добавляет все потери, такие как

Input:
[CLS] calculus is a branch of math [SEP] panda is native to [MASK] central china [SEP]

Targets: false, south
----------------------------------
Input:
[CLS] calculus is a [MASK] of math [SEP] it [MASK] developed by newton and leibniz [SEP]

Targets: true, branch, was

Fine-Tuning

Тонкая настройка BERT разделена на 4 типа.Следующий контент и изображения предоставлены преподавателем Национального тайваньского университета Ли Хунъи.Курсы по машинному обучению(Следующее содержимое изображено выше, объяснено ниже)

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

Здесь г-н Ли Хунъи не упомянул одну вещь, именно поэтому используется первая позиция, то есть[CLS]Вывод локации. Здесь я читаю некоторые блоги в Интернете и объясняю это, исходя из собственного понимания. Поскольку BERT — это Трансформер, а Трансформер — это Самовнимание, поэтому[CLS]Вывод должен содержать полную информацию всего предложения, что не вызывает сомнений. Однако в векторе Само-Внимание ценность себя и себя на самом деле наибольшая, и теперь предполагается использованиеw1w_1Результат классифицируется, тогда этот результат будет на самом деле более ценнымw1w_1w1w_1Это еще одно слово или слово с практическим значением, которое неизбежно повлияет на конечный результат. но[CLS]бессмысленно, просто заполнитель, поэтому даже если[CLS]Не имеет значения, если ваше собственное значение в выводе составляет большую часть. Конечно, вы также можете объединить вывод всех слов в качестве окончательного вывода.

Если текущая задачаSlot Filling, вывод соответствующей позиции каждого слова в предложении отправляется в разные Linear, и прогнозируется метка слова. На самом деле это проблема классификации, но для каждого слова должна быть предсказана категория.

Если текущая задачаNLI (вывод естественного языка). То есть, учитывая предпосылку, а затем выдвигая гипотезу, модель должна оценить, верна ли гипотеза, неверна или неизвестна. По сути, это проблема трех категорий, аналогичная случаю 1, да.[CLS]Результат можно предсказать

Если текущая задача QA (вопрос и ответ), например, как показано на рисунке выше, отправить в модель статью и вопрос (пример здесь относительно простой, ответ обязательно появится в статье), модель выведет два числа s, e, эти два числа означают, что ответ на этот вопрос попадает с s-го слова на eth-слово в статье. Для конкретного процесса мы можем увидеть следующую картину

Сначала пропустите вопрос и статью через[SEP]После разделения и подачи в BERT получается желтый результат на рисунке выше. На этом этапе нам также нужно обучить два вектора, оранжевый и желтый на рисунке выше. Сначала произведите скалярное произведение оранжевого и всех желтых векторов, а затем передайте softmax, чтобы увидеть, какой вывод имеет наибольшее значение, например, как на картинке выше.d2d_2Соответствующая выходная вероятность наибольшая, тогда мы считаем, что s=2

Точно так же мы берем скалярное произведение синего вектора и всех желтых векторов, и окончательный прогнозd3d_3имеет наибольшую вероятность, поэтому e=3. В конечном итоге ответ s=2,e=3

Вы можете подумать, что здесь есть проблема, что, если окончательный вывод s>e, разве это не противоречие? На самом деле в некоторых обучающих наборах некоторые вопросы не имеют ответов, поэтому прогноз на данный момент может быть верным, то есть ответа нет.

Выше приведено подробное введение BERT, см. следующие статьи.

ELMo

ЭЛМО этоEmbedding from Language Modelаббревиатура отнеконтролируемыйспособ предварительной подготовки языковых моделей для изучения представлений слов

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

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

В частности, для предложения длины N, скажем,t1,t2,,tNt_1, t_2,…, t_N, языковая модель вычисляет заданноеt1,t2,,tk1т_1,т_2,…,т_{к-1}происходит в условияхtkt_kВероятность:

p(t1,...,tN)=i=1kp(tkt1,...,tk1)p(t_1,...,t_N)=\prod_{i=1}^{k}p(t_k\mid t_1,...,t_{k-1})

Традиционная модель N-грамм не может учитывать долгую историю, поэтому в настоящее время основным направлением является использование многоуровневого двунаправленного LSTM. сейчасkk, первый из LSTMjjСлой выведет скрытое состояниеhkj\overrightarrow{h_{kj}}j=1,...,Lj=1,...,L,LLколичество слоев LSTM. Верхний слойhkL\overrightarrow{h_{kL}}, вероятность выходного слова получается после его софтмаксирования

Точно так же мы можем использовать обратный LSTM для вычисления вероятностей:

p(t1,...,tN)=i=1kp(tktk+1,...,tN)p(t_1,...,t_N)=\prod_{i=1}^{k}p(t_k\mid t_{k+1},...,t_N)

С помощью этого LSTM мы можем получитьhkj\overleftarrow{h_{kj}}. Наша функция потерь представляет собой сумму этих двух LSTM.

L=i=1n(logp(tit1,,ti1;Θe,ΘLSTM,Θs)+logp(titi+1,,tn;Θe,ΘLSTM,Θs))\begin{aligned} \mathcal{L} = - \sum_{i=1}^n \Big( \log p(t_i \mid t_1, \dots, t_{i-1}; \Theta_e, \overrightarrow{\Theta}_\text{LSTM}, \Theta_s) + \\ \log p(t_i \mid t_{i+1}, \dots, t_n; \Theta_e, \overleftarrow{\Theta}_\text{LSTM}, \Theta_s) \Big) \end{aligned}

Два LSTM имеют свои собственные параметрыΘLSTM\overrightarrow{\Theta}_{LSTM}иΘLSTM\overleftarrow{\Theta}_{LSTM}, а параметр Word EmbeddingΘx\Theta_xи параметр SoftmaxΘs\Theta_sявляется общим

ELMo Representations

за введенное словоtkt_k, ELMo рассчитает2L+12L+1представление (вложение входного слова в слова, представления 2L вперед и назад)

Rk={xk,hkj,hkjj=1,2,...,L}={hkjj=0,1,...,L}\begin{aligned} R_k&=\{x_k, \overrightarrow{h_{kj}}, \overleftarrow{h_{kj}}\mid j=1,2,...,L\} \\ &=\{{h_{kj}}\mid j=0,1,...,L\} \end{aligned}

в:

  • hk0h_{k0}это словоtkt_kВстраивание, независимое от контекста
  • hkj=[hkj;hkj],j>0h_{kj}=[\overrightarrow{h}_{kj}; \overleftarrow{h}_{kj}], j>0, контекстно-зависимый

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

ELMoktask=E(Rk;Θtask)=γtaskj=0LsjtaskhkjELMo_k^{task}=E(R_k;\Theta_{task})=\gamma^{task}\sum_{j=0}^{L}s_j^{task}h_{kj}

здесьγtask\gamma^{task}является масштабным коэффициентом, иsjtasks_j^{task}используется для объединения выходных данных разных слоеввзвешенная комбинация. При решении конкретных задач параметры LSTMhkjh_{kj}все фиксированы (или точно настроены), а основные параметры настройки толькоγtask\gamma^{task}иsjtasks_j^{task},конечно ELMo тут просто извлечение фичи, актуальная задача добавит какие-то другие сетевые архитектуры

GPT (генеративный предтренировочный преобразователь)

Параметры языковой модели, полученные с помощью GPT, не являются фиксированными, они будут корректироваться (обычно дорабатываться) в соответствии с конкретной задачей, чтобы полученное представление предложения могло лучше адаптироваться к конкретной задаче. Его идея также очень проста, используйтеОдносторонний трансформаторИзучите языковую модель, выполните неконтролируемое встраивание предложений, а затем точно настройте параметры Transformer в соответствии с конкретной задачей. Есть два основных различия между GPT и ELMo:

  1. Различные архитектуры моделей: ELMo — неглубокая двунаправленная RNN; GPT — многоуровневый преобразователь кодировщика.
  2. Различная обработка для последующих задач: ELMo добавляет встраивание слов в конкретные задачи в качестве дополнительной функции; GPT точно настраивает одну и ту же базовую модель для всех задач.

Неконтролируемая предварительная подготовка

Вот пояснение к вышесказанномуОдносторонний трансформатор. В статье Transformer упоминается, что блок Transformer, используемый Encoder и Decoder, отличается. В блоке декодера используется маскированное самовнимание, то есть каждое слово в предложении может обращать внимание только на все предшествующие слова, включая само себя, что является односторонним преобразователем. Структура Transformer, используемая GPT, предназначена для замены самостоятельного внимания в кодировщике на маскированное собственное внимание. Конкретная структура показана на следующем рисунке.

В частности, учитывая немаркированную ожидаемую библиотекуU={u1,,un}\mathcal{U}=\{u_1,…,u_n\}, мы обучаем языковую модель с оценками максимального (логарифмического) правдоподобия параметров:

L1(U)=ilogP(uiu1,...,uk1;Θ)L_1(\mathcal{U})=\sum_i logP(u_i|u_1,...,u_{k-1};\Theta)

Процесс обучения тоже очень прост, то есть n словвложение слов (WeW_e) плюс позиционное вложение (WpW_p), а затем вводится в преобразователь, n выходов предсказывает следующее слово в позиции соответственно

h0=UWe+Wphl=transformer_block(hl1)P(u)=softmax(hnWeT)\begin{aligned} h_0 & =UW_e+W_p \\ h_l & = transformer\_block(h_{l-1}) \\ P(u) & = softmax(h_n W_e^T) \end{aligned}

Кодирование положения здесь не использует традиционный метод фиксированного кодирования Transformer, а динамически изучается.

Контролируемая тонкая настройка

После Pretraining нам также необходимо выполнить Fine-Tuning для конкретных задач. Гипотетический контролируемый набор данныхC\mathcal{C}вводXXэто последовательность словx1,...,xmx^1,...,x^m, вывод представляет собой категориальную меткуyy, такие как задача классификации настроений

мы кладемx1,...,xmx^1,...,x^mВойдите в модель Transformer и получите вывод последнего момента верхнего слоя.hlmh_l^m, пропустите его через один из недавно добавленных слоев Softmax (параметрыWyW_y) для классификации и, наконец, использовать CrossEntropyLoss для расчета потерь, чтобы настроить параметры Transformer и Softmax в соответствии со стандартными даннымиWyW_y. Это эквивалентно оценке максимального правдоподобия:

L2(C)=(x,y)logP(yx1,...,xm)P(yx1,...,xm)=softmax(hlmWy)\begin{aligned} &L_2(\mathcal{C})=\sum_{(x,y)}logP(y\mid x^1,...,x^m) \\ &P(y\mid x^1,...,x^m)=softmax(h_l^mW_y) \end{aligned}

Обычно мы должны настроить параметры так, чтобыL2L_2Максимум, но чтобы повысить скорость обучения и способность модели к обобщению, мы используем Multi-Task Learning, при этом делая его максимально правдоподобнымL1L_1иL2L_2

L3(C)=L2(C)+λ×L1(C)L_3(\mathcal{C})=L_2(\mathcal{C})+\lambda \times L_1(\mathcal{C})

используется здесьL1L_1Все еще потеря (вероятность) предыдущей языковой модели, но используемые данные не являются предыдущими неконтролируемыми данными.U\mathcal{U}, вместо этого используйте данные текущей задачиC\mathcal{C}и использовать толькоXX, без необходимости метокyy

другие задачи

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

  • Классификация: для задач классификации модификация не требуется.
  • Результат: для задач вывода можно использовать разделитель, чтобы отделить априорную гипотезу от гипотезы.
  • Сходство: для проблемы подобия, поскольку модель односторонняя, но сходство не имеет ничего общего с порядком, порядок двух предложений должен быть обратным, а результаты двух входов должны быть добавлены, чтобы сделать окончательный предполагать.
  • Множественный выбор: для вопросов, отвечающих на вопросы, контекст, вопрос объединяется, а ответ разделяется, а затем делается прогноз.

Проблемы с ELMo и GPT

Самая большая проблема с ELMo и GPT заключается в том, что традиционные языковые модели односторонние — мы предсказываем текущее слово на основе предыдущей истории. Но мы не можем воспользоваться последней информацией. такие как предложенияThe animal didn’t cross the street because it was too tired. мы кодируемitНеобходимо использовать информацию как до, так и после семантики, потому что в этом предложенииitможет относиться кanimalможет также относиться кstreet. в соответствии сtired, делаем вывод, что это относится кanimal. Но если положитьtiredизменить наwide,Такitотносится кstreet. Традиционные языковые модели могут использовать информацию только в одном направлении. Например, вперед RNN, в кодировкеitкогда он увиделanimalиstreet, но не виделtired, поэтому определить нельзяitЧто это означает. Если это обратная RNN, она видит при кодированииtired, но он его вообще не видитanimal, поэтому он также не может знать, какойanimal. Само-внимание Трансформера теоретически может обращать внимание на эти два слова одновременно, но, согласно предыдущему введению, чтобы использовать Трансформер для изучения языковой модели, необходимо использовать Маску, чтобы сделать его невидимым для будущей информации, чтобы он мог не решить это сомнительно

Примечание. Даже если ELMo обучает две RNN в обоих направлениях, одна RNN может смотреть только в одном направлении, поэтому она не может «одновременно» использовать информацию в обоих направлениях. Некоторые читатели могут спросить, моя RNN имеет много слоев, например, прямой RNN первого уровня кодируетitвремя кодироватьanimalиstreetсемантика, обратный RNN кодируетtiredСемантика , а затем RNN второго слоя могут видеть две семантики одновременно, а затем судитьitОтносится к животным. Теоретически это возможно, но на практике это сложно. В качестве контрпримера, теоретически, трехслойная (один скрытый слой) полносвязная сеть может выполнять любую функцию, так что нам нужно больше слоев полносвязной сети или CNN, RNN? Если объем данных не очень велик или если нет ограничений на структуру сети, то у нее есть много способов согласования, большинство из которых являются переоснащением. Однако из-за ограничений на структуру сети, таких как локальные специальные эффекты CNN, временные эффекты RNN и иерархическая структура многоуровневых сетей, на нее накладывается множество ограничений, так что она может лучше сходиться к лучшие параметры. Мы изучаем различные сетевые структуры (включая Resnet, Dropout, BatchNorm и т. д.), чтобы добавить в сеть дополнительные (предварительные) ограничения.

На следующем рисунке показано сравнение трех моделей, взятых из статьи BERT.

Справочная статья