ट्रांसफार्मर से BERT वाक्य एम्बेडिंग

Aug 17 2020

मैं एक BERT मॉडल में छिपे हुए राज्यों से वाक्य वैक्टर प्राप्त करने की कोशिश कर रहा हूं। Huggingface BertModel निर्देश को देखते हुए यहां है, जो कहते हैं:

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)

तो पहले ध्यान दें, जैसा कि वेबसाइट पर है, यह करता है / नहीं। आपको मिला:

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

लेकिन ऐसा लगता है कि एक मामूली बदलाव इसे ठीक करता है, जिसमें आप सीधे टोकन को कॉल नहीं करते हैं, लेकिन इसे इनपुट को एन्कोड करने के लिए कहें:

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

ठीक है, एक तरफ, मुझे मिलने वाले टेनसर्स, मेरी अपेक्षा से अलग आकार के हैं:

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

यह बहुत सारी परतें हैं। वाक्य एम्बेडिंग के लिए उपयोग करने के लिए कौन सी सही परत है? [0]? [-1]? कई लाभ? मेरा लक्ष्य है कि मैं इनके साथ कोसाइन समानता बनाने में सक्षम हूं, इसलिए मुझे एनएक्सटी टेंसर के बजाय एक उचित 1xN वेक्टर की आवश्यकता है।

मैं देखता हूं कि लोकप्रिय बर्ट-ए-इन-सर्विस परियोजना का उपयोग करने के लिए प्रकट होता है[0]

क्या ये सही है? क्या प्रत्येक स्तर के लिए प्रलेखन है?

जवाब

5 Jindřich Aug 18 2020 at 08:37

मुझे नहीं लगता कि कोई आधिकारिक दस्तावेज है जो कह रहा है कि क्या उपयोग करना है और कब करना है। आपको अपने कार्य के लिए सबसे अच्छा प्रयोग करने और मापने की आवश्यकता है। BERT के बारे में हालिया टिप्पणियों को इस पत्र में संक्षेप में प्रस्तुत किया गया है:https://arxiv.org/pdf/2002.12327.pdf।

मुझे लगता है कि अंगूठे का नियम है:

  • अंतिम परत का उपयोग करें यदि आप अपने विशिष्ट कार्य के लिए मॉडल को ठीक करने जा रहे हैं। और जब भी आप कर सकते हैं, तब कई सौ या दर्जनों प्रशिक्षण उदाहरण पर्याप्त हैं।

  • यदि आप मॉडल को पूरा नहीं कर सकते तो कुछ मध्य परतों (7-वें या 8-वें) का उपयोग करें। इसके पीछे अंतर्ज्ञान यह है कि परतें पहले इनपुट के अधिक से अधिक अमूर्त और सामान्य प्रतिनिधित्व को विकसित करती हैं। कुछ बिंदु पर, पूर्व-प्रशिक्षण कार्य के लिए प्रतिनिधित्व अधिक लक्ष्य होना शुरू होता है।

बर्ट-अस-सर्विसेज डिफ़ॉल्ट रूप से अंतिम परत का उपयोग करती है (लेकिन यह कॉन्फ़िगर करने योग्य है)। यहाँ, यह होगा [:, -1]। हालांकि, यह हमेशा सभी इनपुट टोकन के लिए वैक्टर की एक सूची देता है। पहले विशेष (तथाकथित [CLS]) टोकन के अनुरूप वेक्टर को वाक्य एम्बेडिंग माना जाता है। यह वह जगह है जहां [0]से स्निपर में आता है जिसे आप संदर्भित करते हैं।

2 cronoik Oct 07 2020 at 04:50

जबकि जिंदरिच का मौजूदा उत्तर आम तौर पर सही है, यह पूरी तरह से प्रश्न को संबोधित नहीं करता है। ओपी ने पूछा कि वाक्य एम्बेडिंग के बीच कोसिन समानता की गणना करने के लिए उसे किस परत का उपयोग करना चाहिए और इस प्रश्न का संक्षिप्त उत्तर कोई नहीं है । कॉस्मिक समानता जैसी एक मीट्रिक की आवश्यकता है कि वेक्टर के आयाम समान और सार्थक रूप से योगदान करते हैं, लेकिन बीईआरटी के लिए ऐसा नहीं है। जैकब देवलिन (BERT पेपर के लेखकों में से एक) ने लिखा है :

मुझे यकीन नहीं है कि ये वैक्टर क्या हैं, क्योंकि BERT सार्थक वाक्य वैक्टर उत्पन्न नहीं करता है। ऐसा लगता है कि यह एक वाक्य वेक्टर पाने के लिए टोकन शब्द पर औसत पूलिंग कर रहा है, लेकिन हमने कभी यह सुझाव नहीं दिया कि इससे सार्थक वाक्य निरूपण होगा। और यहां तक ​​कि अगर वे एक डाउनस्ट्रीम कार्य के लिए प्रशिक्षित DNN में खिलाए गए सभ्य प्रतिनिधित्व हैं, तो इसका मतलब यह नहीं है कि वे कोसाइन दूरी के संदर्भ में सार्थक होंगे। (चूंकि कोसाइन दूरी एक रैखिक स्थान है जहां सभी आयाम समान रूप से भारित होते हैं)।

हालांकि, इसका मतलब यह नहीं है कि आप इस तरह के कार्य के लिए BERT का उपयोग नहीं कर सकते हैं। इसका सीधा सा मतलब है कि आप पहले से प्रशिक्षित वेट आउट-ऑफ-द-बॉक्स का उपयोग नहीं कर सकते। आप या तो BERT के शीर्ष पर एक क्लासिफायरियर ट्रेन कर सकते हैं जो सीखता है कि कौन से वाक्य समान हैं ( [CLS]टोकन का उपयोग कर रहे हैं ) या आप ऐसे वाक्य-ट्रांसफॉर्मर का उपयोग कर सकते हैं, जिनका उपयोग एक अनुपयोगी परिदृश्य में किया जा सकता है क्योंकि उन्हें सार्थक वाक्य अभ्यावेदन का उत्पादन करने के लिए प्रशिक्षित किया गया था।