1. От механизмов внимания к архитектуре Transformer: математика Self-Attention и структура энкодера
От механизмов внимания к архитектуре Transformer: математика Self-Attention и структура энкодера
Добро пожаловать в курс «Vision Transformers: Глубокое погружение и практика». Вы уже знакомы с основами глубокого обучения и концепцией внимания (attention), которая зародилась в задачах обработки естественного языка (NLP). Однако настоящая революция произошла в 2017 году с выходом статьи «Attention Is All You Need». Архитектура Transformer, предложенная в ней, отказалась от рекуррентности и сверток в пользу чистого механизма внимания.
В этой статье мы разберем «двигатель» трансформера — механизм Self-Attention (самовнимания) и архитектуру Encoder (энкодера). Именно энкодер станет основой для Vision Transformer (ViT), который мы будем применять к изображениям в следующих модулях. Наша цель сегодня — понять математику процесса настолько глубоко, чтобы вы могли воспроизвести её в коде.
Концепция Self-Attention: Взгляд внутрь данных
В традиционных сверточных нейросетях (CNN) контекст собирается локально: пиксель «видит» только своих соседей через ядро свертки. Чтобы охватить всё изображение, нужно много слоев. В трансформерах механизм Self-Attention позволяет каждому элементу входных данных (будь то слово в предложении или патч изображения) взаимодействовать с каждым другим элементом сразу же, в первом слое.
Чтобы реализовать это, используется концепция Query, Key и Value (Запрос, Ключ, Значение). Эта аналогия пришла из систем поиска информации:
Линейные проекции
Пусть у нас есть входной вектор . Чтобы получить , мы умножаем на три обучаемые матрицы весов:
Где: * — входной вектор размерности . * — обучаемые матрицы весов размерности . * — полученные векторы запроса, ключа и значения.
Математика Scaled Dot-Product Attention
Сердцем трансформера является формула Scaled Dot-Product Attention. Давайте разберем её пошагово. Предположим, мы обрабатываем не один вектор, а сразу матрицу всех входных векторов . Тогда мы получаем матрицы .
Формула внимания выглядит так:
Где: * — матрица запросов (Queries). * — матрица ключей (Keys). * — матрица значений (Values). * — операция транспонирования матрицы. * — размерность вектора ключа (используется для масштабирования). * — функция активации, преобразующая числа в вероятностное распределение.
Шаг 1: Скалярное произведение (Similarity)
Сначала мы вычисляем . Скалярное произведение двух векторов показывает степень их сходства. Если векторы сонаправлены, произведение велико; если ортогональны — равно нулю.
Где: * — матрица оценок (scores), показывающая, насколько каждый элемент «похож» на каждый элемент .
В контексте компьютерного зрения это означает: «насколько этот участок изображения важен для того участка».
Шаг 2: Масштабирование (Scaling)
Зачем мы делим на ? При больших размерностях векторов () скалярные произведения могут становиться очень большими по модулю. Это загоняет функцию Softmax в области, где градиенты (производные) крайне малы, что останавливает обучение (проблема исчезающего градиента).
Деление на нормализует дисперсию результата, возвращая значения в комфортный для градиентов диапазон.
Шаг 3: Softmax и взвешенная сумма
Применяя Softmax, мы превращаем оценки сходства в вероятности (веса внимания), которые в сумме дают 1.
Где: * — матрица весов внимания (Attention Weights).
Наконец, мы умножаем эти веса на матрицу значений . Это по сути взвешенная сумма: мы берем много информации от тех векторов , чьи ключи были похожи на запрос, и мало от остальных.
!Блок-схема операций внутри механизма внимания.
Multi-Head Attention: Параллельные миры
Одного механизма внимания недостаточно. Представьте, что вы смотрите на фотографию собаки. Один «взгляд» должен сфокусироваться на форме ушей, другой — на текстуре шерсти, третий — на фоне. Если использовать только один набор , усреднение может размыть эти разные аспекты.
Multi-Head Attention (многоголовое внимание) решает эту проблему, запуская несколько механизмов внимания параллельно. Каждый «голос» (head) имеет свои собственные матрицы и проецирует входные данные в разные подпространства.
Математически это выглядит так:
Где: * — результат работы -й головы. * — операция объединения (конкатенации) векторов. * — выходная линейная матрица, смешивающая результаты всех голов.
Архитектура Энкодера (The Encoder Block)
Оригинальный Transformer состоял из Энкодера и Декодера. Для задач компьютерного зрения (в частности, ViT) используется только Энкодер. Давайте разберем его анатомию.
Энкодер — это стек (набор) из одинаковых слоев. Каждый слой имеет два основных подслоя:
Вокруг каждого из этих подслоев используются два критически важных элемента:
* Residual Connections (Остаточные связи): Вход слоя добавляется к его выходу. * Layer Normalization (Слоевая нормализация): Стабилизирует обучение.
Уравнение для одного блока энкодера можно записать так (в современной вариации Pre-Norm, которая чаще используется в ViT):
Где: * — вход текущего слоя (выход предыдущего). * — Layer Normalization. * — Multi-Head Self-Attention. * — промежуточный результат после блока внимания. * — Multi-Layer Perceptron (полносвязная сеть). * — выход текущего слоя.
!Структура блока энкодера с отображением потоков данных и skip-connections.
Feed-Forward Network (MLP)
Блок MLP обычно состоит из двух линейных слоев с функцией активации GELU (Gaussian Error Linear Unit) или ReLU между ними. Он обрабатывает каждый вектор независимо и идентично. Если Attention смешивает информацию между разными токенами, то MLP обрабатывает информацию внутри каждого токена, увеличивая нелинейность модели.
Где: * — матрицы весов слоев MLP. * — векторы смещения (bias). * — функция активации.
Positional Encoding: Возвращение порядка
Механизм Self-Attention инвариантен к перестановкам. Если вы перемешаете слова в предложении или патчи в изображении, результат вычисления для пары элементов не изменится (изменится только их позиция в матрице выхода, но не само значение). Для модели «кот на коврике» и «коврик на коте» без информации о позиции были бы неразличимы.
Чтобы исправить это, к входным векторам добавляются позиционные кодировки (Positional Encodings). Это векторы той же размерности, что и входные данные, содержащие информацию о том, где находится элемент.
Где: * — итоговый вход в первый слой трансформера. * — векторное представление данных (эмбеддинг). * — вектор позиционного кодирования.
В Vision Transformers часто используются обучаемые позиционные эмбеддинги, в отличие от фиксированных синусоидальных в оригинальном NLP-трансформере.
Заключение
Мы разобрали математический фундамент трансформеров. Вы узнали, как механизм Self-Attention позволяет модели глобально анализировать данные, используя аналогии Query-Key-Value, и зачем нужно масштабирование на . Мы также изучили архитектуру блока Энкодера, который станет основным строительным блоком для Vision Transformers.
В следующей статье мы перейдем от теории к практике компьютерного зрения: узнаем, как превратить 2D-изображение в последовательность векторов, понятную трансформеру, и построим архитектуру ViT.