मूल वैज्ञानिक लेख और अनगिनत ब्लॉग पोस्टों में नकारात्मक-नमूना स्किप-ग्राम वास्तुकला के रूप में शब्द 2vec की क्लासिक व्याख्या इस तरह दिखती है:
while(1) { 1. vf = vector of focus word 2. vc = vector of focus word 3. train such that (vc . vf = 1) 4. for(0 <= i <= negative samples): vneg = vector of word *not* in context train such that (vf . vneg = 0) }
वास्तव में, यदि आप google [word2vec स्किपग्राम], जो हम देखते हैं:
लेकिन ये सभी कार्यान्वयन गलत हैं ।
C में word2vec का मूल कार्यान्वयन अलग
तरीके से काम करता है और इससे
मौलिक रूप से अलग है। जो लोग शब्द 2vec से शब्द एम्बेडिंग वाले पेशेवर सिस्टम को लागू करते हैं, वे निम्न में से एक करते हैं:
- सी के मूल कार्यान्वयन को सीधे कॉल करें।
gensim
कार्यान्वयन का उपयोग करें, जो कि स्रोत C से चर नाम से मेल खाने वाले हद तक अनुवादित है।
वास्तव में,
gensim
केवल सही C कार्यान्वयन है जिसके बारे में मुझे पता है ।
C क्रियान्वयन
सी कार्यान्वयन वास्तव में
प्रत्येक शब्द के लिए दो वैक्टर का समर्थन करता
है । शब्द के लिए एक वेक्टर फोकस में है, और दूसरा शब्द संदर्भ में है। (परिचित लगता है? सही, GloVe डेवलपर्स ने इस तथ्य का उल्लेख किए बिना शब्द 2vec से एक विचार उधार लिया है!)
सी कोड में कार्यान्वयन असाधारण रूप से सक्षम है:
यादृच्छिक और शून्य आरंभीकरण क्यों?
एक बार फिर, चूंकि यह मूल लेखों में
और इंटरनेट पर कहीं भी नहीं समझाया गया है, मैं केवल अटकलें लगा सकता हूं।
परिकल्पना यह है कि जब नकारात्मक नमूने पूरे पाठ से आते हैं और आवृत्ति से भारित नहीं होते हैं, तो आप
किसी भी शब्द का चयन कर सकते हैं, और सबसे अधिक बार ऐसा शब्द जिसका
वेक्टर बिल्कुल प्रशिक्षित नहीं है । यदि इस वेक्टर का एक अर्थ है, तो यह यादृच्छिक रूप से वास्तव में महत्वपूर्ण शब्द को फोकस में स्थानांतरित कर देगा।
बिंदु सभी नकारात्मक उदाहरणों को शून्य पर सेट करना है, ताकि
केवल अधिक या कम बार होने वाले वैक्टर दूसरे वेक्टर की प्रस्तुति को प्रभावित करें।
यह वास्तव में बहुत मुश्किल है, और मैंने कभी नहीं सोचा था कि कैसे महत्वपूर्ण आरंभीकरण रणनीतियों हैं।
मैं यह क्यों लिख रहा हूँ
मैंने अपने जीवन के दो महीने बिताए, मूल वैज्ञानिक प्रकाशन और इंटरनेट पर अनगिनत लेखों में वर्णित शब्द 2vec को पुन: पेश करने की कोशिश कर रहा था, लेकिन असफल रहा। मैं शब्द 2vec के समान परिणाम प्राप्त नहीं कर सका, हालांकि मैंने अपनी पूरी कोशिश की।
मैं कल्पना नहीं कर सकता था कि प्रकाशन के लेखकों ने शाब्दिक रूप से एक एल्गोरिथ्म तैयार किया है जो काम नहीं करता है, जबकि कार्यान्वयन कुछ पूरी तरह से अलग करता है।
अंत में, मैंने स्रोत का अध्ययन करने का फैसला किया। तीन दिनों के लिए मुझे विश्वास था कि मैंने कोड को गलत समझा है, क्योंकि सचमुच इंटरनेट पर सभी ने एक अलग कार्यान्वयन के बारे में बात की थी।
मुझे पता नहीं है कि इंटरनेट पर मूल प्रकाशन और लेख शब्द 2vec के
वास्तविक तंत्र के बारे में कुछ क्यों नहीं कहते हैं, इसलिए मैंने इस जानकारी को स्वयं प्रकाशित करने का निर्णय लिया।
यह नकारात्मक संदर्भ के लिए अलग-अलग वैक्टर सेट करने के लिए ग्लोवी की कट्टरपंथी पसंद को भी बताता है - उन्होंने वही किया जो शब्द 2vec करता है, लेकिन लोगों को इसके बारे में बताया :)।
क्या यह वैज्ञानिक चाल है? मैं नहीं जानता, एक कठिन सवाल। लेकिन ईमानदार होने के लिए, मैं अविश्वसनीय रूप से गुस्से में हूं। शायद, मैं मशीन सीखने में एल्गोरिदम के स्पष्टीकरण को फिर से गंभीरता से नहीं ले पाऊंगा: अगली बार मैं
तुरंत स्रोतों को देखूंगा।