Прочтите статью "Внимание — это все, что вам нужно" | с реализацией кода

Google искусственный интеллект Keras Facebook

предисловие

В середине 2017 года были две похожие статьи, которые автор очень ценит, а именно: Сверточная последовательность FaceBook для обучения последовательности и Внимание Google - это все, что вам нужно. Оба они являются нововведениями в Seq2Seq. По сути, все они заброшены.Структура RNN для выполнения задачи Seq2Seq. 

В этой статье автор проведет простой анализ Attention is All You Need. Конечно, эти две статьи довольно популярны, поэтому в Интернете уже есть много толкований (но многие толкования представляют собой прямо переведенные статьи, а собственного понимания мало), так что здесь как можно больше ваших собственных слов, и постарайтесь не повторять всем в интернете то, что уже сказал начальник.

кодирование последовательности

Метод глубокого обучения НЛП заключается в том, чтобы сначала сегментировать предложение, а затем преобразовать каждое слово в соответствующую последовательность векторов слов. Таким образом, каждое предложение соответствует матрице X=(x1,x2,…,xt), где xi представляет вектор слов (вектор-строку) i-го слова, а размерность равна d, поэтому?tp=webp&wxfrom=5&wx_lazy=1. В этом случае проблемой становится кодирование этих последовательностей.

Первая основная идея — слой RNN, Схема RNN очень проста и рекурсивна:

8a394feeefe34cef647edfcfb30b9af303c39d52

Ни LSTM, ни GRU, ни в последнее время широко используемые SRU не отделены от этой рекурсивной структуры. Сама структура RNN относительно проста, а также очень подходит для моделирования последовательностей, но один из очевидных недостатков RNN заключается в том, что ее нельзя распараллелить, поэтому скорость низкая, что является естественным дефектом рекурсии.

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

Вторая идея - слой CNN.На самом деле схема CNN тоже очень естественна.Оконный обход, такой как свертка с размером 3, это:

09d4159dee99ecde9e27dddc4e15a039df15827c

В статье FaceBook чистое использование свертки также завершает изучение Seq2Seq, который является изысканным и экстремальным случаем использования свертки.Читатели, увлеченные свертки, должны внимательно прочитать эту статью.

CNN удобен для распараллеливания, и легко получить некоторую глобальную структурную информацию.Сам автор предпочитает CNN.В текущей модели работы или соревнования я попытался использовать CNN для замены существующей модели RNN и сформировал свой собственный набор A пользовательского опыта, мы поговорим об этой части позже.

Шедевр Google предоставляетТретья идея: чистое Внимание,Просто сосредоточься.

RNN необходимо рекурсивно шаг за шагом, чтобы получить глобальную информацию, поэтому обычно лучше использовать двунаправленную RNN; CNN может фактически получать только локальную информацию, и она увеличивает рецептивное поле путем суммирования; внимание — самая грубая идея, она получает глобальную информацию. информация за один шаг, его решение:

01d4e0756a4f0e090f53a6e779bdb8cc91586dd5

где A,B — другая последовательность (матрица). Если все возьмут А=В=Х, то это называется Самовнимание,Это означает непосредственное сравнение xt с каждым исходным словом и, наконец, вычисление yt.

Уровень внимания

Определение внимания

Обобщенная идея Google Attention также представляет собой схему последовательности кодирования, поэтому мы также можем думать, что это уровень кодирования последовательности, такой как RNN и CNN.

1c0fef8b598c4793509ed53f7264ed472e498408

Приведенное выше описание является обобщенной формой фреймворка, на самом деле решение, данное Google, очень специфично. Во-первых, это дает определение внимания:

2f1b6d628d23ea5086288135438abff0f29e66f9

Используемые здесь обозначения соответствуют статье Google, где:

ddf0946cdd5bd71ec5fb6451a0b3e4284b8821e9

Если игнорировать функцию активации softmax, то на самом деле это умножение трех матриц n×dk, dk×m, m×dv, а конечным результатом является матрица n×dv.

Таким образом, мы можем думать: это слой Внимание,закодировать последовательность n×dk Q в новую последовательность n×dv.

Как понять эту структуру? Давайте посмотрим на это вектор за вектором.

2a74af68b56d5834ca2f6b1ae138f7d0e704a8d3

где Z — нормировочный коэффициент. На самом деле, q, k, v — это аббревиатуры запроса, ключа и значения соответственно. K и V находятся во взаимно однозначном соответствии. Они похожи на отношения ключ-значение. Внутренний продукт ks комбинируется с softmax для получения сходства между qt и каждым vs, а затем взвешиваются и суммируются для получения dv-мерного вектора.

где фактор?tp=webp&wxfrom=5&wx_lazy=1Он играет регулирующую роль, чтобы внутренний продукт не был слишком большим (если он слишком велик, он будет либо 0, либо 1 после softmax, что недостаточно «мягко»).

На самом деле это определение внимания не ново, но из-за влияния Google мы можем думать, что это определение теперь предлагается более формально и рассматривается как слой.

Кроме того, это определение является только формой внимания, и есть некоторые другие варианты, например, метод работы запроса и ключа не обязательно скалярное произведение (он также может быть сплайсирован, а затем скалярно произведен вектор параметров) , и даже вес возвращать не обязательно.Один и тд.

Multi-Head Attention

Это новая концепция, предложенная Google, которая представляет собой совершенство механизма Attention.

8d47d33e760c8528f3e73e7fef6c712a5ee56d03

Однако с формальной точки зрения это на самом деле очень просто, то есть сопоставьте Q, K, V через матрицу параметров, а затем выполните Внимание, повторите этот процесс h раз, и результаты можно склеить вместе, который можно охарактеризовать как «путь до конца» Джейн». Конкретно:

3ea6c41732d2b99a5d5f49d7b6e09744663c9a90


здесь53797d704f5dd616a7d9ab28402c48b01cd593a7,Потом:

bcd491d3c1bbd02e123239491bba468596c4be5e

В итоге мы получаем последовательность n×(hd̃v).Так называемый «мульти-головка» заключается в том, чтобы делать одно и то же несколько раз (параметры не используются совместно), а затем объединять результаты.

Self Attention 

До сих пор описание слоя «Внимание» было общим, и мы можем реализовать некоторые приложения. Например, если вы занимаетесь пониманием прочитанного,Q может быть последовательностью векторов слов главы, взять K = V в качестве последовательности векторов слов вопроса, тогда результатом будет так называемое встраивание выровненных вопросов. 

В статье Google большая часть внимания — это внимание к себе,Это «самовнимание», или внутреннее внимание. 

Так называемое внутреннее внимание на самом деле является вниманием (X, X, X), а X — это входная последовательность, упомянутая выше. Это,Сделайте Внимание внутри последовательности, чтобы найти связи внутри последовательности. 

Одним из основных вкладов статьи Google являетсяЭто показывает, что внутреннее внимание очень важно для кодирования последовательности в машинном переводе (или даже для задач Seq2Seq в целом)., а предыдущее исследование Seq2Seq в основном использовало механизм внимания только в конце декодирования.

Похожая вещь в том, что R-Net, текущая топ-модель для понимания прочитанного SQUAD, также добавила механизм самоконтроля, который также улучшил свою модель. 

Конечно, если быть точнее, Google использует Self Multi-Head Attention:

c96a7c614ce77244e613645c628b7827a0f3aedb

Position Embedding

Однако после небольшого размышления оказывается, что такая модель не фиксирует порядок последовательности. Другими словами, если K, V перетасованы по строкам (эквивалентно перетасовке порядка слов в предложении), то результат Attention останется тем же.

Это показывает, что,Пока что модель «Внимание» — это в лучшем случае очень тонкая модель «мешка слов». 

Эта проблема более серьезная. Как мы все знаем, для временных рядов, особенно для задач в НЛП, порядок является очень важной информацией. Он представляет собой локальную или даже глобальную структуру. Если информацию о порядке нельзя узнать, то эффект будет сильно сокращен (например, при машинном переводе можно перевести только каждое слово, но нельзя организовать его в разумные предложения). 

Так что Google сделал еще один шаг-Position Embedding, то есть «вектор положения», пронумеруйте каждую позицию, а затем каждое число соответствует вектору. Путем объединения вектора положения и вектора слова в каждое слово вводится определенная информация о положении, так что внимание может различать разные слова положения . 

Встраивание позиции не является чем-то новым, в FacebookConvolutional Sequence to Sequence LearningТоже использовал это. Но в этой работе Google встраивание позиции имеет несколько отличий:

1. Position Embedding фактически появился в моделях RNN и CNN и раньше, но в этих моделях Position Embedding является вишенкой на торте, то есть "с ним будет лучше, а без него будет немного хуже" , Потому что RNN и CNN могут сами собирать информацию о местоположении.

Но в этой чистой модели Attention встраивание позиции является единственным источником информации о позиции, поэтому оно является одним из основных компонентов модели, а не просто вспомогательным средством. 

2. В прошлом Position Embedding векторы в основном обучались по задаче. А Google прямо дал формулу построения Position Embedded:

ad65d5d5fe8cd6aeff04e5ebfee7f4f9cd1cdfea

Смысл здесь в том, чтобы сопоставить позицию с id p с dpos-мерным вектором позиции, а значение i-го элемента этого вектора равно PEi(p).

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

3. Встраивание позиции само по себе является информацией об абсолютной позиции, но в языке относительная позиция также очень важна.Важная причина, по которой Google выбирает вышеупомянутую формулу вектора позиции, заключается в следующем:

Поскольку мы имеем sin(α+β)=sinα cosβ+cosα sinβ и cos(α+β)=cosα cosβ−sinα sinβ, это показывает, что вектор в позиции p+k может указывать на линейное преобразование вектора в позиции p , что дает возможность отображать информацию об относительном положении.

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

В статье FaceBook используется первое, а в статье Google — второе. Интуитивно, добавление привело бы к потере информации, что кажется нежелательным, но результаты Google показывают, что добавление также является хорошим решением. Кажется, мое понимание недостаточно глубоко.

некоторые недостатки

На данный момент механизм Attention в основном представлен.Преимущество слоя «Внимание» состоит в том, что он может фиксировать глобальную связь за один шаг, потому что он напрямую сравнивает последовательности попарно (ценой является то, что объем вычислений становится равным ?(n2), конечно, поскольку это чистая матрица операция, этот объем вычислений вполне и не очень серьезный).

Напротив, RNN требует пошаговой рекурсии для захвата, в то время как CNN необходимо расширить рецептивное поле, складывая, что является явным преимуществом слоя Attention. 

Остальная часть документа Google посвящена тому, как его можно использовать в машинном переводе.Это вопрос настройки приложения и параметров, и мы не особенно заботимся об этом здесь. Конечно, результаты Google показывают, что использование механизмов чистого внимания в машинном переводе может дать наилучшие результаты, и результаты действительно блестящие. 

Однако я все же хочу рассказать о некоторых недостатках самой бумаги и самого слоя Attention. 

1. Название статьи «Внимание — это все, что вам нужно», поэтому слова RNN и CNN намеренно избегаются в статье, но я думаю, что такой подход является слишком преднамеренным.

На самом деле, в статье также специально названы Position-wise Feed-Forward Networks, по сути, это одномерная свертка с размером окна 1, поэтому есть ощущение, что название было специально изменено, чтобы не упомянуть сверток, немного не добрый. (Возможно также, что я преувеличиваю). 

2. Хотя Attention не имеет прямой связи с CNN, на самом деле он полностью опирается на идею CNN, Например, Multi-Head Attention означает, что Attention делается несколько раз, а затем сращивается, что согласуется с идеей CNN. несколько ядер свертки в CNN, а также в некоторых работах используется остаточная структура, которая также получена из сети CNN. 

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

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

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

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

На самом деле Google, кажется, знает об этой проблеме, поэтому в документе также упоминается ограниченная версия Self-Attention (но в основной части документа ее использовать не следует).

Предполагается, что текущее слово связано только с r словами до и после, поэтому внимание возникает только между этими 2r+1 словами, поэтому количество вычислений равно ?(nr), что также может отражать локальную структуру последовательности. Но, очевидно, это концепция окна свертки в ядре свертки. 

Благодаря приведенному выше обсуждению мы можем понять, что, рассматривая внимание как отдельный уровень, смешанный с CNN, RNN и другими структурами, мы должны иметь возможность более полно интегрировать их соответствующие преимущества, не уподобляясь документу Google под названием «Внимание — это все, что вам нужно». , Это было бы немного "перебор" (слишком много "тона"), и на самом деле это невозможно сделать.

Что касается работы над статьей, то, возможно, занижая цифру и называя ее Attention is All Seq2Seq Need (на самом деле, «тон» этого заголовка также очень велик), получит большее подтверждение.

Код

Наконец, чтобы сделать эту статью немного практичной, автор попытался уделить внимание коду реализации Multi-Head. Читатели, которым он нужен, могут использовать его напрямую или обратиться к нему для модификации. 

Заметим, что хотя смысл Multi-Head очень прост — повторять несколько раз и потом склеивать, на самом деле по этой идее нельзя писать программы, которые будут очень медленными. Потому что TensorFlow автоматически не распараллеливает, например:

a = tf.zeros((10, 10))

b = a + 1

c = a + 2

где вычисления b,c связаны, хотя b,c не зависят друг от друга. Следовательно, мы должны объединить операции Multi-Head в единый тензор, потому что умножение одного тензора автоматически распараллеливается внутри.

Кроме того, мы должны замаскировать последовательность, чтобы игнорировать эффект заполнения. Общая маска состоит в том, чтобы установить часть заполнения на ноль, но маска во внимании состоит в том, чтобы вычесть большое целое число из части заполнения перед softmax (поэтому она очень близка к 0 после softmax). Это содержимое имеет соответствующие реализации в коде.

Версия TensorFlow

https://github.com/bojone/attention/blob/master/attention_tf.py

Керас издание

https://github.com/bojone/attention/blob/master/attention_keras.py

проверка кода

Простой тест на IMDB на Keras (без маски):

from __future__ import print_function
from keras.preprocessing import sequence
from keras.datasets import imdb


max_features = 20000

maxlen = 80

batch_size = 32


print('Loading data...')

(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)

print(len(x_train), 'train sequences')

print(len(x_test), 'test sequences')


print('Pad sequences (samples x time)')

x_train = sequence.pad_sequences(x_train, maxlen=maxlen)

x_test = sequence.pad_sequences(x_test, maxlen=maxlen)

print('x_train shape:', x_train.shape)

print('x_test shape:', x_test.shape)

from keras.models import Model
from keras.layers import *


S_inputs = Input(shape=(None,), dtype='int32')

embeddings = Embedding(max_features, 128)(S_inputs)
#embeddings = Position_Embedding()(embeddings) #增加Position_Embedding能轻微提高准确率

O_seq = Attention(8,16)([embeddings,embeddings,embeddings])

O_seq = GlobalAveragePooling1D()(O_seq)

O_seq = Dropout(0.5)(O_seq)

outputs = Dense(1, activation='sigmoid')(O_seq)


model = Model(inputs=S_inputs, outputs=outputs)
# try using different optimizers and different optimizer configs

model.compile(loss='binary_crossentropy',

             optimizer='adam',

             metrics=['accuracy'])


print('Train...')

model.fit(x_train, y_train,

         batch_size=batch_size,

         epochs=5,

         validation_data=(x_test, y_test))

Результат без встраивания позиции:

4a49e779aafd28e3ce3e06a465edc25f2d5cad81

Результаты с внедрением позиций:

ff7ca6c35a0b00044d83efd77dd17d5411105f17

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

Вычислительный анализ

Видно, что на самом деле расчетное количество Внимания не мало. Например, в Self Attention первым шагом является выполнение трех линейных отображений на X. Этот объем вычислений эквивалентен одномерной свертке с размером ядра свертки 3, но эта часть объема вычислений составляет всего ?(n ); то он также включает Для двух матричных умножений самой последовательности количество вычислений этих двух матричных умножений равно ?(n2). Если последовательность достаточно длинная, такое количество вычислений фактически неприемлемо. 

Это также показывает, что ограниченная версия Attention находится в центре внимания следующего исследования, а смешанное использование Attention с CNN и RNN является более умеренным путем.

Эпилог

Спасибо за замечательные варианты использования, предоставленные Google, которые заставили меня ждать откровения и более глубокого понимания внимания. В какой-то степени это достижение Google отражает концепцию «упрощения дороги», и это действительно редкий бутик в НЛП.


Автор: Су Цзяньлинь