چیت‌شیت

مدل‌های RNN، Seq2Seq و N-gram

RNNs, Seq2Seq and N-gram Models

مدل‌های TextCNN، LSTM و GRU، انکودر-دیکودر با وادارسازی معلم، جستجوی پرتو، BLEU، کنایزر-نی و دلیل برتری اتنشن.

  • ۱۱ بخش
  • ۵ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. انکودر-دیکودر Seq2seq
  2. فرمول‌های اصلی
  3. وظایف در کد
  4. آموزش با وادارسازی معلم
  5. گذر رو به جلو در TextCNN
  6. ترجمه و امتیازدهی
  7. پیش‌فرض‌ها و ارقام
  8. عیب‌یابی
  9. چه زمانی از چه مدلی استفاده کنیم؟
  10. اختصارات
  11. نکات کاربردی

انکودر-دیکودر Seq2seq

معماری
گلوگاهوضعیت پنهان اولیهinput_tokenبازخورد به ورودیتوکن‌های مبدأشناسه‌های مبدأ (src ids)GRU انکودرخروجی‌ها، وضعیت پنهانبردار زمینهوضعیت پنهان نهاییbos_id tokenسپس آخرین توکنGRU دیکودریک گام در هر لحظهلاجیت‌های واژگانargmax or beam

فرمول‌های اصلی

مفهوم‌ها
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_ratio0.9شروع از 1.0 و کاهش تدریجی تا ~0.5
Beam width3-5ترجمه ماشینی برای متن‌های عمومی از 4-5 استفاده می‌کند
KN `discount`0.75از شمارش هر دوتایی کسر می‌شود
TextCNN filters64عرض‌های (2, 3, 4)، دراپ‌اوت 0.3
0.9 ^ 1002.7e-5گرادیان باقی‌مانده پس از 100 گام
Copy accuracy at length 4023%98٪ در طول 5. همان گلوگاه معروف
BLEU bands3040 خوب است، 50 استثنایی، زیر 1 یعنی نویز
4-gram KN perplexity, Brown140یک مدل زبانی ترنسفورمر به 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 نمونه که توسط انسان برچسب‌گذاری شده کالیبره کنید.
  • پرپلکسیتی را تنها تحت توکن‌سازی کاملاً یکسان مقایسه کنید.
  • چند هزار جفت داده‌ی موازی تمیز بهتر از چند صد هزار داده‌ی نویزدار عمل می‌کند.