Головна / Статті / Залишкові зв'язки: чому глибокі трансформери взагалі вдається навчити

Залишкові зв'язки: чому глибокі трансформери взагалі вдається навчити

Чому просте нарощування шарів ламає навчання, як skip-зв'язки x + F(x) лагодять потік градієнтів, як їх використовують блоки з Pre-LayerNorm, і коротка реалізація на PyTorch.

1031 слів

Якщо наївно скласти десятки шарів один на одного, навчання стає нестабільним. Залишкові зв'язки, їх ще називають shortcut-зв'язками, розв'язують цю проблему: і інформація, і градієнти отримують змогу проходити крізь мережу напряму.

Чому просте нашарування не працює

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

Input
   │
   ▼
Attention
   │
   ▼
Feed Forward
   │
   ▼
Attention
   │
   ▼
Feed Forward
   │
   ▼
...

Навчається таке погано. Що глибша мережа, то складніше її оптимізувати, і до появи залишкових зв'язків у ResNet у 2015 році це було однією з головних перешкод у глибокому навчанні. Від них залежать майже всі сучасні трансформери, зокрема GPT, BERT, LLaMA, Claude і Gemini.

Почнімо з мережі з двох шарів:

Input  ↓Layer 1  ↓Layer 2  ↓Output

Навчити її зазвичай нескладно. А тепер уявіть 96 шарів:

Input↓Layer 1↓Layer 2↓...↓Layer 96↓Output

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

Зіпсований телефон

Уявіть повідомлення, яке пошепки передають ланцюжком із п'ятдесяти людей:

Person 1↓Person 2↓Person 3↓...↓Person 50

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

Додаймо короткий шлях

А що, як даним не обов'язково проходити через кожен шар і вони можуть ще й оминати їх?

Input
  │
  ├──────────────┐
  ▼              │
Layer            │
  ▼              │
Output           │
  │              │
  └────── Add ◄──┘
        │
        ▼
Final Output

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

Математика

Припустімо, шар обчислює ось це:

F(x)

Без залишкового зв'язку вихід — це просто результат шару:

Output = F(x)

Із ним вихід стає таким:

Output = x + F(x)

Вхід додається просто до перетвореного виходу. Ця операція називається skip-зв'язком, або shortcut-зв'язком.

Чому це допомагає

Припустімо, конкретному шару нічого додати. У звичайній мережі йому довелося б якось навчитися працювати тотожною функцією, а це, як з'ясовується, важко. Із залишковим зв'язком тотожність дістається безкоштовно. Шару досить вивчити:

F(x) = 0

щоб:

Output = x + 0 = x

Вхід проходить без змін, і оптимізація стає набагато простішою.

Вчимося на різниці

Звідси й назва. Шару не треба вивчати все перетворення цілком. Він вчить лише різницю, той самий залишок, між входом і цільовим виходом. Добре порівняння — редагування фото: картинку рідко перемальовують повністю, її коригують, додаючи яскравість, контраст чи різкість. Шар трансформера теж рідко мусить замінювати все представлення. Йому досить трохи його покращити.

Два короткі шляхи на блок

У кожному блоці трансформера два залишкові зв'язки. Перший охоплює шар уваги:

Input
  │
  ├──────────────┐
  ▼              │
Multi-Head Attention
  ▼              │
 Add ◄───────────┘
  │
  ▼
Output

Другий охоплює feed-forward мережу:

Input
  │
  ├──────────────┐
  ▼              │
Feed Forward Network
  ▼              │
 Add ◄───────────┘
  │
  ▼
Output

Pre-LayerNorm

Сучасні моделі GPT використовують схему Pre-LayerNorm, яка обчислюється так:

Input
   │
   ▼
LayerNorm
   │
   ▼
Multi-Head Attention
   │
   ▼
Add Residual
   │
   ▼
LayerNorm
   │
   ▼
Feed Forward Network
   │
   ▼
Add Residual
   │
   ▼
Output

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

Потік градієнтів

Під час зворотного поширення в градієнта тепер два шляхи:

Gradient↓Transformer Layer↓Residual Path

Якщо основне перетворення виявляється важким для оптимізації, короткий шлях однаково дає іншу дорогу назад, тож градієнт не може зникнути повністю. Мовою матаналізу похідна від

x + F(x)

дорівнює

1 + F'(x)

Ця константа 1 дуже важлива. Навіть якщо

F'(x)

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

Числовий приклад

Нехай вхідний ембединг такий:

[0.5, 1.2, -0.3]

а увага видає:

[0.1, -0.2, 0.4]

Замість того щоб замінити вхід, їх додають:

[0.5, 1.2, -0.3] + [0.1, -0.2, 0.4] = [0.6, 1.0, 0.1]

Вихідна інформація зберігається, а нова до неї домішується.

На PyTorch

У коді це майже нічого не коштує:

x = x + self.attention(
    self.layer_norm1(x)
)
x = x + self.ffn(
    self.layer_norm2(x)
)

Це додавання — одна з найвагоміших операцій у всій архітектурі.

Один повний блок

                Input
                  │
                  ▼
             LayerNorm
                  │
                  ▼
        Multi-Head Attention
                  │
                  ▼
           Add Residual
                  │
                  ▼
             LayerNorm
                  │
                  ▼
      Feed-Forward Network
                  │
                  ▼
           Add Residual
                  │
                  ▼
                Output

Сучасні LLM повторюють цю структуру десятки й навіть сотні разів.

Що змінюється з ними і без них

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