1. От классического ML к Трансформерам: архитектура, механизмы внимания и математическое обоснование
От классического ML к Трансформерам: архитектура, механизмы внимания и математическое обоснование
До 2017 года обработка естественного языка (NLP) упиралась в фундаментальный физический предел: время. Чтобы нейросеть (RNN или LSTM) поняла длинный медицинский эпикриз, она должна была «прочитать» его строго последовательно, слово за словом. Обучение таких моделей занимало последовательных шагов, где — длина текста. Распараллелить этот процесс по видеокартам (GPU) было математически невозможно, так как состояние сети на шаге зависело от шага . В 2017 году исследователи из Google предложили архитектуру Transformer, которая совершила революцию, заменив рекуррентность на механизм внимания. Они свели количество последовательных операций к , открыв дорогу к созданию современных LLM.
Для инженера, пришедшего из классического ML, понимание Трансформеров требует сдвига парадигмы: мы отказываемся от статических признаков в пользу динамических контекстных представлений, вычисляемых на лету.
Проблема статических признаков
В классическом машинном обучении (например, при обучении Random Forest на табличных данных) признак всегда имеет фиксированное значение. В раннем NLP этот подход отразился в алгоритмах вроде TF-IDF или Word2Vec. Каждому слову сопоставлялся один статический вектор (embedding).
В медицинском домене это приводит к катастрофическим ошибкам. Возьмем слово «выписка». Вектор Word2Vec для этого слова всегда будет одинаковым, независимо от того, идет ли речь о «выписке из стационара» (административное действие) или о «гнойной выписке» (клинический симптом).
Трансформер решает эту проблему элегантно: он не хранит готовые векторы слов. Вместо этого он хранит базовые представления токенов и правила их смешивания. Вектор слова «выписка» в Трансформере формируется динамически, вбирая в себя математические признаки окружающих слов. Этот процесс смешивания и есть механизм Self-Attention (самовнимание).
Self-Attention: База данных внутри нейросети
Чтобы понять, как слова обмениваются контекстом, полезно использовать аналогию из бэкенд-разработки — поиск по реляционной базе данных или key-value хранилищу.
Когда вы пишете SQL-запрос, у вас есть:
В механизме Self-Attention каждое слово в предложении одновременно выступает во всех трех ролях. Нейросеть умножает исходный вектор каждого токена на три разные обучаемые матрицы весов (, , ), получая для каждого токена три новых вектора: (Query), (Key) и (Value).
> Self-Attention — это процесс, при котором каждый токен формирует «поисковый запрос» (Q), чтобы найти релевантный контекст среди «ключей» (K) других токенов, и забирает их «значения» (V) пропорционально степени совпадения.
Математически это выражается формулой Scaled Dot-Product Attention:
Разберем каждый элемент этой формулы, так как это излюбленная тема на System Design интервью:
!Пошаговое вычисление Self-Attention
Multi-Head Attention: Ансамблирование признаков
В классическом ML одно дерево решений (Decision Tree) часто переобучается или улавливает только одну закономерность. Поэтому мы используем Random Forest — ансамбль деревьев.
Тот же принцип работает в Трансформерах. Если использовать только один набор матриц , токен сможет сфокусироваться только на одном аспекте контекста. В реальности связи слов многомерны: одно слово связано с другим грамматически (подлежащее и сказуемое), семантически (синонимы) или логически (причина и следствие).
Поэтому архитектура использует Multi-Head Attention (многоголовое внимание). Исходные векторы проецируются в различных подпространств (голов). Каждая голова имеет свои собственные матрицы весов и вычисляет внимание независимо. Затем результаты работы всех голов конкатенируются (склеиваются) и умножаются на финальную матрицу , возвращая вектор к исходной размерности. Это позволяет модели одновременно анализировать текст с разных «точек зрения».
Инъекция порядка: Positional Encoding
Если вы посмотрите на формулу внимания, вы заметите одну критическую деталь: в ней нет понятия последовательности. Операция матричного умножения коммутативна по отношению к строкам. Для механизма Self-Attention фразы «врач вылечил пациента» и «пациент вылечил врача» абсолютно идентичны — это просто мешок слов (bag-of-words).
Чтобы модель понимала порядок, перед подачей токенов в первый слой внимания к их векторам (embeddings) прибавляются векторы позиционного кодирования (Positional Encoding). В оригинальной статье использовались комбинации синусов и косинусов разных частот. Современные модели часто используют обучаемые позиционные эмбеддинги или относительное кодирование (RoPE — Rotary Position Embedding), о котором мы подробно поговорим в главе про оптимизацию LLM. Главное правило: Трансформер не читает текст слева направо, он видит все токены сразу, а порядок понимает только благодаря искусственно добавленным пространственным координатам.
Анатомия Transformer Block
Механизм внимания — это сердце модели, но чтобы оно работало стабильно и могло наслаиваться в глубокие архитектуры (сотни слоев), его оборачивают во вспомогательные компоненты, образуя Transformer Block.
!Архитектура блока Трансформера
Каждый блок состоит из нескольких обязательных этапов:
Практический кейс: Разрешение зависимостей в медицине
Объединим все концепции на примере сложного клинического предложения: «Пациент отрицает прием аспирина, но регулярно использует ибупрофен для купирования боли.»
Как Трансформер обрабатывает это на уровне архитектуры?
Мы увидели, как Трансформеры решили проблему последовательного узкого горлышка, заменив рекуррентность на параллельные матричные вычисления. Однако это решение породило новый вызов: размер матрицы равен , где — длина контекста. Мы обменяли времени на вычислительной сложности и потребления памяти. Именно эта квадратичная зависимость заставляет нас применять сложнейшие инженерные решения (квантование, FlashAttention, KV-кэширование) при развертывании современных LLM в продакшене.