Phase 07: Transformers Deep Dive

الاهتمام متعدد الرؤوس

رأس واحد يدرك علاقة واحدة في كل مرة ثمانية رؤوس تتعلم ثمانية رؤوس مجانية خذ المزيد منها

Type: Build

Languages: Python

Prerequisites: Phase 7 · 02 (Self-Attention from Scratch)

Time: ~75 minutes

المشكلة

رأس الانتباه الذاتي واحد يحسب ماتريسكة الانتباه. هذه المصفوفة تسجل نوعًا واحدًا من العلاقات عادةً ما تكون تلك التي تقلل من الخسارة على أي إشارة تدريبية. إذا كان بياناتك تتضمن اتفاقًا موضوعيًا ومفعولًا ومشاركة إشارة ، وتحديثًا طويلًا ، وتقطيعًا نحويًا متصلبًا معًا ، فإن رأس واحد يضعهم في توزيع واحد ذو غاية ضعيفة ويخسر نصف الإشارة.

التحدي من ورقة Vaswani 2017: تشغيل العديد من وظائف الاهتمام بالتوازي ، كل منها مع توقعات Q ، K ، V الخاصة به ، وتحديد الخروج. تعمل كل رأس في فرعية صغيرة من الأبعاد d_model / n_heads.الفقرات الكلية تبقى نفسها .تزداد الطاقة التعبيرية

الاهتمام متعدد الرؤوس هو الاختيار الافتراضي لكل محول في السفن 2026. الحجة الوحيدة حول كم عدد الرؤوس وما إذا كانت المفاتيح والقيم تشارك التنبؤات (التأمل المجموعي، التأمل المتعدد، التأمل المتعدد الرؤوس).

المفهوم

!Multi-head attention splits, attends, concatenates

Split.خذXمن الشكل(N, d_model). مشروع إلى Q، K، V كل من الشكل (N, d_model). إعادة التغيير إلى(N, n_heads, d_head)أينd_head = d_model / n_heads. نقل إلى(n_heads, N, d_head). . .

Attend in parallel.أطلقوا على نطاق واسع النقطة المنتجة الاهتمام داخل كل رأس.(N, d_head).ال رؤوس تعمل على مختلف الفضاء الفرعي من الإدراج ولا تتحدث أبدا خلال حساب الاهتمام نفسه.

Concatenate and project.رأس السحب يعود إلى(N, d_model)و تكرر بمصفوفة الخروج المتعلمة W_oمن الشكل(d_model, d_model). .W_oحيث تخلط الرؤوس

Why it works.يمكن لكل رأس التخصص دون المنافسة مع الآخرين لميزانية تمثيلية. تظهر دراسات الاستقصاء من 20192024 أدوار رأس متميزة: رؤوس الموقف، الرأس الذي يشارك في الرمز السابق، رؤوس النسخ، رؤوس الكيانات المسمى، رؤوس الإدراج (التي تتمثل في التعلم في السياق).

The 2026 lineage of variations:

VariantQ headsK/V headsUsed by
Multi-head (MHA)NNGPT-2, BERT, T5
Multi-query (MQA)N1PaLM, Falcon
Grouped-query (GQA)NG (e.g. N/8)Llama 2 70B, Llama 3+, Qwen 2+, Mistral
Multi-head latent (MLA)Ncompressed to low-rankDeepSeek-V2, V3

GQA هي الاختيار الافتراضي الحديث لأنه يقلل من ذاكرة KV-Cache بمعدل N/Gبينما تحافظ على الجودة الكاملة تقريبا. MLA يذهب أبعد من ذلك عن طريق ضغط K / V في مساحة غامضة، ثم التنبؤ مرة أخرى في وقت الحساب تكلف FLOPs، ويحفظ الكثير من الذاكرة.

بناءها

الخطوة الأولى: تقسيم الرؤوس من الاهتمام المتوحد الذي لدينا بالفعل

خذواSelfAttentionمن الدروس 02 و لفها بـ زوج من المزقينcode/main.pyلتنفيذ ضئيل؛ المنطق هو:

pythondef split_heads(X, n_heads):
    n, d = X.shape
    d_head = d // n_heads
    return X.reshape(n, n_heads, d_head).transpose(1, 0, 2)  # (heads, n, d_head)

def combine_heads(H):
    h, n, d_head = H.shape
    return H.transpose(1, 0, 2).reshape(n, h * d_head)

واحد إعادة تشكيل و واحد نقل لا حلقة هذا بالضبط ما يفعله PyTorch تحتnn.MultiheadAttention. . .

الخطوة الثانية: تشغيل نقطة-المنتج الاهتمام لكل شخص

كل رأس يحصل على شريحة خاصة من Q، K، V. الانتباه يصبح ململ المكتسب:

pythondef mha_forward(X, W_q, W_k, W_v, W_o, n_heads):
    Q = X @ W_q
    K = X @ W_k
    V = X @ W_v
    Qh = split_heads(Q, n_heads)         # (heads, n, d_head)
    Kh = split_heads(K, n_heads)
    Vh = split_heads(V, n_heads)
    scores = Qh @ Kh.transpose(0, 2, 1) / np.sqrt(Qh.shape[-1])
    weights = softmax(scores, axis=-1)
    out = weights @ Vh                    # (heads, n, d_head)
    concat = combine_heads(out)
    return concat @ W_o, weights

على الأجهزة الحقيقيةQh @ Kh.transpose(...)هو واحدbmm. الجيبو يرى شكل واحد من الشكل(heads, N, d_head) × (heads, d_head, N) -> (heads, N, N)إضافة رؤوس مجانية

الخطوة 3: مجموعة-سؤال الاهتمام المتغير

فقط تغير الأساس والقيمة التنبؤات.n_headsالمجموعات: K و V الحصولn_kv_heads < n_headsالمجموعات وتكرر لتطابق:

pythondef gqa_project(X, W, n_kv_heads, n_heads):
    kv = split_heads(X @ W, n_kv_heads)       # (kv_heads, n, d_head)
    repeat = n_heads // n_kv_heads
    return np.repeat(kv, repeat, axis=0)      # (n_heads, n, d_head)

في الاستنتاج هذا يُخفي الذاكرة لأن فقطn_kv_headsالنسخة الحية في الجهاز التخزيني، لا n_heads. Llama 3 70B يستخدم 64 رأس استفسار مع 8 رؤوس كيف 8× مخفف الاحتفاظ.

الخطوة الرابعة: قم بتحقيق ما تعلمته كل رأس

إضغط على الجملة القصيرة مع 4 رؤوس. لكل رأس، طبع(N, N)سترى رؤوس مختلفة تختار بنية مختلفة حتى مع البداية عشوائية

استخدمها

في PyTorch، النسخة ذات الخط الواحد:

pythonimport torch.nn as nn

mha = nn.MultiheadAttention(embed_dim=512, num_heads=8, batch_first=True)

GQA اعتبارا من PyTorch 2.5+:

pythonfrom torch.nn.functional import scaled_dot_product_attention

# scaled_dot_product_attention auto-dispatches Flash Attention on CUDA.
# For GQA, pass Q of shape (B, n_heads, N, d_head) and K,V of shape
# (B, n_kv_heads, N, d_head). PyTorch handles the repeat.
out = scaled_dot_product_attention(q, k, v, is_causal=True, enable_gqa=True)

How many heads?قواعد الإبهام من نماذج الإنتاج في عام 2026:

Model sized_modeln_headsd_head
Small (~125M)7681264
Base (~350M)10241664
Large (~1B)204816128
Frontier (~70B)819264128

d_headتقريباً دائماً يصل إلى 64 أو 128. إنها وحدة كمية رأس واحد يمكنه "رؤية". انخفض إلى أقل من 32 و تبدأ الرؤوس في محاربة عامل التوسعsqrt(d_head)إضافة إلى إضافة إضافية إلى 256 و تفقد ميزة "الكثير من المتخصصين الصغار".

أرسله

انظرoutputs/skill-mha-configurator.md. توصي المهارة بعد الرأس، و عدد الرأس، واستراتيجية التنبؤ لمحول جديد مع إعطاء ميزانية المعلمات، وطول التسلسل، و هدف الانتشار.

التمارين

  1. Easy.خذ المكتب منcode/main.pyوتغييرn_headsمن 1 إلى 16 مع d_model=64تدوين خسارة نموذج صغير من طبقة واحدة على مهمة نسخ اصطناعية هل تساعد رؤوس أكثر أو تساعد أو تؤذي؟
  2. Medium.تنفيذ MQA (رأس KV واحد مشترك بين جميع رؤوس الاستفسار). قياس كمية تراجع عدد المعايير مقابل MHA الكامل. حساب كمية تقلص حجم KV-Cache عند الاستنتاج ل N = 2048.
  3. Hard.تنفيذ نسخة صغيرة من الاهتمام المتخفي متعدد الرؤوس: ضغط K، V إلى رتبةrالاختفاء، تخزن الاختفاء في الاحتفاظ الكهربائي، وتفكيك في وقت الاهتمام.rهل تتجاوز ذاكرة الاحتفاظ بالخزنة أقل من 1/8 من MHA الكامل بينما تبقى الجودة ضمن 1 بت من التحقق من التحقق؟

الشروط الرئيسية

TermWhat people sayWhat it actually means
Head"A single attention circuit"One Q/K/V projection of dimension d_head = d_model / n_heads with its own attention matrix.
d_head"Head dimension"Per-head hidden width; almost always 64 or 128 in production.
Split / combine"Reshape tricks"(N, d_model) ↔ (n_heads, N, d_head) reshape+transpose around attention.
W_o"Output projection"(d_model, d_model) matrix applied after concatenating heads; where heads mix.
MQA"One KV head"Multi-Query Attention: single shared K/V projection. Smallest KV cache, some quality loss.
GQA"The default since Llama 2"Grouped-Query Attention with n_kv_heads < n_heads; repeats to match Q.
MLA"DeepSeek's trick"Multi-head Latent Attention: K,V compressed to low-rank latent, decompressed at attend time.
Induction head"The circuit behind in-context learning"A pair of heads that detect previous occurrences and copy what followed them.

المزيد من القراءة

This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.

Browse the complete course catalog or open this lesson on GitHub.