BERT'i NER için nasıl ince ayar yaparsınız? Hangi loss ve etiket tokenizasyonu?
sobes.tech yapay zeka
AI'dan gelen yanıt
NER görevi için BERT'i ince ayar yapmak genellikle aşağıdaki yaklaşımı kullanır:
-
Tokenizasyon: BERT'in WordPiece tokenizasyonu kullanılır. NER için etiketler (labels) genellikle tokenlara karşılık gelir, ancak WordPiece kelimeleri altkelimelere böldüğü için, etiket ilk altkelimeye atanır ve diğer altkelimeler için genellikle özel bir etiket (örneğin, "X") veya ilk altkelimenin etiketi tekrarlanır.
-
Etiket formatı: genellikle varış noktası ve devamını göstermek için BIO (Begin, Inside, Outside) şeması kullanılır.
-
Kayıp fonksiyonu: genellikle her tokeni sınıflandırmak için Çapraz Entropi Kayıp (Cross-Entropy Loss) kullanılır. Kayıp hesaplaması istenmeyen tokenlar (örneğin, padding veya "X" etiketiyle altkelimeler) için maskeleme yapılır.
PyTorch ve HuggingFace Transformers kullanımıyla örnek:
from transformers import BertForTokenClassification, BertTokenizerFast
import torch
model = BertForTokenClassification.from_pretrained('bert-base-cased', num_labels=num_labels)
tokenizer = BertTokenizerFast.from_pretrained('bert-base-cased')
# Cümle ve etiket örneği
sentence = "John lives in New York"
labels = [1, 0, 0, 2, 3] # BIO formatında örnek etiketler
encoding = tokenizer(sentence.split(), is_split_into_words=True, return_tensors="pt", truncation=True, padding=True)
# Altkelimeler için etiketlerin dönüştürülmesi
word_ids = encoding.word_ids()
label_ids = []
previous_word_idx = None
for word_idx in word_ids:
if word_idx is None:
label_ids.append(-100) # Padding'i atla
elif word_idx != previous_word_idx:
label_ids.append(labels[word_idx])
else:
label_ids.append(-100) # Altkelimeleri atla
previous_word_idx = word_idx
outputs = model(**encoding, labels=torch.tensor([label_ids]))
loss = outputs.loss
loss.backward()
Anahtar noktalar, dikkatli tokenizasyon ve etiketlerin hizalanması ile Cross-Entropy Loss'un maskeleme ile kullanılmasıdır.