Углубленный взгляд на последовательные модели с особым акцентом на трансформеры.

Преамбула

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

Если вы уже знаете их, не стесняйтесь переходить к содержанию ниже.

Векторы

Векторы — это способ представления информации в многомерном пространстве. Допустим, мы хотим пометить фильм. Мы можем придумать несколько жанров; романтическая комедия, ужасы, триллер, историческая драма и т. д.

Мы можем представить, сколько каждой из этих категорий принадлежит фильму, представив его в векторе.

Векторы — это способ представления данных в модели таким образом, что можно сказать: «фильм X на 10 % состоит из ужасов, на 50 % — из триллера, на 40 % — из комедии». Поскольку мы определяем три категории для фильмов, мы говорим, что вектор имеет три размера.

Вес

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

Предвзятость

Смещение — это постоянное значение, используемое для смещения весов. Это позволяет модели получать результаты, которые были бы невозможны при использовании только весов.

Обратное распространение

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

Softmax/Тан/Сигмоид

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

Последовательная информация

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

Джеймс вышел из дома, чтобы пойти в магазин.

Мы знаем, что «он» в этом примере относится к Джеймсу, потому что мы можем сделать вывод, о ком идет речь, используя память и порядок слов.

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

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

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

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

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

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

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

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

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

Модель Seq2Seq состоит из кодера и декодера, оба из которых обычно реализуются как RNN.

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

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

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

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

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

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

Модель долговременной памяти

Модели долговременной памяти (LSTM) были разработаны как потенциальное решение проблемы долговременной зависимости. LSTM, как и RNN, требуют, чтобы входная последовательность прошла процесс внедрения.

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

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

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

Первые ворота, забыть ворота, определяют, какая информация должна быть отброшена. Ворота забывания используют сигмовидную функцию и точечное умножение векторов. Сигмовидный слой используется для получения выходных данных между 0 и 1. Этот вывод описывает, сколько информации следует забыть. 0 означает «забыть все», а 1 означает «ничего не забыть».

Затем модуль должен решить, какую информацию хранить в состоянии ячейки. Входные ворота используют сигмовидный слой, чтобы решить, какие значения обновлять. Для сигмовидного слоя в этих воротах 0 означает «не добавлять ничего», а 1 означает «добавлять все». Слои тангенса создают вектор значений-кандидатов, а результат сигмоидального слоя определяет, какие из этих значений будут использоваться для обновления состояния ячейки.

Наконец, необходимо определить выход блока, следующее скрытое состояние. Сигмовидный слой определяет, какую часть состояния ячейки выводить, где 0 означает «ничего не выводить», а 1 означает «выводить все». Само состояние ячейки проходит через слой tanh, сжимая его значения между -1 и 1 перед умножением на результат сигмовидного слоя. Эти операции работают вместе, чтобы вывести только те части скрытого состояния, которые сохраняют какое-либо значение.

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

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

Процесс декодирования LSTM похож на RNN в том, что он генерирует вывод по одному токену за раз, однако его методология отличается, поскольку он сохраняет долгосрочную информацию о состоянии ячейки. LSTM также могут использовать жадный процесс или более сложные методы, такие как beam-search.

LSTM обычно встречаются в архитектуре Seq2Seq с использованием той же модели кодировщика/декодера, которая описана выше в разделе RNN и визуализирована на рисунке 3. Модели LSTM Seq2Seq обычно используются для таких задач, как языковой перевод, суммирование текста, распознавание речи и чат-боты.

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

Модели трансформеров в настоящее время являются современным методом преобразования последовательностей.

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

В 2017 году Ашиш Васвани и его команда представили архитектуру для создания Трансформеров. Дизайн, который привел к разработке известных моделей больших языков (LLM), таких как BERT и ChatGPT.

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

Чтобы помочь вам понять, насколько Transformer лучше традиционных RNN и LSTM, мы можем сравнить их процессы. Когда вы задаете Преобразователю вопрос, он одновременно получает доступ ко всей необходимой информации (ко всей входной последовательности). Когда он генерирует свой ответ, он может динамически «оглядываться назад» на различные части входной последовательности по мере необходимости. Это позволяет Преобразователю видеть полный контекст входных данных и выявлять отношения и тонкие зависимости в последовательности. Если вы попросите Трансформера резюмировать короткую книгу, при генерации ответа он будет иметь доступ к полному тексту и даст контекстно-богатое резюме.

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

Внимание

«Внимание — это овладение умом в ясной и яркой форме одним из нескольких одновременно возможных объектов или цепочек мыслей» — Уильям Джеймс (1890).

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

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

Самостоятельное внимание

Механизм внутреннего внимания — это то, что дает Трансформеру возможность находить эти существенные части. Эта новая технология также позволяет Transformer динамически ссылаться на ввод при генерации вывода. Слой само-внимания является центральным механизмом Трансформера.

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

«Голубь, белый и блестящий, сидел на краю подоконника».

Трансформер видит слово «голубь» и присваивает больший вес внимания словам «белый», «блестящий» и «сидящий», поскольку он распознает эти слова и предоставляет контекстную информацию о голубе. Эти слова являются ключевыми словами. Модель поймет, что голубь — это то, что сидит, и поймет, что «край подоконника» — это то, где он сидит. DALL·E 2 — это мультимодальная модель на основе Transformer, которая идеально выводит значение предложения для создания изображения выше.

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

Как правило, для высококачественного вывода длина входной последовательности для RNN лучше всего работает при 10–20 словах, а для LSTM — в диапазоне 50–500 слов. Хотя LSTM обеспечивают огромный прирост по сравнению с возможностями RNN, обе они меркнут по сравнению с возможностями Transformers. Модели-трансформеры, такие как GPT4, могут иметь входную последовательность до 25 000 слов, Claude — до 75 000 слов, а Microsoft LongNet — предположительно, весь интернет.

Архитектура трансформатора

Преобразователи, такие как RNN и LSTM, используют архитектуру кодировщика/декодера для выполнения задач seq2seq.

Кодер — слева — состоит из двух элементов: слоя самоконтроля с несколькими головками и нейронной сети с прямой связью. Декодер — с правой стороны — состоит из трех элементов: многоуровневый уровень внутреннего внимания, уровень внутреннего внимания кодировщик-декодер и нейронная сеть с прямой связью. Они оба являются блоками-трансформерами. Трансформер складывает несколько блоков, это то, что означает Nx рядом с ними на изображении. Один энкодер используется как вход для следующего энкодера и так далее, и то же самое с декодерами. Блоков должно быть равное количество.

Кодер

Внедрение входных данных и позиционное кодирование

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

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

1. Слово в токен

Каждое слово должно быть преобразовано в уникальный токен, чтобы модель могла его распознать. Каждое слово соответствует уникальному токену, поэтому фразу «Я люблю кошек» можно преобразовать в [816, 8129, 312].

2. Токен для внедрения

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

I: [0.34, -0.21, 1.21]
love: [-1.36, 0.98, 0.23]
cats: [0.54, 0.68, 0.49]

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

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

Position 1: [0.1, 0.2, 0.3]
Position 2: [0.4, 0.5, 0.6]
Position 3: [0.7, 0.8, 0.9]

4. Комбинируйте встраивание и позиционное кодирование

Добавление вложений слов к позиционным кодировкам дает окончательное входное представление:

I (position 1) = [0.34 + 0.1, -0.21 + 0.2, 1.21 + 0.3] = [0.44, -0.01, 1.51]

love (position 2) = [-1.36 + 0.4, 0.98 + 0.5, 0.23 + 0.6] = [-0.96, 1.48, 0.83]

cats (position 3) = [0.54 + 0.7, 0.68 + 0.8, 0.49 + 0.9] = [1.24, 1.48, 1.39]

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

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

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

На уровне самоконтроля с несколькими головками входная последовательность обрабатывается несколько раз. Вот что значит "головы". Каждая голова имеет различную весовую матрицу. Это позволяет каждой головке фиксировать различные шаблоны и взаимосвязи между каждым элементом входной последовательности. Подход «многоголовый» — это то, что позволяет модели параллельно различать значение из разных частей ввода.

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

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

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

В примере «Я люблю кошек» каждое слово представлено своим вектором встраивания:

I = `[0.44, -0.01, 1.51]`
love = `[-0.96, 1.48, 0.83]`
cats  = `[1.24, 1.48, 1.39]`

Механизм внутреннего внимания умножает каждый вектор встраивания на набор весов; Wᵩ , Wₖ и W для вычисления векторов запросов, ключей и значений для каждого слова. (Юникод не имеет нижнего индекса «q», поэтому представьте, что греческий символ — один из них)

“I” = 
`[0.44, -0.01, 1.51] * W_q = Q_1` 
`[0.44, -0.01, 1.51] * W_k = K_1`
`[0.44, -0.01, 1.51] * W_v = V_1`

“love” = 
`[-0.96, 1.48, 0.83] * W_q = Q_2`  
`[-0.96, 1.48, 0.83] * W_k = K_2`  
`[-0.96, 1.48, 0.83] * W_v = V_2`  

“cats” = 
`[1.24, 1.48, 1.39] * W_q = Q_3`  
`[1.24, 1.48, 1.39] * W_k = K_3`  
`[1.24, 1.48, 1.39] * W_v = V_3` 

Wᵩ , Wₖ и W изучаются во время обучения и используются всеми векторами встраивания. Эти матрицы используются для преобразования представления слова в вектор запроса, ключа и значения при сохранении его уникального представления.

У каждого вектора есть свои роли:

Запрос

Запрос определяет релевантность других слов в последовательности с точки зрения этого слова.

Ключ

Ключ определяет релевантность этого слова с точки зрения других слов в последовательности.

Ценить

Значение определяет, насколько заметно слово по сравнению с другими словами. Мы можем думать о заметном как о том, что было выделено. Это выделяется и важно. Трансформер уделяет ему больше «внимания».

Для каждого слова:

  1. Скалярное произведение Qₓ и Kₓ дает новый вектор scoreₓ.
  2. scoreₓ делится на квадратный корень из измерения Kₓ, и к нему применяется softmax для создания нового вектора attention_score.
  3. attention_score умножается на Vₓ с получением нового вектора weighted_value.

Для более визуальных учеников это выглядит так:

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

context — это карта отношений каждого слова к каждому другому слову в последовательности.

Каждая голова внимания создает свой собственный context вектор. Эти векторы объединяются и преобразуются весовой матрицей W₀. Это унифицированное глобальное представление передается в нейронную сеть с прямой связью.

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

Нейронная сеть с прямой связью

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

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

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

Вспомните пример «Я люблю кошек». Он прошел через слой внутреннего внимания и в итоге стал матрицей global_representation. Каждая строка global_representation представляет собой всю информацию, полученную из одного слова/токена входной последовательности. Матрица в целом дает модели информацию обо всей последовательности.

Уровень прямой связи действует на каждую строку global_representation независимо. Прохождение его через слой прямой связи будет выглядеть так:

FNN_output_1 = ReLU((i_output * W1 + b1)) * W2 + b2
FNN_output_2 = ReLU((love_output * W1 + b1)) * W2 + b2
FNN_output_3 = ReLU((cats_output * W1 + b1)) * W2 + b2

Сама нейронная сеть с прямой связью состоит из 2 линейных слоев. W₁ и b₁ относятся к первому слою, W₂ и b₂ — ко второму. Это параметры, общие для всех позиций. Поддерживая постоянство параметров, модель может повторно использовать изученные шаблоны во всей последовательности, расширяя свои возможности для фиксации взаимосвязей в данных.

Связи и нормализация

Результат уровня прямой связи добавляется обратно в матрицу global_representation через остаточное соединение.

residual_output = global_representation + FNN_output_1 + FNN_output_2 + FNN_output_3

Я хотел бы подчеркнуть, что эта операция является сложением, а не конкатенацией. Это означает, что residual_output — это матрица global_representation, дополненная знаниями, полученными из нейронной сети с прямой связью.

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

residual_output используется как вход для следующего блока трансформатора.

Количество блоков может варьироваться. В оригинальной статье «Внимание — это все, что вам нужно» шесть блоков используются как для кодера, так и для декодера. BERT использует 12 блоков, GPT-3 использует 48 блоков. Когда данные проходят через блок, модель подвергается различным уровням абстракции и зависимостям между входными элементами.

Декодер

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

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

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

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

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

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

Вернемся к нашему примеру «Я люблю кошек» и представим, что Transformer используется для перевода ввода с английского на французский.

  1. Процесс кодирования создает вектор encoding.
  2. Декодер генерирует специальный маркер начала предложения, <sos>.
  3. <sos> проходит через слои внедрения и позиционного кодирования, создавая embedded_output_seq
  4. embedded_output_seq проходит через уровень самоконтроля, позволяя декодеру учитывать токены, которые уже были сгенерированы.
  5. Выходные данные слоя самоконтроля передаются в нейронную сеть с прямой связью.
  6. Нейронная сеть создает вектор вероятностей для маркера конца предложения (<eos>) и следующего возможного маркера во французском словаре. Например: {“<eos>: -1, “je”: 0.1, “comment”: -0.3, “J’aime”: 2.1, …}
  7. Модель выбирает токен с наивысшим баллом, в данном случае j’aime.
  8. Обновленная выходная последовательность <sos> j’aime теперь передается декодеру для следующего шага.
  9. Окончательная выходная последовательность, созданная преобразователем, будет <sos> j’aime les chats <eos>.

Как правило, эти шаги повторяются до тех пор, пока не будет сгенерирован токен <eos> или не будет достигнут предел выходной последовательности моделей. Как и в кодировщике, вычисления выполняются параллельно, и выходные данные каждой головки внимания в декодере объединяются перед дальнейшей обработкой. Эти этапы упрощены, и трансформеры, используемые в реальном мире, используют множество сложных матричных/векторных операций для выполнения процессов кодирования-декодера.

Я надеюсь, что этот пост помог вам лучше понять магию трансформеров и машинного обучения в целом. Спасибо за прочтение!