Чернетка

Всередині трансформаторного блоку — змішування інформації та додавання оновлень

Одна головка уваги дозволяє кожній позиції збирати суміш інформації з інших позицій. Але ця суміш — лише внесок. Як модель включає це у представлення, яке вона вже має, а потім продовжує вдосконалювати це представлення?

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

Кожен трансформаторний блок містить підрівень уваги з кількома головами та підрівень прямого зв’язку. Головки уваги зчитують однакові вхідні представлення та обчислюють незалежно, тому вони можуть працювати паралельно. Їх результати об’єднуються та проектуються в одне оновлення уваги. Блоки трансформатора працюють послідовно: кожен блок отримує оновлені представлення попереднього блоку.

На малюнку нижче показано три голови для ілюстрації; кількість головок залежить від моделі. Нормалізація тут опущена та представлена ​​нижче.

Transformer block 1
  ├─ Multi-head attention
  │    ├─ Head 1 ─┐
  │    ├─ Head 2 ─┼─ combine → project → residual addition
  │    └─ Head 3 ─┘
  └─ Feed-forward network → residual addition
          ↓
Transformer block 2
          ↓
...

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

Блок — це два оновлення поточного представлення

Нехай X містить один рядок на позицію маркера. Він має форму (n, d): позиції n, кожна з яких представлена ​​номерами d. Ми будемо використовувати блок pre-norm, де кожен підрівень зчитує нормалізовану версію своїх вхідних даних:

Y = X + attention(layer_norm_1(X))
Z = Y + ffn(layer_norm_2(Y))

Ці лінії виявляють структуру перед деталями. Для кожного додавання потрібні два масиви однакової форми. Ця вимога пояснює, чому підрівень уваги та FFN повертають (n, d), навіть якщо їхні внутрішні обчислення використовують інші ширини. Оригінальна стаття Transformer, §3.1 явно пов’язує загальну ширину моделі з залишковим додаванням. Його вихідний блок нормалізується після кожного додавання; ми порівняємо цей механізм із нашим базовим рівнем нижче.

flowchart TB X["X: current representation · n × d"] --> L1["LayerNorm: normalized read"] L1 --> A["Multi-head attention + output projection"] A --> DA["Attention update ΔA · n × d"] X --> ADD1["Y = X + ΔA"] DA --> ADD1 ADD1 --> L2["LayerNorm: normalized read"] L2 --> F["Per-position FFN"] F --> DF["FFN update ΔF · n × d"] ADD1 --> ADD2["Z = Y + ΔF"] DF --> ADD2 ADD2 --> NEXT["Next block"]

Стрілки обходу несуть існуюче зображення. Гілки обчислюють оновлення. Це перегляд залишкового потоку: послідовні компоненти зчитують представлення та записують до нього внески. Елхадж та його колеги розробляють цю інтерпретацію в Математичній структурі трансформаторних схем; Початок інтерпретації трансформатора, §2 викладає рівняння компонентів.

«Часткове оновлення» є корисною мовою, якщо воно означає внесок одного компонента в поточне представлення. Це не передбачає невеликої зміни, зміни лише кількох координат або вдосконалення на кожному кроці. Оновлення можуть посилити, скасувати або змінити те, що вже було.

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

Вивчення механізму самоуважності голови

Тут потрібен лише підсумок. Головна стаття пояснює, як виникають ці операції. Нехай U = layer_norm_1(X) буде нормалізованим зчитуванням потоку:

Q, K, V = U @ Wq, U @ Wk, U @ Wv
scores = Q @ K.T / sqrt(d_k)
scores = apply_mask(scores)        # forbidden positions get -inf
A = softmax(scores, axis=-1)
H = A @ V

Q і K – це (n, d_k), ваги змішування A – (n, n), а значення та продуктивність напору – (n, d_v). Голова повертає суміші значень, але ще не оновлення залишкового потоку. У рядку i H[i] поєднує значення з усіх дозволених вихідних позицій за допомогою рядка i з A.

Матриці Wq, Wk і Wv є вивченими параметрами, які спільно використовуються між позиціями. Q/K/V і A є обчисленими активаціями. Глибше в стеку ці проекції читають уявлення, створені попередніми оновленнями, а не свіжі пошуки статичних вбудовувань. Під час причинної генерації ключі та значення можуть кешуватися; те, що їх кількість обчислюється, не означає, що їх ніколи не можна зберігати.

Мультиголовка: кілька сумішей, одне оновлення уваги

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

Кожна головка отримує повний d-вимірний вхід і проектує його на менші простори запитів/ключів/значень. Для головок h поширеним вибором є d_k = d_v = d/h. Голова не отримує необроблений фрагмент введення введення. Ефективні реалізації проектують один раз у великий тензор, а потім розбивають спроектовані координати на головки.

heads = []
for r in range(h):
    Q = U @ Wq[r]                   # (n, d_k)
    K = U @ Wk[r]                   # (n, d_k)
    V = U @ Wv[r]                   # (n, d_v)
    A = softmax(apply_mask(Q @ K.T / sqrt(d_k)), axis=-1)
    heads.append(A @ V)             # (n, d_v)

delta_attn = concatenate(heads, axis=-1) @ Wo  # (n, d)

Конкатенація створює (n, h*d_v). Вихідна проекція Wo у формі (h*d_v, d) повертає отриманий результат на ширину, необхідну для додавання до X.

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

current token  was
four constructed causal patterns — each head can mix positions differently
head 1
head 2
head 3
head 4
↓↓↓↓
concatenate + mix  (output projection WO)
↓
attention update · before residual addition
illustrative patterns, not trained heads · rows = the querying token · columns = what it attends to · lower triangle only (the causal mask)

Проекція виходу перетворює суміші на внески

Є інший спосіб прочитати точно такий же розрахунок. Розділіть Wo на блоки рядків h, кожен має форму (d_v, d). Потім:

Δattn=Concat⁡(H1,…,Hh)WO=∑r=1hHrWO(r).\Delta_{\mathrm{attn}} =\operatorname{Concat}(H_1,\ldots,H_h)W_O =\sum_{r=1}^{h} H_r W_O^{(r)}.

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

Для однієї посади, що отримується, внесок керівника становить:

δi(r)=∑jaij(r)(vj(r)WO(r)).\delta_i^{(r)}=\sum_j a_{ij}^{(r)}\bigl(v_j^{(r)}W_O^{(r)}\bigr).

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

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

Залишкові зв’язки та нормалізація шару

Тепер ми можемо включити оновлення уваги:

Y=X+Δattn.Y=X+\Delta_{\mathrm{attn}}.

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

Суміш, оновлення та оновлене представлення

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

Об’єкт на towerСтруктураПаризька ідентичність
Вхідне представлення x1.00000.0000
Головна суміш h0.24830.5035
Заплановане оновлення h @ Wo з Wo = I0.24830.5035
Результат x + h @ Wo1.24830.5035

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

Тепер нехай вихідна проекція заперечує першу координату: Wo = diag(-1, 1). Оновлення стає [-0.2483, 0.5035], а результат стає [0.7517, 0.5035]. Операція все ще є додаванням, але координата структури зменшується. Додатковий шлях не гарантує збереження всіх функцій: внески можуть скасувати попередні компоненти.

У віджеті змініть перетворення запиту та значення, а потім перемкніть Скасувати оновлення структури. Слідкуйте за чотирма різними об’єктами від введення до результату. Він обчислює наведений вище двовимірний приклад без нормалізації, щоб ізолювати операції.

Follow the mixture into an update

The receiving position is tower. Its input is [1, 0]. Keys stay unchanged; scores use √2 scaling.

the24.83%
Eiffel50.35%
tower24.83%
Input x[1.0000, 0.0000]
structure
Paris identity
−1.5 0 +1.5
Mixture h = A @ V[0.2483, 0.5035]
structure
Paris identity
−1.5 0 +1.5
Update Δ = h @ Wo[0.2483, 0.5035]
structure
Paris identity
−1.5 0 +1.5
Result x + Δ[1.2483, 0.5035]
structure
Paris identity
−1.5 0 +1.5

The mixture and update coincide only when Wo is identity. Negating its structure coordinate reduces that part of the result, even though the operation is still addition. This calculator omits normalization to isolate the arithmetic.

Залишкове навчання було введено в ResNet як навчання виправлення введення. Встановлення залишкової гілки на нуль залишає відображення ідентичності. У диференціації y = x + F(x) дає dy/dx = I + dF/dx: прямий шлях додає тотожний термін до якобіана. Це допомагає оптимізувати, але це не гарантія того, що градієнти ніколи не можуть зникнути або вибухнути.

Нормалізуйте читання, збережіть додавання

У нашому базовому рівні перед нормою увага приділяється LayerNorm(X), але його оновлення додається до X, а не до цього нормалізованого масиву. FFN також читає LayerNorm(Y) і додає свій вихід до Y. Нормалізація належить до гілок; він не замінює потік при кожному додаванні.

Для одного рядка LayerNorm обчислює:

LN⁡(x)=γ⊙x−μ(x)σ2(x)+ϵ+β.\operatorname{LN}(x)=\gamma\odot\frac{x-\mu(x)}{\sqrt{\sigma^2(x)+\epsilon}}+\beta.

Середнє значення та дисперсія береться за ознаками цієї позиції d, а не за позиціями маркерів чи прикладами. Вивчений масштаб і зсув мають один запис для кожної функції. Маленький epsilon захищає знаменник. Нормалізація контролює масштаб того, що читається підшаром; у попередній нормі це не змушує поточну суму мати одиничну дисперсію.

Реалізація анотованого трансформатора робить відмінність видимою в SublayerConnection: його виконуваний код застосовує норму перед підрівнем, навіть якщо навколишній документ описує пост-норма. Видалення його пропуску для ясності дає нашу форму x + sublayer(norm(x)). Порівняння діаграм вимагає перевірки розміщення, а не лише наявності поля нормалізації.

АранжуванняОдин підшарНаслідок для бігу подання
Попередня норма, наша базова лініяx + F(LN(x))Прямий адитивний шлях залишається за межами нормалізації
Постнорма, оригінал Transformer/BERTLN(x + F(x))Сума нормалізується до того, як стане наступним представленням

Вони мають широкий шаблон, але реалізації в стилі BERT і GPT не ідентичні, за винятком їхніх масок. Буквальна плинна сума за шарами описує нашу переднормову базову лінію до її остаточної нормалізації. Це не та сама алгебра для пост-норми. Мовні моделі до норми зазвичай нормалізуються ще раз перед зчитуванням словника.

Прямий підрівень

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

Δffn=FFN⁡(LN⁡2(Y)),Z=Y+Δffn.\Delta_{\mathrm{ffn}}=\operatorname{FFN}(\operatorname{LN}_2(Y)),\qquad Z=Y+\Delta_{\mathrm{ffn}}.

Для нашої базової лінії FFN є двошаровим MLP:

F = layer_norm_2(Y)                 # (n, d)
hidden = gelu(F @ W1 + b1)          # (n, d_ff)
delta_ffn = hidden @ W2 + b2         # (n, d)
Z = Y + delta_ffn                    # (n, d)

W1 розширює ширину функції, часто до d_ff = 4d, а W2 відображає результат назад у d, щоб його можна було додати. У кожній позиції використовуються однакові ваги FFN. Тут немає перехресного змішування: рядок i обробляється лише за допомогою рядка i.

Нелінійність має значення, оскільки дві послідовні лінійні карти згорнуться в одну. З GELU між ними внесок залежить від того, які проміжні функції активуються. Увага вже є нелінійною через її softmax, що залежить від вхідних даних; FFN додає інше нелінійне перетворення для кожної позиції.

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

Для прикладу ширини 768 768 → 3072 → 768 надає проміжному обчисленню більше координат, а потім повертається до ширини потоку. Це повернення є архітектурною вимогою для додавання, а не свідченням того, що всі проміжні обчислення зберігають інформацію або без втрат.

Позиційне кодування: повідомляє моделі, де знаходиться кожна лексема

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

Для абсолютних позицій перший стан потоку:

X = token_embedding(token_ids) + position_embedding(position_ids)
for block in blocks:
    X = block(X)

Це позиційне додавання відбувається один раз під стеком. Це не те саме, що оновлення уваги та FFN у кожному блоці. Вектори позиції можуть бути фіксованими синусоїдами або вивченими записами таблиці.

Інші схеми привертають до уваги саму позицію:

СхемаДе входить позиціяЩо бачить шлях додавання/оновлення
Синусоїдальні або вивчені абсолютні положенняДодано до вбудовування токенів перед першим блокомПотік, ініціалізований маркером і інформацією про позицію
Зміщення відносної позиціїДодано до ключових балів запитуСуміші, зважені за вмістом і відносним розташуванням
МотузкаОбертає запити та ключі перед їх скалярним добуткомСуміші, бали яких включають відносні обертання

За допомогою RoPE зберігайте основний вміст запиту/ключа фіксованим і зміщуйте обидві позиції однаково: їх скалярний добуток не змінюється, оскільки відносне обертання не змінюється. Оцінка все ще залежить від вмісту, векторних величин і частоти обертання; це не просто функція відстані. Двовимірний віджет ізолює позиційний ефект за допомогою спочатку вирівняних одиничних векторів:

RoPE: position is a rotation
Each token's query and key is rotated by an angle set by its position. This example fixes both content vectors to the same unit direction, isolating how their relative position changes the dot product.
query position12
key position4
query rotation48°
key rotation16°
relative distance8
angle between32°
q · k = cos(between)0.85
Try this: bump query and key up by the same amount. Both arrows spin, but the angle between them — and the dot product q·k — don't move. That is the whole point: for fixed content vectors, this positional effect depends on relative offset. Real scores also depend on the query and key content; tokens at the same distance need not have the same score.

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

Складання блоку

Ось знову повний шлях. Функція уваги включає всі заголовки, маскування, конкатенацію та W_O. Розміри відсіву та партії опущено:

def block(X):
    U = layer_norm_1(X)
    delta_attn = multi_head_attention(U)
    Y = X + delta_attn

    F = layer_norm_2(Y)
    delta_ffn = gelu(F @ W1 + b1) @ W2 + b2
    Z = Y + delta_ffn
    return Z

Виконайте ті самі етапи в провіднику. Його розміри є ілюстративною переднормовою конфігурацією (d = 768, 12 головок шириною 64, d_ff = 3072), а не твердженням, що це точна стандартна схема BERT.

The transformer block, stage by stage
An illustrative pre-norm block: 768-wide stream, 12 heads, and a 3072-wide FFN. Select a stage to follow its contribution.
↓
↓
↓
↓
↓
↓
↓
selected part
Multi-Head Self-Attention
input shape
[n × 768]
output shape
[n × 768]

The communication step: each token gathers information from the other tokens.

Project into Q/K/V (12 heads × 64 dims each); score every query against every key (Q·Kᵀ / √64), softmax into weights, mix the value vectors by those weights. Concatenate the 12 head outputs and project back to 768 with W_O.

Q: n × 12 × 64
K: n × 12 × 64
V: n × 12 × 64
Attn(X) = Concat(head_1 … head_12) · W_O
Learn more: Self-attention mechanics →

Кожен блок має однакову форму входу/виводу, тому його вихід може подавати наступний блок. Блоки зазвичай мають свої власні параметри: повторення архітектури не означає повторного використання одного набору ваг. На наступній глибині Q/K/V і FFN зчитують оновлені представлення, тому пізніший компонент може відповісти на інформацію, введену попереднім компонентом.

У цій базовій лінії перед нормою розширення доповнень дає перед остаточною нормою:

X(N)=X(0)+∑ℓ=1N(Δattn(ℓ)+Δffn(ℓ)).X^{(N)}=X^{(0)}+\sum_{\ell=1}^{N}\left(\Delta_{\mathrm{attn}}^{(\ell)}+\Delta_{\mathrm{ffn}}^{(\ell)}\right).

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

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

Трансформатор математики: визначення розміру моделі в голові

Такі самі форми забезпечують компактну книгу параметрів. Припустимо h*d_k = h*d_v = d, щільну двоматричну FFN з d_ff = 4d, і опустимо зміщення та параметри нормалізації:

Частина одного блокуФорми ваги, комбіновані по головахПараметри
Проекції запиту, ключа, значенняТри матриці d × d3d²
Проекція виведення увагиd × dd²
Розширення та повернення FFNd × 4d, 4d × d8d²
ВсьогоШість великих матриць12d²

Таким чином, стек блоків N має приблизно параметри 12 N d² до вбудовування таблиць та інших невеликих термінів. У цій базовій лінії дві третини ваг блоку знаходяться в FFN. Gated FFN, спільні прогнози ключа/значення та інші варіанти змінюють арифметику; метод форми все ще застосовується. Покрокове керівництво GPT-2 надає конкретну кількість для всієї моделі.

Довжина послідовності змінюється витрати на активацію та обчислення, а не ці розміри матриці проекцій. Оцінка повної послідовності уваги та робочі шкали змішування цінностей як n²d; проекція та FFN масштабуються лінійно з n для фіксованої ширини. Ефективні ядра уваги можуть уникати зберігання всієї матриці балів, але це не усуває попарну арифметику. Кешоване декодування одним маркером має інший профіль вартості: його новий запит зчитує існуючі ключі та значення.

Немає універсальної контекстної стелі в 200 тисяч токенів. Дизайн моделі, пам’ять, ядра, позиційне навчання, розмір пакету та прийнятна затримка – усе це має значення. Стаття KV-кешу отримує рахунок пам’яті; оптимізація висновку слідує за наслідками обслуговування.

Від одного внеску до стека

Голова обчислює суміш. Вихідна проекція виражає це як внесок у координати потоку. Внесок уваги додається до представлення, потім FFN обчислює та додає ще один. Стекування повторює цю послідовність на все більш трансформованих входах.

Це зв’язок між іграшкою та блоком: змішування визначає, яка інформація надходить; додаткові оновлення визначають, як кожен компонент приєднується до поточного представлення. Форма залишається (n, d), поки інформація в її рядках змінюється.

Щоб побачити виконання повної моделі, скористайтеся візуалізатором Брендана Байкрофта і дотримуйтеся одного залишкового шляху вздовж її гілок. Потім перейдіть до кодувальників, декодерів і архітектурного поділу або конвеєра GPT-2.

Додатково: яка частина цього зображення є справжньою?

Геометричні приклади, головні ролі та те, що може встановити карта уваги

Операції є буквальними; для навчання вибираються позначені сокири та сюжетні ролі в нашій іграшці. Справжні вивчені об’єкти не повинні займати окремі координати. Голова може брати участь у кількох поведінках, і кілька голів можуть сприяти одній поведінці. Паралельні головки в шарі та послідовні шари є різними формами композиції; жоден з них не гарантує чистого переходу від синтаксису до семантики в кожній моделі.

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

Залишковий потік має кінцеву ширину. Додавання вкладів у спільних координатах не створює окремих постійних слотів для зберігання для кожної голови чи шару. Напрямки можуть накладатися, посилювати або скасовувати. Стаття про sparse-autoencoder досліджує, чому окремі координати може бути важко інтерпретувати.

Альтернативні норми, закриті FFN та вивчені фактичні асоціації

RMSNorm змінює масштаб рядка без віднімання його середнього значення. Деякі архітектури нормалізуються в додаткових точках, використовують закриті мережі прямого зв’язку, такі як SwiGLU, або пропускають вибрані зміщення. Вони змінюють обчислення гілок, а іноді й їх розташування; перевіряйте конкретну модель, а не розглядайте одну діаграму як універсальну. Стаття modern-LLM порівнює такі варіанти.

Робота з інтерпретації також вивчає FFN як вивчені спогади. ROME досліджує фактичні асоціації та цільове редагування ваги в конкретних трансформаторних MLP. Це не означає, що кожен факт займає один нейрон або лише FFN зберігають знання. Це напрямок досліджень, який слід досліджувати після того, як будуть зрозумілі прогнозні обчислення.

Подальші підключення та супутні читання

Математичні примітки до головної статті зберігають зв’язки білінійної оцінки, ядра та швидкої пам’яті. Лінійна увага змінює правило змішування; це не просто чергове розміщення залишкового доповнення.

Для реалізацій Анотований трансформатор поєднує код із оригінальним документом; перевірте його явно зазначений вибір коду попередньої норми. Inside the Transformer: The Life of a Token — це додаткове проходження з конкретними формами тензорів і архітектурними варіаціями. Праймер інтерпретації виходить за межі обчислень до методів для дослідження того, що роблять навчені компоненти.

Перегляд зображення

Змінюйте масштаб жестом щипка або клавішами + / −. Переміщуйте зображення перетягуванням або стрілками. Esc — закрити.