BERT ٹوکنائزر کے لیے ایک وضاحتی گائیڈ

ماخذ نوڈ: 1073113

ایک نیورل نیٹ ورک صرف ہندسوں کے ساتھ کام کر سکتا ہے لہذا پہلا قدم ہر لفظ کو کچھ عددی اقدار تفویض کرنا ہے۔ فرض کریں کہ آپ کے پاس 10000 الفاظ کی لغت ہے لہذا آپ 10000 تک ہر لفظ کے لیے ایک منفرد انڈیکس تفویض کر سکتے ہیں۔ اب تمام الفاظ کو انڈیکس کے ذریعے دکھایا جا سکتا ہے۔ اور ایمبیڈنگ ہر انڈیکس کے لیے ایک ڈی ڈائمینشنل ویکٹر ہے۔ لفظ کی سرایت کے بنیادی خیال کے لیے نیچے دیے گئے اعداد و شمار کو دیکھیں ہر لفظ کا ایک منفرد انڈیکس ہوتا ہے اور اس میں سرایت کرنے والا ویکٹر ہوتا ہے۔

آئیے یہاں تھوڑا سا مزہ کریں، ذرا سوچیں کہ کیا ہم اپنے ورڈ ایمبیڈنگ میں پوزیشنل انڈیکس کا اضافہ کرتے ہیں۔ کیا اس سے مدد ملے گی؟ نیچے دی گئی تصویر کا حوالہ دیں، جب ہم لفظ ایمبیڈنگ (W1, W2..etc) میں پوزیشنل انڈیکس شامل کرتے ہیں تو دائیں طرف کے الفاظ کے لیے حتمی ایمبیڈنگ ہمیشہ بڑی ہوگی اور یہ اصل لفظ ایمبیڈنگ پر حاوی ہوگی جیسا کہ اس صورت میں اگر ہم W10 میں 3 کا اضافہ کریں تو W3 کی اہمیت ختم ہو جائے گی۔ اس مسئلے پر قابو پانے کے لیے اگر ہم انڈیکس کو کل طوالت کے ساتھ نارمل کریں (تمام انڈیکس کو 10 سے تقسیم کریں) تو ایک ہی لفظ میں مختلف طوالت کے جملوں کے لیے بالکل مختلف سرایت ہوگی۔

پوزیشنی سرایت

ٹرانسفارمرز مندرجہ بالا مسئلہ کے لئے ایک خوبصورت خیال کے ساتھ آئے. انہوں نے سائنوسائیڈل پوزیشنل انکوڈنگ کا استعمال کیا۔ فارمولہ نیچے لکھا گیا ہے جہاں pos جملے میں الفاظ کے پوزیشنل انڈیکس ہے، d سرایت کرنے والا ویکٹر ڈائمینشن ہے اور i اس سرایت کرنے والے ویکٹر میں انڈیکس کی پوزیشن ہے۔ گناہ اور کوزائن کی لہروں کو یکساں اور طاق انڈیکس کے لیے استعمال کرنے سے ڈپلیکیٹ ایمبیڈنگ اقدار کو ہٹا دیا جاتا ہے (کوزائن کی لہر ایک سے زیادہ مرتبہ اسی طرح کی sin wave صفر ہے)۔

پوزیشنی سرایت

                                        پوزیشنل انکوڈنگ کے لیے سائن کوزائن فارمولا

BERT ان پٹ ایمبیڈنگ

برٹ ان پٹ ایمبیڈنگ

اگر آپ نے BERT کے اصل کاغذ کو دیکھا ہے تو آپ نے اوپر کی تصویر ضرور دیکھی ہوگی۔ اگر آپ ایسا نہیں کرتے ہیں، تو فکر نہ کریں ہم یہاں ہر چیز کو دریافت کرنے کے لیے موجود ہیں۔ BERT میں ہمیں سائنوسائیڈل پوزیشنل انکوڈنگ دینے کی ضرورت نہیں ہے، ماڈل خود ٹریننگ کے مرحلے کے دوران پوزیشنل ایمبیڈنگ سیکھتا ہے، اسی وجہ سے آپ کو ٹرانسفارمرز کی ڈیفالٹ لائبریری میں پوزیشنل ایمبیڈنگ نہیں ملے گی۔ BERT نے ورڈ پیس ٹوکنائزر تصور کو استعمال کرنے کا ہوشیار خیال پیش کیا جو کچھ الفاظ کو ذیلی الفاظ میں توڑنے کے سوا کچھ نہیں ہے۔ مثال کے طور پر اوپر کی تصویر میں 'sleeping' لفظ کو 'sleep' اور '##ing' میں ٹوکنائز کیا گیا ہے۔ یہ خیال نامعلوم الفاظ کو کچھ معلوم الفاظ میں توڑنے میں کئی بار مدد کر سکتا ہے۔ اگر میں معلوم الفاظ کہہ رہا ہوں تو میرا مطلب وہ الفاظ ہیں جو ہماری لغت میں ہیں۔ ہم اسے بعد میں ایک حقیقی دنیا کی مثال کے ساتھ دیکھیں گے۔

برٹ ٹوکنائزر ٹرانسفارمرز لائبریری میں

اس مقام سے، ہم Hugging-face tokenizer لائبریری کے ساتھ مذکورہ بالا تمام ایمبیڈنگ کو دریافت کرنے جا رہے ہیں۔ اگر آپ ٹوکنائزر فائلیں مقامی طور پر اپنی مشین پر ڈاؤن لوڈ کرنا چاہتے ہیں تو جائیں۔ https://huggingface.co/bert-base-uncased/tree/main اور یہاں سے vocab.txt اور config فائلیں ڈاؤن لوڈ کریں۔ پائپ کا استعمال کرتے ہوئے ٹرانسفارمرز لائبریری کو انسٹال کریں۔

ٹرانسفارمرز سے درآمد کریں BertTokenizer tokenizer = BertTokenizer.from_pretrained(//path to tokenizers) نمونہ = 'دنیا کے نقشے میں ہمالیہ کہاں ہے؟' encoding = tokenizer.encode(نمونہ) پرنٹ(انکوڈنگ) پرنٹ(tokenizer.convert_ids_to_tokens(encoding))آؤٹ پٹ 1: [101، 2073، 2003، 26779، 1999، 1996، 2088، 4949، 1029، 102] آؤٹ پٹ 2: ['[CLS]'، 'جہاں'، 'ہے'، 'ہمالیہ'، 'ان'، 'دی'، 'دنیا'، 'نقشہ'، '؟'، '[SEP]']

مندرجہ بالا کوڈ میں ہم نے صرف انکوڈ فنکشن کا نام دیا ہے اور آؤٹ پٹ 1 میں ہمیں جو کچھ ملتا ہے وہ vocab فائل سے ان پٹ ٹوکنز کا انڈیکس ہے اور output2 ریورس ہے، input_ids کا انسانی پڑھنے کے قابل ٹوکن۔ ان پٹ ٹوکن کے علاوہ ہمیں 2 خصوصی ٹوکن بھی ملے '[CLS]' اور '[SEP]'۔ BERT ماڈل کو اس طرح ڈیزائن کیا گیا ہے کہ جملہ [CLS] ٹوکن سے شروع ہو اور [SEP] ٹوکن پر ختم ہو۔ اگر ہم سوال جواب دینے یا زبان کے ترجمے پر کام کر رہے ہیں تو ہمیں علیحدگی کے لیے دو جملوں کے درمیان [SEP] ٹوکن استعمال کرنا ہوگا لیکن Hugging-face لائبریری کی بدولت ٹوکنائزر لائبریری ہمارے لیے یہ کام کرتی ہے۔ اب اس مثال کے ساتھ تھوڑا سا کھیلتے ہیں اور لفظ کو تبدیل کرتے ہیںہمالیہ سے ہمالیہ اور دیکھیں آگے کیا ہوتا ہے۔

نمونہ = 'دنیا کے نقشے میں ہمالیہ کہاں ہے؟' encoding = tokenizer.encode(نمونہ) پرنٹ(انکوڈنگ) پرنٹ(tokenizer.convert_ids_to_tokens(encoding))
آؤٹ پٹ 1: [101، 2073، 2003، 26779، 2015، 1999، 1996، 2088، 4949، 1029، 102] آؤٹ پٹ 2: ['[سی ایل ایس]'، 'کہاں'، 'ہے'، 'ہمالیہ'، '# #s', 'in', 'the', 'world', 'map', '?', '[SEP]']

کیا آپ نے اوپر کی مثال میں دیکھا، ٹوکنائزر لفظ لاتا ہے 'اندھیرے سے ہمالیہ کی پشت۔ اس طرح یہ زیادہ تر نامعلوم الفاظ کو سنبھال سکتا ہے اور ماڈل کی درستگی کو بہتر بنا سکتا ہے۔ اب آئیے تھوڑا اور کھودیں اور ٹوکنائزر لائبریری کے ایک اور فنکشن کو دریافت کریں اور سوال جواب کی مثال کے ساتھ تصور کو دوبارہ سمجھیں۔ میں سوال جواب دینے والا ڈیٹا استعمال کر رہا ہوں کیونکہ اس میں ترتیب کے دو ان پٹ جوڑے ہیں (سوال اور سیاق و سباق) دوسری طرف کی درجہ بندی میں صرف ایک ہی ترتیب ہے۔

q1 = 'ٹونی سٹارک کون تھا؟' c1 = 'انتھونی ایڈورڈ سٹارک جسے ٹونی سٹارک کے نام سے جانا جاتا ہے Avengers' encoding = tokenizer.encode_plus(q1,c1) میں ایک خیالی کردار ہے، کلید کے لیے، encoding.items(): print( '{} : {}'.format( کلید، قدر ) ) آؤٹ پٹ: ان پٹ آئی ڈیز : [101، 2040، 2001، 4116، 9762، 1029، 102، 4938، 3487، 9762، 2124، 2004، 4116، 9762، 2003، 1037، 7214، 2839، 1999، 14936، 102، 0، 0] token_type_ids : [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] توجہ_ماسک : [ ﮨﻤﯿﺸﮧ، ﺍﻟﻠﮧ، ﺍﻟﻠﮧ، ﺻﻠﯽ ﺍﻟﻠﮧ ﻋﻠﯿﮧ ﻭﺁﻟﮧ ﻭﺳﻠﻢ، ﺍﻟﻠﮧ ﺗﻌﺎﻟٰﯽ، ﺻﻠﯽ ﺍﻟﻠﮧ ﻋﻠﯿﮧ ﻭﺁﻟﮧ ﻭﺳﻠﻢ، ﺻﺤﯿﺢ، ﺻﺤﯿﺢ، ﺻﺤﯿﺢ، ﺻﺤﯿﺢ، ﺫﺭﯾﻌﮧ، ﺫﺭﺍﻕ

یہاں ہم استعمال کرتے ہیں۔ encode_plus لائبریری کا فنکشن اور اس کے نتیجے میں تین مختلف لغتیں نکلیں پہلی ایک input_ids ہے: ہم اسے پہلے کی مثال میں دیکھ چکے ہیں، یہاں فرق صرف اتنا ہے کہ ہم ایک (سوال و جواب) کے جوڑے کو ایک ہی ان پٹ کے طور پر دیکھ رہے ہیں اور ہمیں ایک [ SEP] سوال اور جواب کے درمیان ٹوکن۔ Token_type_ids پہلے جملے کے لیے 0s اور دوسرے جملے کے لیے 1 ہیں۔ یاد رکھیں کہ اگر ہم درجہ بندی کا کام کر رہے ہیں تو ٹوکن_ٹائپ_آئیڈز وہاں کارآمد نہیں ہوں گے کیونکہ ان پٹ سیکوئنس جوڑا نہیں بنایا گیا ہے (وہاں صرف صفر کی ضرورت نہیں ہے)۔ توجہ_ماسک کو سمجھنے کے لیے ہمیں ڈیٹا کو بیچوں میں پروسیس کرنا ہوگا۔ ایک بیچ میں، ہمارے پاس ان پٹ کی مختلف لمبائی ہو سکتی ہے۔ ماڈل کو ہمیشہ مستطیل شکل میں ان پٹ ڈیٹا کی ضرورت ہوتی ہے، اگر ہم ڈیٹا کو بیچ میں منتقل کر رہے ہیں۔ مثال کے طور پر، اگر ہمارے پاس بیچ سائز = 3 ہے تو بیچ نیچے کی تصویر کی طرح نظر آئے گا۔

ٹرانسفارمر

اوپر کی تصویر سے، آپ اندازہ لگا سکتے ہیں کہ میں نے اوپر کیا کہا تھا۔ ہمیں ایک بیچ میں تمام نمونوں کے لیے ایک ہی لمبائی بنانے کی ضرورت ہے۔ اس عمل میں، کچھ پیڈنگ ویلیو کو ٹوکنز کے دائیں جانب چھوٹے جملوں میں شامل کرنا ہوگا اور اس بات کو یقینی بنانے کے لیے کہ ماڈل ان پیڈڈ ویلیوز کو نہیں دیکھے گا توجہ کا ماسک صفر کے طور پر قدر کے ساتھ استعمال کیا جاتا ہے۔ آئیے اسی سوال کا جواب دینے والے ڈیٹا کے لیے ایک حقیقی ڈیٹا کا مسئلہ ہے۔

q1 = 'ٹونی سٹارک کون تھا؟' c1 = 'انتھونی ایڈورڈ سٹارک جسے ٹونی سٹارک کے نام سے جانا جاتا ہے Avengers میں ایک خیالی کردار ہے' q2 = 'مارول میں ٹونی کون تھا' c2 = 'ٹونی سٹارک مارول ایوینجرز میں ایک خیالی کردار ہے' انکوڈنگ = ٹوکنائزر([q1,q2], [q1,q2] c1,c101]) کلید کے لیے، encoding.items(): print('2040- {}: {}'.format(key, value)) آؤٹ پٹ: input_ids: [[2001, 4116, 9762, 1029, 102 ، 4938، 3487، 9762، 2124، 2004، 4116، 9762، 2003، 1037، 7214، 2839، 1999، 14936، 102، 101، 2040، 2001، 4116، 1999، 8348 102، 4116، 9762، 2003 , 1037, 7214, 2839, 1999, 8348, 14936, 102, 0, 0]] token_type_ids: [[0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1، 1، 1، 1، 1، 1، 1، 0]، [0، 0، 0، 0، 0، 0، 1، 1، 1، 1، 1، 1، 1، 1، 1، 1، توجہ_ماسک: [[1، 1، 1، 1، 1، 1، 1، 1، 1، 1، 1، 1، 1، 1، 1، 1، 1، 1، 1، 1، 1، 1، 1، 1]، ﺣﻀﺮﺕ ﻋﻠﯿﮧ ﺻﻠﯽ ﺍﻟﻠﮧ ﻋﻠﯿﮧ ﻭﺳﻠﻢ، ﺍﻟﻠﮧ، ﻋﻠﯿﮧ، ﺍﻟﺴﻼﻡ، ﺻﻠﯽ ﺍﻟﻠﻪ ﻋﻠﯿﮧ ﻭﺳﻠﻢ

مندرجہ بالا کوڈ میں، ہم نے دو فہرستیں بنائیں پہلی فہرست تمام سوالات پر مشتمل ہے اور دوسری فہرست تمام سیاق و سباق پر مشتمل ہے۔ اس بار ہمیں ہر ڈکشنری کے لیے دو فہرستیں موصول ہوئی ہیں (input_ids، token_type_ids، اور attention_mask)۔ اگر آپ نے دیکھا کہ دونوں فہرستوں کا سائز اب بھی مختلف ہے۔ ایسا اس لیے ہوا کیونکہ ہم نے پیڈنگ کو بطور دلیل استعمال نہیں کیا۔

encoding = tokenizer([q1,q2], [c1,c2],padding=True) کلید کے لیے، قدر encoding.items(): print('1- {}: {}'.format(key, value)) آؤٹ پٹ: input_ids: [[101، 2040، 2001، 4116، 9762، 1029، 102، 4938، 3487، 9762، 2124، 2004، 4116، 9762، 2003، 1037، 7214، 2839، 1999، 14936، 102]، [ 101, 2040, 2001, 4116, 1999, 8348, 102, 4116, 9762, 2003, 1037, 7214, 2839, 1999, 8348, 14936, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 1، 1 , 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1 ، 1، 1، 1، 1، 1، 1، 1، 1، 1، 1، 1، 1، 1، 1، 1]] توجہ_ماسک: [[1، 1، 1، 1، 1، 1، ﺣﻀﺮﺕ ﻋﻠﯿﮧ ﺻﻠﯽ ﺍﻟﻠﮧ ﻋﻠﯿﮧ ﻭﺁﻟﮧ ﻭﺳﻠﻢ، ﺻﺤﯿﺢ، ﺻﺤﯿﺢ، ﺻﺤﯿﺢ، ﺻﺎﺣﺐ، ﺫﺍﺕ، ﺫﺍﺕ، ﺫﺍﺕ، ﺫﺍﺕ، ﺫﺍﺕ، ﺫﺍﺕ 1، 1، 1، 1، 1، 1، 1، 1، 1، 1، 1، 1]]

پیڈنگ آرگیومینٹ شامل کرنے کے بعد ہمیں چھوٹے جملوں کے لیے صفر پیڈنگز ملیں اور سب کچھ وہی رہتا ہے۔ یہاں توجہ_ماسک کی اہمیت آتی ہے، ماڈل صرف اس جگہ پر توجہ مرکوز کرے گا جہاں ماسکنگ کو درست یا 1 پر سیٹ کیا گیا ہو۔ ٹوکنائزر لائبریری کے ایک اور فنکشن کے ساتھ بھی یہی چیز حاصل کی جاسکتی ہے، فرق صرف اتنا ہے کہ آپ کو جوڑے کی فہرست بنانا ہوگی۔ ذیل میں ایک سوال اور سیاق و سباق

اور ہمیں اوپر والے کوڈ کے لیے آؤٹ پٹ وہی ملے گا جیسا کہ آپ کو پچھلی مثال میں ملتا ہے۔ اسی طرح، مختلف BERTs مختلف قسموں کو مختلف ان پٹ ایمبیڈنگ کی ضرورت ہوتی ہے۔ مثال کے طور پر، DistilBERT token_type_ids استعمال نہیں کرتا ہے یہ تہوں کو دو کے عنصر سے کم کرتا ہے۔ ان تبدیلیوں نے اسکور پر تھوڑا سا سمجھوتہ کرنے کے ساتھ ماڈل کو BERT سے بہت تیز تر بنا دیا۔ آئیے DistilBERT ٹوکنائزر کی مثال دیکھیں

ماخذ: https://www.analyticsvidhya.com/blog/2021/09/an-explanatory-guide-to-bert-tokenizer/

ٹائم اسٹیمپ:

سے زیادہ تجزیات ودھیا