Что такое Трансформер? Прочитав это, вы станете просветленным

алгоритм
Что такое Трансформер? Прочитав это, вы станете просветленным

предисловие

Модель предварительно обученного языка BERT, предложенная командой Google, в последние годы была забита в различных задачах обработки естественного языка (говоря об ученых, тоже очень интересно, название модели вынуждено составлять имя персонажа Улицы Сезам, хахаха ). Наиболее важной частью алгоритма BERT является концепция Transformer, которая, по сути, является кодирующей частью Transformer. А что такое Трансформер? Трансформер - вечный бог.Поскольку трансформер использовал механизм чистого внимания, который отказался от rnncnn, возникли различные модели предобучения, основанные на структуре трансформера, и самое главное в трансформере - использовать механизм самоконтроля, поэтому эта статья будет Начнем с механизма Attention.

Модель RNN решает проблему seq2seq

Во-первых, давайте рассмотрим пример, чтобы обсудить, как модель RNN решает проблему машинного перевода. Основываясь на проблеме машинного перевода, мы шаг за шагом объясняем механизм внимания, его преимущества и недостатки. Во-первых, давайте посмотрим, как модель RNN решает проблему машинного перевода. ЭтоМногие ко многим (Tx!=Ty) Проблема аннотации последовательности Seq2Seq. 在这里插入图片描述На следующем рисунке показана обычно используемая модельная структура RNN для решения этого типа проблемы маркировки последовательностей с неравной длиной входной последовательности и выходной последовательности:在这里插入图片描述 энкодер слеваСмоделируйте входную последовательность, затем извлеките выходное значение активации на последнем временном шаге на выходе из сети,получить представление входной последовательности. Выходное значение активации последнего временного шага кодировщика прошло через всю последовательность исходного текста, поэтому можно считать, что оно содержит информацию обо всем предложении, которое необходимо перевести. **Его размерность равна количеству нейронов скрытого слоя блока RNN. Конечно, RNN здесь может быть глубоким, но мы объясним это только с помощью одного скрытого слоя RNN.

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

  • Значение активации в нулевое время языковой модели является нулевым вектором, тогда как значение активации в нулевое время декодера модели машинного перевода является выходом активации временного шага в конце кодера.
  • Чтобы обеспечить разнообразие сгенерированных предложений, выходные данные каждого временного шага генерируются случайным образом в соответствии с распределением вероятностей. Модель машинного перевода, очевидно, должна переводить наиболее точные результаты, поэтому выходная последовательность должна быть последовательностью с глобальной максимальной вероятностью.
  • Декодер справа использует представление, полученное с помощью кодирования, и предсказанное слово в качестве входных данных и авторегрессивно предсказывает следующее слово, но rnn использует только скрытое состояние предыдущей ячейки и предыдущее слово в качестве входных данных при предсказании текущего слова. Таким образом, будут проблемы с последовательностью с длинными зависимостями.

Кстати, является ли глобальная задача оптимального решения в задаче машинного перевода похожей на модель маркировки последовательностей обычного машинного обучения, такого как CRF и HMM, то естьстратегия декодирования, которую можно решить с помощью алгоритма Витерби, а соответствующие инструкции можно найти в соответствующих блогах. Если мы используем жадный алгоритм, то есть жадный поиск, мы можем застрять в локальном оптимальном решении. Поэтому, в частности, мы обнаруживаем, что даже алгоритм динамического программирования Витерби имеет высокую пространственно-временную сложность, когда размер словаря велик (временная сложность:O(MN2)O(MN^2), где M — порядковый номер, а N — размер словаря). С целью уменьшения объема вычислений учеными был предложен метод поиска луча, то есть на первом выходе выбираются В слов с наибольшей вероятностью, а на второй временной шаг они подаются как на вход, а на второй выход по-прежнему выбираются только слова B с наибольшей вероятностью... и так далее, в конце будут сгенерированы только последовательности предсказания B, и мы выбираем ту с наибольшей вероятностью в качестве окончательного результата.На самом деле это баланс между жадным поиском и алгоритмом Витерби, когда B=1, поиск луча вырождается в жадный алгоритм, а когда B=N, поиск луча превращается в алгоритм Витерби.

RNN+Attention

Приведенная выше архитектура RNN решает некоторые проблемы машинного перевода:

Поскольку при использовании RNN для решения машинного перевода мы принимаем результат последнего временного шага как результат кодирования,Так что можно считать, что он содержит информацию обо всем предложении, которое необходимо перевести.Однако такая теория справедлива для коротких последовательностей, а для длинных последовательностей последовательность слишком длинна, чтобы улавливать относительно далекие признаки, т. е.информационное узкое место. Поэтому в процессе исследования ученые внедрили механизм внимания, чтобы узнать параметр внимания для выходных данных каждого временного шага rnn, чтобы выполнить взвешенную сумму внимания по этим функциям, а затем также использовать его в качестве входных данных. этап декодера. Как показано на рисунке ниже, мы используем двунаправленную RNN для кодирования входной последовательности (x1, x2, x3), а затем на стороне декодера, когда мы декодируем посещение слова, вход этого временного шага равен

  1. Вектор выхода активации в предыдущий момент,
  2. Вектор результата прогнозирования предыдущего момента (то есть слово jane вывода предыдущего момента),
  3. Существует также вывод внимания, соответствующий выводу каждого временного шага на стороне кодирования (взвешенная сумма внимания x1, x2, x3, то есть узнать параметр для генерации каждого слова, потому что разные x генерируется для разных y. Вклады не одинаковы, поэтому требуется внимание)

在这里插入图片描述Преимущества модели машинного перевода на основе rnn после введения внимания: Преимущества механизма Attention заключаются в следующем:

  • Он решает проблему «информационного» узкого места традиционной архитектуры RNN.
  • Пусть декодер выборочно обращает внимание на слова в исходном предложении, которые имеют отношение к текущему переводу.
  • Путем прямого соединения последовательных скрытых слоев кодировщика и последовательных скрытых слоев декодера градиент может распространяться в обратном направлении более непосредственно, и проблема исчезновения градиента решается.
  • Повышенная интерпретируемость моделей машинного перевода.

Transformer: yyds

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

Чтобы иметь возможность выполнять параллельные вычисления, не требуя многоуровневой итерации, ученые предложили модель Transformer. Название его диссертации очень властное: «Внимание — это все, что вам нужно». Как следует из названия, модель Transformer полностью отказывается от горизонтального распространения традиционной RNN, используя механизм само-внимания, и распространяется только в вертикальном направлении, и ей нужно только постоянно накладывать слой Self-Attention. Таким образом, вычисление каждого слоя может выполняться параллельно и может быть ускорено с помощью графического процессора.

Вы можете использовать слой Self-Attention, чтобы делать все, что может слой RNN:在这里插入图片描述Поскольку преобразователь использует механизм внутреннего внимания, мы сначала вводим этот механизм:

Self-Attention

Базовая структура слоя Self-Attention показана на следующем рисунке:在这里插入图片描述мы рассчитываемx1x_1Выход b1 после входа в модель само-внимания является примером.

  1. Во-первых, мы берем предварительно обученный вектор слов, такой как Word2Vec первого слова, в качестве входных данных.x1x_1, мы можем пропустить его через полносвязный слой или MLP, чтобы получитьa1a_1Вектор, который можно рассматривать как другое вложение (может измениться размерность)
  2. Далее нам нужно задать три матрицы параметров, которыеWq,WkWvW_q, W_k и W_v, путем трех матричных умножений получаем три вектора q1, k1, v1 из a1. (эквивалентно трем отдельным полносвязным слоям). (Следует отметить, что при расчете всех временных рядов используются вышеуказанные четыре матрицы параметров, и все временные ряды вычисляются параллельно в матрице во время матричной операции). Среди них вектор q называется вектором запроса, который используется для соответствует вектору k других временных рядов; вектор k называется вектором совпадения, который используется для сопоставления с вектором q других временных рядов; вектор v представляет собой информацию, извлекаемую из текущего временного ряда.
  3. Затем он аналогичен методу расчета веса внимания, упомянутому в предыдущем разделе. Сначала мы вычисляем выходной тайминг 1 для каждого входного тайминга.iiпоказатель вниманияα1,iα_{1,i}, который получается после операции скалярного произведения вектора запроса q во временном ряду 1 и ключевого вектора k везде:α1,i=q1*kiα_{1,i}=q_1*k_i
  4. Чтобы убедиться, что градиент стабилен, нам также нужно разделить на квадратный корень из d общего измерения q и k, Наконец, мы делаем преобразование вероятности для оценки внимания и используем операцию softmax, чтобы получитьa1a_1При всех показателях внимания k1k2k3k4...., тогда иviv_iВыполняя взвешенную сумму, мы получаем b1.

Примечание. Если это матричная операция, сначала мы вводим [x1, x2, x3, x4], а после встраивания получается матрица размерности [seq_len, embed_size], seq_len — длина последовательности, а embed_size — после токен представляет собой встроенное векторное измерение. затем умножить наWq,WkWv, то получим три матрицыQ,K,VW_q, W_k и W_v, то получаются три матрицы Q, K, V, а затем вычислить матрицу внимания от A до Q и K. здесьQ,K,VQ,K,VРазмеры [seq_len,embed_size], затемA=softmax(Q*KT(d))A=softmax(\frac{Q*K^{T}}{\sqrt(d)})Для каждого слова, полученного из внимания, мы будемB=A*VB=A*VПолучите результат вывода части внутреннего внимания: B-size:[seq_len,embed_size]

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

mult-head attention

Самостоятельное внимание мультиголовки, используемой трансформатором в структуре модели Давайте представим Базовая структура такая же, как у собственного внимания, но во время работы оно делится на несколько головок, а затем расчет собственного внимания выполняется параллельно, и, наконец, выходные векторы соединяются вместе, где разные головки будут учиться по-разному. уровни знаний.在这里插入图片描述** Преимущества самоконтроля с несколькими головками: ** Разные головы могут фокусироваться на разных точках, и через несколько головок можно сфокусироваться на большем количестве информации. Это несколько эквивалентно различным фильтрам в CNN.

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

Чтобы решить эту проблему, исследователи представили функцию встраивания позиции при кодировании векторов слов. В частности, позиционное кодирование добавляет позиционную информацию слова к вектору слова, так что преобразователь может различать слова в разных позициях.在这里插入图片描述Приведенный выше ei представляет собой ввод информации о местоположении в i-й момент времени. Его можно узнать или установить вручную.

model structure

在这里插入图片描述

Кодер:

Мы обнаружили, что перед тем, как мы введем входную информацию в часть кодирования, нам сначала нужно выполнить сплайсинг с встраиванием положения каждого токена позиции, как вход механизма мульти-головы-само-внимания, мы обнаружили, что вход через множественное механизм -head-self-attention Размеры вывода те же, а затем нам нужно пройти слой add&norm.

add относится к остаточным соединениям:

Остаточное соединение:

Суммируйте остаточные соединения. Если наш вход X, то выход, который нужно получить, равен H(X). тогда мы можем пройтиH = F (X) + X, что означает изучение F. После того, как выход F получен, выход H может быть получен путем добавления X на этой основе. В Transformer буква F в это время представляет собой Multi-Head Attention and Feed Forward на рисунке ниже, и мы добавляем X, чтобы получить требуемый результат.

Зачем использовать остаточные сети, Из-за остаточной сети остаточные блоки имеют эффект, аналогичный пропускному соединению.При углублении сети градиентный спуск также будет очень хорошо обучен, что может решить проблему исчезновения и деградации градиента, потому что HX=Fx +x, улучшит ситуацию, когда экспоненциальное умножение в цепном выводе вызовет взрыв градиента. Остаточная сеть также может решить проблему деградации сети.Поскольку в глубокой сети некоторые уровни являются избыточными, очень сложно изучить сопоставление идентификаторов этих слоев, а для остаточной сети очень сложно узнать HX=x. , просто нужно подогнать Fx к 0, то есть пустьНичего не делать становится легко.在这里插入图片描述Норма в &norm означает нормализацию, а нормализация преобразователя использует нормализацию слоя.

Layer norm

Нормирование означает, что за ним следует слой нормализации. Формула в исходной статье — LayerNorm (X + SubLayer (X)), а SubLayer — это F I, упомянутый выше.

Добавляются и выполняются вектор из остаточного пути и вектор, рассчитанный по Самовниманию.Layer-Normalization, то есть нормализация слоя. Layer Norm нормализует все нейроны в одном слое одной и той же выборки так, чтобы они соответствовали стандартному нормальному распределению. Нормализовано в:

  • Основная идея BatchNorm:Нормализация каждого пакета данных на каждом уровне (один и тот же канал в пакете). Пакетная норма нормализует все значения одного и того же нейрона в разных выборках в пакете.
  • Layer Norm нормализует все нейроны в одном слое одной и той же выборки, чтобы они соответствовали стандартному нормальному распределению.Основная идея Layer Norm:заключается в вычислении среднего значения и дисперсии для каждой выборки (разные каналы в выборке), вместо BN, который вычисляет среднее значение и дисперсию в направлении партии!
  • Зачем использовать нормализацию слоя:
  • Один из них — решить проблему исчезновения градиента, а другой — решить проблему деградации весовой матрицы.

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

FFN

Нейронная сеть прямого распространения, используемая в преобразователе: FFN эквивалентен сопоставлению результата Attention каждой позиции сПространство признаков большего размера, затем используйтеReLU вводит нелинейность для фильтрации и, наконец, восстанавливает исходное измерение.. Следует отметить, что после отказа от структуры LSTM ReLU в FFN стал основным источником энергии.Блоки, обеспечивающие нелинейные преобразования.

Пока что мы разобрались с тремя модулями части encode.После многоголового-само-внимания и остаточного соединения и нормализации слоя и FFN мы получаем представление каждого слова после кодирования.Размерность этого представления в скрытом слое может не быть начальным входным измерением, преобразователем Размер встраивания скрытого слоя в середине — 2048, а затем размер внедрения вывода последнего слоя такой же, как размер ввода, и, наконец, мы получаем матрицу размера [seq_len, embed_size].

Decoder

在这里插入图片描述

После разговора о процессе обработки данных частью кодировщика нам необходимо уточнить структуру декодера. Во-первых, последняя часть декодера такая же, как кодировщик, но вначале она будет проходить через маскированное многоголовое внимание. Последняя часть аналогична кодеру, но разница в том, что при прохождении через немаскированное мультиголовное самовнимание вход Q является результатом выхода маскированного собственного внимания в декодере, тогда как К и Используются V. Получается путем умножения вектора, выдаваемого энкодером, на Wk и Wv.masked-self-attention Роль маски здесь, мы должны сначала знать, что когда преобразователь используется в модели seq2seq, последовательность декодера также является пословной авторегрессионной генерацией, В это время будет использоваться концепция случайного внимания, то есть генерация каждого слово остается таким же, как и перед ним.Сгенерированные слова подвергаются операции внимания. Затем следующие слова необходимо замаскировать, чтобы избежать спойлеров для будущей информации.

Поясним на примере генерации меня, любви, машины, обучения и перевода в , я, любовь, машина, обучение, . тренироваться:

  1. Введите в кодировщик вложение «Я/Любовь/Машина/Обучение», и окончательный вывод кодировщика последнего слоя будет выводом [10, 512] (при условии, что длина используемого вложения равна 512, а размер пакета = 1), это Выходы умножаются на новую матрицу параметров, которую можно использовать как K и V для каждого уровня в декодере;
  2. Используйте в качестве начальных входных данных декодера и используйте вектор выходного слова максимальной вероятности A1 и 'i' декодера, чтобы выполнить кросс-энтропию (кросс-энтропию) для вычисления ошибки.
  3. Используйте , "i" в качестве входных данных декодера и используйте выходное слово максимальной вероятности A2 и "love" декодера для вычисления ошибки по перекрестной энтропии.
  4. Используйте , «i», «love» в качестве входных данных декодера и используйте выходное слово A3 максимальной вероятности декодера и «машину», чтобы выполнить перекрестную энтропию для вычисления ошибки.
  5. Используйте , «i», «love» и «machine» в качестве входных данных декодера и используйте выходное слово A4 с максимальной вероятностью и «обучение» декодера для вычисления ошибки с помощью перекрестной энтропии.
  6. Возьмите , «i», «любовь», «машина» и «обучение» в качестве входных данных декодера и используйте выходное слово максимальной вероятности декодера A5 и терминатор, чтобы выполнить перекрестную энтропию для вычисления ошибки.

Итак, как мы можем сделать это параллельно?Здесь у нас будет матрица масок, называемая маской последовательности, потому что ее функция состоит в том, чтобы маскировать слова после каждого слова, когда декодер кодирует нашу целевую информацию о последовательности. Как показано ниже:在这里插入图片描述При генерации слова «Север» мы можем рассчитывать внимание только на начальное слово . При генерации слова you нам нужно игнорировать внимание , Beijing, Beijing, Huan и Ying. Таким образом, процесс декодера в основном закончен. Но здесь возникает проблема, как декодер использует K и V, переданные кодировщиком?

Здесь можно кратко пояснить, что когда декодер получает на вход нашу текущую targetlength, стоп-слов не будет, то есть вход декодера — , Beijing, Beijing, welcome, welcome, you. Соответствующая позиция выхода (стандартный вывод соответствующей позиции потери) Пекин, Пекин, добро пожаловать, добро пожаловать, вы, . Горизонтальная и вертикальная оси приведенного выше рисунка официально таковы. В моем примере с машинным обучением любви входными данными для кодировщика являются я, любовь, машина, обучение. Вход декодера — , i, любовь, машина, обучение, а выход декодера — i, любовь, машина, обучение, . понимать? Поведение расчета убытка, равного каждой позиции, становится параллельным.

  • Затем, когда мы используем K и V части энкодера, мы знаем, что эти K и V получаются путем умножения матрицы размерности вывода кодирования [seq_len, embed_size] на Wk и Wv, а K и V также имеют эту размерность. В примере из книги «Я люблю машинное обучение» seq_len= 4 (я, люблю, машины, учусь).
  • И поколение нашего декодера QОн получается путем умножения матрицы размерности [target_len,embedd] на Wq. Q также является этим измерением. target_len относится к длине предложения, введенного декодером. В примере с машинным обучением я люблю target_len=5 (ввод , я, любовь, машина, обучение).

В это время мы используем Q, сгенерированный декодером, и K, сгенерированный кодером, для вычисления внимания. Таким образом, мы получаем матрицу внимания:A=softmax(Q*KT(d))A=softmax(\frac{Q*K^T}{\sqrt(d)})d — встроенный_размер. Следовательно, размерность нашего A должна быть матрицей размером [target_seq, seq_len]. В настоящее время размер матрицы, полученный путем умножения A на V(seq_len, embed_size), равен [target_seq, embed_size], что является предсказанным вложение каждой позиции слова. . Позже полносвязный слой можно использовать для сопоставления встраивания с вектором размера словарного запаса, а прогнозируемый вектор можно получить через слой softmax.На этапе обучения этот вектор и стандартный ответ соответствующего позицию можно использовать для расчета потери перекрестной энтропии. Это метод обучения нашего преобразователя в задаче seq2seq!

При тестировании моделиТест: декодер не имеет метки и использует авторегрессионный вывод одного слова и одного слова Китайский язык, который нужно перевести, обычно вводится из кодировщика параллельно (так же, как обучение), чтобы получить встраивание каждого слова, а затем сначала декодер заходит в bos а потом этот table.id в , получает первое слово перевода, потом авторегрессия и так пока предсказание не дойдет до стоп-метки eos