09 Attention
🚧 Not finished. This chapter has not been taught yet, and the page below was drafted by Claude rather than written up from a delivered lecture. Treat it as a preview: expect gaps and mistakes until it has been reviewed.
🚧 Երեք դասախոսության սլայդերն էլ պատրաստ են (L24, L25, L26)։ Տեսանյութ դեռ չկա։
🎲 Random
TBD
📚 Նյութը
Երեք դասախոսություն (սլայդերը ml/ch9_attention/ պանակում)։
- L24 — Attention: դասը սկսվում է հենց այնտեղից, որտեղ L21-ը կանգ առավ՝ seq2seq-ի bottleneck-ից։ Ուղղումը մեկ գաղափարով է․ թող decoder-ը հետ նայի ամբողջ նախադասությանը։ Հետո՝ թռիչքը․ հեռացրեք ռեկուրենտությունը, թողեք միայն attention-ը, և հաշվարկը դառնում է զուգահեռ։ Երկրորդ կեսը self-attention-ի ամբողջական մեխանիկան է՝ query / key / value, dot product, softmax, \(\sqrt{d_k}\), թվերը ձեռքով, ~15 տող կոդ։ PDF
- L25 — The Transformer block: multi-head attention, positional encoding, և ամբողջական block-ը՝ residual stream-ով ու causal mask-ով։ PDF
- L26 — Transformers in the world: encoder / decoder / encoder-decoder ընտանիքը, cross-attention, ինչպես է սովորում և ինչպես է դառնում chatbot, ինչու՞ հաղղեց, \(O(n^2)\) պատը և ազնիվ սահմանափակումները։ PDF
Վերցնում ենք նույն երեք բառի վեկտորները երկու հերթականությամբ՝ «dog bites man» և «man bites dog», և անցկացնում մեկ գլխով self-attention-ի միջով։
| «dog» բառի ելքային վեկտորի ամենամեծ տարբերությունը | |
|---|---|
| Առանց positional encoding-ի | 1.1 × 10⁻¹⁶ (այսինքն՝ զրո) |
| Positional encoding-ով | 1.797 |
Ոչ թե «քիչ տարբեր» — նույնական։ Self-attention-ը permutation-equivariant է․ \(\mathbf{q}_i \cdot \mathbf{k}_j\)-ը կախված է վեկտորներից, ոչ թե \(i\)-ից և \(j\)-ից, softmax-ը բազմության վրա է, իսկ ելքը գումար է։
RNN-ը հերթականությունը ստանում էր ձրի՝ մշակելով բառերը հերթով։ Attention-ը դեն նետեց ռեկուրենտությունը՝ զուգահեռության դիմաց, և հերթականությունն էր այն գինը, որ վճարեց։
Հաշվարկը՝ py_src/l25_l26_figs.py, որը սխալ է նետում, եթե առանց PE-ի տարբերությունը գերազանցի 1e-9։
- Multi-head-ը պարամետրեր չի ավելացնում։ Յուրաքանչյուր head աշխատում է փոքր տարածքում՝ \(d_k = d_{model}/h\)։ Դուք ոչ թե ավելացնում եք ծավալը, այլ բաժանում։ Չափված՝ մեկ շերտի 12 head-երի attention entropy-ն տատանվում է 0.92-ից 1.85, այսինքն՝ դրանք իրոք տարբեր բաներ են անում։
- Causal mask-ը throughput-ի որոշում է։ \(-\infty\)-ն softmax-ից առաջ ապագա թոքենների կշիռը դարձնում է ուղիղ զրո, և մեկ forward pass-ը տալիս է \(n\) ուսուցողական օրինակ միանգամից։ Դա է պատճառը, որ ինտերնետի մասշտաբով նախնական ուսուցումն ընդհանրապես մատչելի է։
- «Attention-ը bottleneck է»-ը ճիշտ չէ բոլոր երկարությունների համար։ \(d_{model} = 4096\)-ի դեպքում attention-ը feed-forward-ին գերազանցում է միայն 16,384 թոքենից հետո։ 2,048 թոքենի պատուհանում հաշվարկի մեծ մասը MLP-ում է, ոչ թե attention-ում։ Քառակուսայինը նկարագրում է, թե ինչպես է ծախսը աճում, ոչ թե որտեղ է այն հիմա։
🏡 Տնային
L24-ը բանաձևը ցույց տվեց, L25-ը՝ ամբողջ block-ը։ Այս առաջադրանքը դրանք դարձնում է շոշափելի՝ առանց որևէ ներբեռնման, առանց GPU-ի, ~15 տող։
import numpy as np
def softmax(x, axis=-1):
x = x - x.max(axis=axis, keepdims=True)
e = np.exp(x)
return e / e.sum(axis=axis, keepdims=True)
def attention(X, Wq, Wk, Wv, causal=False):
"""X: (n_tokens, d_model). Վերադարձրեք (ելք, attention_matrix)։"""
# TODO 1: հաշվեք Q, K, V
# TODO 2: scores = Q @ K.T / sqrt(d_k)
# TODO 3: եթե causal=True, ավելացրեք -inf անկյունագծից վերև
# TODO 4: softmax տողերի վրա, ապա բազմապատկեք V-ով
...Ստուգեք ձեր պատասխանը երեք հարցով.
- Տողերը գումարվո՞ւմ են 1-ի։
attn.sum(axis=1)պետք է լինի ամենուր 1։ causal=True-ի դեպքում ապագան իրո՞ք զրո է։np.triu(attn, k=1).max()պետք է լինի ուղիղ 0.0, ոչ թե «շատ փոքր»։- Վերարտադրեք դասի արդյունքը։ Վերցրեք երեք բառ, անցկացրեք երկու հերթականությամբ, և ստուգեք, որ նույն բառի ելքային վեկտորը նույնական է։ Ապա ավելացրեք sinusoidal positional encoding և ստուգեք, որ այլևս նույնական չէ։
Երրորդն ամենակարևորն է․ եթե ձեր իրականացումը չի վերարտադրում permutation-equivariance-ը, ապա ինչ-որ տեղ սխալ եք հասկացել մեխանիզմը։
Կամընտրական․ BertViz-ով նայեք իրական մոդելի head-երին ձեր իսկ նախադասության վրա։