Transformatörlerden BERT cümle düğünleri

Aug 17 2020

Bir BERT modelinde gizli durumlardan cümle vektörleri almaya çalışıyorum. Huggingface BertModel talimatları baktığımızda burada söylemek,:

from transformers import BertTokenizer, BertModel
tokenizer = BertTokenizer.from_pretrained('bert-base-multilingual-cased')
model = BertModel.from_pretrained("bert-base-multilingual-cased")
text = "Replace me by any text you'd like."
encoded_input = tokenizer(text, return_tensors='pt') 
output = model(**encoded_input)

İlk olarak, web sitesinde olduğu gibi, bunun çalışmadığını / çalışmadığını unutmayın. Sen alırsın:

>>> Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'BertTokenizer' object is not callable

Ancak küçük bir değişiklik onu düzeltti gibi görünüyor, çünkü tokenleştiriciyi doğrudan çağırmazsınız, ancak girişi kodlamasını istersiniz:

encoded_input = tokenizer.encode(text, return_tensors="pt")
output = model(encoded_input)

Tamam, bir yana, aldığım tensörler beklediğimden farklı bir şekle sahip:

>>> output[0].shape
torch.Size([1,11,768])

Bu çok fazla katman. Cümle düğünlerinde kullanılacak doğru katman hangisidir? [0]? [-1]? Ortalama birkaç mı? Bunlarla kosinüs benzerliği yapabilme amacım var, bu yüzden bir NxK tensör yerine uygun bir 1xN vektörüne ihtiyacım var.

Popüler bir hizmet olarak bert projesinin kullanılıyor gibi göründüğünü görüyorum[0]

Bu doğru mu? Katmanların her birinin ne olduğuna dair belge var mı?

Yanıtlar

5 Jindřich Aug 18 2020 at 08:37

Neyi ne zaman kullanacağımı söyleyen tek yetkili belge olduğunu sanmıyorum. Göreviniz için en iyi olanı denemeniz ve ölçmeniz gerekir. BERT ile ilgili son gözlemler bu makalede güzel bir şekilde özetlenmiştir:https://arxiv.org/pdf/2002.12327.pdf.

Bence temel kural:

  • Özel göreviniz için modele ince ayar yapacaksanız son katmanı kullanın. Ve ne zaman yapabiliyorsanız ince ayar yapın, birkaç yüz hatta düzinelerce eğitim örneği yeterlidir.

  • Modelin ince ayarını yapamıyorsanız orta katmanlardan bazılarını (7. veya 8.) kullanın. Bunun arkasındaki sezgi, katmanların önce girdinin gittikçe daha soyut ve genel bir temsilini geliştirmesidir. Bir noktada, temsil, eğitim öncesi görev için daha fazla hedef olmaya başlar.

Bert-as-services varsayılan olarak son katmanı kullanır (ancak yapılandırılabilir). Burada olacak [:, -1]. Ancak, her zaman tüm girdi belirteçleri için bir vektör listesi döndürür. İlk özel (sözde [CLS]) simgeye karşılık gelen vektör , cümle yerleştirme olarak kabul edilir. Bu [0], bahsettiğiniz keskin nişancıdan geliyor.

2 cronoik Oct 07 2020 at 04:50

Jindrich'in mevcut cevabı genel olarak doğru olsa da, soruyu tamamen ele almıyor. OP, cümle düğünleri arasındaki kosinüs benzerliğini hesaplamak için hangi katmanı kullanması gerektiğini sordu ve bu sorunun kısa cevabı hiçbiri değil . Bir metrik kosinüs benzerliği, vektörün boyutlarının eşit ve anlamlı bir şekilde katkıda bulunmasını gerektirir, ancak bu BERT için geçerli değildir. Jacob Devlin (BERT makalesinin yazarlarından biri) şunları yazdı :

BERT anlamlı cümle vektörleri üretmediğinden, bu vektörlerin ne olduğundan emin değilim. Görünüşe göre bu, bir cümle vektörü elde etmek için kelime simgeleri üzerinden ortalama bir havuzlama yapıyor, ancak bunun anlamlı cümle temsilleri üreteceğini asla önermedik. Ve aşağı akış görevi için eğitilmiş bir DNN'ye beslendiklerinde iyi temsiller olsalar bile, kosinüs mesafesi açısından anlamlı olacakları anlamına gelmez. (Kosinüs mesafesi, tüm boyutların eşit olarak ağırlıklandırıldığı doğrusal bir uzay olduğundan).

Ancak bu, böyle bir görev için BERT kullanamayacağınız anlamına gelmez. Bu sadece önceden eğitilmiş ağırlıkları kutudan çıkar çıkmaz kullanamayacağınız anlamına gelir. Hangi cümlelerin benzer olduğunu ( [CLS]belirteci kullanarak ) öğrenen BERT üzerine bir sınıflandırıcı eğitebilir veya anlamlı cümle temsilleri üretmek için eğitildikleri için denetimsiz bir senaryoda kullanılabilecek cümle dönüştürücüleri kullanabilirsiniz .