09 Attention

Warning

🚧 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.

Warning

🚧 Երեք դասախոսության սլայդերն էլ պատրաստ են (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
ImportantԳլխի ամենակարևոր չափումը — attention-ը բառերի հերթականությունը չի տեսնում

Վերցնում ենք նույն երեք բառի վեկտորները երկու հերթականությամբ՝ «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։

TipԵրեք բան, որ արժե հիշել
  • 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-ում։ Քառակուսայինը նկարագրում է, թե ինչպես է ծախսը աճում, ոչ թե որտեղ է այն հիմա։

🏡 Տնային

NoteԻրականացրեք scaled dot-product attention-ը numpy-ով

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. Տողերը գումարվո՞ւմ են 1-ի։ attn.sum(axis=1) պետք է լինի ամենուր 1։
  2. causal=True-ի դեպքում ապագան իրո՞ք զրո է։ np.triu(attn, k=1).max() պետք է լինի ուղիղ 0.0, ոչ թե «շատ փոքր»։
  3. Վերարտադրեք դասի արդյունքը։ Վերցրեք երեք բառ, անցկացրեք երկու հերթականությամբ, և ստուգեք, որ նույն բառի ելքային վեկտորը նույնական է։ Ապա ավելացրեք sinusoidal positional encoding և ստուգեք, որ այլևս նույնական չէ։

Երրորդն ամենակարևորն է․ եթե ձեր իրականացումը չի վերարտադրում permutation-equivariance-ը, ապա ինչ-որ տեղ սխալ եք հասկացել մեխանիզմը։

Կամընտրական․ BertViz-ով նայեք իրական մոդելի head-երին ձեր իսկ նախադասության վրա։

Flag Counter