भारतीय भाषाओं में बड़े भाषा प्रतिरूप (LLMs) — आरंभ से

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

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

इस लेख में हम कार्पाथी के कोड के आधार पर भारतीय भाषाों मे LLM बनाते हैं।

परिचय

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

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

1
2
3
4
5
6
7
8
# 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 संग्रह को आयात करते हैं —

1
2
3
4
from tokenizers import Tokenizer
from tokenizers.models import BPE
from tokenizers.pre_tokenizers import Whitespace
from tokenizers.trainers import BpeTrainer

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

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

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

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

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

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

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

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

# आंकड़ों को संकेतक द्वारा कूटलेखित कर के 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 हैं। परंतु हम प्रशिक्षण की गति बढ़ाने के लिए उसका एक छोटा भाग (पहले 500MB) ही लेते हैं।

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

हमने पाठकों के लिए इस लेख का पूरा कोड एक गिटहब भंडार में उपलब्ध कराया है। उसको अवश्य देखें! उस कोड में हमने हिन्दी भाषा के प्रतिरूप के लिए कार्यान्वयन (implementation) दिया है, लेकिन आप आंकड़ा समुच्चय का स्रोत बदल कर (उदाहरणार्थ, उपयुक्त AI4BHARAT IndicCorp v2 स्रोत) उस कोड की सहायता से अन्य भाषाओं के भी प्रतिरूप प्रशिक्षित कर सकते हैं।

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

Licensed under CC BY-NC-SA 4.0
Last updated on Feb 24, 2023 14:42 -0800
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy