Трансформатор — это архитектура глубокого обучения, разработанная исследователями из Google и основанная на механизме многоголового внимания , предложенном в статье 2017 года « Внимание — это все, что вам нужно ». [1] Текст преобразуется в числовые представления, называемые токенами , и каждый токен преобразуется в вектор с помощью поиска в таблице встраивания слов . [1] На каждом уровне каждый токен затем контекстуализируется в рамках контекстного окна с другими (незамаскированными) токенами с помощью параллельного механизма многоголового внимания, что позволяет усилить сигнал для ключевых токенов и ослабить менее важные токены.
Преимущество трансформаторов в том, что они не имеют повторяющихся единиц, поэтому требуют меньше времени на обучение, чем более ранние рекуррентные нейронные архитектуры (RNN), такие как долговременная краткосрочная память (LSTM). [2] Более поздние вариации были широко приняты для обучения больших языковых моделей (LLM) на больших (языковых) наборах данных, таких как корпус Википедии и Common Crawl . [3]
Трансформаторы были впервые разработаны как улучшение предыдущих архитектур для машинного перевода , [4] [5], но с тех пор нашли множество применений. Они используются в крупномасштабной обработке естественного языка , компьютерном зрении ( трансформаторы зрения ), обучении с подкреплением , [6] [7] аудио , [8] мультимодальном обучении , робототехнике , [9] и даже в игре в шахматы . [10] Это также привело к разработке предварительно обученных систем , таких как генеративные предварительно обученные трансформаторы (GPT) [11] и BERT [12] (представления двунаправленного кодировщика из трансформаторов).
В течение многих лет моделирование и генерация последовательностей выполнялись с использованием простых рекуррентных нейронных сетей (RNN). Хорошо цитируемым ранним примером была сеть Элмана (1990). Теоретически информация из одного токена может распространяться сколь угодно далеко вниз по последовательности, но на практике проблема исчезающего градиента оставляет состояние модели в конце длинного предложения без точной, извлекаемой информации о предыдущих токенах.
Ключевым прорывом стала LSTM (1995), [примечание 1] RNN, которая использовала различные инновации для преодоления проблемы исчезающего градиента, что позволило эффективно обучаться моделированию длинных последовательностей. Одним из ключевых инноваций было использование механизма внимания , который использовал нейроны, умножающие выходы других нейронов, так называемые мультипликативные единицы . [13] Нейронные сети, использующие мультипликативные единицы, позже были названы сетями сигма-пи [14] или сетями более высокого порядка . [15] LSTM стала стандартной архитектурой для моделирования длинных последовательностей до публикации Transformers в 2017 году. Однако LSTM по-прежнему использовала последовательную обработку, как и большинство других RNN. [примечание 2] В частности, RNN обрабатывают один токен за раз от первого до последнего; они не могут работать параллельно по всем токенам в последовательности.
Современные Transformers преодолевают эту проблему, но в отличие от RNN, они требуют времени вычисления, квадратичного по размеру контекстного окна. Линейно масштабируемый быстрый контроллер веса (1992) учится вычислять матрицу веса для дальнейшей обработки в зависимости от входных данных. [16] Одна из его двух сетей имеет «быстрые веса» или «динамические связи» (1981). [17] [18] [19] Медленная нейронная сеть учится с помощью градиентного спуска генерировать ключи и значения для вычисления изменений веса быстрой нейронной сети, которая вычисляет ответы на запросы. [16] Позже было показано, что это эквивалентно ненормализованному линейному Transformer. [20] [21]
Идея трансдукции последовательности кодер-декодер была разработана в начале 2010-х годов (см. [22] [23] для предыдущих статей). Статьи, которые чаще всего цитируются как первоисточники, создавшие seq2seq, — это две одновременно опубликованные статьи 2014 года. [22] [23]
(Sutskever et al, 2014) [23] была 380M-параметрической моделью для машинного перевода с использованием двух долгосрочных краткосрочных запоминающих устройств (LSTM). Архитектура состоит из двух частей. Кодер — это LSTM, который принимает последовательность токенов и превращает ее в вектор. Декодер — это еще одна LSTM, которая преобразует вектор в последовательность токенов. Аналогично, (Cho et al, 2014) [22] была 130M-параметрической моделью, которая использовала управляемые рекуррентные единицы (GRU) вместо LSTM. Более поздние исследования показали, что GRU не лучше и не хуже LSTM для seq2seq. [24] [25]
Эти ранние модели seq2seq не имели механизма внимания, а вектор состояния был доступен только после обработки последнего слова исходного текста. Хотя в теории такой вектор сохраняет информацию обо всем исходном предложении, на практике информация сохраняется плохо, поскольку входные данные обрабатываются последовательно одной рекуррентной сетью в выходной вектор фиксированного размера, который затем обрабатывался другой рекуррентной сетью в выходной сигнал. Если входные данные длинные, то выходной вектор не сможет содержать всю необходимую информацию, и качество выходных данных ухудшается. Как доказательство, обратный ход входного предложения улучшил перевод seq2seq. [26]
(Bahdanau et al, 2014) [4] ввели механизм внимания в seq2seq для машинного перевода, чтобы решить проблему узкого места ( выходного вектора фиксированного размера ), что позволило модели легче обрабатывать зависимости на больших расстояниях. Они назвали свою модель RNNsearch , поскольку она «эмулирует поиск по исходному предложению во время декодирования перевода».
(Луонг и др., 2015) [27] сравнили относительную производительность архитектур моделей глобального (Бахданау и др., 2014)) и локального (скользящее окно) внимания для машинного перевода и обнаружили, что архитектура смешанного внимания имела более высокое качество, чем глобальное внимание, в то время как использование архитектуры локального внимания сокращало время перевода.
В 2016 году Google Translate был переделан в Google Neural Machine Translation , который заменил предыдущую модель, основанную на статистическом машинном переводе . Новая модель представляла собой модель seq2seq, где кодер и декодер представляли собой 8 слоев двунаправленной LSTM. [28] На ее разработку ушло девять месяцев, и она достигла более высокого уровня производительности, чем статистический подход, на разработку которого ушло десять лет. [29]
Модели Seq2seq с вниманием (включая самовнимание) все еще страдали от той же проблемы с рекуррентными сетями, которая заключается в том, что их трудно распараллелить , что не позволяло ускорить их на графических процессорах. В 2016 году разложимое внимание применило механизм самовнимания к сетям прямого распространения , которые легко распараллелить, и достигло результата SOTA в текстовом выводе с на порядок меньшим количеством параметров, чем LSTM. [30] Один из его авторов, Якоб Ушкорейт, подозревал, что внимание без повторения достаточно для языкового перевода, отсюда и название «внимание — это все , что вам нужно». [31] Эта гипотеза противоречила общепринятому мнению того времени, и даже его отец, известный вычислительный лингвист, был настроен скептически. [31] В том же году самовнимание (называемое внутривниманием или внутрипредложным вниманием ) было предложено для LSTM. [32]
В 2017 году оригинальная (размером 100 М) модель преобразователя кодера-декодера была предложена в статье « Внимание — это все, что вам нужно ». В то время основное внимание уделялось улучшению seq2seq для машинного перевода путем устранения его повторения для параллельной обработки всех токенов, но сохранения его механизма внимания скалярного произведения для поддержания производительности обработки текста. [1] Его параллелизуемость была важным фактором для его широкого использования в больших нейронных сетях. [33]
Еще весной 2017 года, еще до публикации препринта «Внимание — все, что вам нужно», один из соавторов применил вариант архитектуры «только декодер» для генерации вымышленных статей Википедии. [34] Архитектура Transformer в настоящее время используется во многих генеративных моделях , которые способствуют продолжающемуся буму ИИ .
В языковом моделировании ELMo (2018) был двунаправленным LSTM, который производит контекстуализированные вложения слов , улучшая линию исследований от bag of words и word2vec . За ним последовал BERT (2018), модель Transformer, работающая только с кодировщиком. [35] В октябре 2019 года Google начал использовать BERT для обработки поисковых запросов. [36] В 2020 году Google Translate заменил предыдущую модель RNN-кодировщик–RNN-декодер на модель Transformer-кодировщик–RNN-декодер. [37]
Начиная с 2018 года серия OpenAI GPT декодерных трансформеров стала передовым достижением в области генерации естественного языка . В 2022 году чат-бот на основе GPT-3, ChatGPT , стал неожиданно популярным, [38] вызвав бум вокруг больших языковых моделей . [39] [40]
С 2020 года Transformers стали применяться в модальностях, выходящих за рамки текста, включая Vision transformer , [41] распознавание речи, [42] робототехнику [6] и мультимодальные . [43] Vision transformer, в свою очередь, стимулировал новые разработки в области сверточных нейронных сетей . [44] Генераторы изображений и видео, такие как DALL-E (2021), Stable Diffusion 3 (2024), [45] и Sora (2024), основаны на архитектуре Transformer.
Архитектура простого трансформатора имела трудности со схождением. В оригинальной статье [1] авторы рекомендовали использовать разминку скорости обучения. То есть скорость обучения должна линейно увеличиваться от 0 до максимального значения для первой части обучения (обычно рекомендуется, чтобы она составляла 2% от общего числа шагов обучения), прежде чем снова затухать.
В статье 2020 года было обнаружено, что использование нормализации слоев до (а не после) многоголового внимания и слоев прямой связи стабилизирует обучение, не требуя разогрева скорости обучения. [46]
Трансформеры обычно сначала предварительно обучаются с помощью самоконтролируемого обучения на большом общем наборе данных, а затем с помощью контролируемой тонкой настройки на небольшом наборе данных для конкретной задачи. Набор данных предварительной подготовки обычно представляет собой немаркированный большой корпус, такой как The Pile . Задачи для предварительной подготовки и тонкой настройки обычно включают:
Отчет трансформатора T5 [47] документирует большое количество задач по предварительной подготовке естественного языка . Вот некоторые примеры:
Обратите внимание, что хотя каждая из этих задач является тривиальной или очевидной для людей, являющихся носителями языка (или языков), они, как правило, оказывались сложными для предыдущих поколений архитектуры машинного обучения.
В целом, существует 3 класса задач моделирования языка: «замаскированные», [49] «авторегрессивные», [50] и «префиксные LM». [51] Эти классы не зависят от конкретной архитектуры моделирования, такой как Transformer, но они часто обсуждаются в контексте Transformer.
В замаскированной задаче [49] один или несколько токенов замаскированы, и модель будет производить распределение вероятностей, предсказывающее, что представляют собой замаскированные токены, на основе контекста. Функция потерь для задачи обычно представляет собой сумму логарифмов-перплексий для замаскированных токенов: и модель обучается минимизировать эту функцию потерь. Серия моделей BERT обучается для прогнозирования замаскированных токенов и другой задачи.
В задаче авторегрессии [50] вся последовательность сначала маскируется, и модель выдает распределение вероятностей для первого токена. Затем первый токен раскрывается, и модель предсказывает второй токен и т. д. Функция потерь для задачи обычно остается прежней. Серия моделей GPT обучается с помощью задач авторегрессии.
В задаче prefixLM [51] последовательность делится на две части. Первая часть представлена как контекст, а модель предсказывает первый токен второй части. Затем это будет раскрыто, и модель предскажет второй токен и так далее. Функция потерь для задачи обычно остается той же. Серия моделей T5 обучается с помощью задач prefixLM.
Обратите внимание, что «замаскированный» в значении «моделирование замаскированного языка» не является «замаскированным» в значении «замаскированное внимание», а «префиксLM» (моделирование префиксного языка) не является «префиксLM» (модель префиксного языка).
Все трансформаторы имеют одинаковые первичные компоненты:
Следующее описание точно следует Трансформатору, как описано в оригинальной статье. Существуют варианты, описанные в следующем разделе.
По соглашению мы записываем все векторы как векторы-строки. Это, например, означает, что проталкивание вектора через линейный слой означает его умножение на матрицу весов справа, как .
Поскольку архитектура Transformer изначально обрабатывает числовые данные, а не текст, между текстом и токенами должен быть перевод. Токен — это целое число, представляющее символ или короткий сегмент символов. На стороне ввода входной текст разбирается на последовательность токенов. Аналогично на стороне вывода выходные токены разбираются обратно на текст. Модуль, выполняющий преобразование между последовательностями токенов и текстами, называется токенизатором .
Набор всех токенов — это словарь токенизатора, а его размер — это размер словаря . При столкновении с токенами за пределами словаря обычно используется специальный токен, записываемый как «[UNK]» для «неизвестно».
Некоторые часто используемые токенизаторы — это кодирование пар байтов , WordPiece и SentencePiece.
Каждый токен преобразуется в вектор встраивания с помощью таблицы поиска . Эквивалентно выраженный, он умножает однократное представление токена на матрицу встраивания . Например, если входной токен , то однократное представление , а его вектор встраивания Векторы встраивания токена добавляются к соответствующим им позиционным векторам кодирования (см. ниже), создавая последовательность входных векторов.
Число измерений во вложенном векторе называется скрытым размером или размером вложения и записывается как [35]
Слой извлечения — это почти противоположность слою внедрения. В то время как слой внедрения преобразует токен в вектор, слой извлечения преобразует вектор в распределение вероятностей по токенам.
Слой невнедрения — это линейный слой softmax : Матрица имеет форму . Иногда требуется, чтобы матрица вложения и матрица невложения были транспонированы друг друга, практика, называемая связыванием веса. [52]
Позиционное кодирование — это векторное представление фиксированного размера относительных позиций токенов в последовательности: оно предоставляет модели преобразователя информацию о том, где находятся слова во входной последовательности. Без позиционного кодирования модель не смогла бы обрабатывать входную последовательность как нечто большее, чем мешок слов , например, и « человек кусает собаку », и «собака кусает человека» были бы обработаны совершенно одинаково.
Позиционное кодирование определяется как функция типа , где — положительное четное целое число . Полное позиционное кодирование, определенное в оригинальной статье [1], имеет вид: где .
Здесь, является свободным параметром, который должен быть значительно больше, чем самый большой , который будет введен в функцию позиционного кодирования. В оригинальной статье используется .
Функция имеет более простую форму, если записать ее как сложную функцию типа , где .
Основная причина использования этой функции позиционного кодирования заключается в том, что при ее использовании сдвиги являются линейными преобразованиями: где — расстояние, на которое требуется сместиться. Это позволяет преобразователю брать любую закодированную позицию и находить кодировку позиции на n шагов вперед или на n шагов назад с помощью умножения матриц.
Взяв линейную сумму, любую свертку можно реализовать как линейные преобразования: для любых констант . Это позволяет преобразователю брать любую закодированную позицию и находить линейную сумму закодированных положений ее соседей. Эта сумма закодированных позиций, будучи введена в механизм внимания, создаст веса внимания для ее соседей, во многом подобно тому, что происходит в языковой модели сверточной нейронной сети . По словам автора, «мы предположили, что это позволит модели легко научиться уделять внимание относительному положению».
В типичных реализациях все операции выполняются над действительными числами, а не над комплексными, но поскольку комплексное умножение можно реализовать как действительное умножение матриц 2 на 2 , это всего лишь различие в обозначениях.
Как и более ранние модели seq2seq , исходная модель трансформатора использовала архитектуру кодер-декодер . Кодер состоит из слоев кодирования, которые обрабатывают все входные токены вместе один слой за другим, в то время как декодер состоит из слоев декодирования, которые итеративно обрабатывают выходные токены кодера и декодера до сих пор.
Целью каждого слоя кодировщика является создание контекстуализированных представлений токенов, где каждое представление соответствует токену, который «смешивает» информацию из других входных токенов через механизм собственного внимания. Каждый слой декодера содержит два подуровня внимания: (1) перекрестное внимание для включения выходных данных кодировщика (контекстуализированные представления входных токенов) и (2) собственное внимание для «смешивания» информации среди входных токенов для декодера (т. е. токенов, сгенерированных до сих пор во время вывода). [53] [54]
Оба слоя кодировщика и декодера имеют нейронную сеть прямой связи для дополнительной обработки своих выходов и содержат остаточные соединения и шаги нормализации слоя. [54] Эти слои прямой связи содержат большинство параметров в модели Transformer.
Модули сети прямой связи (FFN) в Трансформере представляют собой 2-слойные многослойные персептроны : где — его функция активации. Оригинальный Трансформер использовал активацию ReLU .
Число нейронов в среднем слое называется промежуточным размером (GPT), [55] размером фильтра (BERT), [35] или размером прямой связи (BERT). [35] Обычно он больше размера внедрения. Например, как в серии GPT-2, так и в серии BERT промежуточный размер модели в 4 раза больше ее размера внедрения: .
Механизм внимания, используемый в архитектуре Transformer, представляет собой масштабированные скалярные единицы внимания . Для каждой единицы модель transformer изучает три матрицы весов: веса запросов , веса ключей и веса значений .
Модуль принимает три последовательности: последовательность запроса, последовательность ключа и последовательность значения. Последовательность запроса — это последовательность длины , а каждая запись — это вектор размерности . Аналогично для последовательностей ключа и значения.
Для каждого вектора в последовательности запроса он умножается на матрицу для получения вектора запроса . Матрица всех векторов запроса — это матрица запроса: Аналогично мы строим матрицу ключей и матрицу значений .
Обычно все матрицы являются квадратными, т.е. и т.д.
Веса внимания рассчитываются с использованием векторов запроса и ключа: вес внимания от токена к токену является скалярным произведением между и . Веса внимания делятся на квадратный корень размерности векторов ключа, , что стабилизирует градиенты во время обучения, и проходят через softmax , который нормализует веса. Тот факт, что и являются разными матрицами, позволяет вниманию быть несимметричным: если токен уделяет внимание токену (т. е . большой), это не обязательно означает, что токен уделит внимание токену (т. е. может быть маленьким). Выход блока внимания для токена является взвешенной суммой векторов значений всех токенов, взвешенных по , вниманию от токена к каждому токену.
Расчет внимания для всех токенов может быть выражен как один большой матричный расчет с использованием функции softmax , что полезно для обучения из-за оптимизаций вычислительных матричных операций, которые быстро вычисляют матричные операции. Матрицы , и определяются как матрицы, где строки th являются векторами , , и соответственно. Тогда мы можем представить внимание как
где softmax применяется к каждой строке матрицы.
Число измерений в векторе запроса — это размер запроса и аналогично для размера ключа и размера значения . Выходное измерение заголовка внимания — это его размерность головы . Механизм внимания требует соблюдения следующих трех равенств: но в остальном не ограничен.
Если головка внимания используется в режиме собственного внимания, то . Если головка внимания используется в режиме перекрестного внимания, то обычно . Теоретически возможно, чтобы все три были разными, но на практике это случается редко.
Один набор матриц называется головкой внимания , и каждый слой в модели трансформатора имеет несколько головок внимания. В то время как каждая головка внимания уделяет токенам, которые имеют отношение к каждому токену, несколько головок внимания позволяют модели делать это для разных определений «релевантности». В частности, матрицы проекции запросов и ключей и , которые участвуют в вычислении оценки внимания, определяют «релевантность». Между тем, матрица проекции значений в сочетании с частью матрицы проекции выходных данных определяет, как посещаемые токены влияют на то, какая информация передается последующим слоям и, в конечном счете, выходным логитам. Кроме того, область внимания или диапазон отношений токенов, захваченных каждой головкой внимания, может расширяться по мере прохождения токенов через последовательные слои. Это позволяет модели захватывать более сложные и долгосрочные зависимости в более глубоких слоях. Многие головки внимания трансформатора кодируют отношения релевантности, которые имеют смысл для людей. Например, некоторые головки внимания могут уделять в основном следующему слову, в то время как другие в основном обращаются от глаголов к их прямым объектам. [56] Вычисления для каждой головки внимания могут выполняться параллельно , что обеспечивает быструю обработку. Выходные данные для слоя внимания объединяются для передачи в слои нейронной сети прямого распространения .
Конкретно, пусть несколько головок внимания индексируются с помощью , тогда мы имеем , где матрица является конкатенацией вложений слов, а матрицы являются «матрицами проекций», принадлежащими отдельной головке внимания , и является окончательной матрицей проекций, принадлежащей всей многоголовой головке внимания.
Теоретически возможно, чтобы каждая голова внимания имела разное измерение головы , но на практике это случается редко.
Например, в самой маленькой модели GPT-2 есть только механизмы самовнимания. Она имеет следующие размеры: Поскольку , ее выходная проекционная матрица является квадратной матрицей.
Может потребоваться вырезать связи внимания между некоторыми парами слов. Например, декодер при декодировании для токена position не должен иметь доступа к токену в position . Это может быть достигнуто до этапа softmax путем добавления матрицы маски , которая находится в записях, где связь внимания должна быть вырезана, и в других местах: Немаскированный модуль внимания можно рассматривать как маскированный модуль внимания, где маска имеет все записи, равные нулю.
Например, следующая матрица обычно используется в модулях самовнимания декодера, называемых «причинной маскировкой»: На словах это означает, что каждый токен может обращать внимание на себя и на каждый токен до него, но не на любой после него. В качестве примера необычного использования матрицы маски XLNet рассматривает все маски вида , где — случайная матрица перестановки . [57]
Кодер состоит из слоя внедрения, за которым следуют несколько слоев кодера.
Каждый слой кодировщика состоит из двух основных компонентов: механизма самовнимания и слоя прямой связи. Он принимает входные данные в виде последовательности входных векторов, применяет механизм самовнимания для создания промежуточной последовательности векторов, затем применяет слой прямой связи для каждого вектора по отдельности. Схематически мы имеем:
где означает «сеть прямой связи». Мы можем более кратко записать это как с неявным соглашением, что применяется к каждой строке матрицы по отдельности.
Слои кодировщика сложены. Первый слой кодировщика берет последовательность входных векторов из слоя внедрения, создавая последовательность векторов. Эта последовательность векторов обрабатывается вторым кодировщиком и так далее. Выходные данные из последнего слоя кодировщика затем используются декодером.
Поскольку кодер обрабатывает все входные данные одновременно, каждый токен может уделять внимание каждому другому токену (всеобщее внимание), поэтому нет необходимости в причинной маскировке.
Декодер состоит из слоя внедрения, за которым следуют несколько слоев декодера, а затем слой извлечения.
Каждый декодер состоит из трех основных компонентов: механизма каузально замаскированного собственного внимания, механизма перекрестного внимания и нейронной сети прямой связи. Декодер функционирует аналогично кодеру, но в него вставлен дополнительный механизм внимания, который вместо этого извлекает соответствующую информацию из кодировок, сгенерированных кодерами. Этот механизм также можно назвать вниманием кодера-декодера . [1] [54]
Как и первый кодер, первый декодер принимает позиционную информацию и вложения выходной последовательности в качестве входных данных, а не кодировки. Трансформатор не должен использовать текущий или будущий выход для прогнозирования выхода, поэтому выходная последовательность должна быть частично замаскирована, чтобы предотвратить этот обратный поток информации. [1] Это позволяет генерировать авторегрессивный текст. Для декодирования всеобщее внимание не подходит, потому что токен не может уделять внимание еще не сгенерированным токенам. Таким образом, модуль собственного внимания в декодере каузально замаскирован.
Напротив, механизм перекрестного внимания обращается на выходные векторы кодера, которые вычисляются до того, как декодер начинает декодирование. Следовательно, в механизме перекрестного внимания нет необходимости в маскировке.
Схематически имеем: где — матрица, строки которой являются выходными векторами кодера.
За последним декодером следует последний слой дезинтеграции. для получения выходных вероятностей по словарю. Затем один из токенов выбирается в соответствии с вероятностью, и декодер может быть запущен снова для получения следующего токена и т. д., авторегрессивно генерируя выходной текст.
Каждый слой кодировщика содержит 2 подуровня: собственное внимание и сеть прямой связи. Каждый слой декодера содержит 3 подуровня: причинно-замаскированное собственное внимание, перекрестное внимание и сеть прямой связи.
Последние детали — это остаточные соединения и нормализация слоев (LayerNorm или LN), которые, хотя и не являются концептуально необходимыми, необходимы для численной устойчивости и сходимости. Подобно тому, как модули прямой связи применяются индивидуально к каждому вектору, LayerNorm также применяется индивидуально к каждому вектору.
Используются два общих соглашения: соглашение после LN и соглашение до LN . В соглашении после LN выход каждого подслоя — это , где — функция, реализованная самим подслоем.
В конвенции до LN выход каждого подслоя равен Оригинальный Transformer 2017 года использовал конвенцию после LN. Его было трудно обучать, и он требовал тщательной настройки гиперпараметров и «разминки» скорости обучения, когда она начиналась с малого и постепенно увеличивалась. Конвенция до LN, предложенная несколько раз в 2018 году, [58] оказалась более простой в обучении, не требующей разминки, что приводило к более быстрой сходимости. [46]
Ниже приведен псевдокод для стандартного пре-LN кодера-декодера Transformer, адаптированный из [59]
вход: Вход кодера t_e Вход декодера t_dвыход: Массив распределений вероятностей с формой (размер словаря декодера x длина (выходная последовательность декодера))/* кодировщик */z_e ← кодировщик.токенизатор(t_e)для каждого t в 1:length(z_e) сделать z_e[t] ← кодер.встраивание(z_e[t]) + кодер.позиционное_встраивание(t)для каждого l в 1:length(encoder.layers) сделать слой ← кодировщик.слои[l] /* первый подуровень */ z_e_copy ← копировать(z_e) для каждого t в 1:length(z_e) сделать z_e[t] ← слой.норма_слоя(z_e[t]) z_e ← Layer.multiheaded_attention(z_e, z_e, z_e) для каждого t в 1:length(z_e) сделать z_e[t] ← z_e[t] + z_e_copy[t] /* второй подуровень */ z_e_copy ← копировать(z_e) для каждого t в 1:length(z_e) сделать z_e[t] ← слой.норма_слоя(z_e[t]) z_e ← слой.прямая связь(z_e) для каждого t в 1:length(z_e) сделать z_e[t] ← z_e[t] + z_e_copy[t]для каждого t в 1:length(z_e) сделать z_e[t] ← кодер.final_layer_norm(z_e[t])/* декодер */z_d ← декодер.токенизатор(t_d)для каждого t в 1:length(z_d) сделать z_d[t] ← декодер.внедрение(z_d[t]) + декодер.позиционное_внедрение(t)для каждого l в 1:length(decoder.layers) сделать слой ← декодер.слои[l] /* первый подуровень */ z_d_copy ← копировать(z_d) для каждого t в 1:length(z_d) сделать z_d[t] ← слой.норма_слоя(z_d[t]) z_d ← слой.маскированное_многоголовое_внимание(z_d, z_d, z_d) для каждого t в 1:length(z_d) сделать z_d[t] ← z_d[t] + z_d_copy[t] /* второй подуровень */ z_d_copy ← копировать(z_d) для каждого t в 1:length(z_d) сделать z_d[t] ← слой.норма_слоя(z_d[t]) z_d ← слой.многоголовое_внимание(z_d, z_e, z_e) для каждого i в 1:length(z_d) сделать z_d[t] ← z_d[t] + z_d_copy[t] /* третий подуровень */ z_d_copy ← копировать(z_d) для каждого t в 1:length(z_d) сделать z_d[t] ← слой.норма_слоя(z_d[t]) z_d ← слой.прямая связь(z_d) для каждого t в 1:length(z_d) сделать z_d[t] ← z_d[t] + z_d_copy[t]z_d ← декодер.final_layer_norm(z_d)output_distributions ← []для каждого t в 1:length(z_d) сделать output_distributions.append(декодер.unembed(z_d[t]))возврат выходных_распределений
Архитектура Transformer, будучи модульной, допускает вариации. Несколько распространенных вариаций описаны здесь. [60]
Трансформатор «только для кодировщика» применяет кодировщик для отображения входного текста в последовательность векторов, которые представляют входной текст. Обычно это используется для встраивания текста и обучения представлению для последующих приложений. BERT — только для кодировщика. В настоящее время они используются реже, поскольку было обнаружено, что они не намного лучше, чем обучение кодировщика-декодировщика Трансформера, а затем только кодировщика. [51]
Трансформер «только декодер» не является буквально только декодером, поскольку без кодера механизму перекрестного внимания не за чем следить. Таким образом, слои декодера в Трансформере только декодера состоят всего из двух подслоев: причинно-замаскированного собственного внимания и сети прямой связи. Обычно это используется для генерации текста и следования инструкциям . Модели в сериях GPT и Chinchilla являются только декодерами.
Трансформатор «кодер-декодер» в целом такой же, как и оригинальный Трансформатор, с 2 подуровнями на слой кодера и 3 подуровнями на слой декодера и т. д. Они могут иметь незначительные архитектурные улучшения, такие как альтернативные функции активации, изменение местоположения нормализации и т. д. Это также обычно используется для генерации текста и выполнения инструкций . Модели серии T5 являются кодер-декодерами. [60]
«PrefixLM» (модель языка префиксов) — это архитектура только для декодера, но с маскировкой префиксов, которая отличается от каузальной маскировки. В частности, она имеет маску вида [60] : Рисунок 3 , где первые столбцы соответствуют «префиксу», а последующие столбцы соответствуют авторегрессионно сгенерированному тексту на основе префикса. Они напоминают модели кодировщика-декодера, но имеют меньшую «разреженность». Такие модели используются редко, хотя они упоминаются как теоретические возможности и сравнительные тесты. [51]
Существуют также смешанные модели seq2seq. Например, в 2020 году Google Translate заменил предыдущую модель RNN-encoder–RNN-decoder на модель Transformer-encoder–RNN-decoder, аргументируя это тем, что RNN-decoder работает намного быстрее, чем Transformer-decoder, когда работает авторегрессивно. [61]
Оригинальный трансформатор использует функцию активации ReLU . Были разработаны другие функции активации. Серия Llama использовала SwiGLU; [62] как GPT-1, так и BERT [35] использовали GELU. [63]
Альтернативные функции активации часто используются в сочетании с линейными блоками управления в модуле прямой связи. [64]
Нормализация, используемая в Transformer, может отличаться от LayerNorm. Одним из примеров является RMSNorm [65] , который используется в серии Llama . Другие примеры включают ScaleNorm, [66] или FixNorm. [66]
Трансформаторы могут использовать другие методы позиционного кодирования, нежели синусоидальные. [67]
В оригинальной статье Transformer сообщалось об использовании обученного позиционного кодирования [68], но при этом было обнаружено, что оно не превосходит синусоидальное. [1] Позже [69] было обнаружено, что причинная маскировка сама по себе обеспечивает достаточно сигнала для декодера Transformer, чтобы он мог научиться неявно выполнять абсолютное позиционное кодирование без модуля позиционного кодирования.
RoPE (вращательное позиционное вложение), [70] лучше всего объяснить, рассмотрев список 2-мерных векторов . Теперь выберите некоторый угол . Тогда кодирование RoPE будет Эквивалентно, если мы запишем 2-мерные векторы как комплексные числа , то кодирование RoPE будет просто умножением на угол: Для списка -мерных векторов кодер RoPE определяется последовательностью углов . Затем кодирование RoPE применяется к каждой паре координат.
Преимущество RoPE заключается в том, что скалярное произведение двух векторов зависит только от их относительного расположения: для любого целого числа .
ALiBi (внимание с линейными смещениями) [71] не является заменой позиционного энкодера на исходном трансформаторе. Вместо этого это дополнительный позиционный энкодер, который напрямую подключается к механизму внимания. В частности, механизм внимания ALiBi здесь — это действительное число («скаляр»), и — это матрица линейного смещения, определяемая другими словами, . Идея заключается в том, что матрица линейного смещения — это смягченная маска. Так же, как представляет собой полное внимание, а представляет собой отсутствие внимания, матрица линейного смещения увеличивает внимание, уделяемое в одном направлении, и уменьшает внимание, уделяемое в другом направлении.
ALiBi позволяет проводить предварительную подготовку на коротких контекстных окнах, а затем тонкую настройку на более длинных контекстных окнах. Поскольку он напрямую подключен к механизму внимания, его можно комбинировать с любым позиционным кодером, который подключен к «низу» всей сети (где находятся синусоидальный кодер на исходном трансформаторе, а также RoPE и многие другие).
Кодировки относительного положения [72] похожи на ALiBi, но более общие: где — матрица Теплица , то есть, всякий раз , когда . Это контрастирует с исходным синусоидальным позиционным кодированием, которое является «абсолютным позиционным кодированием». [73]
Модель трансформера была реализована в стандартных фреймворках глубокого обучения, таких как TensorFlow и PyTorch . Transformers — это библиотека, созданная Hugging Face , которая предоставляет архитектуры на основе трансформера и предварительно обученные модели. [11]
FlashAttention [74] — это алгоритм, который эффективно реализует механизм внимания преобразователя на GPU. Он выполняет умножение матриц в блоках , так что каждый блок помещается в кэш GPU, и путем тщательного управления блоками он минимизирует копирование данных между кэшами GPU (поскольку перемещение данных происходит медленно).
Улучшенная версия FlashAttention-2, [75] [76] [77] была разработана для удовлетворения растущего спроса на языковые модели, способные обрабатывать более длинные контексты. Она предлагает улучшения в разбиении работы и параллелизме, позволяя ей достигать до 230 TFLOPs/s на графических процессорах A100 ( FP16 / BF16 ), что в 2 раза больше скорости по сравнению с исходным FlashAttention.
Ключевые усовершенствования FlashAttention-2 включают сокращение нематмулирующих FLOP, улучшенный параллелизм по размеру длины последовательности, лучшее разделение работы между варпами GPU и добавленную поддержку размеров заголовка до 256 и внимания с несколькими запросами (MQA) и внимания с групповыми запросами (GQA). [78]
Тесты показали, что FlashAttention-2 до 2 раз быстрее FlashAttention и до 9 раз быстрее стандартной реализации внимания в PyTorch. Будущие разработки включают оптимизацию для нового оборудования, например, графических процессоров H100 , и новых типов данных, например, FP8.
Внимание с несколькими запросами изменяет механизм многонаправленного внимания. [79] В то время как обычно,
при использовании Multi-Query Attention есть только один , таким образом:
Это не оказывает никакого влияния на качество модели и скорость обучения, но увеличивает скорость вывода.
В более общем смысле, внимание с групповыми запросами (GQA) разделяет внимание на группы, каждая из которых разделяет пару ключ-значение. MQA — это GQA с одной группой, тогда как стандартное внимание с несколькими заголовками — это GQA с максимальным количеством групп. [80]
Когда авторегрессионный трансформатор используется для вывода, например, для генерации текста, вектор запроса отличается на каждом шаге, но уже вычисленные векторы ключей и значений всегда одинаковы. Метод кэширования KV сохраняет вычисленные векторы ключей и значений в каждом блоке внимания, так что они не пересчитываются на каждом новом токене. PagedAttention применяет страничное разбиение памяти к кэшированию KV. [81] [82] [83]
Если трансформатор используется с встроенным запросом, например ["Вы агент службы поддержки клиентов..."], то векторы ключей и значений могут быть вычислены для запроса и сохранены на диске. Экономия вычислений значительна, когда модель используется для множества коротких взаимодействий, например, в онлайн-чатботах.
Трансформаторы используются в больших языковых моделях для генерации авторегрессионной последовательности: генерации потока текста, по одному токену за раз. Однако в большинстве настроек декодирование из языковых моделей ограничено памятью, что означает, что у нас есть свободная вычислительная мощность. Спекулятивное декодирование [84] [85] использует эту свободную вычислительную мощность, вычисляя несколько токенов параллельно. Подобно спекулятивному выполнению в ЦП, будущие токены вычисляются одновременно, путем спекуляции на значении предыдущих токенов, и позже отбрасываются, если оказывается, что спекуляция была неверной.
В частности, рассмотрим модель преобразователя, такую как GPT-3 с размером контекстного окна 512. Чтобы сгенерировать целое контекстное окно авторегрессивно с жадным декодированием, его нужно запустить 512 раз, каждый раз генерируя токен . Однако, если бы у нас были некоторые обоснованные предположения относительно значений этих токенов, мы могли бы проверить их все параллельно, за один запуск модели, проверив, что каждый из них действительно является токеном с наибольшим логарифмическим правдоподобием в -ом выходе.
В спекулятивном декодировании меньшая модель или некоторая другая простая эвристика используется для генерации нескольких спекулятивных токенов, которые впоследствии проверяются большей моделью. Например, предположим, что маленькая модель сгенерировала четыре спекулятивных токена: . Эти токены прогоняются через большую модель, и только и принимаются. Тот же прогон большой модели уже сгенерировал новый токен для замены , и полностью отбрасывается. Затем процесс повторяется (начиная с 4-го токена), пока не будут сгенерированы все токены.
Для нежадного декодирования применяются похожие идеи, за исключением того, что спекулятивные токены принимаются или отклоняются стохастически, таким образом, что гарантируется, что окончательное распределение выходных данных будет таким же, как если бы спекулятивное декодирование не использовалось. [84] [86]
Обучение архитектур на основе трансформаторов может быть дорогим, особенно для длинных входов. [87] Было разработано много методов для решения этой проблемы. Long Range Arena (2020) [88] — это стандартный эталон для сравнения поведения архитектур трансформаторов при длинных входах.
Стандартный график внимания — это либо график «все ко всем», либо график причинно-следственной связи, оба из которых масштабируются следующим образом: где — количество токенов в последовательности.
Reformer (2020) [87] [89] снижает вычислительную нагрузку с до с помощью локально чувствительного хеширования и обратимых слоев. [90]
Разреженное внимание [91] использует графы внимания, которые растут медленнее, чем . Например, BigBird (2020) [92] использует случайные сети малого мира , которые растут как .
Обычные трансформаторы требуют размер памяти, квадратичный по размеру контекстного окна. Трансформаторы без внимания [93] сводят это к линейной зависимости, сохраняя при этом преимущества трансформатора, связывая ключ со значением.
Random Feature Attention (2021) [94] использует случайные признаки Фурье : где — независимые выборки из нормального распределения . Этот выбор параметров удовлетворяет , или Следовательно, однонаправленное внимание с одним запросом можно записать как , где . Аналогично для нескольких запросов и для многонаправленного внимания.
Это приближение может быть вычислено за линейное время, поскольку мы можем сначала вычислить матрицу , а затем умножить ее на запрос. По сути, нам удалось получить более точную версию Performer (2022) [95] , которая использует то же внимание к случайным признакам, но сначала независимо выбирается из нормального распределения , а затем обрабатывается по методу Грама-Шмидта .
Трансформаторы также могут использоваться/адаптироваться для модальностей (ввода или вывода), выходящих за рамки простого текста, обычно путем нахождения способа «токенизации» модальности.
Мультимодальные модели можно обучать с нуля или с помощью тонкой настройки. Исследование 2022 года показало, что Transformers, предварительно обученные только на естественном языке, могут быть тонко настроены только на 0,03% параметров и стать конкурентоспособными с LSTM в различных логических и визуальных задачах, демонстрируя трансферное обучение . [96] LLaVA была моделью зрительно-языковой связи, состоящей из языковой модели (Vicuna-13B) [97] и зрительной модели ( ViT -L/14), соединенных линейным слоем. Тонкой настройке подвергается только линейный слой. [98]
Трансформаторы зрения [41] адаптируют трансформатор к компьютерному зрению, разбивая входные изображения на ряд фрагментов, превращая их в векторы и обрабатывая их как токены в стандартном трансформаторе.
Conformer [42] и более поздний Whisper [99] следуют той же схеме распознавания речи , сначала превращая речевой сигнал в спектрограмму , которая затем обрабатывается как изображение, т. е. разбивается на ряд фрагментов, преобразуется в векторы и обрабатывается как токены в стандартном трансформаторе.
Восприниматели [100] [101] — это разновидность Трансформеров, предназначенная для мультимодальности.
Для генерации изображений примечательными архитектурами являются DALL-E 1 (2021), Parti (2022), [102] Phenaki (2023), [103] и Muse (2023). [104] В отличие от более поздних моделей, DALL-E не является диффузионной моделью. Вместо этого она использует Transformer, работающий только с декодером, который авторегрессивно генерирует текст, за которым следует представление токена изображения, которое затем преобразуется вариационным автокодировщиком в изображение. [105] Parti — это Transformer, работающий только с кодером-декодером, где кодировщик обрабатывает текстовую подсказку, а декодер генерирует представление токена изображения. [106] Muse — это Transformer, работающий только с кодировщиком, который обучен предсказывать токены замаскированных изображений из токенов незамаскированных изображений. Во время генерации все входные токены маскируются, и предсказания с наивысшей степенью достоверности включаются в следующую итерацию, пока все токены не будут предсказаны. [104] Phenaki — это модель преобразования текста в видео. Это двунаправленный маскированный преобразователь, обусловленный предварительно вычисленными текстовыми токенами. Затем сгенерированные токены декодируются в видео. [103]
Трансформер имел большой успех в обработке естественного языка (NLP). Многие крупные языковые модели, такие как GPT-2 , GPT-3 , GPT-4 , AlbertAGPT, Claude , BERT , XLNet , RoBERTa и ChatGPT, демонстрируют способность трансформаторов выполнять широкий спектр подзадач, связанных с NLP, и их соответствующие реальные или практические приложения, включая:
Помимо традиционного NLP, архитектура трансформатора успешно применяется и в других приложениях, таких как:
{{cite web}}
: CS1 maint: multiple names: authors list (link){{cite journal}}
: Цитировать журнал требует |journal=
( помощь )