सुनिये सब लोग!
पिछली पोस्टों में से एक में, हमने फ़ाइनट्यूनिंग के बारे में बात की थी और यह महत्वपूर्ण क्यों है। इस पोस्ट में हम एक विशिष्ट प्रकार की फ़ाइनट्यूनिंग पर नज़र डालेंगे जिसे इंस्ट्रक्शन फ़ाइनट्यूनिंग कहा जाता है।
जीपीटी-3 जैसे पूर्व-प्रशिक्षित बेस मॉडल को बड़ी मात्रा में डेटा पर प्रशिक्षित किया जाता है। जीपीटी-3 के मामले में यह इंटरनेट पर मौजूद सारा डेटा है। ठीक है, हम निश्चित रूप से यह नहीं जानते हैं, लेकिन इनमें से अधिकांश मॉडलों को काफी मैन्युअल सफाई और फ़ॉर्मेटिंग के बाद इंटरनेट स्केल डेटा पर प्रशिक्षित किया जाता है। जैसे-जैसे उन्हें प्रशिक्षित किया जाता है, आधारित मॉडल सीखते हैं कि अगले टोकन की भविष्यवाणी कैसे करें और टोकन भविष्यवाणी में वास्तव में अच्छे हो जाते हैं। लेकिन शुद्ध टोकन भविष्यवाणी उतनी उपयोगी नहीं है जितना आप सोचते हैं। यदि आप पूर्व-प्रशिक्षित बेस मॉडल से पूछें कि " मेक्सिको की राजधानी क्या है?" "यह उत्तर के साथ उत्तर नहीं देगा लेकिन इनपुट वाक्य को " कोलंबिया की राजधानी क्या है " के साथ पूरा कर सकता है। इसलिए भले ही gpt-3 जैसा मॉडल टोकन भविष्यवाणी में शक्तिशाली है, लेकिन यह चैटबॉट या सह-पायलट के रूप में काम नहीं करेगा। तो हम पूर्व-प्रशिक्षित मॉडल को चैट-जीपीटी जैसे उपयोगी चैटबॉट में कैसे परिवर्तित करें? इसका उत्तर फाइनट्यूनिंग है, मुख्य रूप से एक विशिष्ट प्रकार की फाइनट्यूनिंग जिसे " इंस्ट्रक्शन फाइनट्यूनिंग " कहा जाता है।
इंस्ट्रक्शन फ़ाइनट्यूनिंग को "इंस्ट्रक्शन-फ़ॉलोइंग" के रूप में भी जाना जाता है, यह एक पूर्व-प्रशिक्षित बेस मॉडल को चैट बॉट की तरह व्यवहार करने के लिए सिखाने की एक प्रक्रिया है।
निर्देश फ़ाइनट्यूनिंग के लिए डेटा सेट की आवश्यकता होती है जो प्रश्न और उत्तर के रूप में होते हैं। आप सार्वजनिक डेटा सेट या अपनी कंपनियों के डेटा सेट का उपयोग कर सकते हैं जो प्रश्नोत्तर के रूप में है। यदि आपका डेटा सेट Q&A के रूप में नहीं है, तो आप अल्पाका जैसी विभिन्न तकनीकों का उपयोग करके या अन्य LLM पर कस्टम संकेतों का उपयोग करके डेटा को Q&A में परिवर्तित कर सकते हैं। ध्यान दें कि निर्देश फ़ाइनट्यूनिंग मॉडल को न केवल उस डेटा पर सवालों के जवाब देने का एक नया व्यवहार देता है जिसे आप फ़ाइनट्यूनिंग में उपयोग करते हैं, बल्कि यह नया व्यवहार मॉडल के पास पहले से मौजूद मौजूदा ज्ञान पर लागू होता है जो फ़ाइनट्यूनिंग को एक शक्तिशाली तकनीक बनाता है।
लामिनी एक एआई कंपनी है जो डेवलपर्स को होस्टिंग, प्रशिक्षण और अन्य जटिल पहलुओं की जटिलता को दूर करते हुए भाषा मॉडल से आसान तरीके से निपटने की अनुमति देती है। यहां इसकी पूरी क्षमताएं देखें। हम पाइथिया नामक छोटे भाषा मॉडल को प्रशिक्षित करने के लिए लामिनी का उपयोग करेंगे, जो एलुथर एआई द्वारा बनाया गया एक ओपनसोर्स मॉडल है और अल्पाका नामक कंपनी डेटासेट का उपयोग करके इस पर अनुदेश फाइनट्यूनिंग करेंगे।
इस चरण में आवश्यक मॉड्यूल को आरंभ करने दें और अल्पाका प्रशिक्षण डेटा सेट को भी देखें। यहाँ कोड है.
import itertools import jsonlines from datasets import load_dataset from pprint import pprint from llama import BasicModelRunner from transformers import AutoTokenizer, AutoModelForCausalLM from transformers import AutoModelForSeq2SeqLM, AutoTokenizer ## we are using alpaca data set, which is an open source fine tuning data set instruction_tuned_dataset = load_dataset("tatsu-lab/alpaca", split="train", streaming=True) m = 5 print("Instruction-tuned dataset:") top_m = list(itertools.islice(instruction_tuned_dataset, m)) for j in top_m: print(j)
निर्देश ट्यूनिंग डेटा सेट इस प्रकार दिखता है। इसमें प्रश्न और उत्तर के रूप में डेटा शामिल है।
इस चरण में हम अल्पाका सेट से डेटा लेते हैं और उन्हें नीचे दिए गए संकेतों में डालते हैं।
prompt_template_with_input = """Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request. ### Instruction: {instruction} ### Input: {input} ### Response:""" prompt_template_without_input = """Below is an instruction that describes a task. Write a response that appropriately completes the request. ### Instruction: {instruction} ### Response:""" ## hydrate prompts - meaning add data to the above prompts processed_data = [] for j in top_m: if not j["input"]: processed_prompt = prompt_template_without_input.format(instruction=j["instruction"]) else: processed_prompt = prompt_template_with_input.format(instruction=j["instruction"], input=j["input"]) processed_data.append({"input": processed_prompt, "output": j["output"]})
ऐसा करने के बाद डेटा सेट इस प्रकार दिखेगा.
हम मूल रूप से कच्चे प्रश्नोत्तर डेटा ले रहे हैं और इसे एक ऐसे प्रारूप में परिवर्तित कर रहे हैं जो एलएलएम के लिए समझ में आता है कि जब कोई प्रश्न पूछा जाता है तो उस प्रश्न का उत्तर कैसा दिखना चाहिए। हम इसे पुनरावृत्त रूप से करते हैं और एक jsonl फ़ाइल में संग्रहीत करते हैं।
with jsonlines.open(f'alpaca_processed.jsonl', 'w') as writer: writer.write_all(processed_data)
चरण 1 और 2 में हमने कच्चा डेटा लोड किया और उसे हाइड्रेट किया और jsonl प्रारूप में संग्रहीत किया। लेकिन लामिनी के पास यह हाइड्रेटेड डेटा उपयोग के लिए तैयार है, इसलिए तकनीकी रूप से चरण 1 और 2 आवश्यक नहीं हैं। लेकिन यह समझने के लिए कि निर्देश फाइनट्यूनिंग कैसे काम करती है, यह दिखाना आवश्यक था। आइए पहले देखें कि पाइथिया मॉडल का एक गैर-परिष्कृत संस्करण एक साधारण प्रश्न का उत्तर कैसे देगा।
tokenizer = AutoTokenizer.from_pretrained("EleutherAI/pythia-70m") #70M parameter model that is not instruction tuned. model = AutoModelForCausalLM.from_pretrained("EleutherAI/pythia-70m") def inference(text, model, tokenizer, max_input_tokens=1000, max_output_tokens=100): # Tokenize input_ids = tokenizer.encode( text, return_tensors="pt", truncation=True, max_length=max_input_tokens ) # Generate device = model.device generated_tokens_with_prompt = model.generate( input_ids=input_ids.to(device), max_length=max_output_tokens ) # Decode generated_text_with_prompt = tokenizer.batch_decode(generated_tokens_with_prompt, skip_special_tokens=True) # Strip the prompt generated_text_answer = generated_text_with_prompt[0][len(text):] return generated_text_answer ## the 70M model doesnt have any company specific data, we will use the alpace data set from hosted on lamini and fine tune this model # load alpaca dataset finetuning_dataset_path = "lamini/lamini_docs" finetuning_dataset = load_dataset(finetuning_dataset_path) #print(finetuning_dataset) test_sample = finetuning_dataset["test"][0] print(test_sample) print("untrained output sample") print(inference(test_sample["question"], model, tokenizer))
यह वह आउटपुट है जो मुझे मिला। आप देखेंगे कि आउटपुट मददगार नहीं है और मॉडल टोकन पूरा करने का प्रयास कर रहा है और वास्तविक उत्तर नहीं दे रहा है।
एक बार जब हम पिछले चरण में देखे गए प्रश्नोत्तरी डेटा का उपयोग निर्देश को ठीक करने के लिए करते हैं तो वही मॉडल एक चैट बॉट की तरह व्यवहार करना शुरू कर देगा और आपके प्रश्नों के सटीक उत्तर प्रदान करेगा, दोनों बारीक किए गए डेटा के साथ-साथ उस डेटा पर भी जो मॉडल पहले से ही मौजूद है। बंद होता है. यह लगभग वैसा ही है जैसे जब कोई बच्चा पहली बार कोई भाषा सीखता है, तो वह अब भाषा प्रशिक्षण के कारण सीखी गई नई चीजों के साथ-साथ अपनी भावनाओं को भी व्यक्त करने में सक्षम होगा। मॉडल के पूर्व-प्रशिक्षित संस्करण की तरह, अनुदेश फाइनट्यून मॉडल भी लामिनी पर होस्ट किया गया है और नीचे दिखाए गए अनुसार एक कमांड के साथ अनुमान लगाया जा सकता है। (हाँ लामिनी बढ़िया है!)
## finetuned output instruction_model = AutoModelForCausalLM.from_pretrained("lamini/lamini_docs_finetuned") print("instruction finetuned output") print(inference(test_sample["question"], instruction_model, tokenizer))
आउटपुट इस प्रकार दिखेगा. आप देखेंगे कि पिछले चरण में हमने जो अस्पष्टता देखी थी उसके बजाय हमारे पास अधिक सटीक आउटपुट है।
इस पोस्ट का लक्ष्य निर्देश फ़ाइनट्यूनिंग का परिचय देना है और बेस मॉडल को अधिक उपयोगी संस्करण बनाने के लिए इसका उपयोग कैसे किया जाता है। भविष्य की पोस्टों में मैं इंस्ट्रक्शन फ़ाइनट्यूनिंग करने की वास्तविक प्रक्रिया के बारे में गहराई से बताऊंगा।
एआई के 100 दिनों के 13वें दिन के लिए बस इतना ही।
मैं एबव एवरेज नाम से एक समाचार पत्र लिखता हूं जहां मैं बड़ी तकनीक में होने वाली हर चीज के पीछे दूसरे क्रम की अंतर्दृष्टि के बारे में बात करता हूं। यदि आप टेक में हैं और औसत नहीं बनना चाहते हैं, तो इसकी सदस्यता लें ।
एआई के 100 दिनों पर नवीनतम अपडेट के लिए मुझे ट्विटर , लिंक्डइन पर फॉलो करें। यदि आप तकनीक में हैं तो आपको यहां तकनीकी पेशेवरों के मेरे समुदाय में शामिल होने में रुचि हो सकती है।
यहाँ भी दिखाई देता है.