जब मैंने वर्षों पहले टेक्स्ट डेटा के साथ काम करना शुरू किया, तो सम्मिलन की पूरी अवधारणा अनावश्यक रूप से जटिल लगती थी. मैं अपने बैग-ऑफ-वॉर्ड दृष्टिकोणों और सरल टीएफ-आईडीएफ वेक्टरों के साथ सहज था. मुझे विश्वास था कि वे सरल, समझने में आसान थे, और प्रभावी ढंग से हाथ पर कार्य पूरा कर चुके थे.
मैं उत्पाद समीक्षाओं के साथ काम कर रहा था, और मेरे पारंपरिक मॉडल ने सार्कज्म या रंगीन भाषा के साथ समीक्षाओं को गलत तरीके से वर्गीकृत किया. समस्या स्पष्ट हो गई: मेरे मॉडल समझ नहीं पा रहे थे कि "यह उत्पाद बीमार है" वास्तव में सकारात्मक हो सकता है या कि "आपको उम्मीद की तरह काम किया" संदर्भ के आधार पर तटस्थ या नकारात्मक हो सकता है।
वे सिर्फ एक शानदार नई तकनीक नहीं हैं - वे मशीनों को भाषा को समझने के मूल सीमाओं को संबोधित करते हैं।
The Old Days: Life Before Embeddings
पुराने दिनों: Embeddings से पहले जीवनआइए इन तरीकों और दृष्टिकोणों के विवरण में प्रवेश किए बिना इम्बेडिंग से पहले पाठ प्रतिनिधित्वों का उपयोग करने के इतिहास को समझें. वे अन्य स्थानों पर बहुत अच्छी तरह से कवर किए गए हैं.
One-Hot Encoding
यह एक शब्दकोश में उस शब्द के अनुरूप स्थिति में एक एकल "1" को छोड़कर सभी शून्य के साथ एक दुर्लभ वेक्टर के रूप में प्रत्येक शब्द का प्रतिनिधित्व करता था. यह शब्दों को बड़े पैमाने पर, दुर्लभ वेक्टरों के रूप में प्रतिनिधित्व करता था, जहां प्रत्येक शब्द अपने स्वयं के आयाम को मिला. यदि आपके शब्दकोश में 100,000 शब्द थे (जो मामूली है), तो प्रत्येक शब्द वेक्टर में 99,999 शून्य और एक एकल 1. इन प्रतिनिधित्वों ने हमें बिल्कुल भी अर्थ के बारे में कुछ नहीं बताया. शब्द "उद्देश्यपूर्ण" और "अद्भुत" गणितीय रूप से "उद्देश्यपूर्ण" और " भयानक" के रूप में समान रूप से अलग थे - स्पष्ट समानता संबंधों से पूरी तरह से अनुपस्थित।
"कैट" → [1, 0, 0, 0, ..., 0] (वॉचबोर्ड में पद 5432) "कुत्ता" → [0, 1, 0, 0, ..., 0] (वॉचबोर्ड में पद 8921)
सीमाएं
- के
- आयाम विस्फोट: वेक्टरों में शब्दकोश आकार के रूप में कई आयाम थे (अक्सर 100,000+) के
- कोई सार्थक संबंध नहीं: "कैट" और "किट" "कैट" और "एयरप्लेन" (सब बराबर दूरी) के रूप में अलग थे के
- कंप्यूटेशनल अप्रभावीता: इन दुर्लभ मैट्रिक्सों को गुणा करना अत्यधिक संसाधन-अनुकूल था के
- कोई सामान्यीकरण: सिस्टम अपने मूल शब्दकोश के बाहर शब्दों को नहीं समझ सकता था के
Bag-of-Words Approach
यह दस्तावेजों में शब्दों की घटनाओं को गिनती करता है, कभी-कभी उनके महत्व से वजन करता है. यह दस्तावेजों में शब्दों को शब्दों की अनजान संग्रहों के रूप में व्यवहार करता है, पूरी तरह से शब्दों की क्रम को फेंक देता है. "द कुत्ता आदमी को छूता है" और "द आदमी कुत्ते को छूता है" के समान प्रतिनिधित्व होते हैं.
दस्तावेज़: "पेट पर बैठे हुए बिल्ली" BoW: {"the": 2, "cat": 1, "sat": 1, "on": 1, "mat": 1}
सीमाएँ :
- के
- शब्दों की क्रम के नुकसान: "कुत्ता मनुष्य को काटता है" और "मनुष्य कुत्ते को काटता है" में समान प्रतिनिधित्व थे के
- Sparse उच्च आयाम वेक्टर: अभी भी आवश्यक शब्दकोश आकार के वेक्टर के
- कोई व्यावहारिक समझ नहीं: सिनोमी को पूरी तरह से अलग विशेषताओं के रूप में प्रस्तुत किया गया था के
- कोई संदर्भ अर्थ नहीं: प्रत्येक शब्द को संदर्भ के बावजूद एक निश्चित प्रतिनिधित्व था के
N-grams
कुछ शब्द क्रम को कब्जा करने के लिए, हमने n-grams (n लगातार शब्दों के अनुक्रम) का उपयोग करना शुरू किया. यह कुछ संदर्भ जानकारी को कब्जा करने के लिए N लगातार शब्दों के अनुक्रमों को देखा।
यूनिग्राम (एक शब्द) के साथ, आपके पास 100,000 शब्दकोश हो सकता है. बिग्राम (वचन जोड़े) के साथ, अचानक आप संभावित लाखों विशेषताओं को देख रहे हैं. ट्राइग्राम के साथ? अरब, सैद्धांतिक रूप से।
Limitations:
सीमाएँ :- के
- संयोजन विस्फोट: संभावित एन-ग्राम की संख्या एक्सपोनेंटिक रूप से बढ़ती है के
- डेटा कमज़ोरता: अधिकांश संभावित एन-ग्राम प्रशिक्षण डेटा में कभी नहीं दिखाई देते हैं के
- सीमित संदर्भ विंडो: केवल छोटे विंडो के भीतर रिश्तों को कैप्चर किया जाता है (आमतौर पर 2-5 शब्द) के
TF-IDF (Term Frequency-Inverse Document Frequency)
टीएफ-आईडीएफ ने शब्दों को एक विशिष्ट दस्तावेज़ के लिए कितने महत्वपूर्ण थे के आधार पर वजन करके चीजों को बेहतर बनाया. लेकिन यह अभी भी "अद्भुत" और "उद्देश्यपूर्ण" को पूरी तरह से संबंधित नहीं होने वाले शब्दों के रूप में व्यवहार किया।
Limitations:
सीमाएँ :कोई व्यावहारिक अर्थ नहीं: यह शब्दों की संख्या और आवृत्ति है जो उनके उपयोग के महत्व को निर्धारित करती है।
The Embedding Revolution: What Changed?
इम्बेडिंग क्रांति: क्या बदल गया?एम्बेडमेंट के लिए संक्रमण केवल एक निरंतर सुधार नहीं था; यह भाषा का प्रतिनिधित्व करने के तरीके में एक पैराडाइम परिवर्तन था।
Meaning Through Context
एम्बेडिंग के पीछे मौलिक अंतर्दृष्टि धोखाधड़ी से सरल है: समान संदर्भों में दिखाई देने वाले शब्दों में शायद समान अर्थ होते हैं. यदि आप देखते हैं कि "कुत्ता" और "कैट" समान प्रकार के शब्दों ("पेट", "फूड", "फूर") के आसपास दिखाई देते हैं, तो वे शायद समानता से जुड़े होते हैं.
प्रारंभिक embedding मॉडल जैसे Word2Vec ने यह भविष्यवाणी करने के लिए तंत्रिका नेटवर्क को प्रशिक्षित करके कैप्चर किया:
- के
- अपने आसपास के संदर्भ पर आधारित एक शब्द (Continuous Bag of Words) के
- एक शब्द पर आधारित आसपास के संदर्भ (Skip-gram) के
इन मॉडलों से छिपे हुए परत वजन हमारे शब्द वेक्टर बन गए, वेक्टर अंतरिक्ष की भूमध्य विशेषताओं में सेमेंटिक संबंधों को एन्कोड करते हैं।
जब मैंने पहली बार शब्द वेक्टरों को चित्रित किया और देखा कि "राजा" - "पुरुष" + "महिला" ≈ "राजा", मुझे पता था कि हम कुछ क्रांतिकारी पर हैं।
प्रारंभिक मॉडल जैसे Word2Vec और GloVe ने प्रत्येक शब्द को संदर्भ के बावजूद एक ही वेक्टर दिया. लेकिन एक ही शब्द विभिन्न संदर्भों में विभिन्न चीजों का मतलब हो सकता है:
"I need to bank the money" vs. "I'll meet you by the river bank"
BERT और GPT जैसी मॉडल ने एक ही शब्द के लिए इसके आसपास के संदर्भ के आधार पर अलग-अलग एम्बेडमेंट्स उत्पन्न करके यह हल किया. यह नामित इकाई पहचान और भावना विश्लेषण जैसे कार्यों के लिए एक गेम-विनियर था, जहां संदर्भ अर्थ निर्धारित करता है.
तो, सबसे पहले, आइए समझें कि एम्बेडमेंट क्या हैं और वे एनएलपी को कैसे बदलते हैं और पिछले दृष्टिकोणों की सीमाओं को हल करते हैं।
What Are Embeddings?
Embeddings क्या हैं?इम्बेडिंग एक निरंतर वेक्टर अंतरिक्ष में डेटा (टेक्स्ट, छवियों, ऑडियो, आदि) की संख्यात्मक प्रतिनिधित्व हैं. पाठ के लिए, इम्बेडिंग शब्दों या दस्तावेजों के बीच सेमेंटिक संबंधों को कैप्चर करते हैं, जिससे मशीनों को अर्थ को समझने की अनुमति मिलती है जिस तरह से गणितीय रूप से संसाधित किया जा सकता है.
Key Concepts:
- के
- वेक्टर: बहुआयामी अंतरिक्ष में एक बिंदु का प्रतिनिधित्व करने वाले संख्याओं की क्रमबद्ध सूची के
- आयाम: प्रत्येक वेक्टर में मूल्यों की संख्या (उदाहरण के लिए, 768-dim, 1024-dim) के
- वेक्टर अंतरिक्ष: गणितीय अंतरिक्ष जहां एम्बेड्स मौजूद हैं के
- सेमेंटिक समानता: वेक्टरों के बीच की दूरी या कोण द्वारा मापा जाता है (लगभग = अधिक समान) के
What Do Dimensions Represent?
एक एम्बेडमेंट वेक्टर में प्रत्येक आयाम डेटा के एक सीखने वाली विशेषता या पहलू का प्रतिनिधित्व करता है. क्लासिक फ़ीचर इंजीनियरिंग के विपरीत जहां मनुष्यों ने परिभाषित किया कि प्रत्येक आयाम का क्या मतलब है, आधुनिक एम्बेडमेंट मॉडल में:
- के
- आयाम प्रशिक्षण के दौरान अप्रभावी "वैज्ञानिक अवधारणाओं" का प्रतिनिधित्व करने के लिए उभरते हैं के
- व्यक्तिगत आयामों को अक्सर विशिष्ट मानव व्याख्या योग्य अर्थ की कमी होती है के
- पूर्ण वेक्टर, हालांकि, समकालीन जानकारी को समग्र रूप से कब्जा करता है के
- कुछ आयाम भावना, औपचारिकता, विषय या सिंटाक्स के अनुरूप हो सकते हैं, लेकिन अधिकांश विशेषताओं के जटिल संयोजनों का प्रतिनिधित्व करते हैं के
Why We Need Embeddings
कंप्यूटर मूल रूप से संख्याओं के साथ काम करते हैं, शब्द नहीं।
- के
- समान संबंधों को कैप्चर करें – समान अवधारणाओं को समान प्रतिनिधित्व होना चाहिए के
- संदर्भ अर्थ बनाए रखें – एक ही शब्द अलग-अलग संदर्भों में विभिन्न चीजों का मतलब हो सकता है के
- गणितीय ऑपरेशन सक्षम करें – जैसे कि समानताओं को ढूंढना या समानताओं को पूरा करना के
- बड़े पैमाने पर कुशलता से काम करें – कंप्यूटर विस्फोट के बिना बड़े मात्रा में पाठ का प्रसंस्करण करें के
Embeddings शब्दों, वाक्यांशों, या दस्तावेजों को एक निरंतर अंतरिक्ष में घने वेक्टरों के रूप में प्रस्तुत करके इन समस्याओं को हल करते हैं जहां सेमेंटिक संबंधों को भूमध्य संबंधों के रूप में संरक्षित किया जाता है।
Embeddings के आधार
डेंस वेक्टर प्रतिनिधित्व
हजारों या लाखों आयामों के साथ दुर्लभ वेक्टरों के बजाय, इनपुट कुछ सौ घने आयामों का उपयोग करते हैं जहां प्रत्येक आयाम अर्थ में योगदान करता है।
"cat" → [0.2, -0.4, 0.1, -0.8, ..., 0.3] (300 dimensions)
"kitten" → [0.19, -0.38, 0.15, -0.75, ..., 0.29] (similar to "cat")
यह आकार के गणना आदेशों को अधिक कुशल बनाता है, जबकि समकालीन प्रतिनिधित्व को अधिक समृद्ध करने की अनुमति देता है।
सामुदायिक वितरण
Embeddings इस सिद्धांत पर बनाए गए हैं कि "आप उस कंपनी द्वारा एक शब्द को जानते हैं जिसे वह रखता है" (J.R. Firth). विश्लेषण करके कि समान संदर्भों में क्या शब्द दिखाई देते हैं, embeddings स्वचालित रूप से समान संबंधों को कैप्चर करते हैं।
उदाहरण के लिए, "राजा" और "राजा" में समान संदर्भ होंगे, इसलिए उनके पास समान एम्बेडमेंट होंगे, हालांकि वे शायद ही कभी सटीक एक ही स्थिति में दिखाई देंगे।
गणितीय संपत्ति
इनपुट अंतरिक्षों में उल्लेखनीय गणितीय गुण हैं:
vector("king") - vector("man") + vector("woman") ≈ vector("queen")
यह एनालॉग तर्क और सीमेंटिक ऑपरेशन सीधे वेक्टर अंतरिक्ष में अनुमति देता है।
Transfer Learning के बारे में
पूर्व प्रशिक्षित एम्बेडमेंट सामान्य भाषा ज्ञान को कब्जा करते हैं जिसे विशिष्ट कार्यों के लिए अच्छी तरह से अनुकूलित किया जा सकता है, जो नए अनुप्रयोगों के लिए आवश्यक डेटा को काफी कम करता है।
संदर्भ समझ
आधुनिक संदर्भ इनपुट (जैसे BERT, GPT, आदि से) संदर्भ के आधार पर अलग-अलग तरीके से एक ही शब्द का प्रतिनिधित्व करते हैं:
"I'll deposit money in the bank" → "bank" relates to finance
"I'll sit by the river bank" → "bank" relates to geography
इम्बेडमेंट्स के इतिहास और समझ के बारे में सभी ज्ञान के साथ, उनका उपयोग करने का समय आ गया है।
एलएलएम / एसएलएम मॉडल का उपयोग एम्बेडमेंट उत्पन्न करने के लिए
विभिन्न शोध समूहों ने कई भाषाओं और डोमेनों को कवर करने वाले विविध डेटासेट्स पर प्रशिक्षित एम्बेड मॉडल विकसित किए हैं। इस विविधता के परिणामस्वरूप बड़े पैमाने पर अलग-अलग शब्दकोश और सीमितिक समझ क्षमताओं वाले मॉडल होते हैं. उदाहरण के लिए, मुख्य रूप से अंग्रेजी वैज्ञानिक साहित्य पर प्रशिक्षित मॉडल कई भाषाओं के सोशल मीडिया सामग्री पर प्रशिक्षित लोगों की तुलना में तकनीकी अवधारणाओं को अलग-अलग कोड करेंगे. इस विशेषज्ञता में चिकित्सकों को उन एम्बेड मॉडल का चयन करने की अनुमति मिलती है जो उनके विशिष्ट उपयोग मामलों के अनुरूप होते हैं।
The practical implementation of embeddings has been greatly simplified by libraries like the SentenceTransformer package from Hugging Face, which provides a comprehensive SDK for working with various embedding models. Similarly, OpenAI's SDK offers straightforward access to their embedding models, which have shown impressive performance across many benchmarks. These tools, and there are many more, have democratised access to state-of-the-art embedding technologies, allowing developers to integrate semantic understanding into applications without needing to train models from scratch.
मॉडल, इस लेख के लिए, एक ब्लैक बॉक्स के रूप में माना जाना चाहिए जो वाक्यांशों को एक इनपुट के रूप में लेता है और उनके संबंधित वेक्टर प्रतिनिधित्व को वापस करता है।
Embeddings के लिए SentenceTransformers पुस्तकालय का उपयोग करना
SentenceTransformer का उपयोग करके एम्बेडमेंट उत्पन्न करने का सबसे आसान तरीका:
from sentence_transformers import SentenceTransformer
# Load a pre-trained model
model = SentenceTransformer('all-MiniLM-L6-v2') # 384 dimensions
# Generate embeddings
texts = ["This is an example sentence", "Each sentence becomes a vector"]
embeddings = model.encode(texts)
print(f"Shape: {embeddings.shape}") # (2, 384)
max_seq_length = model.tokenizer.model_max_length
print(max_seq_length) # 256
HuggingFace से उपलब्ध "All-MiniLM-L6-v2" मॉडल में 384 आयाम हैं. इसका मतलब यह है कि यह एक निश्चित शब्द या वाक्यांश के लिए 384 विशेषताओं या रंगों को कैप्चर कर सकता है. इस मॉडल का अनुक्रम लंबाई 256 टोकन है. वाक्यांशों को टोकन में टुकड़े हुए शब्दों और शब्दों में टुकड़े हुए हैं. एक वाक्यांश के लिए उत्पन्न टोकन की संख्या आमतौर पर वाक्यांश में शब्दों की संख्या से 25% से 40% अधिक है.
अनुक्रम लंबाई उन टोकनों की संख्या को दर्शाती है जिन्हें मॉडल द्वारा दिए गए इनपुट के रूप में संसाधित किया जा सकता है. कम से कम कुछ भी इसे 256 लंबाई में बनाने के लिए पैड किया जाता है, और कुछ भी अधिक फेंक दिया जाता है. इसके परिणाम हैं, और हम उन्हें एक और पोस्ट में चर्चा करेंगे.
SentenceTransformer क्लास का कोड विधि मॉडल का उपयोग करने के लिए PyTorch अंतर्दृष्टि मोड पर एक Wrapper है. उपरोक्त कोड PyTorch कोड के समान है:
from sentence_transformers import SentenceTransformer
import torch
# Load the model directly with SentenceTransformer
model = SentenceTransformer("sentence-transformers/msmarco-distilbert-base-tas-b")
# Input text
texts = ["This is an example sentence", "Each sentence becomes a vector"]
# Get embedding directly
with torch.no_grad():
embedding = model.encode(texts, convert_to_tensor=True)
print(embedding)
Here, the torch.no_grad function ensures that no gradients are calculated during back propagation.
PyTorch का उपयोग करके एम्बेडमेंट बनाने का एक और, अधिक सामान्य तरीका:
# Load the model
model = AutoModel.from_pretrained("sentence-transformers/msmarco-distilbert-base-tas-b")
# Get the tokenizer
tokenizer = AutoTokenizer.from_pretrained("sentence-transformers/msmarco-distilbert-base-tas-b")
# Tokenize input
text = ["This is an example sentence"]
encoded_input = tokenizer(text, padding=True, truncation=True, return_tensors='pt')
# Get embedding of the [CLS] token
with torch.no_grad():
outputs = model(**encoded_input, return_dict=True)
cls_embedding = outputs.last_hidden_state[:, 0]
print(cls_embedding)
इस और पिछले कोड स्नैप्स के बीच का अंतर यह है कि कोड फ़ंक्शन को स्पष्ट रूप से टोकनेज़र और मॉडल का उपयोग करके प्रतिस्थापित किया गया है।
एक और अंतर यह है कि हम outputs.last_hidden_state[:, 0] का उपयोग CLS टोकन से संबंधित वेक्टर को प्राप्त करने के लिए कर रहे हैं. इस CLS विशेष टोकन को प्रत्येक वाक्य की शुरुआत में प्रत्येक वाक्य में जोड़ा जाता है, और इसमें पूरे वाक्य के बारे में संग्रहीत जानकारी होती है. कोड विधि हमारे लिए इसे स्वचालित रूप से करती है.
यह ध्यान दिया जाना चाहिए कि एक CLS टोकन जोड़ने का यह दृष्टिकोण केवल कुछ ट्रांसफार्मर-आधारित आर्किटेक्चरों पर लागू होता है, और इसमें BERT और इसके रूपों और केवल एन्कोडर-आधारित ट्रांसफार्मर शामिल हैं।
Best for:वर्गीकरण और अनुक्रम स्तर के पूर्वानुमान कार्य
Why they work:BERT-स्टाइल मॉडल में [CLS] टोकन को पूर्व प्रशिक्षण के दौरान पूरे अनुक्रम से जानकारी एकत्र करने के लिए विशेष रूप से प्रशिक्षित किया गया है. यह एक "संक्षेप" टोकन के रूप में कार्य करता है जो समग्र अर्थ को कैप्चर करता है.
When to choose:
- के
- वर्गीकरण के लिए BERT, RoBERTa, या इसी तरह के मॉडल का उपयोग करते समय के
- जब आपको एक पूरे अनुक्रम का प्रतिनिधित्व करने वाले एक ही वेक्टर की आवश्यकता होती है के
- जब आपके निचले कार्य में पूरे पाठ की एक संपत्ति का अनुमान लगाना शामिल है के
CLS विधि का उपयोग वाक्य के लिए इनपुट को कैप्चर करने के लिए केवल एक विधि है. अन्य विधियों भी हैं.
Mean Pooling
सभी टोकन एम्बेडमेंट्स का औसत लेना कई कार्यों के लिए आश्चर्यजनक रूप से प्रभावी है. यह मेरे जाने का तरीका है जब मैं समानता या खोज कार्यों के लिए एम्बेडमेंट्स का उपयोग कर रहा हूं.
Best for:Semantic similarity, retrieval, and general-purpose representations - समानता, वापसी और सामान्य उद्देश्य प्रतिनिधित्व।
Why it works:सभी टोकन प्रतिनिधित्वों के माध्यम से औसत करके, mean pooling सामूहिक सार्थक सामग्री को कब्जा करता है जबकि शोर को कम करता है. यह सभी सार्थक टोकनों को समान वजन देता है.
When to choose:
- के
- दस्तावेज़ समानता या सेमेंटिक खोज अनुप्रयोगों के लिए के
- जब आपको मजबूत प्रतिनिधित्व की आवश्यकता होती है जो किसी भी एकल टोकन द्वारा नियंत्रित नहीं होते हैं के
- जब अनुभवी परीक्षण दिखाता है कि यह अन्य तरीकों से अधिक प्रदर्शन करता है (यह अक्सर समानता कार्यों के लिए करता है) के
import torch
from transformers import AutoTokenizer, AutoModel
model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)
# Tokenize input
texts = ["This is an example sentence", "Each sentence becomes a vector"]
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
# Mean pooling
with torch.no_grad():
outputs = model(**inputs)
# Get attention mask to ignore padding tokens
attention_mask = inputs['attention_mask']
# Sum token embeddings and divide by the number of tokens
sum_embeddings = torch.sum(outputs.last_hidden_state * attention_mask.unsqueeze(-1), dim=1)
count_tokens = torch.sum(attention_mask, dim=1, keepdim=True)
mean_embeddings = sum_embeddings / count_tokens
print(f"Shape: {mean_embeddings.shape}") # (2, 768)
Max Pooling
मैक्स पॉलिंग सभी टोकनों पर प्रत्येक आयाम के लिए अधिकतम मूल्य लेता है. यह पाठ में दिखाई देने के बावजूद महत्वपूर्ण विशेषताओं को कैप्चर करने में आश्चर्यजनक रूप से अच्छा है.
Best for:विशेषता का पता लगाने और सूचना निकालने के कार्य
Why it works:मैक्स पॉलिंग सभी टोकनों पर प्रत्येक आयाम के लिए सबसे मजबूत सक्रियण का चयन करता है, जिससे पाठ में वे कहां दिखाई देते हैं, सबसे महत्वपूर्ण विशेषताओं को प्रभावी ढंग से कैप्चर किया जाता है।
When to choose:
- के
- जब विशिष्ट विशेषताएं उनकी आवृत्ति या स्थिति से अधिक महत्वपूर्ण होती हैं के
- विशिष्ट अवधारणाओं या इकाइयों की उपस्थिति की तलाश में के
- लंबे पाठों के साथ काम करते समय जहां महत्वपूर्ण संकेत औसत में पतले हो सकते हैं के
import torch
from transformers import AutoTokenizer, AutoModel
model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)
# Tokenize input
texts = ["This is an example sentence", "Each sentence becomes a vector"]
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
# Max pooling
with torch.no_grad():
outputs = model(**inputs)
# Create a mask to ignore padding tokens for max pooling
attention_mask = inputs['attention_mask'].unsqueeze(-1)
# Replace padding token representations with -inf so they're never selected as max
token_embeddings = outputs.last_hidden_state.masked_fill(attention_mask == 0, -1e9)
# Take max over token dimension
max_embeddings = torch.max(token_embeddings, dim=1)[0]
print(f"Shape: {max_embeddings.shape}") # (2, 768)
Weighted Mean Pooling
सभी शब्द समान रूप से अर्थ में योगदान नहीं करते हैं. वजन वाले जोड़ने का तरीका स्थिति के आधार पर अधिक महत्वपूर्ण टोकनों को अधिक वजन देने का प्रयास करता है (उदाहरण के लिए, बाद के टोकनों को अधिक वजन देने के लिए)।
Best for:कार्य जहां इनपुट के अलग-अलग हिस्सों का अलग-अलग महत्व है
Why it works:सभी शब्द समान रूप से अर्थ में योगदान नहीं करते हैं. वजन घनत्व आपको उनकी स्थिति, ध्यान स्कोर, या अन्य प्रासंगिकता मीट्रिक के आधार पर कुछ टोकनों को उजागर करने की अनुमति देता है।
When to choose:
- के
- जब अनुक्रम आदेश मायने रखता है (उदाहरण के लिए, बाद के टोकनों को अधिक वजन दें)
- जब कुछ टोकन स्वाभाविक रूप से अधिक सूचनात्मक होते हैं (उदाहरण के लिए, शब्दों और वाक्यों के विपरीत लेख) के
- जब आपके पास एक विशिष्ट महत्व heuristic है जो आपके कार्य के लिए समझ में आता है
import torch
import torch.nn.functional as F
from transformers import AutoTokenizer, AutoModel
model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)
# Tokenize input
texts = ["This is an example sentence", "Each sentence becomes a vector"]
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
# Weighted mean pooling - more weight to later tokens
with torch.no_grad():
outputs = model(**inputs)
# Get token embeddings and attention mask
token_embeddings = outputs.last_hidden_state
attention_mask = inputs['attention_mask']
# Create position-based weights (later positions get higher weights)
input_lengths = torch.sum(attention_mask, dim=1).unsqueeze(-1)
position_indices = torch.arange(token_embeddings.size(1)).unsqueeze(0).expand_as(attention_mask)
position_weights = position_indices.float() / input_lengths.float()
position_weights = position_weights * attention_mask
# Normalize weights to sum to 1
position_weights = position_weights / torch.sum(position_weights, dim=1, keepdim=True)
# Apply weights and sum
weighted_embeddings = torch.sum(token_embeddings * position_weights.unsqueeze(-1), dim=1)
print(f"Shape: {weighted_embeddings.shape}") # (2, 768)
अंतिम टोकन पॉलिंग
अंतिम टोकन जोड़ना एक तकनीक है जो केवल अंतिम टोकन की प्रतिनिधित्व का चयन करके टोकन इनबेडिंग की एक श्रृंखला से एक एकल इनबेडिंग वेक्टर बनाने के लिए है।
Best for: Autoregressive models and sequential processing
Why it works:जीपीटी जैसे बाएं-दाएं मॉडल में, अंतिम टोकन में पूरे अनुक्रम से जमा संदर्भ होता है, जिससे यह कुछ कार्यों के लिए जानकारी से समृद्ध होता है।
When to choose:
- के
- When using GPT or other decoder-only models के
- कार्यों के साथ काम करते समय जो पूरी तरह से पिछले संदर्भ पर निर्भर करते हैं के
- पाठ उत्पन्न या पूरा करने के कार्यों के लिए के
import torch
from transformers import AutoTokenizer, AutoModel
model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)
# Tokenize input
texts = ["This is an example sentence", "Each sentence becomes a vector"]
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
# Last token pooling
with torch.no_grad():
outputs = model(**inputs)
# Get the last non-padding token for each sequence
attention_mask = inputs['attention_mask']
last_token_indices = torch.sum(attention_mask, dim=1) - 1
batch_indices = torch.arange(attention_mask.size(0))
# Extract the last token embedding for each sequence
last_token_embeddings = outputs.last_hidden_state[batch_indices, last_token_indices]
print(f"Shape: {last_token_embeddings.shape}") # (2, 768)
कई और तरीके हैं, और इन तरीकों को एक साथ जोड़ा जा सकता है साथ ही कस्टम तरीकों का निर्माण करने के लिए. यह केवल एक अवधारणा के रूप में एम्बेडमेंट को समझने और विभिन्न तकनीकों का उपयोग करके एम्बेडमेंट प्राप्त करने के लिए बुनियादी कार्यान्वयन के लिए शुरुआत था.
Looking Forward: Where Embeddings Are Headed
आगे देखते हुए: जहां इम्बेडमेंट्स जाते हैंएम्बेडमेंट स्पेस (pun intended) विकसित करना जारी रखता है:
- के
- मल्टीमोडल एम्बेडमेंट्स पाठ, छवियों, ऑडियो, और वीडियो के बीच बाधाओं को तोड़ रहे हैं. CLIP और DALL-E जैसे मॉडल एम्बेडमेंट्स का उपयोग विभिन्न प्रकारों के बीच एक साझा सेमेंटिक स्थान बनाने के लिए करते हैं। के
- अधिक कुशल आर्किटेक्चर जैसे MobileBERT और DistilBERT सीमित संसाधनों वाले एज डिवाइसों पर शक्तिशाली एम्बेडमेंट का उपयोग करना संभव बना रहे हैं। के
- विशेष कॉर्पोरा पर पूर्व प्रशिक्षित डोमेन विशिष्ट एम्बेडमेंट्स चिकित्सा, कानून और वित्त जैसे क्षेत्रों में आधुनिकता को बढ़ावा दे रहे हैं। के
मैं विशेष रूप से रचना-जागरूक embeddings के बारे में उत्साहित हूं जो बेहतर कैप्चर करते हैं कि अर्थ छोटे इकाइयों से कैसे बनाया जाता है, जो अंततः नकारात्मकता और रचनात्मक वाक्यांशों के साथ लंबे समय से मौजूद चुनौतियों को हल कर सकता है।
Final Thoughts
अंतिम विचारEmbeddings सिर्फ एक और एनएलपी तकनीक नहीं है - वे मशीनों को समझने और भाषा को संसाधित करने के तरीके में एक बुनियादी बदलाव हैं. वे हमें पाठ को श्रमिक प्रतीकों के रूप में व्यवहार करने से लेकर अर्थों और रिश्तों के समृद्ध, जटिल नेटवर्क को कैप्चर करने के लिए स्थानांतरित कर चुके हैं जिन्हें मनुष्य सहज रूप से समझते हैं.
कोई फर्क नहीं पड़ता कि आप किसी भी एनएलपी कार्य पर काम कर रहे हैं, संभावना है कि विचारशील रूप से लागू एम्बेडमेंट्स इसे बेहतर बना सकते हैं. कुंजी यह समझना नहीं है कि उन्हें कैसे उत्पन्न किया जाए, बल्कि जब और क्यों विभिन्न दृष्टिकोणों का उपयोग करना है।
और यदि आप अभी भी पाठ विश्लेषण के लिए शब्दों के बैग या एक ही गर्म कोडिंग का उपयोग कर रहे हैं ...
संभावनाओं की एक पूरी दुनिया आपके लिए इंतजार कर रही है।