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

un

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

Увага плюс MLP, повторено

Структура блоку трансформера Pre-Norm


Два підшари

Блок трансформера містить рівно два підшари, кожен з яких працює з послідовністю токенів форми [batch, seq_len, d_model]:


1. Підшар багатоголової уваги. Токени дивляться один на одного. Активність 68 детально це розглядала. Форма виходу збігається з формою входу.

2. Підшар прямого поширення MLP. Кожен токен трансформується незалежно через двошаровий персептрон. Немає потоку інформації між токенами. Форма виходу збігається з формою входу.


Обидва підшари зберігають форму [batch, seq_len, d_model]. Це збереження дозволяє складати блоки: вихід шару N подається на вхід шару N+1 без акробатики з формами.


Що вносить кожен підшар

Увага переміщує інформацію між позиціями: токен у позиції 17 може витягнути інформацію з позицій 1 через 16. MLP трансформує інформацію у межах кожної позиції: представлення токена переформовується через навчені нелінійні функції, але ніколи не бачить своїх сусідів.


Накладання блоків чергуватиме ці дві операції. Увага шару 1 змішує позиції. MLP шару 1 переформовує для кожної позиції. Увага шару 2 змішує знову, тепер над переформованими представленнями. Це чергування збільшує виразну силу з глибиною.


Стек ANDREA


Варіантn_layern_headd_modelmlp_dim
ANDREA-12M6123841536
ANDREA-120M12127683072
ANDREA-480M162415366144

Зверніть увагу, що mlp_dim = 4 × d_model у всій родині. Це співвідношення зберігається майже в кожному сучасному трансформері. Розділ 3 пояснює чому.

Назви підшарів

Блок трансформера містить два підшари. Назвіть їх по порядку, та для кожного вкажіть, чи передає він інформацію між позиціями (від токена до токена) чи трансформує інформацію в межах однієї позиції (незалежно для кожного токена). Одне речення на підшар.

Чому пропускні з’єднання важливі

Залишковий шаблон

Кожен підшар обгортає свої обчислення в залишкове з’єднання. Вихід додає назад вхід:


x = x + Attention(LayerNorm(x))     # підшар уваги
x = x + MLP(LayerNorm(x))           # Підшар MLP

Усередині кожного підшару функція Attention(...) або MLP(...) виробляє дельту. Блок не замінює вхід; він додає вивчену корекцію.


Чому це важливо

Три причини, чому залишкові з'єднання домінують у глибоких архітектурах:


1. Потік градієнтів. Під час зворотного поширення додавання дає градієнтам прямий шлях від виходу назад до входу, обходячи підшар. У стопці з 12 шарів без залишків сигнал градієнта зникне задовго до досягнення вбудовувань; з залишками магнітуда градієнта залишається придатною через сотні шарів.


2. Ініціалізація ідентичності. Під час ініціалізації ваги підшару виробляють малі виходи. Залишковий зв’язок означає, що шар N спочатку проходить майже без змін. Навчання поступово вивчає дельти з робочої початкової точки.


3. Композиційне навчання. Кожен блок вивчає уточнення, а не заміну. Шар 1 може додати позиційну інформацію. Шар 2 може додати синтаксичну структуру. Шар 7 може додати семантичні зв’язки. Залишковий потік накопичується.


Нормалізація шару

Перед кожним підшаром LayerNorm перемасштабує представлення кожного токена до нульового середнього та одиничної дисперсії, потім застосовує вивчені коефіцієнти підсилення та зміщення для кожної ознаки:


y = gamma * (x - mean(x)) / sqrt(var(x) + epsilon) + beta

Середнє значення та дисперсія обчислюються по виміру d_model, окремо для кожного токена. Два навчані вектори (gamma, beta, кожен форми [d_model]) відновлюють виразну шкалу. Нормалізація утримує активації в чисельно стабільному діапазоні; без неї малі нестабільності під час навчання накопичуються в NaN градієнти.

Pre-Norm проти Post-Norm

Тонкий, але критичний вибір

Два способи інтеграції шарової нормалізації в залишковий підшар:


Пост-нормалізація (оригінальна стаття 2017 року):

x = LayerNorm(x + Attention(x))

Шарова нормалізація розташована після додавання залишку. Сам потік залишку нормалізується на кожному шарі.


Pre-norm (сучасний стандарт, що використовується в ANDREA):

x = x + Attention(LayerNorm(x))

Layer norm стоїть перед підшаром, всередині гілки з залишком. Потік залишку залишається ненормалізованим; нормалізується лише вхід до підшару.


Чому переміг Pre-Norm

Post-norm погано навчається без LR warmup та ретельного налаштування гіперпараметрів. Градієнти вибухають у ранніх шарах, оскільки кожен layer norm перемішує накопичений стан потоку залишку. Оригінальна стаття 2017 року використовувала post-norm з обширним налаштуванням; подальші роботи (GPT-2, LLaMA, ANDREA) стандартизували pre-norm.


Навчання до нормалізації стабільне. Резidualний потік накопичується чисто через всі шари; нормалізуються лише входи підшарів для числової стабільності. Сучасні трансформери за замовчуванням використовують pre-norm, та ANDREA успадковує цей вибір.


Рівняння фінального блоку

Поєднуючи резидуали, layer norm у позиції pre-norm та обидва підшари, отримуємо повний блок ANDREA:


```python
def block_forward(x):
```
x = x + Attention(LayerNorm(x))   # підшар уваги
x = x + MLP(LayerNorm(x))         # підшар MLP
return x

Два підшари, два залишкових додавання, дві нормалізації шарів (зверніть увагу: кожен підшар має свою нормалізацію шару; ANDREA-120M має 24 нормалізації шарів у 12 блоках плюс одну фінальну на виході, тобто 25 загалом). Повторити 12 разів. Це стовбур ANDREA-120M.

Чому Pre-Norm стабілізує тренування

ANDREA використовує pre-norm: `x = x + Attention(LayerNorm(x))`. Порівняйте з post-norm: `x = LayerNorm(x + Attention(x))`. Наведіть одну причину з перспективи потоку градієнтів, чому pre-norm тренується стабільніше за post-norm у глибоких стеках. Посилайтесь на залишковий потік у вашій відповіді.

Два Лінійні Шари, Одна Активація

Три Операції

Підшар MLP — це двошаровий персептрон із нелінійною активацією між шарами:


def mlp_forward(x):
h = x · W_1 + b_1        # розширення: d_model → mlp_dim
h = GELU(h)              # нелінійна активація
y = h · W_2 + b_2        # стиснення: mlp_dim → d_model
return y

Три операції. Дві лінійні, одна нелінійна. Перша лінійна розширює ширину; друга стискає назад.


Співвідношення розширення 4×

Сучасні трансформери встановлюють mlp_dim = 4 × d_model. ANDREA-120M:


d_model = 768
mlp_dim = 4 × 768 = 3072
Форма W_1 = [768, 3072]      # ~2.36M параметрів
Форма W_2 = [3072, 768]      # ~2.36M параметрів
Параметри MLP на блок = 4.72M (ігноруючи зміщення)

Два MLP розташовані між кожною парою підшарів уваги (по одному на блок). Дванадцять блоків × 4.72M ≈ 56.6M параметрів MLP загалом в ANDREA-120M, приблизно половина всіх параметрів.


Чому 4×

Співвідношення 4× з’явилося емпірично. Менші співвідношення зменшують ємність моделі. Більші співвідношення дають дедалі меншу віддачу на витрачений параметр. Протягом десятиліть пошуку архітектур 4× витримало перевірку; воно присутнє в GPT, BERT, T5, LLaMA та ANDREA.


Недавні роботи (PaLM, Chinchilla) виявили, що механізми гейтингу (SwiGLU) можуть використовувати розширення 8/3× з порівнянною ємністю за меншу вартість; ANDREA залишається з класичним GELU + 4× для простоти.

GELU: Плавна активація

Що обчислює GELU

GELU (Gaussian Error Linear Unit) — це стандартна активація між шарами MLP у сучасних трансформерах. Її формула:


GELU(x) = x · Φ(x)

Φ(x) — це кумулятивна функція розподілу стандартного нормального розподілу: ймовірність того, що стандартна гауссівська випадкова величина буде меншою або рівною x. Обчислюється чисельно:


Φ(x) ≈ 0.5 × (1 + tanh(sqrt(2/π) × (x + 0.044715 × x³)))

Поведінка за регіонами

- Для великих додатних x: Φ(x) ≈ 1, тому GELU(x) ≈ x. Як ReLU.

- Для великих від'ємних x: Φ(x) ≈ 0, тому GELU(x) ≈ 0. Як ReLU.

- Біля x = 0: Φ(x) ≈ 0.5, тому GELU(0) = 0 точно. Плавний перехід через початок координат.


На відміну від ReLU, GELU пропускає деякі від'ємні входи, зважені Φ(x). Невеликий від'ємний вхід все ще вносить невеликий від'ємний вихід, просто менший, ніж повний вхід.


Чому GELU перевершила ReLU

Емпірично трансформери, навчені з GELU, досягають нижчої втрати, ніж трансформери, навчені з ReLU, при тій самій кількості параметрів. Плавність біля нуля має значення: жорстке відсікання ReLU в нулі створює розриви градієнтів; плавна крива GELU забезпечує чистіші градієнти для зворотного поширення.


Навчальний двигун ANDREA microgpt_cuda.cu містить вручну написане ядро GELU CUDA. Ядро використовує апроксимацію tanh наведену вище; сучасні GPU включають tanh як операцію одного інструкції.

Обчислення параметрів MLP

ANDREA-120M має `d_model=768`, `mlp_dim=3072` та `n_layer=12`. Обчисліть загальну кількість параметрів у матрицях ваг MLP (`W_1` та `W_2`) по всіх 12 блоках. Ігноруйте зміщення. Покажіть арифметику. Потім вкажіть, яку частку від загальних ~120M параметрів ANDREA-120M це становить (округліть до одного знака після коми).

Дванадцять блоків складаються в ANDREA-120M

Від блоку до моделі

Повний прямий прохід ANDREA-120M:


def model_forward(token_ids):
x = token_embed(token_ids) + position_embed(positions)
for block_idx in range(n_layer):       # 12 блоків
x = block_forward(x)               # увага + MLP з залишковими з'єднаннями
x = LayerNorm(x)                       # фінальна нормалізація
logits = x · token_embed.T             # зв'язані ваги для проєкції виходу
return logits

Шість ліній. Основна маса живе всередині block_forward, викликається дванадцять разів. Ембедінги запускають конвеєр; зв'язане розембедування (та сама матриця, що використовується для пошуку входу, транспонована для проєкції виходу) завершує його.


Глибина як композиція

Кожен блок читає залишковий потік, обчислює дельту та додає її назад. Після дванадцяти проходів потік містить накопичені внески від кожного блоку. Внутрішньо шари схильні спеціалізуватися:


- Ранні шари (1-3): синтаксичні патерни, позиційна структура

- Середні шари (4-8): зв'язки слів, межі фраз

- Пізні шари (9-12): семантичний зміст, фактичне пригадування


Ця спеціалізація виникає через тренувальний тиск, а не через архітектурні вибори. Такий самий уніфікований дизайн блоку створює спеціалізовані шари під час тренування на мові.


Загальна кількість параметрів блоку


КомпонентНа блокПо 12 блоках
Проекції уваги (4×W)2.36M28.3M
Вага MLP (W_1 + W_2)4.72M56.6M
Нормалізація шарів (gamma, beta)~3K (незначно)~37K
Всього на блок~7.1M~85M

85M параметрів у стовбурі. Додаємо ~13M у вбудовуваннях токенів (8449 словник × 768 d_model × 2 для зв’язаних вхід/вихід) плюс фінальну нормалізацію шару, & загальна кількість параметрів ANDREA-120M становить приблизно 120M. Дизайн блоку становить дві третини; вбудовування — решту.

Відстеження одного токена через один блок

Вектор токена розміром 768 відправляється в блок 7 ANDREA-120M. Опишіть, що з ним відбувається всередині блоку (у структурі pre-norm). Згадайте: обидві нормалізації шарів, обидва підшари, обидва додавання залишків & фінальну форму. Назвіть принаймні одне місце, де потік залишків лишається недоторканим & одне місце, де він модифікується.