Книга: Инжиниринг искусственного интеллекта
Назад: 1.4 Механизм самовнимания (Self‑Attention)
Дальше: 1.6 Выходной слой и генерация

1.5 Трансформерные блоки (Transformer Blocks)

В предыдущем разделе мы увидели, как слова общаются друг с другом внутри одного механизма внимания. Но в реальном трансформере такой «разговор» происходит не один раз, а многократно - и каждый раз с разных точек зрения. Больше того, одного внимания недостаточно: услышанное нужно осмыслить, переработать и передать дальше. Именно так устроен трансформерный блок - базовый «станок» на конвейере производства смысла. Сырье заходит с одной стороны (просто числа - токены), а на выходе получается готовое «понимание» контекста.

Ниже приведен пример того как устроен один такой станок/трансформер и зачем нужна каждая его деталь.



1. Multi-Head Attention (Многоголовое внимание)



Это несколько параллельных механизмов внимания, каждый со своими матрицами Q, K, V. Они учатся выделять разные типы связей: грамматические, семантические, синтаксические, анафорические.



Что это

Позволяет каждому токену общаться со всеми остальными токенами сразу, но с разных точек зрения (разные «головы»).



Технически

Это тот самый механизм Q/K/V, который мы разбирали, только запущенный параллельно несколько раз (например, 32 раза).



Зачем и почему



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

Но почему недостаточно одной «головы»? Дело в том, что связи между словами бывают разной природы. Одни - грамматические, другие - смысловые, третьи - указательные. Чтобы разобраться во всех, нужны разные специалисты. Например, есть особый тип связей, который называется кореференцией. Разберём его подробнее.



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

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



Простой пример



"Иван купил машину. Он очень рад ей."

Иван и Он - кореферентны (оба указывают на одного и того же человека).

машину и ей - кореферентны (оба указывают на один и тот же предмет).



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



Результат

На выходе мы получаем векторы, которые уже «посмотрели» на соседей и впитали немного контекста.

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



2. Add & Norm (Добавление и нормализация) - Первый раз



Состоит из



Add (Остаточная связь)

Мы берем вход, который зашел в блок ДО Attention, и прибавляем его к выходу Attention.



Norm (Слоевая нормализация)

Мы «причесываем» полученную сумму, чтобы числа не выходили за разумные пределы.



Зачем и почему



Add (Зачем складывать?)

Представьте, что вы учитесь рисовать. Attention - это ваш новый штрих. Если штрих неудачный, вы можете откатиться назад и начать заново. Остаточная связь - это «ластик» и «карандаш» одновременно. Она позволяет модели на глубоких слоях не забывать, что было в начале. Если следующий слой не привнес ничего полезного, он может просто «пропустить» информацию дальше (скопировать вход). Это помогает обучать очень глубокие сети (32+ слоя), иначе градиенты4 затухнут.



Зачем это нужно







Norm (Зачем нормализовать?)

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





Метафора

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





Зачем это нужно









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

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





3. Feed-Forward Network (FFN) - Сеть прямого распространения





Что это

Маленькая двухслойная нейросеть, которая применяется к каждому токену отдельно.





Технически

Сначала вектор расширяется в 4 раза (например, с 4096 до 16384 нейронов), потом сжимается обратно. Внутри - нелинейная функция (например, SwiGLU (Swish-Gated Linear Unit) или GeLU (Gaussian Error Linear Unit) - функции активации, улучшающие обучение) - они просто решают, какие нейроны зажечь, а какие погасить).





Зачем и почему

Attention смешивает информацию между токенами (как бы по горизонтали). FFN же работает внутри одного токена (вертикально). После того как токен «послушал» соседей, ему нужно этот новый услышанный смысл переварить и записать в удобном виде.





Аналогия

Attention - это совещание (обмен информацией между сотрудниками). FFN - это рабочий кабинет, куда сотрудник уходит после совещания, чтобы осмыслить услышанное и составить отчет. Без FFN модель не сможет делать сложные логические выводы, она будет просто перекладывать слова. Эта метафора точно отражает разделение труда: Attention - это коллективное обсуждение, где все делятся тем, что знают. FFN - это личный кабинет, куда сотрудник уходит, чтобы обдумать услышанное и сформулировать свою новую позицию. Без FFN модель была бы просто «пересказчиком»: она бы собрала информацию от соседей, но не смогла бы её переработать в новые смыслы. FFN даёт токену возможность «обдумать» услышанное, сделать выводы, сформулировать новую позицию. Это тот шаг, который превращает коллективное обсуждение в личное понимание.





Почему FFN называют чёрным ящиком (даже инженеры)





Мы спроектировали FFN: два линейных слоя, нелинейность между ними, расширение в 4 раза и сжатие обратно. Архитектура полностью прозрачна. Но числа внутри - веса - выучились автоматически из данных. И вот тут начинается проблема.

Мы не можем открыть обученную модель, ткнуть пальцем в конкретный нейрон и сказать: «вот этот отвечает за котов, а этот - за глагол „есть“». Знание не локализовано. Оно размазано по миллионам параметров.

Более того, мы не можем объяснить на человеческом языке, почему конкретный входной вектор превратился в конкретный выходной. Ответ всегда один: «потому что так сошлись миллиарды умножений».

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

И это фундаментальное ограничение. Не баг. Не фича. Просто реальность глубоких нейросетей.





4. Add & Norm (Добавление и нормализация) - Второй раз





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





Что это

То же самое, что и в пункте 2, но теперь мы складываем вход в FFN с выходом из FFN.





Зачем

Опять страхуемся, чтобы FFN не испортила то, что насобирал Attention. Если FFN сработала плохо, у нас есть «путь обхода» через остаточную связь.

Мы разобрали, как устроен один блок. Но в настоящем трансформере таких блоков не один, а десятки - от 32 до 128 и больше. Зачем нужно так много? Неужели одного недостаточно?

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





Каждый следующий блок строит абстракцию5.





Слой 1: Видит буквы и слоги. Понимает, что «кот» - это одно слово.

Слой 2-5: Видит словосочетания («рыжий кот»).

Слой 10-20: Видит роли в предложении (кто действует, на кого действует).

Слой 30+: Видит смысл всего абзаца, тон, настроение, сложные логические связи.





Эти данные подтверждены визуализациями активаций нейросетей - например, в работах OpenAI (2019) по анализу GPT-2, где исследователи наглядно показали, как разные слои модели отвечают за разные уровни абстракции: от отдельных токенов до целых предложений и их смысла.

Если слоев мало - модель «мелковата» и может понимать только простые фразы. Чем больше слоев, тем сложнее концепции она способна выучить, но тем сложнее ее обучить (тут-то и помогают Add & Norm связи).

Как работает трансформер на уровне логики по шагам и на примере можно ознакомиться в Приложении 1.





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





Назад: 1.4 Механизм самовнимания (Self‑Attention)
Дальше: 1.6 Выходной слой и генерация