Модели-трансформеры стали популярными в большинстве задач НЛП. Многие модели на основе трансформаторов, такие как серия BERT, ROBERTa, GPT и т. д., считаются самыми современными моделями НЛП. В то время как НЛП перегружен всеми этими моделями, Трансформеры также набирают популярность в компьютерном зрении. Преобразователи теперь используются для распознавания и построения изображений, кодирования изображений и многого другого. В то время как модели-трансформеры захватывают область ИИ, также важно иметь представление об этих моделях на низком уровне. Этот блог направлен на то, чтобы дать представление о моделях на основе Transformer и Transformer. Это включает в себя компоненты модели, детали обучения, метрики и функцию потерь, производительность и т. д.

Предпосылки

  • Вложения
  • Моделирование последовательности
  • RNN и LSTM

Немного предыстории

В настоящее время модели на основе нейронных сетей набирают популярность в области компьютерного зрения и обработки естественного языка (NLP). Но еще в начале 2000-х НЛП не было очень популярно, и самое интересное в ИИ происходило только в компьютерном зрении. В то время компьютерное зрение набирало популярность благодаря вызову ImageNet, и такие модели, как AlexNet, ResNet, GAN и т. д., попадали в заголовки. Компьютерное зрение было настолько привлекательным, что НЛП почти не присутствовало на картине.

Однако в то же время НЛП также добился определенного прогресса благодаря таким моделям, как Word2Vec. Word2Vec — это модель нейронной сети, изобретенная Google в 2013 году. Эта модель может генерировать контекстно-независимые вложения в текстовые данные. Модели Word2Vec стали ключевым прорывом в области NLP, потому что это была одна из первых моделей, которые могли генерировать вложения на основе семантического значения слова.

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

Позже это было решено с помощью другой серии моделей, известной как LSTM. Модели LSTM были первоначально изобретены в 1997 году, но они приобрели популярность после изобретения RNN. LSTM можно считать великим достижением в области НЛП. LSTM могут справляться с проблемами исчезновения / взрыва градиента, запоминать вещи более умным способом. Существуют и другие варианты LSTM, которые до сих пор широко используются многими компаниями. К ним относятся двунаправленный LSTM, GRU и многие другие. Если вы хотите узнать больше о LSTM, я рекомендую вам ознакомиться с моим предыдущим сообщением в блоге.



Именно в 2017 году НЛП совершило ключевой прорыв. Google выпустил исследовательскую работу «Внимание — это все, что вам нужно», в которой была представлена ​​концепция под названием «Внимание». Внимание помогает нам сосредоточиться только на необходимых функциях, а не на всех функциях. Механизм внимания привел к разработке моделей Transformer и Transformer.

Почему Трансформеры

LTM были великолепны. Но было и несколько ограничений. Во-первых, LSTM было трудно обучать. Это в основном из-за более длительного времени обучения, а также из-за высоких требований к памяти во время обучения. LSTM в основном использовались для преодоления проблем исчезающего/взрывающегося градиента с помощью RNN. Но оказывается, что LSTM решают эту проблему лишь до определенной степени. Еще одним недостатком LSTM является то, что он может легко переобучиться, и очень сложно включить методы регуляризации. Итак, теперь мы узнали, что LSTM не могут полностью избавить нас от всех этих проблем. И что теперь?

А вот и Трансформеры. Изобретение Трансформеров можно считать моментом «БАМ» НЛП. Итак, какие дополнительные преимущества предлагает Transformer? Давайте сначала проведем общий обзор Transformers, а затем мы сможем углубиться в его компоненты и их работу на следующих сессиях.

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

На очень высоком уровне Transformers можно рассматривать как модель Encoder-Decoder, где Encoder будет принимать наши входные данные и преобразовывать их в вектор. Эти закодированные входные данные передаются декодеру, где декодер пытается преобразовать вектор в естественный или интерпретируемый язык. Теперь, если мы подумаем об описанном выше процессе, мы можем связать его с машинным переводом (например, преобразование французского предложения в английское) или созданием подписей к изображениям (генерация подписей к изображениям). Когда мы используем Transformer для машинного перевода, мы передаем наше входное предложение (французское предложение) кодировщику. Кодер преобразует текст в вектор. Теперь этот вектор передается декодеру, где он преобразует его в английское предложение. Тот же метод применим и к подписям к изображениям, где входом будет изображение, а выходом будет предложение, описывающее изображение.

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

Все это хорошо. Но что такого особенного в Трансформерах по сравнению с предыдущими моделями?

  • Трансформеры могут обрабатывать долгосрочные зависимости лучше, чем LSTM
  • Решает проблему с исчезающими/взрывающимися градиентами
  • Кодирование двунаправленное
  • Поддерживает распараллеливание

Каждый из этих пунктов станет яснее по мере продвижения вперед.

Стек кодировщика

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

Из приведенного выше рисунка видно, что один блок кодировщика содержит два блока — блок самоконтроля и нейронную сеть прямого распространения. Я предполагаю, что вы уже знакомы с нейронной сетью с прямой связью, поэтому я не буду это объяснять. Давайте сосредоточимся на слое само-внимания.

Слой самоанализа

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

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

Например, рассмотрим предложение

«Животное не перешло улицу, потому что слишком устало»

Теперь представьте, что нам нужно перевести это предложение. Для этого, во-первых, нам нужно его закодировать. Теперь при кодировании мы передаем кодировщику все слова в этом предложении (все одновременно). Теперь, когда мы начинаем кодирование, мы узнали, что для кодирования некоторых слов также требуется некоторый контекст. Например, слово «оно» — относится ли оно к животному или к улице. Здесь мы используем механизм само-внимания. В итоге мы получим матрицу внимания, в которой указано, насколько каждое слово важно при кодировании того или иного слова. Матрица внимания для приведенного выше примера будет выглядеть примерно так. Чем темнее клетка, тем больше внимания потребуется.

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

Матрица внимания и закодированный вектор — Z

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

Матрица внимания

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

Как показано на рисунке выше, каждый из векторов входных слов (x1 на рисунке) умножается на некоторые матрицы для создания векторов ключа, запроса и значения. Матрица, используемая для умножения, изучается посредством обратного распространения ошибки. Предположим, что мы зафиксировали входное измерение (количество входных слов) как L, а размер весовых матриц равен dxd. Когда мы вычислим эти векторы для всех входных слов, размерность этих векторов будет 1xd. Теперь, когда мы объединим все эти векторы для всех входных слов, результирующий вектор будет Lxd.

Итак, теперь у нас есть эти три вектора. Как теперь вычислить матрицу внимания? Как только мы получим эти векторы, матрица внимания будет рассчитана как

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

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

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

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

Здесь мы можем увидеть еще некоторые особенности

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

Стек декодера

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

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

  • Самостоятельное внимание — это работает так же, как в Encoder. Но здесь немного по-другому. Если вы помните, внимание в кодировщике, для текущего слова мы должны рассматривать векторы ключа, значения и запроса, соответствующие всем словам. Это означает, что текущее слово должно обращать внимание как на прошлые, так и на будущие слова, что делает этот процесс двунаправленным. Но функция декодера состоит в том, чтобы предсказать следующее слово. Итак, при вычислении вектора внимания для текущего слова мы можем учитывать только прошлые слова, потому что будущее слово нам еще неизвестно и его предстоит предсказать. Это делает процесс внимания декодера однонаправленным.
  • Внимание кодировщика-декодера — этот слой будет вычислять внимание между кодировщиком и декодером и сообщит нам, насколько важен каждый компонент вектора кодировщика в предсказании следующего слова.

Выходной слой

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

Предположим, что в нашей задаче целевым языком является английский, и в нашем словарном запасе всего 1000 слов. Теперь последний выходной слой в модели Transformer — это слой softmax, размер которого равен размеру словаря. Результат будет оцениваться от 0 до 1, что на самом деле является вероятностью каждого слова в качестве вывода. Например, если в момент времени t=1 выходной вектор будет таким

Тогда выходным словом в момент t=1 будет «am». Таким образом, каждое выходное слово будет прогнозироваться до тех пор, пока не будет достигнуто условие «EOS».

Детали обучения

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

Трансформаторные вариации

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

Последние мысли

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

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