Вложение — это поиск, а не функция
Первый слой после токенизатора
Токенизатор передаёт модели целочисленные ID: [256, 1842, 7301, ...]. Первое, что делает трансформер: преобразует каждый ID в вектор из d_model чисел с плавающей точкой. Этот вектор находится в d_model-мерном пространстве (768 измерений для ANDREA-120M).
Слой вложения — это таблица поиска, а не функция. Представьте огромную матрицу:
shape: (V, d_model)
row 0: [e_0_0, e_0_1, ..., e_0_767]
row 1: [e_1_0, e_1_1, ..., e_1_767]
...
row 8448: [e_8448_0, e_8448_1, ..., e_8448_767]
Token ID i выбирает строку i. Прямой доступ к массиву. Без арифметики, без активации. Только индекс.
Обучаемые числа с плавающей точкой
Каждая запись в этой таблице изначально представляет собой небольшое случайное число с плавающей точкой (обычно выбирается из нормального распределения, масштабированного на 1/sqrt(d_model)). Обратное распространение обновляет каждую строку, когда её Token ID появляется в батче. После обучения похожие токены (cat, dog, pet) получают похожие векторы; несвязанные токены (cat, Tuesday, xylophone) располагаются далеко друг от друга в векторном пространстве.
ANDREA-120M Стоимость токен-эмбеддинга
| Количество | Значение |
|---|---|
| V | 8,449 |
| d_model | 768 |
| Параметры | 6,488,832 |
Примерно 6,5 млн параметров находятся только в таблице эмбеддингов токенов, что составляет около 5,4 % от общего числа параметров ANDREA-120M. Каждому слоту словаря соответствует 768 чисел с плавающей точкой.
Расчёт размера таблиц эмбеддингов
Скалярные произведения измеряют сходство
Векторы как стрелки
768-мерный вектор существует в пространстве, которое человек не может визуализировать, но та же алгебра работает в любом измерении. Для трансформеров важны две ключевые операции:
Модуль (длина стрелки):
||v|| = sqrt(v_0² + v_1² + ... + v_767²)
Скалярное произведение (выравнивание между двумя стрелками):
u · v = u_0 × v_0 + u_1 × v_1 + ... + u_767 × v_767
Что показывает скалярное произведение
Два факта, которые верны в любом измерении:
- u · v = ||u|| × ||v|| × cos(theta), где theta — угол между ними.
- Векторы, указывающие в одном направлении, дают большие положительные скалярные произведения.
- Векторы, указывающие в противоположных направлениях, дают большие отрицательные скалярные произведения.
- Векторы, расположенные под прямым углом, дают скалярное произведение, равное нулю.
Скалярное произведение = ненормализованное сходство. Две обученные эмбеддинги токенов для cat и dog в итоге имеют высокое скалярное произведение, потому что обратное распространение ошибки «сближает» их (оба предсказывают контексты, связанные с домашними животными). cat и Tuesday оказываются почти ортогональными, потому что они предсказывают разные контексты.
Почему трансформеру важно
Activity 5 (grow_a_language_model_attention) строит внимание из скалярных произведений: вектор запроса скалярно умножается на векторы ключей, давая оценки, которые показывают, какие предыдущие токены важны для предсказания следующего. Эмбеддинги и скалярные произведения вместе несут все взаимодействия внутри трансформера.
Предсказать сходство
ANDREA использует обученные позиционные эмбеддинги
Проблема
Эмбеддинг токена сообщает модели, какое слово находится в этой позиции. Он не сообщает модели, где именно это слово расположено. Без информации о позиции трансформер воспринимает the cat sat on a mat и mat a on sat cat the одинаково: один и тот же набор токенов, без сигнала о порядке.
В литературе по трансформерам существуют три решения:
Синусоидальные (Vaswani 2017). Фиксированная математическая формула на основе синусов и косинусов. Позиция 0 получает определённый 768-вектор; позиция 1 — другой; никогда не обучается и не обновляется. Обобщается на любую позицию через формулу.
RoPE (Rotary Position Embedding). Поворачивает векторы query и key в зависимости от позиции. Используется в LLaMA, Qwen. Не требует дополнительных параметров; вращение встроено в механизм внимания.
Learned. Отдельная таблица эмбеддингов размером (T, d_model), где T — длина контекста. Каждая строка обучается через обратное распространение, как и эмбеддинги токенов.
Выбор ANDREA: Learned
ANDREA наследует подход с обученными позициями от microGPT, который унаследовал его от nanoGPT, который в свою очередь — от GPT-2. Обоснование:
- Простота. В механизме внимания не требуется специальная математика. Таблица позиций выглядит так же, как таблица токенов.
- Совместимость с пользовательским CUDA. Движок microgpt_cuda.cu в ANDREA обрабатывает два lookup-эмбеддинга одинаково; ядра sin/cos не требуются.
- Достаточно для фиксированного контекста. ANDREA ограничивает T значением 1024. Обученная таблица отлично работает для последовательностей фиксированной длины.
Стоимость позиционного эмбеддинга ANDREA-120M
| Параметр | Значение |
|---|---|
| T (контекст) | 1,024 |
| d_model | 768 |
| Параметры | 786,432 |
0.79M параметров для позиций. В сумме с токеновыми эмбеддингами: 6.49M + 0.79M = 7.27M параметров эмбеддингов всего для ANDREA-120M.
Как они объединяются
В каждой позиции t входной последовательности:
x_t = token_embedding[token_id_t] + position_embedding[t]
Два 768-мерных вектора, складываемые поэлементно. Результат, x_t, поступает в первый блок трансформера. Модель больше никогда не разделяет их; она учится использовать объединённый сигнал.
Обученные против синусоидальных
Где живут параметры эмбеддингов
Полный слой эмбеддингов ANDREA-120M
| Компонент | Форма | Параметры |
|---|---|---|
| Таблица токен-эмбеддингов | 8,449 × 768 | 6,488,832 |
| Таблица позиционных эмбеддингов | 1,024 × 768 | 786,432 |
| Итого | 7,275,264 |
Примерно 7.3M параметров. Общее число параметров ANDREA-120M: ~120M. Слой эмбеддингов составляет всего 6%. Остальные 94% находятся в трансформер-блоках (attention + MLP, рассматриваются в занятиях 5-7).
Независимые и связанные эмбеддинги
Многие архитектуры трансформеров (включая GPT-2) связывают эмбеддинг токена с финальной выходной проекцией: одна и та же матрица V × d_model используется и на входе, и на выходе (логиты по словарю). Связывание экономит V × d_model параметров и часто улучшает качество.
ANDREA использует несвязанные эмбеддинги: входной эмбеддинг и выходная проекция обучаются как отдельные матрицы. Активность 7 (grow_a_language_model_transformer_block) охватывает финальный слой.
Прямой проход на текущий момент
Вход: идентификаторы токенов [256, 1842, 7301, ...] (1024 штуки). Каждый ID извлекает 768-мерный вектор. Каждая позиция извлекает 768-мерный вектор. Поэлементное сложение. Результат: матрица (1024, 768) x из векторов токен+позиция. x поступает в трансформер-блок 1.
Активность 5 (grow_a_language_model_attention) описывает, что делает блок 1: scaled dot-product attention с causal mask и softmax.