CodeBlanks Logo Icon CodeBlanks

CLS token

CLS token, sınıflandırma görevleri için tüm dizinin özetini taşır.

[CLS] ve [SEP]

BERT girişinin başına [CLS], her cümlenin sonuna [SEP] konur. Cümle çifti görevlerinde (doğal dil çıkarımı, soru-cevap) segment kimlikleri (token_type_ids) hangi belirtecin hangi cümleye ait olduğunu söyler:

[CLS] film güzel ##di [SEP] oyun ##cu ##lar iyi [SEP]
  0     0     0     0    0     1    1     1    1    1     <- token_type_ids

Sınıflandırmada son katmandaki [CLS] vektörü (konum 0) tüm cümlenin özeti olarak kullanılır; dikkat sayesinde bu konum tüm belirteçlerden bilgi toplar.

Dikkat maskesi ve dolgu

Yığındaki girişler aynı uzunluğa dolgulanır; attention_mask gerçek belirteçlerde 1, dolguda 0'dır. Tokenizer üç diziyi birlikte döndürür:

{"input_ids":      [2, 5, 7, 8, 3, 0, 0],
 "token_type_ids": [0, 0, 0, 0, 0, 0, 0],
 "attention_mask": [1, 1, 1, 1, 1, 0, 0]}

BERT'in en uzun girişi 512 belirteçtir; daha uzun metinler kesilir ya da parçalara bölünür.

Uygulama BERT girişi kur

Verilen wordpiece ve sözlükle kodla(a, b=None, n=12) fonksiyonunu yaz: [CLS] a [SEP] (varsa b [SEP]), segment kimlikleri (ikinci cümle 1), dolgu ve dikkat maskesi. kodla("film güzeldi", "oyuncular iyi") sonucunun üç dizisini alt alta 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

# 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

def parcala(metin):
    return [p for k in metin.split() for p in wordpiece(k)]

def kodla(a, b=None, n=12):
    parcalar = ["[CLS]"] + parcala(a) + ["[SEP]"]
    tip = [0] * len(parcalar)
    if b:
        ek = parcala(b) + ["[SEP]"]
        parcalar += ek
        tip += [1] * len(ek)
    ids = [sozluk[p] for p in parcalar]
    maske = [1] * len(ids)
    dolgu = n - len(ids)
    return ids + [0] * dolgu, tip + [0] * dolgu, maske + [0] * dolgu

for dizi in kodla("film güzeldi", "oyuncular iyi"):
    print(dizi)

Beklenen çıktı

[2, 5, 7, 8, 3, 9, 10, 11, 12, 3, 0, 0]
[0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0]

Soru ve cevaplar

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

1 BERT'in sınıflandırma başı hangi konumun vektörünü kullanır?

  • Son [SEP]
  • Tüm konumların toplamı
  • Rastgele bir konum
  • [CLS] (konum 0) Doğru cevap

Açıklama: Ön eğitimdeki sonraki-cümle görevi de [CLS] üzerinden yapılmıştı.

2 Cümleyi ayırıcıyla bitir.

Soru
parcalar = ["[CLS]"] + a + ["____"]
Cevap
parcalar = ["[CLS]"] + a + ["[SEP]"]

Açıklama: Her cümle [SEP] ile biter.

3 Dizileri eşleştir.

Kavram Anlamı
input_ids Belirteç kimlikleri
token_type_ids Hangi cümle
attention_mask Gerçek mi dolgu mu
[CLS] çıktısı Cümle özeti

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