چیتشیت
مدلهای RNN، Seq2Seq و N-gram
RNNs, Seq2Seq and N-gram Models
مدلهای TextCNN، LSTM و GRU، انکودر-دیکودر با وادارسازی معلم، جستجوی پرتو، BLEU، کنایزر-نی و دلیل برتری اتنشن.
فهرست مطالب
انکودر-دیکودر Seq2seq
معماریفرمولهای اصلی
مفهومها- RNN
- $h_t = f(W x_t + U h_{t-1} + b)$. مقادیر W، U و b در طول زمان مشترک هستند.
- LSTM
- گیتهای ورودی، فراموشی و خروجی به همراه وضعیت سلول. گرادیانهای پایدار.
- GRU
- دو گیت کنترلی. دقت مشابه با پارامترهای کمتر.
- TextCNN
- یک فیلتر با عرض k معادل یک k-gram یادگیرنده است. ماکسپول سراسری به ازای هر فیلتر.
- N-gram
- $P(w \mid \mathrm{ctx}) = \mathrm{count}(\mathrm{ctx}, w) / \mathrm{count}(\mathrm{ctx})$
- پرپلکسیتی
- $\exp(-\frac{1}{N} \sum_i \log P(w_i \mid \mathrm{ctx}_i))$. کمتر باشد بهتر است.
- کنایزر-نی
- تخفیف مطلق بهعلاوه احتمال ادامهیافتن برای مرتبه پایینتر.
- BLEU
- دقت n-gram برای n از 1 تا 4، میانگین هندسی، جریمهی کوتاهی طول. بین 0 تا 100.
وظایف در کد
کار و کد| وظیفه | کد |
|---|---|
| گرادیان باقیمانده پس از N گام | vanishing_gradient_sim(seq_len, recurrent_weight=0.9) |
| رمزگشایی بدون معلم | greedy_decode(encoder, decoder, src, bos_id, eos_id, max_len=50) |
| BLEU ساده | simple_bleu(hypothesis, reference, max_n=4) |
| F-score کاراکتری | chrf(hypothesis, reference, n=6, beta=2) |
| شمارش سهتاییها (trigrams) | train_ngram(corpus_tokens, n=3) |
| مدل دوتایی (bigram) هموارسازیشده | kneser_ney_bigram_model(corpus_tokens, discount=0.75) |
| امتیازدهی به متن نگهداشتهشده | perplexity(prob_fn, sentences) |
| عمق ترتیبی در برابر عمق موازی | `rnn_style(xs, decay=0.9)` vs `attention_style(xs)` |
آموزش با وادارسازی معلم
کدpython
_, hidden = encoder(src) # بردار زمینه
input_token = torch.full((batch_size, 1), bos_id, dtype=torch.long)
loss_fn = nn.CrossEntropyLoss(ignore_index=0) # نادیدهگرفتن پدینگ
for t in range(tgt_len):
logits, hidden = decoder(input_token, hidden)
loss += loss_fn(logits.squeeze(1), tgt[:, t])
use_teacher = torch.rand(1).item() < teacher_forcing_ratio
if use_teacher:
input_token = tgt[:, t].unsqueeze(1) # حقیقت پایه در زمان t-1
else:
input_token = logits.argmax(dim=-1) # پیشبینی خود مدل
loss.backward()
گذر رو به جلو در TextCNN
کدpython
x = self.embed(token_ids).transpose(1, 2) # [batch, embed_dim, seq_len]
for conv in self.convs: # یک فیلتر به ازای هر عرض در (2, 3, 4)
c = F.relu(conv(x))
p = F.max_pool1d(c, c.size(2)).squeeze(2) # قویترین فعالسازی
pooled.append(p)
h = torch.cat(pooled, dim=1) # اندازه ثابت برای هر طولی از متن
out, _ = self.lstm(x) # استفاده از طبقهبند LSTM بهجای آن
pooled = out.max(dim=1).values # برتری ماکسپول بر وضعیت نهایی
ترجمه و امتیازدهی
کدpython
model_id = "facebook/nllb-200-distilled-600M"
tok = AutoTokenizer.from_pretrained(model_id, src_lang="eng_Latn")
out = model.generate(**inputs,
forced_bos_token_id=tok.convert_tokens_to_ids("fra_Latn"), # مقصد
num_beams=5, length_penalty=1.0, max_new_tokens=64)
print(tok.batch_decode(out, skip_special_tokens=True)[0])
bleu = sacrebleu.corpus_bleu(hypotheses, references)
chrf = sacrebleu.corpus_chrf(hypotheses, references)
پیشفرضها و ارقام
پیشفرضها| تنظیم | پیشفرض | نکته |
|---|---|---|
teacher_forcing_ratio | 0.9 | شروع از 1.0 و کاهش تدریجی تا ~0.5 |
Beam width | 3-5 | ترجمه ماشینی برای متنهای عمومی از 4-5 استفاده میکند |
KN `discount` | 0.75 | از شمارش هر دوتایی کسر میشود |
TextCNN filters | 64 | عرضهای (2, 3, 4)، دراپاوت 0.3 |
0.9 ^ 100 | 2.7e-5 | گرادیان باقیمانده پس از 100 گام |
Copy accuracy at length 40 | 23% | 98٪ در طول 5. همان گلوگاه معروف |
BLEU bands | 30 | 40 خوب است، 50 استثنایی، زیر 1 یعنی نویز |
4-gram KN perplexity, Brown | 140 | یک مدل زبانی ترنسفورمر به 15-30 میرسد |
عیبیابی
عیبیابیدریفت در خروجیهای طولانی
- علت
- سوگیری مواجهه
- راهحل
- نمونهبرداری برنامهریزیشده، کاهش تدریجی نسبت
ورودیهای طولانی جزئیات را از دست میدهند
- علت
- تنها یک بردار زمینه ثابت
- راهحل
- اتنشن روی تمام وضعیتهای انکودر
شبکه RNN ساده روابط بلندمدت را یاد نمیگیرد
- علت
- محوشدگی گرادیان
- راهحل
- استفاده از LSTM یا GRU
خروجی حریصانه تکراری و وارد حلقه میشود
- علت
- commit زودهنگام روی هر توکن
- راهحل
- جستجوی پرتو، با عرض 4-5
خروجی به زبان نادرست
- علت
- تولید به زبان نادرست
- راهحل
- بررسی
forced_bos_token_id، اجرای ابزار تشخیص زبان
ورودی کوتاه خروجی بسیار طولانی تولید میکند
- علت
- جریمه طول زیر ~5 توکن اعمال شده
- راهحل
- محدود کردن سقف طول بر اساس طول مبدأ
خروجی روان اما حاوی فکتهای ساختگی
- علت
- توهم (Hallucination)
- راهحل
- رمزگشایی مقید، بازبینی انسانی
احتمال مدل N-gram صفر میشود
- علت
- ترکیب n-gram دیدهنشده
- راهحل
- هموارسازی با کنایزر-نی
چه زمانی از چه مدلی استفاده کنیم؟
پرسش و پاسخ- TextCNN؟
- دستگاههای لبه و محلی. 10 تا 100 برابر کوچکتر از ترنسفورمر است.
- LSTM؟
- استریمینگ متن، یک توکن در هر لحظه. مدل BiLSTM-CRF برای 1k تا 10k جملهی برچسبدار.
- RNN seq2seq؟
- تقریباً هرگز. فقط برای ترجمه به صورت استریمینگ یا تولید متن روی دستگاه.
- N-gram LM؟
- تکمیل خودکار کلمات روی دستگاه، امتیازدهی مجدد و یک خط مبنا پیش از هر مدل زبانی عصبی.
- Transformer؟
- در تمامی موارد دیگر. عمق ترتیبی 1 است نه N. حافظه مصرفی $O(N^2)$ است.
- BLEU یا chrF؟
- هر دو را گزارش کنید. معیار chrF برای زبانهای با ساختار صرفی غنی ارزیابی بهتری دارد.
اختصارات
اصطلاحها- LSTM
- شبکهی بازگشتی مجهز به گیت همراه با گیتهای ورودی، فراموشی و خروجی و وضعیت سلول.
- GRU
- شبکهی بازگشتی مجهز به گیت با دو گیت کنترلی.
- NMT
- ترجمه ماشینی عصبی. انکودر-دیکودر ترنسفورمر که روی متنهای موازی آموزش دیده است.
- NLLB
- پروژهی No Language Left Behind. خانوادهای از مدلهای ترجمه ماشینی برای 200 زبان.
- chrF
- معیار F-score در سطح کاراکتر.
- SSM
- مدل فضای حالت. ساختار بازگشتی با قابلیت آموزش موازی.
نکات کاربردی
نکتهها- همیشه از
sacrebleuاستفاده کنید. کدهای شخصی BLEU نتایجی تولید میکنند که قابل مقایسه نیستند. - حداقل از دو خانواده مختلف سنجهها استفاده کنید. هر جا کیفیت اولویت دارد، COMET انتخاب پیشفرض است.
- هر سنجه را روی 50 تا 100 نمونه که توسط انسان برچسبگذاری شده کالیبره کنید.
- پرپلکسیتی را تنها تحت توکنسازی کاملاً یکسان مقایسه کنید.
- چند هزار جفت دادهی موازی تمیز بهتر از چند صد هزار دادهی نویزدار عمل میکند.