Содержание статьи
Что такое трансформеры в искусственном интеллекте
Архитектура трансформера
Векторы [math]q_i[/math] и [math]k_i[/math] будем использовать, чтобы посчитать важность элемента [math]x_j[/math] для элемента [math]x_i[/math] . Чтобы понять, насколько для пересчета вектора элемента [math]x_i[/math] важен элемент [math]x_j[/math] мы берем [math]k_j[/math] (вектор ключа элемента [math]x_j[/math] ) и умножаем на [math]q_i[/math] (вектор запроса элемента [math]x_i[/math] ). Так мы скалярно перемножаем вектор запроса на все векторы ключей, тем самым понимаем, насколько каждый входной элемент нам нужен, чтобы пересчитать вектор элемента [math]x_i[/math] .
Таким образом, новое представление элемента [math]x_i[/math] считаем как взвешенную сумму векторов значения: [math]z_i = \mathrm(Q x_i, K X, V X) = \sum_^n w_ v_p[/math] , где [math]X = (x_1, x_2, . x_n)[/math] — входные векторы. По факту self-attention — это soft-arg-max с температурой [math]\sqrt[/math] . Мы перемешиваем все входные векторы, чтобы получить новые векторы всех элементов, где каждый элемент зависит от всех входных элементов.
Чтобы лучше понять, о чем идет речь, подумайте о функции автозаполнения в своем смартфоне. Она предлагает рекомендации, основанные на частоте вводимых пар слов. Например, если вы часто вводите «У меня все хорошо», ваш телефон автоматически подскажет слово «хорошо», как только вы напечатаете «все».
Так как в архитектуре трансформер обработка последовательности заменяется на обработку множества мы теряем информацию о порядке элементов последовательности. Чтобы отобразить информацию о позиции элемента в исходной последовательности мы используем позиционное кодирование.
Позиционное кодирование (англ. positional encoding) — позволяет модели получить информацию о порядке элементов в последовательности путем прибавления специальных меток к вектору входных элементов. Позиции элементов [math]i[/math] кодируются векторами [math]p_i[/math] , [math]i = 1, 2, . n[/math] , так, что чем больше [math]|i — j|[/math] , тем больше [math]||p_i — p_j||[/math] , и [math]n[/math] не ограничено. Пример такого кодирования:
5. В самом конце мы хотим получить вероятностную порождающую модель для элементов. Результат (индекс слова с наибольшей вероятностью): [math]\mathrm(W_y y_t + b_y) [/math] , где [math] W_y [/math] , [math] b_y [/math] — обучаемые параметры линейного преобразования. Для каждой позиции [math]t[/math] выходной последовательности мы строим вероятностную модель языка, то есть все элементы из выходного словаря получают значение вероятности. Эти значения как раз получаются из векторов [math]y_t[/math] из предыдущего пункта, которые мы берем с последнего блока трансформера-декодировщика.
Трансформеры, напротив, обрабатывают целые последовательности одновременно. Распараллеливание позволяет обучать трансформер гораздо быстрее и обрабатывать с его помощью более длинные последовательности, чем применяя RNN. Механизм самовнимания также позволяет трансформерам одновременно рассматривать всю последовательность данных без повторений и скрытых векторов. Вместо этого позиционное кодирование сохраняет информацию о положении каждого элемента в последовательности.
3. Полученный вектор [math]h_i[/math] подается на вход в блок многомерного самовнимания (англ. multi-headed self-attention). [math]h^j_i = \mathrm(Q^j h_i, K^j H, V^j H)[/math] , где обучаемые матрицы: [math]Q[/math] для запроса, [math]K[/math] для ключа, [math]V[/math] для значения. Подробное объяснения работы механизма self-attention будет разобрано ниже.
Анализ последовательности ДНК
Представьте, что вы находитесь в многолюдной комнате и пытаетесь послушать, как кто-то говорит. Ваш мозг автоматически фокусируется на голосе, отключая менее важные шумы. Самовнимание позволяет модели делать нечто подобное: она уделяет больше внимания соответствующим фрагментам информации и объединяет их для более точного прогнозирования выходных данных. Этот механизм повышает эффективность трансформеров, позволяя обучать их работе с большими наборами данных. Эффективность также повышается при работе с длинными текстами, где контекст предыдущих фрагментов может повлиять на смысл того, что будет дальше.
Двунаправленный и авторегрессивный трансформер (BART) сочетает в себе свойства кодировщика BERT и декодера GPT. Как и BERT, он считывает слева направо и справа налево всю входную последовательность одновременно, однако генерирует выходную по одному токену за раз в зависимости от слов, выданных ранее, и информации, предоставленной кодировщиком.
Если нейросеть работает с текстовой информацией, обычно она генерирует «наиболее вероятные» слова. Сгенерированные выходные слова могут быть переводом, продолжением истории или кратким пересказом, в зависимости от задачи, под которую тренируется нейросеть. Если хотите научить ее переводить — придется дать многоязычный корпус текста, где есть целая книжка и ее перевод. Нужно научить нейросеть краткому пересказу — придется найти корпус, в котором есть длинные истории, а следом их изложение. Нейросети без разницы, для чего генерируются вектора новых слов: они просто генерируются такими, какими наверное могли бы быть в обучающем корпусе.
На вход декодировщику подается выход кодировщика. Главное отличие архитектуры декодировщика заключается в том, что дополнительно имеется attention к вектору, который получен из последнего блока кодирующего компонента. Компонент декодировщика тоже многослойный и каждому блоку компонента на вход подается вектор именно с последнего блока кодирующего компонента. Разберем по порядку этапы работы декодировщика:
Внимание на энкодер генерирует собственный запрос Q, а вот ключ K и значения V берет у энкодера. В этом есть смысл: декодер ведет себя как пользователь, для которого матрицы энкодера — как база данных Ютуба или Гугла, где надо найти то, что его интересует. Стрелки от энкодера к декодеру показывают как раз передачу ключей и значений.
Стрелка вокруг слоя внимания, ведущая к нормализации, называется residual connection, она есть в каждом слое энкодера и декодера. Она означает, что нормализуется не просто Z, а (Z + X). Нормализация появляется после каждого «внимания» и каждой нейросети с прямой связью и в энкодере, и в декодере.
Архитектура трансформера-декодировщика
Трансформеры в значительной степени заменили RNN во многих приложениях, особенно в NLP, поскольку могут лучше справляться с длинными зависимостями. Они также более масштабируемы и эффективны, чем RNN. RNN по-прежнему полезны в определенных случаях, особенно когда размер модели и вычислительная эффективность важнее, чем регистрация взаимодействий на протяжении долгого времени.
Amazon Bedrock – это полностью управляемый сервис, на котором всего за один вызов API можно получить доступ к широкому спектру высокопроизводительных моделей преобразования от ведущих компаний, занимающихся искусственным интеллектом, таких как AI21 Labs, Anthropic, Cohere, Meta, Stability AI и Amazon. Благодаря широкому набору возможностей для создания приложений искусственного интеллекта, Amazon Bedrock упрощает разработку, сохраняя при этом конфиденциальность и безопасность. Ниже приведены несколько примеров.
Amazon SageMaker JumpStart – это центр машинного обучения, в котором можно получить доступ к предварительно обученным моделям преобразования для выполнения таких задач, как обобщение статей и генерация изображений. Предварительно обученные модели полностью настраиваются в соответствии с вашим сценарием применения, для этого используются ваши данные. Вы можете легко внедрить их в рабочую среду с помощью пользовательского интерфейса или SDK.
Векторы можно визуализировать в виде серии координат в n-мерном пространстве. В качестве простого примера представьте себе двухмерный график, где x представляет собой буквенно-цифровое значение первой буквы слова, а y – его категории. Слово banana имеет значение (2,2), потому что оно начинается с буквы b и относится к категории фруктов. Слово mango имеет значение (13,2), потому что оно начинается с буквы m и также относится к категории фруктов. Таким образом, вектор (x, y) сообщает нейронной сети, что слова banana и mango относятся к одной категории.
Напомним метафору с поиском видео на Ютубе. Запрос Q — это то, что интересует пользователя, то, что он написал в поисковой строке и что хочет найти. Ключи K — теги к каждому видео, они хранятся в базе данных Ютуба и по ним ведется поиск. Задача поиска — найти подходящие к запросу теги и выдать видео (значения V) с этими тегами.
Если декодер уже успел что-нибудь сгенерировать, включается слой внимания декодера «на себя». Декодер генерирует по слову за раз, но мы знаем, что на входе трансформер не работает с одним словом и его вектором — вместо этого на вход энкодеру и декодеру подается по матрице, где спрятаны все слова входного предложения и все уже известные — выходного. Проблема в том, что эти матрицы — фиксированных размеров, а матрица декодера все время заполняется новыми значениями, ранее неизвестными. Если ее нельзя «растягивать» по мере необходимости (к сожалению, нельзя), приходится писать значения «-inf» на месте тех слов, которые еще не успели сгенерироваться. Это обеспечивает отсутствие у них веса внимания, а значит, модель «смотрит» только на работу энкодера и на предыдущий результат декодера. Запись «значений-болванок» на месте будущих слов и называется маскировкой.