भारतीय भाषाओं में विशाल भाषा प्रतिरूप (LLMs) - आरंभ से

इस वर्ष, आंद्रे कार्पाथी (Andrej Karpathy) ने विशाल भाषा प्रितिरूपों (अंग्रेज़ी: large language models, LLMs) के विषय पर एक बहुत अच्छा वीडियो व्याख्यान प्रस्तुत किया। उस वीडियो में उसने GPT जैसे भाषा प्रतिरूप को शुरुआत से कैसे बनाना यह विस्तार से दिखाया है, और गिटहब पर कोड भी साझा किया गया। LLM का मूलभूत और व्यावहारिक ज्ञान प्राप्त करने के लिए उस वीडियो केो ज़रूर देखें!

कार्पाथी के कोड में अंग्रेज़ी के लिए भाषा प्रतिरूप बनाया गया है — उसका प्रितिरूप Tiny Shakespeare आंकड़ा समुच्चय (dataset) पर प्रशिक्षित किया जाता है ताकि वह अंत में अपने आप शेक्सपीयर जैसा पाठ रच सके। इस लेख में हम कार्पाथी के कोड के आधर पर भरतीय भाषाों मे LLM बनाते हैं।

पूरवकथित वीडियो में दो प्रकार के प्रतिरूप प्रशिक्षित किए जाते हैं — बाइग्राम (Bigram) और परिवर्तक (Transformer)।

भाषा प्रतिरूप को प्रशिक्षित करने से पहले हमें पाठ या शब्दों को संख्यात्मक मानों (numerical values) में परिवर्तित करने का तरीका चाहिए। NanoGPT में निवेश संचिका से सारे संप्रतीकों (characters) की सूची बनाई जाती है, और हर संप्रतीक को आरोही क्रम में सूचक ($0, 1, \dots, n-1$, जहाँ संप्रतीकों की कुल संख्या $n$ है) दिए जाते हैं।

# here are all the unique characters that occur in this text
chars = sorted(list(set(text)))
vocab_size = len(chars)
# create a mapping from characters to integers
stoi = { ch:i for i,ch in enumerate(chars) }
itos = { i:ch for i,ch in enumerate(chars) }
encode = lambda s: [stoi[c] for c in s] # encoder: take a string, output a list of integers
decode = lambda l: ''.join([itos[i] for i in l]) # decoder: take a list of integers, output a string

अर्थात, यह एक मूलभूत प्रतीककारक (tokenizer) है जो संप्रतीक के स्तर पर हर प्रतीक को एक अलग सूचक देता है। LLM की दुनिया में विविध प्रकार के प्रतीककारक हैं — कुछ शब्द के स्तर पर प्रतीकीकरण (tokenization) करते हैं, जबकि अन्य प्रतीककारक उपशब्द या संप्रतीक के स्तर पर चलते हैं।

अगले भाग में हम एक अलग प्रतीककारक चुनेंगे।

प्रतीककारक को बदलना

बाइट युग्म कूटलेखन (Byte Pair Encoding, BPE)

हम पूर्व प्रतीककारक की जगह एक उन्नत प्रतीककारक का प्रयोग करते हैं — बाइट युग्म कूटलेखन (अंग्रेज़ी: byte pair encoding, BPE)। BPE एक कलन-विधि है जो आंकड़ा संपीडन (data compression) के लिए बनाई गई थी, पर आजकल उसका प्रयोग विविध परिवर्तक प्रतिरूपों में किया जाता है (उदाहरणार्थ, GPT-4)। हम BPE के विवरण यहाँ नहीं देंगे, पर संक्षेप में, वह हर चरण में अनुक्राम का सर्वाधिक बारंबारता का प्रतीक युग्म ले कर उसको एक नए प्रतीक में जोड़ देता है।

इसका प्रयोग करने के लिए हम Huggingface के Tokenizers संग्रह की सहायता लेते हैं। सबसे पहले, हम Tokenizers संग्रह को आयात करते हैं -

from tokenizers import Tokenizer
from tokenizers.models import BPE
from tokenizers.pre_tokenizers import Whitespace
from tokenizers.trainers import BpeTrainer

निम्नलिखित कोड से हम एक नए BPE प्रतीककारक का प्रारंभिकरण कर सकते हैं।

tokenizer = Tokenizer(BPE())
tokenizer.pre_tokenizer = Whitespace()

प्रतीककारक का प्रयोग करने से पहले हमें उसको अपनी आंकड़े की संचिका से प्रशिक्षित करना है।

trainer = BpeTrainer(special_tokens=["[UNK]", "[CLS]", "[SEP]", "[PAD]", "[MASK]"])
tokenizer.train(files=[data_file], trainer=trainer)

उसके बाद, हम प्रशिक्षित प्रतीककारक की शब्दावली का परिमाण प्राप्त कर सकते हैं।

# शब्दावली का परिमाण प्राप्त करें
vocab_size = tokenizer.get_vocab_size()

अब हम अपने प्रशिक्षित प्रतीककारक के आधार पर आंकड़ा संचिका का प्रतीकीकरण कर के एक torch.tensor में परिवर्तित कर सकते हैं।

# आंकड़ा संचिका को खोलें और पढ़ें
with open(data_file, 'r', encoding='utf-8') as f:
  text = f.read()

# आंकड़े को tokenizer द्वारा कूटलेखित कर के उसको torch.tensor में परिवर्तित करें
data = torch.tensor(tokenizer.encode(text).ids, dtype=torch.long)

अन्य प्रतीककारक

BPE एकमात्र प्रतीककारक नहीं है — हम अन्य प्रतीककारक को प्रयोग भी कर सकते थे। कुछ और विकल्प —

  • WordPiece — यह कलन-विधि गूगल से आई, जहाँ BERT को पूर्वप्रशिक्षित करने में उसका प्रयोग हुआ। तब से WordPiece का इस्तेमाल अन्य BERT पर आधारित प्रतिरूपों में हुआ है। WordPiece कलन-विधि BPE से मिलता-जुलता है — WordPiece भी उपशब्द के स्तर पर चलता है और प्रतीक युग्मों को जोड़ता रहता है. उसका अंतर है कि WordPiece जोड़ने के लिए युग्मों को अलग तरीके से चुनता है। अधिक जानकारी के लिए यह देखें।

  • Unigram — BPE या WordPiece के विपरीत, Unigram एक बड़ी शब्दावली से शुरुआत कर के उसको छोटा कर देता है। हर चरण में कुछ प्रतीक हटाए जाते हैं, वांछित शब्दावली परिमाण पर पहुँचने तक। अधिक जानकारी यहाँ उपलब्ध है।

आंकड़ा

हमारे भाषा प्रतिरूप को प्रशिक्षित करने के लिए एक और वस्तु शेष है — हमें एक आंकड़ा समुच्चय की आवश्यकता है! सौभाग्य से, AI4BHARAT परियोजना ने भाषा प्रतिरूपों के लिए विविध भारतीय भाषाओं में कोशों/संग्रहों को इकट्ठा किया है। विशेष रूप से, मैंने प्रतिरूप के प्रशिक्षण के लिए उनका IndicCorp v2 संग्रह लिया है, जिसमें 23 भारतीय भाषाओं (और अंग्रज़ी) में सामग्री है। उदाहरण के लिए, IndicCorp v2 का हिन्दी आंकड़ा लगभग 70GB है तो गति बढ़ाने के लिए हम उसका छोटा भाग भी ले सकते हैं।

हमारे प्रशिक्षित प्रतिरूप के नतीज़े

कोड (गिटहब पर)

हमने पाठकों के लिए इस लेख का पूरा कोड एक गिटहब भंडार में उपलब्ध कराया है। उसको अवश्य देखें!

हमारी आशा है कि आफको यह लेख उपयोगी लगा!

Ameya Velingker
Research Scientist

I am a research scientist whose research interests are broadly in the area of machine learning and theoretical computer science. I am currently interested in reasoning in ML models (e.g., AI for mathematics/science) and machine learning on graph-structured and relational data, combining tools from algorithms with machine learning. Other areas I have worked in include streaming algorithms, privacy, error-correcting codes, etc. I was previously a research scientist at Google Research (until 2024), where my work has been used in a number of systems such as AlphaProof (theorem proving), Google Maps (routing/navigation), and Gboard (private analytics).