English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

гість
1 / ?
назад до уроків

Ширина розподіляється між головами

Одна голова бачить один шаблон

Активність 67 охоплювала масштабну точкову увагу: вектор запиту Q, вектор ключа K, вектор значення V; обчислення Q·Kᵀ/√d_k, маска, softmax, зважування V. Одна голова вивчає один шаблон зв’язків: можливо, узгодження підмета з дієсловом, можливо, парування розділових знаків, можливо, нічого корисного.


Багатоголовкова увага виконує ту саму операцію паралельно кілька разів на різних зрізах представлення токена. Дванадцять паралельних голів. Дванадцять можливих шаблонів зв’язків. Голі спеціалізуються виключно під тиском тренування; жоден архітектор не каже голові 4 дивитися на час дієслова.


Відношення Split

ANDREA-120M встановлює d_model = 768 & n_head = 12. Багатоголовкова увага розбиває 768 на 12 частин по 64 кожна:


head_dim = d_model / n_head
64       = 768     / 12

Кожна голова працює з векторами розмірності 64. Розділення застосовується чітко: d_model повинен ділитися на n_head без остачі. Конфігурації, що порушують це, не проходять перевірку конфігурації, а не падають під час виконання.


Три моделі, три розділення


Варіантd_modeln_headhead_dim
ANDREA-12M3841232
ANDREA-120M7681264
ANDREA-480M15362464

Зверніть увагу: ANDREA-12M та ANDREA-120M зберігають n_head=12 сталим; масштабуються лише d_model та, відповідно, head_dim. ANDREA-480M подвоює кількість голівок до 24, зберігаючи head_dim=64 узгодженим з ANDREA-120M.

Обчислення head_dim

Припустимо, гіпотетичний варіант ANDREA-240M використовує `d_model=1024` та `n_head=16`. Обчисліть `head_dim`. Потім поясніть в одному реченні, що станеться під час валідації конфігурації, якщо колега запропонує `d_model=1024` та `n_head=15`.

Три матриці на голову, чи одна велика матриця

Вигляд на голову

Кожній голові потрібна своя проєкція запиту, проєкція ключа та проєкція значення. Для голови h:


Q_h = X · W_Q^h    де W_Q^h має форму [d_model, head_dim]
K_h = X · W_K^h    де W_K^h має форму [d_model, head_dim]
V_h = X · W_V^h    де W_V^h має форму [d_model, head_dim]

X несе форму входу [batch, seq_len, d_model]. Після проєкції Q_h, K_h, V_h кожне несе форму [batch, seq_len, head_dim].


Об'єднаний вигляд

Матриці для кожної головки розташовані поряд у пам'яті. Єдина об'єднана матриця W_Q форми [d_model, d_model] виробляє всі головки одразу:


Q_fused = X · W_Q              # [batch, seq_len, d_model]
Q_per_head = reshape(Q_fused)  # [batch, n_head, seq_len, head_dim]

Об'єднане множення матриць виконує один виклик BLAS замість 12. Tensor cores CUDA досягають пікової пропускної здатності на множеннях матриць такого розміру; множення по головах недовикористовували б апаратне забезпечення.


Кількість параметрів

Три злиті матриці W_Q, W_K, W_V, кожна розміром d_model × d_model. Плюс матриця проекції виходу W_O, також d_model × d_model. Для ANDREA-120M:


параметрів на увагу одного шару = 4 × 768² = 2,359,296 ≈ 2.36M
параметрів на 12 шарів      = 12 × 2.36M ≈ 28.3M

Приблизно чверть усіх параметрів ANDREA-120M міститься в проєкціях уваги. Решта трьох чвертей — у підшарі MLP та вбудуваннях.

Назви проєкцій

ANDREA-120M має `d_model=768` та `n_head=12`. Назвіть чотири матриці проєкцій в підшарі уваги одного блоку трансформера та вкажіть форму кожної (рядки × стовпці). Потім вкажіть, яка з чотирьох використовує вхід X, а яка — конкатеновані виходи голівок.

Дванадцять векторів стають одним

Multi-Head Attention Flow


Після обчислень кожного Heads

Кожен head виробляє тензор виводу форми [batch, seq_len, head_dim]. Дванадцять heads виробляють дванадцять таких тензорів. Конкатенація вздовж розмірності ознак з'єднує їх назад разом:


concat_output = concat(head_1, head_2, ..., head_12)
shape         = [batch, seq_len, n_head × head_dim]
= [batch, seq_len, 768]    # for ANDREA-120M

Concat повертає назад split. Загальна розмірність ознак повертається до d_model. Немає втрати інформації в розмірностях; різниця полягає в тому, що містить кожен шматок: шматок head 1 відображає вивчений шаблон уваги head 1.


Проекція виходу W_O

Саме конкатенація залишає голови ізольованими: вихід head 4 розташований поруч із виходом head 7, жодна з них не усвідомлює іншу. Проекція виходу W_O форми [d_model, d_model] змішує їх:


attention_output = concat_output · W_O
shape            = [batch, seq_len, d_model]

Після W_O кожен вимір вихідних даних несе в собі навчену лінійну комбінацію всіх дванадцяти голів. Інформація вільно тече між головами через цю єдину множення на матрицю.


Чому голови спеціалізуються
```

Ніщо в архітектурі не змушує голову 4 вивчати час дієслова чи голову 9 — парну пунктуацію. Спеціалізація виникає від тиску градієнтів: під час тренування голови, що роблять повторювані внески, отримують менші градієнти, ніж ті, що роблять унікальні. За тисячі кроків кожна голова осідає в нішу, яка найефективніше зменшує загальні втрати.


Емпірично навчені трансформери демонструють голови, що обробляють: позиційні патерни (голова дивиться на попередній токен), синтаксичні патерни (голова дивиться на відповідну закриваючу дужку), семантичні патерни (голова дивиться на останню згадану іменовану сутність). Жодних міток не потрібно для цієї спеціалізації. Тільки тренувальний сигнал, що поширюється через W_O, сортує голови.

Чому дванадцять голів, а не одна ширша голова

Уявіть альтернативу: замініть 12 голів по 64 dim кожна на 1 голову з 768 dim. Загальна кількість параметрів у проєкціях залишається тією ж. Наведіть дві різні причини, чому конфігурація з 12 головами перевершує конфігурацію з 1 головою в задачах мовного моделювання. Посилайтесь на патерни уваги або динаміку тренування у відповіді.

Як CUDA зберігає голівки

Один тензор, переформований

Тренувальний двигун ANDREA microgpt_cuda.cu не виділяє дванадцять окремих буферів для дванадцяти голівок. Він виділяє один злитий тензор & трактує розмірність голівки як шаблон кроку:


// після Q = X · W_Q (один матричний добуток, злитий по голівках)
// Q має форму [batch, seq_len, d_model]
// переформувати до    [batch, seq_len, n_head, head_dim]
// транспонувати до  [batch, n_head, seq_len, head_dim]
// тепер кожна голова є суцільною в двох внутрішніх вимірах

Транспонування переміщує n_head перед seq_len. Чому? Тому що наступна операція (Q_h · K_h^T) потребує, щоб зріз seq_len × head_dim кожної голови був суцільним у пам'яті. CUDA матмули працюють швидше на суцільних тензорах.


Один Ядро, Багато Голов
One Kernel, Many Heads

Один CUDA-ядро уваги виконується паралельно по всіх головах. Кожен блок потоків обробляє одну пару (batch, head); потоки всередині блоку співпрацюють над тайлом seq_len × head_dim. Ядро ніколи не знає, що обробляє кілька голів; паралелізм забезпечує сітка запуску.


Конфігурація Відображає Апаратне Забезпечення

Вибір ANDREA-120M параметрів n_head=12, head_dim=64 узгоджується з тензорними ядрами RTX 4090, які віддають перевагу тайлам matmul, кратним 16. head_dim=64 = 4 × 16 точно відповідає формі тайла. head_dim=32 (ANDREA-12M) також відповідає, але недоутворює тайл. head_dim=72 не відповідала б і змусила використовувати резервні ядра.


Загальна Картина


КрокОпераціяФорма виходу
1. ПроєктQ = X · W_Q (аналогічно K, V)[batch, seq, d_model]
2. Переформати & транспонуватирозбити d_model → (n_head, head_dim)[batch, n_head, seq, head_dim]
3. Увага на головумасштабований дот-продукт на кожній голові[batch, n_head, seq, head_dim]
4. Транспонувати & переформатиоб’єднати (n_head, head_dim) → d_model[batch, seq, d_model]
5. Проєкція виходуoutput = concat · W_O[batch, seq, d_model]

П’ять кроків. Три матмули торкаються входу (проєкції Q, K, V). Один матмул торкається об’єднаних голів (W_O). Один ядро уваги обробляє всі голови паралельно. ANDREA-120M виконує всі п’ять кроків один раз на шар, дванадцять шарів углиб, кожен прямий прохід.

Читання конвеєра

Пройдіться по тому, що відбувається з представленням одного токена X[i] (вектор розміром 768) під час проходження через один підшар багатоголової уваги в ANDREA-120M. Згадайте: проекції, через які він проходить, як він розділяється, що увага робить з ним, та як він повертається до вектора розміром 768. Покажіть розмірності на кожному кроці.