CodeBlanks Logo Icon CodeBlanks

Özet - BERT

Bu grupta BERT, masked LM ve fine-tuning'i öğrendin.

Özet: BERT

Bu grupta:

  • BERT, çift yönlü bir transformer encoder yığınıdır (base: 12 katman, 768, ~110M).
  • Ön eğitim: belirteçlerin %15'i seçilir, 80/10/10 kuralıyla bozulur; kayıp yalnızca seçilenlerde.
  • WordPiece, kelimeleri en uzun sözlük parçalarına böler; devam parçaları ## ile işaretlenir.
  • İnce ayar: küçük öğrenme oranı, ısınma + doğrusal azalma, küçük bir görev başı.
  • Giriş: [CLS] … [SEP] … [SEP], segment kimlikleri ve dikkat maskesi; sınıflandırma [CLS] vektörünü kullanır.

Uygulama Uçtan uca MLM örneği

Verilen yardımcılarla "film çok güzeldi" cümlesini [CLS] … [SEP] olarak kodla. "güzel" parçasını [MASK] ile değiştir ve etiket dizisini (yalnızca o konumda gerçek kimlik, diğerleri -100) kur. Girişi ve etiketleri alt alta, ardından maskeli girişin belirteçlerini (kimlikten geri çevirerek) yazdır.

Başlangıç kodu

model.py
sozluk = {"[PAD]": 0, "[UNK]": 1, "[CLS]": 2, "[SEP]": 3, "[MASK]": 4,
          "film": 5, "çok": 6, "güzel": 7, "##di": 8, "oyun": 9, "##cu": 10,
          "##lar": 11, "iyi": 12, "kötü": 13, "##ydi": 14}

def wordpiece(kelime):
    parca, bas = [], 0
    while bas < len(kelime):
        son = len(kelime)
        while son > bas:
            aday = kelime[bas:son] if bas == 0 else "##" + kelime[bas:son]
            if aday in sozluk:
                break
            son -= 1
        if son == bas:
            return ["[UNK]"]
        parca.append(aday)
        bas = son
    return parca

ters = {v: k for k, v in sozluk.items()}

# buraya yaz

Örnek çözüm

model.py
sozluk = {"[PAD]": 0, "[UNK]": 1, "[CLS]": 2, "[SEP]": 3, "[MASK]": 4,
          "film": 5, "çok": 6, "güzel": 7, "##di": 8, "oyun": 9, "##cu": 10,
          "##lar": 11, "iyi": 12, "kötü": 13, "##ydi": 14}

def wordpiece(kelime):
    parca, bas = [], 0
    while bas < len(kelime):
        son = len(kelime)
        while son > bas:
            aday = kelime[bas:son] if bas == 0 else "##" + kelime[bas:son]
            if aday in sozluk:
                break
            son -= 1
        if son == bas:
            return ["[UNK]"]
        parca.append(aday)
        bas = son
    return parca

ters = {v: k for k, v in sozluk.items()}

parcalar = ["[CLS]"] + [p for k in "film çok güzeldi".split() for p in wordpiece(k)] + ["[SEP]"]
ids = [sozluk[p] for p in parcalar]
i = parcalar.index("güzel")
giris = ids.copy()
giris[i] = sozluk["[MASK]"]
etiket = [ids[j] if j == i else -100 for j in range(len(ids))]
print(giris)
print(etiket)
print([ters[t] for t in giris])

Beklenen çıktı

[2, 5, 6, 4, 8, 3]
[-100, -100, -100, 7, -100, -100]
['[CLS]', 'film', 'çok', '[MASK]', '##di', '[SEP]']

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 MLM'de 1000 belirteçlik bir metinde yaklaşık kaç belirteç [MASK] ile değiştirilir?

  • 800
  • 15
  • 120 Doğru cevap
  • 150

Açıklama: 1000 × 0.15 = 150 seçilir; bunların %80'i = 120.

2 Kayıpta yok sayılacak etiketi ver.

Soru
kayip = nn.CrossEntropyLoss(ignore_index=____)
Cevap
kayip = nn.CrossEntropyLoss(ignore_index=-100)

Açıklama: Seçilmeyen konumların etiketi -100'dür.

3 Eşleştir.

Kavram Anlamı
MLM Ön eğitim görevi
WordPiece Alt-kelime bölme
[CLS] Sınıflandırma vektörü
ısınma Kararlı başlangıç

Uzman bölümündeki tüm dersler