محتويات الدورة

PyTorch / حالة التدريب وواجهات المعمارية / الدرس 11

أقنعة الانتباه وتخطيط الدفعة

اقرأ عقد الشكل وقطبية القناع لكل واجهة انتباه PyTorch بدلاً من نقل الافتراضات بالاسم.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • تمييز تخطيط وحدة MultiheadAttention من التخطيط المباشر للانتباه بالضرب النقطي المحجم.
  • تحويل قناعي الحجب والسماح المنطقيين عمداً.
  • ضبط الإسقاط وفحص اعتمادات الانتباه الصالحة.

للوحدة والواجهة الوظيفية عقدان مختلفان

تسقط nn.MultiheadAttention المدخلات إلى فضاءات الاستعلام والمفتاح والقيمة، وتجمع الرؤوس وتطبق إسقاط خرج. تستخدم واجهة تسلسل batch_first=True الشكل (N,L,E)، بينما تكشف scaled_dot_product_attention المباشرة محور رأس مثل (N,H,L,E). تتطلب مطابقة عرض التضمين وعدد الرؤوس الأبعاد وشروط القسمة الموثقة. لا يزيل علم الدفعة أولاً محور الرأس من الدالة المباشرة. يستخدم المثال رأساً واحداً وإسقاطات هوية مسندة صراحة حتى يمثل الحسابان الدالة الرياضية نفسها؛ ولا تبرر إسقاطات متعلمة اعتباطية تلك المقارنة.

قطبية القناع المنطقي خاصة بالواجهة

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

python برنامج توضيحي للمعالج المركزي وفق وثائق PyTorch 2.14؛ لم تتوفر torch والخرج المتوقع مشتق
import torch
from torch import nn
from torch.nn import functional as F
attention = nn.MultiheadAttention(2,1,dropout=0.0,bias=False,batch_first=True,dtype=torch.float64,device="cpu")
with torch.no_grad():
    attention.in_proj_weight.copy_(torch.cat([torch.eye(2,dtype=torch.float64,device="cpu")]*3))
    attention.out_proj.weight.copy_(torch.eye(2,dtype=torch.float64,device="cpu"))
x = torch.tensor([[[1.0,0.0],[0.0,1.0],[1.0,1.0]]],dtype=torch.float64,device="cpu")
blocked = torch.ones(3,3,dtype=torch.bool,device="cpu").triu(diagonal=1)
output, weights = attention(x,x,x,attn_mask=blocked,need_weights=True,average_attn_weights=False)
q = x.unsqueeze(1)
direct = F.scaled_dot_product_attention(q,q,q,attn_mask=~blocked,dropout_p=0.0)
print("weight shape", tuple(weights.shape))
print("first output", output[0,0].tolist())
print("future weights", weights[0,0,0,1:].tolist())
print("same after mask conversion", torch.allclose(output,direct.squeeze(1),atol=1e-12,rtol=1e-12))
الناتج المتوقع
weight shape (1, 1, 3, 3)
first output [1.0, 0.0]
future weights [0.0, 0.0]
same after mask conversion True

تجعل إسقاطات الهوية الوحدة والانتباه المباشر قابلين للمقارنة رياضياً؛ وللقناعين المنطقيين معنيان متعاكسان. لم تنفذ نواة انتباه أو إسقاط أو مقارنة allclose في torch.

افحص مجموعة الاعتماد المسموحة

يستبعد القناع المثلثي العلوي مفاتيح المستقبل لكل استعلام. لا ينتبه الاستعلام الأول إلا للقيمة الأولى؛ فخرجه [1,0] ووزنا المستقبل صفر. شكل الأوزان المعادة لكل رأس (1,1,3,3) لتعطيل متوسط الرؤوس. يعد المرافق المفاتيح المسموحة بصورة مستقلة ويحسب سياقاً موزوناً واحداً. لا يحدد قناع مفاتيح الحشو تلقائياً ما يفعل بمخارج استعلامات غير صالحة أو يستبعدها من الخسارة. يحتاج استعلام مستبعد المفاتيح كلها سياسة مدعومة صريحة، لا افتراض أن كل تنفيذ يعيد أصفاراً مفيدة.

python مثال مرافق حتمي بالمكتبة القياسية نُفذ فعلياً
from math import exp, sqrt
rows = [[1.0,0.0],[0.0,1.0],[1.0,1.0]]
blocked = [[j>i for j in range(3)] for i in range(3)]
allowed = [[not value for value in row] for row in blocked]
keys = [[j for j,ok in enumerate(row) if ok] for row in allowed]
scores = [sum(a*b for a,b in zip(rows[0],key))/sqrt(2) for key in rows]
maximum = max(score for score,ok in zip(scores,allowed[0]) if ok)
raw = [exp(score-maximum) if ok else 0.0 for score,ok in zip(scores,allowed[0])]
weights = [value/sum(raw) for value in raw]
context = [sum(weight*row[j] for weight,row in zip(weights,rows)) for j in range(2)]
print("allowed key indices", keys)
print("first context", context)
الناتج المتوقع
allowed key indices [[0], [0, 1], [0, 1, 2]]
first context [1.0, 0.0]

يفحص المرافق المنفذ مجموعة السماح السببية وسياقاً موزوناً واحداً؛ لا بث أقنعة PyTorch أو تكافؤ التنفيذ.

لا يقرأ الإسقاط الوظيفي وضع الوحدة تلقائياً

تطبق الدالة المباشرة الموثقة الإسقاط وفق dropout_p؛ فلا تغير حالة eval لوحدة محيطة الوسيط بذاتها. يمرر المثال صفراً صراحة ولا يستخدم قناعاً عشوائياً. يجب أن يمرر غلاف يريد إسقاطاً مرتبطاً بالوضع قيمة مناسبة من عقده. قد يغير اختيار النواة والدقة وترتيب العمليات العائمة النتيجة؛ فقارن بسماحية مبررة ولا تعد بتطابق بتات عبر التنفيذات. تصرح وثائق 2.14 بحساسية الواجهة الوظيفية للتغيير؛ فافحص العقد المثبت عند نقل الشيفرة لإصدار آخر.

تحقق من مكون الانتباه قبل نموذج أكبر

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

الأخطاء الشائعة وإصلاحها

كشف قناع انتباه محول مواضع مستقبلية

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

بقي التقييم عشوائياً داخل غلاف انتباه مخصص

لماذا يحدث؟
ظل وسيط dropout_p المباشر موجباً رغم module.eval.
كيف تصلحه؟
اضبط وسيط الإسقاط الوظيفي وفق الوضع المقصود.
كيف تتجنب تكراره؟
اختبر وسيط الغلاف الفعلي وسلوكه المتكرر في بيئة مدعومة.

مزج الانتباه مشاهدات مختلفة

لماذا يحدث؟
فُسر محور الدفعة أو السلسلة وفق تخطيط خاطئ.
كيف تصلحه؟
استرجع عقد شكل مدخل الوحدة أو الدالة الدقيق.
كيف تتجنب تكراره؟
استخدم هويات دفعة مختلفة وأطوال محاور غير متساوية في المثال.

اختبر فهمك

1. لماذا يمرر ~blocked إلى الانتباه المباشر بدلاً من blocked؟

اعرض الحل المشروح

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

2. لماذا يبقى أول خرج [1,0] بصرف النظر عن القيم اللاحقة في المثال؟

اعرض الحل المشروح

يسمح القناع السببي بالمفتاح صفر فقط للاستعلام صفر. وزنه المطبع واحد، وتبقي إسقاطات الهوية متجه القيمة في الموضع صفر كما هو [1,0]. تتلقى مفاتيح المستقبل وزناً صفرياً. تعتمد النتيجة على القناع والإسقاطات المحددين بالكامل، لا افتراض سببية كل نموذج انتباه افتراضياً.

أهم ما تعلمته

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

المراجع الرسمية