В статье подробно рассматриваются принципы работы больших языковых моделей (large language model, LLM). Поскольку в основе большинства современных LLM лежит архитектура трансформера (transformer), ее понимание дает представление о ключевых механизмах, обеспечивающих работу таких моделей.
В этой статье мы разберем ключевые принципы работы современных LLM, построенных на архитектуре трансформера. Я постараюсь объяснить основные идеи без погружения в сложную математику. Конечно, для глубокого понимания темы математическая база важна, но для первого знакомства этого материала должно быть достаточно.
Несмотря на разнообразие современных LLM, большинство из них используют одну и ту же фундаментальную архитектуру — трансформер. Отличия между моделями заключаются в обучающих данных, размере модели, настройках архитектуры и методах дополнительного обучения (дообучения).
Освоив материал статьи, вы сможете увереннее читать технические статьи и описания характеристик моделей, понимая, о каких элементах архитектуры идет речь и какую роль они выполняют.
Мы рассмотрим следующие темы:
Токены (Tokens) — как строка текста превращается в последовательность целых чисел.
Внедрения/встраивания (Embeddings) — как эти числа получают смысловое представление.
Позиционное кодирование (Positional Encoding) — как модель определяет порядок следования токенов.
Механизм внимания (Attention) — как токены обмениваются информацией друг с другом.
Многоголовое внимание (Multi-Head Attention) — как модель одновременно отслеживает разные типы взаимосвязей.
Сеть прямого распространения (Feed-Forward Network) — где хранится значительная часть усвоенной моделью информации.
Остаточный поток/магистраль (Residual Stream) и нормализация слоев (Layer Normalization) — что делает обучение глубоких сетей возможным.
Предсказание следующего токена (Next Token Predicting) — что именно выдает модель и как работает цикл генерации текста.
Архитектура и обученные веса (Architecture vs. Trained Weights) — что общего у современных LLM и чем они различаются.

В статье будут встречаться небольшие пояснения, чтобы материал был понятен читателям с любым уровнем подготовки.
Языковые модели не работают с текстом напрямую. Вместо слов и предложений они обрабатывают последовательности чисел. Поэтому первый этап обработки любого запроса — преобразование текста в набор числовых идентификаторов.
Этот процесс называется токенизацией (tokenization). Токенизатор берет строку текста и превращает ее в последовательность целых чисел, где каждое число соответствует записи в фиксированном словаре (vocabulary). Словари современных LLM обычно содержат от нескольких десятков до нескольких сотен тысяч элементов.
Идентификатор токена — это числовой ID элемента словаря. Именно с этими числами работает модель, а не с исходным текстом.
При этом токены далеко не всегда соответствуют целым словам. Чаще всего они представляют собой части слов или часто встречающиеся фрагменты текста. Например, слово «tokenization» может быть разбито на токены [«token», «ization»], а слово «running» — на [«run», «ning»].
Такой подход выбран из соображений эффективности. Если бы словарь содержал все слова целиком, его размер был бы огромным, а обработка новых или редких слов стала бы проблемой. Посимвольное представление, наоборот, слишком детализировано и заставляет модель заново изучать даже простейшие языковые закономерности.
Токенизация по частям слов представляет собой компромисс между этими двумя подходами. Часто встречающиеся слова и фрагменты текста получают собственные токены, а редкие, новые или сложные слова могут быть представлены как комбинация более мелких частей.
Словарь — это фиксированный набор элементов, с которыми работает токенизатор. Каждому элементу соответствует свой ID, и модель напрямую может получать только идентификаторы из этого списка.
Такой подход имеет свои особенности, не всегда очевидные. Классический пример: попросить LLM посчитать, сколько букв «R» содержится в слове «strawberry». Раньше языковые модели часто ошибались в подобных задачах. Дело не в том, что модель плохо умеет считать. Проблема в том, что она не работает с буквами напрямую. Она оперирует токенами и их идентификаторами, тогда как человек воспринимает слово как последовательность отдельных букв. Именно поэтому такие задачи могут оказаться для модели сложными.

Разные семейства моделей используют разные алгоритмы токенизации. Например, модели GPT опираются на разные варианты Byte Pair Encoding (BPE), тогда как в семействе LLaMA широко применяется SentencePiece.
Выбор токенизатора влияет на эффективность и возможности модели. От него зависит, сколько токенов потребуется для представления текста: чем их меньше, тем меньше вычислительных ресурсов необходимо для обработки запроса. Кроме того, качество токенизации напрямую влияет на то, насколько хорошо модель работает с разными языками и типами текста. Несмотря на различия в реализации, общий принцип остается тем же: на вход подается текст, а на выходе получается последовательность числовых ID токенов.
Теперь, когда запрос представлен в виде последовательности числовых ID, необходимо сделать следующий шаг — придать этим числам смысл.
ID токена, например 1024, — это всего лишь индекс строки. Сам по себе он ничего не означает. Смысл ему придает огромная таблица, которая называется матрицей эмбеддингов (embedding matrix).
Такая матрица есть в каждой модели. Она содержит по одной строке для каждого элемента словаря, а каждая строка представляет собой длинный вектор чисел. Длина этого вектора соответствует размерности скрытого пространства модели (hidden size). Например, во многих моделях класса 7B каждый токен представлен вектором из 4096 чисел. В более крупных моделях размерность обычно еще выше.
Вектор — это набор чисел. В трансформерах каждый токен преобразуется в вектор, чтобы модель могла выполнять над ним математические операции.
Когда токенизатор передает модели числовой идентификатор, модель находит соответствующую строку в матрице эмбеддингов и использует связанный с ней вектор. Этот вектор и называется эмбеддингом токена. Он представляет собой внутреннее представление значения токена, сформированное в процессе обучения.
Матрица эмбеддингов — это таблица соответствий (lookup table): на вход подается ID токена, на выходе получается обученный вектор, представляющий этот токен.
Одна из интересных особенностей эмбеддингов заключается в том, что семантически близкие токены со временем получают похожие векторные представления. Например, векторы слов «king» и «queen», а также «Paris» и «France» оказываются расположенными близко друг к другу.
Эти связи не задаются вручную. Они возникают в процессе обучения на больших объемах текста, поскольку помогают модели точнее предсказывать следующий токен.
С эмбеддингами можно даже выполнять арифметические операции, и результат нередко оказывается осмысленным. Классический пример:
king − man + woman ≈ queen
Это показывает, что пространство эмбеддингов обладает собственной геометрической структурой, отражающей смысловые связи между словами. При этом модель никто специально не обучает строить такую структуру — она формируется естественным образом в ходе обучения на текстах.

Важно понимать, что на этом этапе каждый токен уже преобразован в эмбеддинг, однако сам эмбеддинг не содержит информации о положении токена в тексте.
Например, вектор слова «dog» будет одинаковым независимо от того, находится ли это слово в начале предложения, в середине или в конце. Для модели это серьезное ограничение, поскольку порядок слов часто влияет на смысл высказывания.
Именно этот недостаток и устраняет позиционное кодирование (positional encoding).
Сам по себе механизм самовнимания (self-attention) не содержит представления о порядке слов. Без дополнительной информации о позиции модель не способна определить, стоит ли слово «dog» перед словом «bites» или после него.
Однако порядок слов часто определяет смысл предложения. Поэтому модели нужен механизм, который сообщает, где именно находится каждый токен в последовательности.
Позиционное кодирование — это способ передать модели информацию о положении каждого токена в последовательности, чтобы она могла учитывать порядок слов.
В оригинальной статье о трансформерах, опубликованной в 2017 году Ashish Vaswani и соавторами, эта задача решалась с помощью позиционных кодировок. Для каждой позиции создавался собственный числовой шаблон, который прибавлялся к эмбеддингу токена перед любой другой обработкой.
Позиция 1 имела один шаблон чисел, позиция 5 — другой, позиция 100 — третий. Все они строились на основе синусоидальных и косинусоидальных функций разных частот.
В результате эмбеддинг слова «dog» на первой позиции отличался от эмбеддинга того же слова на пятой позиции, поскольку к нему прибавлялась другая позиционная кодировка.
Такой подход оказался достаточно эффективным. Одним из его преимуществ было то, что синусоидальные кодировки позволяли модели работать с последовательностями длиннее тех, которые встречались во время обучения.
Однако с ростом размеров моделей у этого подхода проявились существенные ограничения.
Во-первых, один и тот же вектор должен был одновременно содержать и смысл токена, и информацию о его позиции. Возможности такого представления ограничены: в один набор чисел можно уместить лишь определенный объем информации.
Во-вторых, особенно плохо масштабировались обучаемые абсолютные позиционные эмбеддинги. Если модель обучалась на последовательностях длиной до 2048 токенов, то позицию 5000 она никогда не встречала, а значит, соответствующее представление оставалось необученным.
Поэтому большинство современных моделей используют другой подход — Rotary Position Embeddings (RoPE), предложенный Jianlin Su и коллегами в 2021 году. Сегодня этот механизм применяется в таких моделях, как LLaMA, Mistral, Gemma, Qwen и большинстве других открытых семейств моделей. Основная идея RoPE заключается в том, что позиционная информация не добавляется к вектору токена напрямую. Вместо этого, она используется для поворота (rotation) векторов Query (запроса) и Key ключа на угол, зависящий от позиции токена.
Токен на первой позиции получает один угол поворота, на сотой — другой. Когда механизм внимания сравнивает два токена, он фактически сравнивает уже повернутые Query- и Key-векторы. Именно различие между их поворотами позволяет модели учитывать относительное расстояние между токенами в последовательности.
RoPE — это метод позиционного кодирования, при котором информация о положении токена кодируется не добавлением к эмбеддингу, а поворотом векторов Query и Key. Благодаря этому механизм внимания естественным образом учитывает относительное расположение токенов.

Преимущества такого подхода носят вполне практический характер. RoPE естественным образом кодирует относительное положение токенов — именно ту информацию, которая наиболее важна для механизма внимания. Кроме того, этот метод лучше масштабируется на длинных контекстах и не требует введения дополнительных обучаемых параметров.
Тем не менее, даже современные методы позиционного кодирования не устраняют одну известную проблему LLM, получившую название «lost in the middle» (потеря информации в середине). В исследовании Nelson F. Liu показано, что модели обычно лучше используют информацию, расположенную в начале и конце длинного запроса, чем данные, находящиеся в его середине.
Именно поэтому многие рекомендации по промпт-инжинирингу действительно оказываются эффективными. Например:
размещать наиболее важную информацию в начале запроса;
повторять ключевую информацию ближе к концу;
не помещать критически важные инструкции в середину длинного текста.
Причина в том, что модель обрабатывает разные части контекста с неодинаковой эффективностью.
Теперь у нас есть токены, которые содержат и смысловое представление, и информацию о положении в последовательности. Следующий вопрос — как они обмениваются информацией друг с другом?
Именно этот механизм дал название всей архитектуре трансформеров — attention (внимание).
В каждом слое трансформера внимание выполняет ключевую функцию: оно позволяет каждому токену анализировать доступные ему токены и определять, какие из них наиболее важны для дальнейшей обработки.
Для этого каждый токен преобразуется сразу в три разных вектора: Query (Q) — запрос; Key (K) — ключ; Value (V) — значение.
Query отвечает на вопрос: «Какую информацию я ищу?». Key отвечает на вопрос: «С чем я совпадаю?». Value содержит информацию, которая копируется при сильном совпадении.
Другими словами, Query определяет, какую информацию токен хочет получить, Key описывает, какими характеристиками он обладает для других токенов, а Value содержит информацию, которая будет передана при успешном совпадении.
Важно понимать, что один и тот же токен одновременно выступает в роли Query, Key и Value. Преобразования Q, K и V — это обучаемые матрицы. В процессе обучения модель сама определяет, какую информацию токену следует искать и какую информацию он должен предоставлять другим токенам.
Чтобы определить, насколько один токен должен обращать внимание на другой, модель вычисляет оценку сходства (similarity score). Query одного токена сравнивается с Key каждого токена, который ему доступен. Для этого вычисляется масштабированное скалярное произведение (scaled dot product). Эту операцию можно представить как меру того, насколько два вектора направлены в одну сторону. Масштабирование же необходимо для того, чтобы значения оставались стабильными перед следующим этапом вычислений.
Скалярное произведение — это простой способ оценить, насколько два вектора направлены в одну сторону. Чем больше результат, тем сильнее совпадение между ними.
После вычисления всех оценок сходства модель преобразует их в веса (weights) с помощью функции softmax. Softmax принимает произвольный набор чисел и превращает его в распределение вероятностей, сумма которых равна единице. Чем выше оценка сходства, тем больший вес получает соответствующий токен. Затем эти веса используются для вычисления взвешенной суммы (weighted average) векторов Value.
Softmax преобразует набор числовых оценок в веса, сумма которых равна 1. Чем выше исходная оценка, тем больший вес получает соответствующий элемент.
Рассмотрим предложение: «The cat that I saw yesterday was sleeping». Когда модель обрабатывает слово «was», ей необходимо определить, кто выполнял действие «sleeping». Для этого Query-вектор токена «was» сравнивается с Key-векторами всех доступных токенов. Токен «cat» получает высокую оценку сходства, поскольку в процессе обучения модель усвоила, что глагол обычно связан с субъектом, а существительное «cat» в данном предложении выполняет именно эту роль. Поэтому Query-вектор слова «was» хорошо согласуется с Key-вектором слова «cat». Токен «yesterday», напротив, получает низкую оценку, поскольку не является субъектом действия. После применения softmax токен «cat» получает большой вес, а «yesterday» — значительно меньший. Затем модель вычисляет взвешенную сумму соответствующих Value-векторов. Поскольку вес токена «cat» намного выше, именно его Value оказывает наибольшее влияние на итоговое представление.
В результате новое представление токена «was» формируется с учетом информации, полученной от токена «cat». Именно благодаря этому механизм внимания позволяет модели устанавливать связи между словами, даже если они находятся далеко друг от друга в последовательности.
У языковых моделей семейства GPT есть важное ограничение: они генерируют текст последовательно, слева направо. Это означает, что токен на пятой позиции может обращаться только к токенам, расположенным на позициях с первой по пятую. Токены, находящиеся на шестой, седьмой и последующих позициях, ему недоступны, поскольку в момент вычисления они еще не были сгенерированы. Такой механизм называется каузальной маской (causal masking). Реализуется он довольно просто: для всех будущих токенов оценки сходства искусственно делают настолько низкими, что после применения softmax их вес становится практически нулевым.
Каузальная маска скрывает будущие токены от текущего. Благодаря этому только декодирующая (decoder-only) языковая модель не может «заглядывать вперед» при предсказании следующего токена.

Одно из самых интересных открытий в области изучения работы LLM связано со специализированными индукционными головами (induction heads), обнаруженными Anthropic в 2022 году.
Такие головы учатся распознавать шаблоны вида: «A B … A» и предсказывать, что после второго появления A с высокой вероятностью снова последует B. Когда модель встречает второй токен A, индукционная голова обращается к предыдущему месту, где этот токен уже встречался, анализирует, что следовало за ним, и использует эту информацию для прогнозирования продолжения. Этот механизм считается одним из наиболее наглядных объяснений обучения по контексту (in-context learning) — способности LLM выявлять закономерности непосредственно в запросе пользователя и использовать их без дополнительного обучения.
Индукционная голова распознает повторяющиеся шаблоны в контексте и помогает модели продолжать их по аналогии.
Однако у механизма внимания есть существенный недостаток — высокая вычислительная стоимость. В классическом варианте каждый токен сравнивается со всеми токенами, которые ему доступны. Поэтому при увеличении длины последовательности в два раза объем вычислений возрастает примерно в четыре раза. Именно поэтому обработка длинных запросов требует больших вычислительных затрат, а значительная часть современных исследований посвящена повышению эффективности механизма внимания (например, FlashAttention, Sparse Attention и Linear Attention).
Однако одна индукционная голова предоставляет модели лишь один выученный способ анализировать взаимосвязи между токенами.
Один проход механизма внимания дает модели лишь один способ оценить взаимосвязи между токенами. Этого недостаточно.
В естественном языке одновременно существует множество различных взаимосвязей:
согласование подлежащего и сказуемого;
связь местоимений с объектами, на которые они указывают;
отсылки к информации из предыдущих предложений;
локальные зависимости между соседними словами;
влияние порядка слов на смысл высказывания.
Чтобы учитывать все эти связи одновременно, в трансформерах используется многоголовое внимание (multi-head attention).
Его идея проста: механизм внимания выполняется несколько раз параллельно, причем каждый проход работает в собственном пространстве представлений. Каждый такой независимый механизм называется головой внимания (attention head).
Голова внимания — это независимый механизм внимания со своими собственными обучаемыми матрицами преобразования.
Есть один нюанс, который часто объясняют неправильно, в том числе, во многих популярных статьях и руководствах.
Иногда утверждают, что каждая голова получает лишь свою часть исходного вектора токена. На самом деле это не совсем так.
Каждая голова имеет собственные обучаемые матрицы, которые проецируют полный вектор токена в более компактные векторы Query, Key и Value. Например, если токен представлен вектором размерностью 4096 и модель использует 32 головы внимания, то каждая голова обычно работает в пространстве размерностью 128. Но эти 128 чисел — не фиксированный фрагмент исходного вектора. Они получаются в результате линейного преобразования всего 4096-мерного представления.
Другими словами, разные головы видят не разные части токена, а разные интерпретации одного и того же токена. После этого каждая голова независимо применяет механизм внимания.
Затем результаты работы всех голов объединяются и проходят через заключительный линейный слой, который объединяет информацию в единый полноразмерный вектор (full-size vector). Способ такого объединения модель также изучает в процессе обучения.

Что особенно интересно, так это способность разных голов постепенно специализироваться на разных задачах. При этом модель никто специально не обучает тому, за что должна отвечать каждая голова. Такая специализация возникает сама собой в процессе обучения. Исследователи обнаружили головы внимания, которые: отслеживают грамматические связи (например, связывают глаголы с дополнениями или артикли с существительными); определяют, к какому имени относится местоимение; анализируют позиционные закономерности; работают как индукционные головы; выполняют множество других специализированных функций. Один слой трансформера может содержать, например, 32 головы внимания, а современные модели состоят из десятков таких слоев. В результате типичная LLM включает тысячи голов внимания, каждая из которых анализирует взаимосвязи между токенами по-своему.
Однако за такую архитектуру приходится платить. Во время генерации каждая голова должна хранить вычисленные векторы Key и Value для всех уже обработанных токенов. Это позволяет модели не пересчитывать весь контекст при генерации каждого нового токена. Такой механизм называется KV-кэшем (KV cache) и именно он становится основным потребителем памяти при работе LLM с длинными контекстами.
KV-кэш хранит вычисленные ранее векторы Key и Value во время генерации текста. Благодаря этому модель не пересчитывает весь контекст при обработке каждого нового токена.
Именно стремление сократить потребление памяти привело к появлению нового варианта механизма внимания — Grouped-Query Attention (GQA). В классическом многоголовом внимании каждая голова имеет собственные Key и Value. В GQA несколько Query-голов совместно используют один и тот же набор Key и Value-голов. Например: в модели LLaMA 2 70B используется 64 Query-головы, но всего 8 Key/Value-голов; в Mistral 7B - 32 Query-головы и 8 Key/Value-голов. На практике такой подход позволяет сохранить почти ту же точность, что и классическое многоголовое внимание, но при этом значительно снизить нагрузку на память и уменьшить стоимость инференса.
GQA позволяет нескольким Query-головам совместно использовать меньшее количество Key и Value-голов. Это уменьшает размер KV-кэша и снижает потребление памяти, сохраняя при этом разнообразие представлений, создаваемых Query-головами.
После того как механизм внимания завершает обмен информацией между токенами, в каждом слое трансформера выполняется второй этап — сеть прямого распространения (Feed-Forward Network, FFN).
Если механизм внимания отвечает за взаимодействие между токенами, то FFN обрабатывает каждый токен независимо. На этом этапе обмен информацией между токенами уже не происходит: каждый вектор проходит обработку отдельно от остальных.
Работа FFN состоит из трех последовательных этапов:
Вектор токена расширяется до большей размерности (в оригинальном трансформере обычно использовалось увеличение в 4 раза, а современные модели на основе SwiGLU могут использовать другие коэффициенты расширения).
К полученному вектору применяется нелинейная функция.
Затем размерность снова сжимается до исходной.

Особенно важен второй этап — применение нелинейной функции. Нелинейность (non-linearity) — это функция, которая нелинейно преобразует входные значения. Самый простой пример — ReLU (Rectified Linear Unit). Она заменяет все отрицательные значения нулями, а положительные оставляет без изменений.
Нелинейность — это функция, которая не позволяет сети свестись к одному большому линейному преобразованию.
Без нелинейности FFN представляла бы собой две последовательные линейные операции. Однако несколько линейных преобразований всегда можно объединить в одно. Две линейные операции эквивалентны одной, и даже сто линейных операций подряд математически остаются одним линейным преобразованием. Именно нелинейность предотвращает такое «схлопывание» и позволяет FFN выполнять более сложные преобразования, чем простое умножение на матрицу.
В оригинальном трансформере использовалась функция ReLU. Позже модели GPT и BERT перешли на GELU, а современные модели, такие как LLaMA, Mistral и PaLM, обычно используют SwiGLU. При этом общая схема «расширить → применить нелинейность → сжать» остается неизменной. Меняются лишь сами нелинейные функции.
Большая часть параметров плотного (dense) трансформера находится не в механизме внимания, а в FFN. Значительная доля весов модели сосредоточена именно в слоях прямого распространения.
И эти параметры не являются универсальными вычислительными коэффициентами. Именно здесь хранится большая часть фактических знаний и семантической структуры, усвоенных моделью во время обучения. Исследования показали, что некоторые нейроны внутри FFN сильно связаны с определенными понятиями или фактами. Например, один нейрон может активно реагировать на тексты об Эйфелевой башне, другой — на языки программирования, третий — на глаголы в прошедшем времени. Когда модель «знает», что Париж — столица Франции, это знание представлено в виде паттернов весов и активаций FFN на определенных слоях.
Это свойство имеет интересное следствие. Исследователи научились изменять отдельные факты в уже обученной модели без ее полного переобучения. Например, метод ROME (Rank-One Model Editing) позволяет заменить ассоциацию «Эйфелева башня находится в Париже» на «Эйфелева башня находится в Риме», выполнив небольшое низкоранговое изменение определенной матрицы весов FFN. После такого вмешательства модель начинает генерировать ответы, согласующиеся с новой ассоциацией.
Некоторые современные передовые модели начали заменять плотную FFN архитектурой «Сочетание экспертов» (Mixture of Experts, MoE). Вместо одной сети прямого распространения в каждом слое используется несколько параллельных FFN (экспертов), а небольшая сеть-маршрутизатор (router) определяет, какие из них будут обрабатывать каждый токен. Например, Mixtral 8x7B содержит 8 экспертов в каждом слое, но для каждого токена активируются только 2 из них. Общее число параметров значительно возрастает, тогда как объем вычислений на один токен увеличивается гораздо медленнее, поскольку одновременно работают лишь несколько экспертов. Это позволяет увеличивать размер модели без пропорционального роста стоимости инференса.
MoE — это архитектура, в которой модель содержит несколько сетей прямого распространения и направляет каждый токен только через некоторые из них.
Например, Mixtral 8x7B содержит 46,7 млрд параметров, однако при обработке каждого токена использует лишь около 12,9 млрд. Благодаря этому MoE стала популярным решением для очень больших моделей, позволяя увеличивать число параметров без пропорционального роста стоимости инференса.
Остаточный поток (residual stream) делает работу трансформера накопительной, а не заменяющей. После выполнения механизма внимания или FFN результат обычно не заменяет текущее представление токена, а прибавляется к нему. Для каждого токена новое представление равно сумме предыдущего вектора и результата соответствующего блока.
Остаточное соединение (residual connection) добавляет результат блока обратно к исходному вектору. Это создает для информации и градиентов более короткий путь через сеть.
На протяжении десятков слоев вклад каждого нового блока постепенно накапливается, а не перезаписывает предыдущее представление. Эта последовательность накопленных представлений называется остаточным потоком (residual stream) и обладает интересной особенностью: исходные эмбеддинги сохраняют прямой аддитивный путь до самых поздних слоев, постепенно объединяясь с результатами работы всех промежуточных блоков.

Остаточные соединения были изобретены не для трансформеров. Впервые они были предложены в архитектуре ResNet для распознавания изображений. Их появление было связано с практической проблемой: глубокие нейронные сети было крайне сложно обучать. По мере прохождения через множество слоев обучающий сигнал становился слишком слабым или, наоборот, слишком сильным, из-за чего модель переставала эффективно учиться на своих ошибках. Остаточное соединение создало для сигнала короткий путь от выхода к входу сети, что сделало возможным обучение моделей с сотнями слоев. Позже этот прием был унаследован трансформерами.
В современных исследованиях по работе LLM остаточный поток стал одним из центральных объектов анализа. Все основные компоненты модели — головы внимания, FFN и даже заключительный этап преобразования в вероятности следующего токена — считывают информацию из остаточного потока и записывают в него результаты своей работы.
Второй важный компонент — нормализация слоев (layer normalization). Ее задача гораздо более практична: поддерживать стабильность остаточного потока. Без нормализации значения, проходящие через десятки последовательных сложений, могли бы либо бесконтрольно расти, либо стремиться к нулю. В обоих случаях обучение становилось бы нестабильным. Нормализация слоев приводит вектор каждого токена к контролируемому диапазону значений между соседними блоками.
Нормализация слоев масштабирует вектор токена так, чтобы значения оставались в стабильном диапазоне во время обучения.
В оригинальном трансформере 2017 года нормализация выполнялась после каждого блока (post-norm). Такой подход хорошо работал в относительно неглубоких моделях, но с увеличением числа слоев обучение становилось менее стабильным. Поэтому в современных трансформерах, начиная с GPT-2 и заканчивая LLaMA и Mistral, нормализация обычно выполняется перед каждым блоком (pre-norm). Это одно из изменений, упростивших обучение очень глубоких моделей.
Изменилась и сама функция нормализации. Многие современные открытые модели, включая LLaMA, Mistral, Gemma и Phi, используют более простой вариант — RMSNorm. В классической нормализации слоев каждый вектор сначала сдвигается в сторону нуля, затем меняется масштаб чисел. RMSNorm отказывается от первого шага и выполняет только масштабирование. На практике именно оно обеспечивает большую часть преимуществ, требуя при этом меньше вычислений.
RMSNorm — это упрощенный метод нормализации, который масштабирует вектор без предварительного вычитания среднего значения.
Это не самая заметная часть архитектуры, но без нее современные трансформеры не смогли бы работать. Без остаточных соединений обучение очень глубоких моделей становится значительно сложнее. Без нормализации слоев остаточный поток быстро теряет стабильность. Вместе эти два механизма делают возможным обучение моделей, состоящих из сотен слоев.
После того как все слои внимания и FFN завершаются, модель получает итоговый вектор для каждого токена последовательности. Однако при генерации следующего токена используется только вектор последнего токена.
Этот вектор преобразуется в набор числовых оценок — по одной для каждого возможного токена словаря. Если словарь содержит 100 000 токенов, модель вычисляет 100 000 таких значений. Они называются логитами (logits). Это еще не вероятности — логиты могут быть любыми: положительными или отрицательными.
Логиты — это исходные оценки для каждого возможного следующего токена. В вероятности они преобразуются только после применения функции softmax.
Затем функция softmax преобразует логиты в распределение вероятностей для всех возможных следующих токенов. Это тот же механизм, который уже использовался ранее, но на другом этапе работы модели.
При этом модель далеко не всегда выбирает токен с максимальной вероятностью. Поведение модели определяется параметрами декодирования, которые задают, насколько предсказуемым или разнообразным будет результат. Температура (temperature) изменяет «остроту» распределения вероятностей, а top-k и top-p ограничивают выбор наиболее правдоподобными токенами. Поэтому одна и та же модель может вести себя очень сдержанно при одних настройках и значительно более творчески — при других.
Температура управляет случайностью при выборе следующего токена. Низкие значения делают ответы более предсказуемыми, высокие — более разнообразными.
После выбора следующий токен добавляется к уже существующей последовательности. Затем модель снова выполняет все вычисления уже для более длинного контекста, обычно используя KV-кэш, чтобы не пересчитывать всю последовательность заново. Новый токен проходит через механизм внимания, затем через FFN, после чего формируется новый итоговый вектор и предсказывается следующий токен. Этот цикл продолжается до тех пор, пока модель не сгенерирует специальный токен конца последовательности или не достигнет заданного ограничения по длине. Любой абзац текста представляет собой результат многократного повторения этого цикла — токен за токеном.
Именно предсказание следующего токена является основной целью обучения базовой LLM. Такая модель не обучается напрямую фактической точности, ведению диалога, рассуждениям или программированию. Ее задача — научиться предсказывать следующий токен на огромных массивах текста. Уже после этого дополнительные этапы обучения позволяют адаптировать модель к выполнению инструкций, предпочтениям пользователей, требованиям безопасности и правилам ведения диалога.
Недавно появился еще один эффективный способ ускорить генерацию — спекулятивное декодирование (speculative decoding). Небольшая быстрая модель сначала предлагает сразу несколько следующих токенов, а более крупная модель проверяет их одновременно. Если предложенные токены соответствуют распределению вероятностей большой модели, они принимаются. В противном случае используется результат, полученный самой большой моделью. При правильной реализации итоговое распределение остается таким же, как при работе только большой модели, но генерация выполняется заметно быстрее.
Спекулятивное декодирование использует небольшую вспомогательную модель для предварительного предсказания нескольких токенов, после чего большая модель проверяет их одновременно.
Цикл предсказания следующего токена — самая простая часть архитектуры, но именно на нем основана работа всей LLM.
Мы рассмотрели основные компоненты современных LLM: токенизацию, эмбеддинги, позиционное кодирование, механизм внимания, многоголовое внимание, FFN, остаточный поток, нормализацию слоев и механизм предсказания следующего токена. Вместе они образуют базовую архитектуру трансформера.
Так чем же отличаются GPT, Claude, Gemini и LLaMA? Открытой информации о них не так уж и много, а разработчики закрытых моделей не раскрывают все архитектурные решения. Однако на уровне, рассмотренном в этой статье, все они основаны на одной и той же архитектуре семейства трансформеров.
Большинство современных LLM используют одну и ту же общую структуру: токенизацию, эмбеддинги, позиционное кодирование, последовательность слоев трансформера (каждый из которых включает многоголовое внимание и FFN), остаточный поток, нормализацию слоев и предсказание следующего токена.
Различия между моделями определяются главным образом тремя факторами:
обученными весами (trained weights), полученными в результате обучения на разных наборах данных и при разных масштабах обучения;
конфигурацией модели: количеством слоев, размером словаря, числом голов внимания, количеством параметров, а также использованием плотной архитектуры или MoE;
дополнительным обучением: настройкой на выполнение инструкций, обучением на основе обратной связи от людей и механизмами обеспечения безопасности.
Веса — это параметры модели, которые изменяются в процессе обучения. Именно они определяют, насколько хорошо модель умеет предсказывать следующий токен.
В период с 2023 по 2025 год архитектуры современных трансформеров во многом пришли к схожему набору решений. Несмотря на то, что разные исследовательские команды разрабатывали модели независимо друг от друга, многие из них используют одни и те же подходы: pre-norm, RMSNorm, RoPE, SwiGLU, GQA, а в наиболее крупных моделях — и MoE. Все эти идеи появились не одновременно, а постепенно сформировались в результате нескольких лет развития исходной архитектуры трансформера, предложенной в 2017 году.
Такое сближение архитектур трансформеров — необычное явление в истории машинного обучения. Долгое время для каждой задачи существовал свой специализированный тип нейронных сетей: одни использовались для распознавания изображений, другие — для обработки текста, третьи — для работы со звуком. Методы, применявшиеся в разных областях, почти не пересекались.
Сегодня модели семейства трансформеров применяются не только в обработке языка, но и в компьютерном зрении, работе со звуком и мультимодальных системах. Фактически архитектура трансформера стала основой значительной части современных моделей искусственного интеллекта.
Конечно, в будущем ситуация может измениться. Уже сейчас появляются альтернативные архитектуры, например Mamba и другие модели пространства состояний (state-space models), особенно перспективные для работы с очень длинными последовательностями. Активно исследуются и гибридные архитектуры, а MoE уже заметно изменила представление о том, какой может быть современная языковая модель.
Тем не менее, основные механизмы, рассмотренные в этой статье, остаются фундаментальными: токенизация, эмбеддинги, позиционное кодирование, механизм внимания, FFN, остаточный поток, нормализация и предсказание следующего токена. Даже если архитектуры будут меняться, любой модели, работающей с последовательностями, так или иначе придется решать все эти задачи.
Если вы дочитали до конца, значит, теперь можете гораздо легче ориентироваться в современных статьях о трансформерах и описаниях характеристик моделей, понимая, какие компоненты архитектуры в них рассматриваются. Именно в этом и заключалась цель этой статьи.
Новости, обзоры продуктов и конкурсы от команды Timeweb.Cloud — в нашем Telegram-канале ↩
