Kalimat BERT tertanam dari transformator

Aug 17 2020

Saya mencoba untuk mendapatkan vektor kalimat dari status tersembunyi dalam model BERT. Melihat petunjuk BertModel di sini , yang berbunyi:

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)

Jadi catatan pertama, karena ada di situs web, ini tidak / tidak / berjalan. Anda mendapatkan:

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

Tapi sepertinya ada perubahan kecil yang memperbaikinya, karena Anda tidak memanggil tokenizer secara langsung, tetapi memintanya untuk mengenkode input:

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

Oke, selain itu, tensor yang saya dapatkan, bagaimanapun, memiliki bentuk yang berbeda dari yang saya harapkan:

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

Ini banyak sekali lapisannya. Manakah lapisan yang tepat untuk digunakan untuk embeddings kalimat? [0]? [-1]? Rata-rata beberapa? Saya memiliki tujuan untuk dapat melakukan kesamaan kosinus dengan ini, jadi saya membutuhkan vektor 1xN yang tepat daripada tensor NxK.

Saya melihat bahwa proyek bert-as-a-service yang populer tampaknya digunakan[0]

Apakah ini benar? Apakah ada dokumentasi untuk masing-masing lapisan itu?

Jawaban

5 Jindřich Aug 18 2020 at 08:37

Saya rasa tidak ada satu pun dokumentasi resmi yang mengatakan apa yang harus digunakan dan kapan. Anda perlu bereksperimen dan mengukur apa yang terbaik untuk tugas Anda. Pengamatan terbaru tentang BERT dirangkum dengan baik dalam makalah ini:https://arxiv.org/pdf/2002.12327.pdf.

Saya pikir aturan praktisnya adalah:

  • Gunakan lapisan terakhir jika Anda akan menyempurnakan model untuk tugas spesifik Anda. Dan selesaikan kapan pun Anda bisa, beberapa ratus atau bahkan lusinan contoh pelatihan sudah cukup.

  • Gunakan beberapa lapisan tengah (7 atau 8) jika Anda tidak dapat menyempurnakan model. Intuisi di baliknya adalah bahwa lapisan pertama kali mengembangkan representasi input yang lebih dan lebih abstrak dan umum. Pada titik tertentu, representasi mulai lebih mengarah pada tugas pra-pelatihan.

Bert-as-services menggunakan lapisan terakhir secara default (tetapi dapat dikonfigurasi). Ini dia [:, -1]. Namun, itu selalu mengembalikan daftar vektor untuk semua token masukan. Vektor yang sesuai dengan [CLS]token khusus (disebut ) pertama dianggap sebagai penyematan kalimat. Dari sinilah [0]asal snipper yang Anda maksud.

2 cronoik Oct 07 2020 at 04:50

Meskipun jawaban Jindrich yang ada secara umum benar, namun tidak menjawab pertanyaan sepenuhnya. OP menanyakan layer mana yang harus dia gunakan untuk menghitung cosine similarity antara kalimat embeddings dan jawaban singkat untuk pertanyaan ini adalah none . Metrik seperti cosine similarity mensyaratkan bahwa dimensi vektor berkontribusi sama dan bermakna, tetapi ini tidak berlaku untuk BERT. Jacob Devlin (salah satu penulis makalah BERT) menulis :

Saya tidak yakin apa vektor ini, karena BERT tidak menghasilkan vektor kalimat yang bermakna. Tampaknya ini adalah pengumpulan rata-rata atas kata token untuk mendapatkan vektor kalimat, tetapi kami tidak pernah menyarankan bahwa ini akan menghasilkan representasi kalimat yang bermakna. Dan bahkan jika representasi tersebut layak saat dimasukkan ke dalam DNN yang dilatih untuk tugas hilir, tidak berarti bahwa representasi tersebut akan bermakna dalam hal jarak kosinus. (Karena jarak cosinus adalah ruang linier di mana semua dimensi memiliki bobot yang sama).

Namun, itu tidak berarti Anda tidak dapat menggunakan BERT untuk tugas semacam itu. Ini hanya berarti bahwa Anda tidak dapat menggunakan anak timbangan yang telah dilatih sebelumnya di luar kotak. Anda dapat melatih pengklasifikasi di atas BERT yang mempelajari kalimat mana yang serupa (menggunakan [CLS]token) atau Anda dapat menggunakan transformator kalimat yang dapat digunakan dalam skenario tanpa pengawasan karena mereka dilatih untuk menghasilkan representasi kalimat yang bermakna.