Архитектура Transformers: от машинного перевода до AlphaFold 0:16
Архитектура трансформеров (Transformers), изначально созданная для задач машинного перевода, стала фундаментальным элементом современной глубокой нейросетевой архитектуры. По словам Рамы Рамакришнана, сегодня трансформеры «захватили всё»: от поисковых систем и распознавания речи до генеративного ИИ, компьютерного зрения и даже узкоспециализированных систем вроде AlphaFold, предсказывающей сворачивание белков. Гибкость этой архитектуры настолько высока, что исследователи почти рефлекторно выбирают её для решения новых задач, даже если те изначально не были для неё предназначены.
🛠 Мотивация: задача классификации слотов 2:00
Для изучения принципов работы трансформеров Рамакришнан предлагает использовать задачу извлечения информации из естественного языка, например, поиск авиарейсов: «Найди мне все рейсы из Бостона в Ла-Гуардиа завтра утром».
Процесс обработки такого запроса выглядит следующим образом:
- Парсинг: извлечение ключевых сущностей (откуда, куда, время).
- Структурирование: преобразование в структурированный запрос, например SQL, для базы данных.
Для автоматизации этого процесса исследователи используют размеченные датасеты (например, Airline Travel Information Systems Data Set), где каждое слово помечается определенным «слотом».
Основные правила разметки:
- Слоты: каждое слово классифицируется как специфическая сущность (например, город отправления
B-fromloc.city_name) или какO(other) — неважный для задачи текст. - Схема BIO: используется для сущностей, состоящих из нескольких токенов:
B(Beginning) отмечает начало, аI(Intermediate) — продолжение описания сущности. - Масштаб: в классическом датасете слова распределяются по 123 возможным типам меток.
Это превращает задачу в классификацию «слово-к-слоту»: на 18 входящих слов модель должна выдать 18 меток. Главный вызов здесь — необходимость учитывать контекст (значение «Бостона» зависит от того, является ли он точкой отправления или прибытия) и порядок слов.
🧠 Самообучение: механизм Self-Attention 17:08
Трансформер элегантно решает задачу сохранения контекста через механизм самовнимания (self-attention). Идея заключается в том, чтобы «контекстуализировать» вектор каждого слова с помощью других слов в предложении.
- Веса внимания: для каждого слова в предложении вычисляется степень его важности для текущего слова. Например, в предложении «Поезд медленно покинул станцию» для слова «станция» наиболее важными контекстными весами будут «поезд» и «покинул», а не артикль «the».
- Математика весов: для определения связанности слов используется скалярное произведение их векторов (dot product). Если слова близки по смыслу, угол между их векторами мал, а косинус близок к 1.
- Softmax: чтобы превратить скалярные произведения в корректные веса (неотрицательные и суммирующиеся в 1), применяется функция softmax.
- Контекстуальный вектор: итоговый вектор слова получается как взвешенное среднее всех слов в предложении, где веса определены механизмом внимания.
🚀 Многоголовое внимание и масштабирование 37:02
Чтобы улавливать разные аспекты языка (грамматику, тон, факты), используется Multi-Head Attention — несколько параллельных механизмов внимания («голов»), каждый из которых учится выделять свои паттерны.
Техническая реализация включает следующие этапы:
- Параллельные головы: каждый блок внимания выдает свой вариант контекстуального вектора.
- Конкатенация: полученные векторы объединяются в один длинный вектор.
- Проекция: с помощью полносвязного (dense) слоя конкатенированный вектор сжимается обратно до исходной размерности.
Для внедрения нелинейности в конце добавляется слой с активацией ReLU, который расширяет размерность вектора (обычно в 4 раза) и снова сужает её. По словам Рамакришнана, несмотря на кажущуюся «ad hoc» природу этих дополнений, архитектура трансформера оказалась крайне надежной и трудноулучшаемой.
📍 Позиционное кодирование: учет порядка 48:48
Поскольку механизм внимания по своей сути работает с наборами (sets), а не последовательностями, он не чувствует порядка слов. Для исправления этого используется позиционное кодирование.
- Как это работает: каждому слову, кроме его семантического вектора, добавляется вектор позиции (например, 0-й, 1-й и т.д.).
- Обучение: веса для позиционных эмбеддингов инициализируются случайно и оптимизируются в процессе обучения через обратное распространение ошибки (backprop).
Благодаря тому, что трансформер поддерживает «идеальный API» (размер входа равен размеру выхода), блоки можно стекать друг на друга, как блики, создавая глубокие модели, такие как GPT-3 с её 96 слоями.