Нейронная сеть, используемая Open AI и DeepMind

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



Трансформаторы - это набирающий популярность тип архитектуры нейронных сетей. Трансформеры недавно использовались OpenAI в их языковых моделях, а также недавно использовались DeepMind для AlphaStar - своей программы, направленной на победу над профессиональным игроком в Starcraft.

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

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

«Трансформеры» - японская [[хардкор-панк]] группа. Группа образовалась в 1968 году, в разгар истории японской музыки ».

В этом примере слово «группа» во втором предложении относится к группе «Трансформеры», представленной в первом предложении. Когда вы читаете о группе во втором предложении, вы знаете, что это отсылка к группе «Трансформеры». Это может быть важно для перевода. Есть много примеров, когда слова в некоторых предложениях относятся к словам в предыдущих предложениях.

Для перевода подобных предложений модель должна определять такого рода зависимости и связи. Рекуррентные нейронные сети (RNN) и сверточные нейронные сети (CNN) были использованы для решения этой проблемы из-за их свойств. Давайте рассмотрим эти две архитектуры и их недостатки.

Рекуррентные нейронные сети

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

На рисунке выше мы видим часть нейронной сети A,, обрабатывающую некоторый ввод x_t и выводящую h_t. Цикл позволяет передавать информацию от одного шага к другому.

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

Такая цепочечная природа показывает, что рекуррентные нейронные сети явно связаны с последовательностями и списками. Таким образом, если мы хотим перевести какой-то текст, мы можем установить каждый ввод как слово в этом тексте. Рекуррентная нейронная сеть передает информацию из предыдущих слов в следующую сеть, которая может использовать и обрабатывать эту информацию.

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

Проблема длительных зависимостей

Рассмотрим языковую модель, которая пытается предсказать следующее слово на основе предыдущих. Если мы пытаемся предсказать следующее слово предложения «облака в небе», нам не нужен дальнейший контекст. Совершенно очевидно, что следующим словом будет небо.

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

Но есть случаи, когда нам нужно больше контекста. Например, предположим, что вы пытаетесь предугадать последнее слово текста: «Я вырос во Франции… Я бегло говорю…». Недавняя информация предполагает, что следующим словом, вероятно, будет язык, но если мы хотим сузить, какой язык, нам нужен контекст Франции, который находится дальше по тексту.

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

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

Долговременная кратковременная память (LSTM)

При составлении календаря на день мы расставляем приоритеты в встречах. Если есть что-то важное, мы можем отменить некоторые встречи и согласовать то, что важно.

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

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

Внутренне LSTM выглядит следующим образом:

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



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

Проблема с LSTM

Та же проблема, что обычно случается с RNN, происходит с LSTM, то есть когда предложения слишком длинные, LSTM все еще не очень хорошо работают. Причина этого в том, что вероятность сохранения контекста для слова, которое находится далеко от текущего обрабатываемого слова, экспоненциально уменьшается с удалением от него.

Это означает, что когда предложения длинные, модель часто забывает содержание отдаленных позиций в последовательности. Еще одна проблема с RNN и LSTM заключается в том, что трудно распараллелить работу по обработке предложений, поскольку вам придется обрабатывать слово за словом. Не только это, но еще и не существует модели зависимостей дальнего и ближнего действия. Подводя итог, можно сказать, что LSTM и RNN представляют 3 проблемы:

  • Последовательные вычисления препятствуют распараллеливанию
  • Отсутствие явного моделирования зависимостей дальнего и ближнего действия
  • «Расстояние» между позициями линейное.

Внимание

Чтобы решить некоторые из этих проблем, исследователи создали методику обращения внимания на определенные слова.

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

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

Для решения этих проблем в нейронной сети используется метод Внимание. Для RNN вместо кодирования всего предложения в скрытом состоянии каждое слово имеет соответствующее скрытое состояние, которое полностью передается на этап декодирования. Затем скрытые состояния используются на каждом этапе RNN для декодирования. На следующем гифке показано, как это происходит.

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

Чтобы привлечь внимание к RNN при преобразовании последовательности, мы разделим кодирование и декодирование на 2 основных этапа. Один шаг представлен зеленым, а другой фиолетовым. зеленый этап называется этапом кодирования, а фиолетовый этап - этапом декодирования.

Шаг зеленого цвета, отвечающий за создание скрытых состояний на входе. Вместо того, чтобы передавать декодерам только одно скрытое состояние, как мы делали до использования внимания, мы передаем все скрытые состояния, генерируемые каждым «словом» предложения, на этап декодирования. Каждое скрытое состояние используется на стадии декодирования, чтобы выяснить, на что сеть должна обратить внимание.

Например, при переводе предложения «Je suis étudiant» на английский язык требуется, чтобы на этапе декодирования при переводе учитывались разные слова.

Или, например, когда вы переводите предложение «L’accord sur la zone économique européenne a été signé en août 1992». с французского на английский и сколько внимания уделяется каждому входу.

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

Сверточные нейронные сети

Сверточные нейронные сети помогают решить эти проблемы. С ними мы можем

  • Легко распараллелить (на уровне)
  • Использует локальные зависимости
  • Расстояние между позициями логарифмическое

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

Причина, по которой сверточные нейронные сети могут работать параллельно, заключается в том, что каждое слово на входе может обрабатываться одновременно и не обязательно зависит от предыдущих слов, которые должны быть переведены. Более того, расстояние между выходным словом и любым входом для CNN находится в порядке log (N) - это размер высоты дерева, созданного из выход на вход (вы можете увидеть его на GIF-изображении выше. Это намного лучше, чем расстояние между выходом RNN и входом, которое имеет порядок N.

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

Трансформеры

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

Давайте посмотрим, как работает Transformer. Трансформер - это модель, которая использует внимание для увеличения скорости. В частности, он использует самовнимание.

Внутри Transformer имеет такую ​​же архитектуру, что и предыдущие модели, представленные выше. Но Transformer состоит из шести кодировщиков и шести декодеров.

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

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

Самовнимание

Примечание. Этот раздел взят из записи блога Джея Алламара.

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

Каждое слово вложено в вектор размером 512. Мы представим эти векторы этими простыми прямоугольниками.

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

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

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

Затем мы заменим пример более коротким предложением и посмотрим, что происходит на каждом подуровне кодировщика.

Самовнимание

Давайте сначала посмотрим, как вычислить самовнимание с помощью векторов, а затем перейдем к рассмотрению того, как это на самом деле реализовано - с помощью матриц.

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

Обратите внимание, что эти новые векторы меньше по размерности, чем вектор внедрения. Их размерность составляет 64, в то время как векторы ввода / вывода встраивания и кодировщика имеют размерность 512. Они НЕ ДОЛЖНЫ быть меньше, это выбор архитектуры, позволяющий сделать вычисление многогранного внимания (в основном) постоянным.

Умножение x1 на весовую матрицу WQ дает q1, вектор «запроса», связанный с этим словом. В итоге мы создаем проекцию «запроса», «ключа» и «значения» для каждого слова во входном предложении.

Что такое векторы «запроса», «ключа» и «значения»?

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

Второй шаг в вычислении самовнимания - это подсчет баллов. Предположим, мы вычисляем внимание к себе для первого слова в этом примере - «Мышление». Нам нужно сопоставить каждое слово входного предложения с этим словом. Оценка определяет, сколько внимания следует уделять другим частям входного предложения, когда мы кодируем слово в определенной позиции.

Оценка рассчитывается как скалярное произведение вектора запроса на ключевой вектор соответствующего слова, которое мы оцениваем. Итак, если мы обрабатываем самовнимание для слова в позиции №1, первая оценка будет скалярным произведением q1 и k1. Вторая оценка будет скалярным произведением q1 и k2.

Третий и четвертый шаги заключаются в разделении баллов на 8 (квадратный корень из размерности ключевых векторов, используемых в статье - 64. Это приводит к получению более стабильных градиентов. Могут быть другие возможные значения здесь, но это значение по умолчанию), затем передайте результат через операцию softmax. Softmax нормализует оценки, чтобы все они были положительными и в сумме равнялись 1.

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

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

Шестой шаг - суммирование векторов взвешенных значений. Это дает результат слоя самовнимания в этой позиции (для первого слова).

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

Многоголовое внимание

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

Идея заключается в том, что всякий раз, когда вы переводите слово, вы можете уделять каждому слову разное внимание в зависимости от типа вопроса, который вы задаете. На изображениях ниже показано, что это значит. Например, когда вы переводите «ударом ногой» в предложении «Я ударил по мячу», вы можете спросить «Кто ударил ногой». В зависимости от ответа перевод слова на другой язык может измениться. Или задайте другие вопросы, например «Что сделал?» И т. Д.

Позиционное кодирование

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

Обзор

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

  1. Неоправданная эффективность рекуррентных нейронных сетей
  2. Понимание сетей LSTM
  3. Визуализация модели нейронного машинного перевода
  4. Иллюстрированный трансформер
  5. Трансформатор - все, что вам нужно - внимание
  6. Аннотированный трансформатор
  7. Внимание - это все, что вам нужно для моделей нейронных сетей внимания
  8. Самовнимание для генеративных моделей
  9. OpenAI GPT-2: понимание генерации языков с помощью визуализации
  10. WaveNet: Генеративная модель для Raw Audio