# پارت 1 : مهم ترین pre-trained model برای text, را از آغاز بررسی و مقایسه خواهیم کرد.
"یک حلقه تا انتها برای فرمانروایی بر تمامی آنها، یک حلقه تا پیدا کردنشان، یک حلقه تا همه را به هم آوردن، و در تاریکی آنها را به خود متصل کردن."
در این سهگانه، قصد داریم دربارهٔ مدلهای پیشآموزش دیده صحبت کنیم که شباهتهایی به حلقههای قدرت در فیلم ماندگار "ارباب حلقهها" دارند. همانطور که فیلم سهگانه بود، من هم مقاله را به سه بخش تهیه کردهام. همانطور که از فیلم یاد میکنیم، حلقههای قدرت، حلقه الفها و حلقه دورفها وجود داشتند. در این سهگانه، من دربارهٔ مدلهای پیشآموزش دیده که شبیه به حلقههای قدرت از فیلم "ارباب حلقهها" هستند، صحبت خواهم کرد. مقاله به سه بخش تقسیم شده است، به همان شکلی که فیلم بود. حلقههای قدرت، حلقه الفها و حلقه دورفها در فیلم وجود داشتند. به همان ترتیب، مدلهای پیشآموزش دیده شبیه حلقههای قدرت هستند که میتوانند برای ساخت مدلهای هوش مصنوعی استفاده شوند. با ترکیب این مدلها، ما میتوانیم مدلهای چندمنظورهای ایجاد کنیم که ممکن است منجر به توسعه هوش مصنوعی عمومی یا حتی هوش مصنوعی فوق العاده شوند. با این وجود، همانطور که در فیلم است، اگر این مدلها به دستان نادرست بیفتند، ممکن است تهدیدات جدی ایجاد کنند. به همین دلیل مقاله را با عنوان "اربابان حلقهها" نامگذاری کردهام. همراه من در این سفر هیجانانگیز باشید.
این مقاله در 3 پارت در مورد pre-trained model تکمیل خواهد شد که به شرح زیر است:
# پارت 1 : مهم ترین pre-trained model برای text, را از آغاز بررسی و مقایسه خواهیم کرد.
# پارت 2 : بررسی مهم ترین pre-trained model ها در حوزه Image.
# پارت 3 : مهم ترین pre-trained model برای Robotics را از آغاز بررسی و مقایسه خواهیم کرد.
در این سه گانه می خواهیم pre-trained model ها در سه پارت Text ,Image, Robotics بررسی کنیم و مختصری راجع به ایده و چگونگی پیدایش اونها صحبت کنیم و ببینیم که این مدل ها چطور کار می کنند؟ چه معماری دارند ؟ انواع مختلف اونها رو بررسی کنیم. پرقدرت ترین های اونها کدوم ها هستند؟ آیا راز بزرگ و نقطه قوت اصلی LLMs ها همین مدل های pre-trained model و Transformer ها هستند؟ اگر pre-trained model و Transformer نبود الان چت بات قدرتمندی مثل ChatGPT وجود داشت ؟ البته امروزه دیگر چت بات ها فقط در حوزه ی NLP نیستند. مثلا GPT-4 چند وجهی است. چون که فقط محدود به تولید متن نیست. آیا کارکردی شبیه RL دارند؟ برای Robotics چه pre-trained model هایی داریم؟ برای مدل های Multimodal Models کدام ها بهترهستند ؟ آیا pre-trained model ها الان هم فقط برای NLP کاربرد دارن؟ در حوزه Image قدرتمند ترین مدل ها کدام ها هستند؟ برای استفاده از هر کدام از این مدلها چطور آنها را Fine-tuning کنیم یا Hyperparameter Tuning کنیم؟ با من در این 3 گانه همراه باشید تا با هم به این سوالات پاسخ دهیم.
به نظر می آید مهم ترین ویژگی ای که با استفاده از pre-trained model ها می توانیم به دست بیاوریم قابلیت Fine-tuning کردن و Transfer Learning این مدل ها برای تسکی که می خواهیم انجام دهیم است. در واقع Transfer Learning ویژگی بسیار مهمی در Deep learning است و انقلابی که در Deep learningبه وجود آمده و در حال رخ دادن است یکی از پایه های مهم آن Transfer Learning است. می توانیم بگوییم اساس یادگیری در انسان یا حتی موجودات زنده هم همین است. هم اکنون که دارید این متن را می خوانید من در حال انتقال یادگیری خودم در مورد pre-trained model به شما هستم!
بیایید با یک مثال شروع کنیم که موضوع را بهتر درک کنیم. تصور کنید که می خواهید خانه بزرگی را بسازید. دو راه وجود دارد: یک راه این است که از اول شروع به ساختن کنید. خانه را قسمت به قسمت از فندانسون تا نما و همه موارد را مرحله به مرحله بسازید. و برای این کار علاوه بر مصالح وابزارها ماشین آلات و غیره باید خانه را کاملا ضد زلزله بنا کنید. بنابراین علاوه بر هزینه بیشتر نیاز به مهندسی پیچیده تر هم د ارید. حتی امکان دارد آن نتیجه کاملا مطلوب را به دست نیاوریم. راه دوم این است : از تجربه و تخصص شرکتی که سالها در خانه سازی تجربه دارد استفاده کنیم. خانه هایی که این شرکت ساخته اجزای از پیش ساخته شده ماتتد پازل دارد. حتی این قطعات پازل قابل سفارشی سازی هستند! یعنی به نحوی که نمای داخل و خارج ساختمان مطلوب ما طراحی شود. از طرفی مهندسی ساخت به صورتی است که ساختمان کاملا ضد زلزله باشد! در نتیجه هزینه ها و زمان طراحی و اجرای پروژه به شدت کاهش می یابد و خانه ای کاملا ضد زلزله داریم که حاصل سالها تجربه تخصصی در ساخت و ساز خانه است! کدام روش رو انتخاب می کنید ؟!
یکی از دغدغه ها و چاش های بزرگ برای آموزش مدل های مختلف هوش مصنوعی مخصوصا در یادگیری عمیق در گذشته و حال پرهزینه بودن وچالش بعدی چگونگی استفاده از داده های بزرگ و حتی جمع آوری این داده هاست. داده های بزرگ سخت افزار های بسیار پرقدرت و پر هزینه نیاز دارند. از طرفی مجموعه داده های بسیار بزرگ مخصوصا در گذشته مانند اکنون در دسترس نبودند. مفهوم pre-trained برای نخستین بار در سالهای ابتدایی 2010 میلادی مطرح شد. در ابتدا pre-trained model برای پردازش زبان طبیعی (NLP) به وجود آمدند. در واقع می توان گفت یکی از جنبه های مهم رشد LLMs ها pre-trained ها هستند.
یکی از بزرگترین و مهم ترین قابلیت های pre-trained model ها چون که مجموعه ای از weights و biases های اولیه دارند می توان آن ها را برای تسک خاصی به خوبی تنظیم کرد. هیچ مدلی وجود ندارد که 100 درصد دقت را داشته باشد. چون pre-trained model را افراد متخصص تر با ابزارهای دقیق تر و لجستیک قوی می سازند اغلب دقیق تر و کارآمد تر از مدل هایی هستند که شخصی ساخته می شوند.
معروف ترین و پرکاربردترین pre-trained model برای تسک های مهم عبارت است از:
پردازش تصویر( VGG (2014) / ResNet (2015) )
ترجمه ماشینی ( Transformer (2017) / BERT (2018) )
تولید موسیقی ( OpenAI's MuseNet(2019) / Magenta's Music Transformer (2018) )
رباتیک ((Dactyl (2018) / DeepLoco (2018) (
تحلیل احساسات ( BERT (2018) / RoBERTa(2019) )
تشخیص اخبار جعلی (BERT(2018) / GPT-3(2020) )
مفهوم pre-trained model چیه ؟
مفهوم pre-trained model از سالهای ابتدایی توسعه DNN مطرح شده بود، اما نخستین بار که این ایده به صورت رسمی مطرح و مورد توجه قرار گرفت، در زمان توسعه مدلهایی مانند Word2Vec و GloVe بود. می خوایم مختصری راجع به این دو الگوریتم یاد بگیریم و ببینیم pre-trained model اولیه و مخصوصا مدل هایی که برای متن وجود دارد چطور کار می کنن بزن بریم !
زبان اصلی من فارسی است ! من هنوز قادر به درک مستقیم یک متن به زبان چینی نیستم! بنابراین برای فهمیدن آن باید بتوانم اون رو ترجمه کنم.
زبان کامپیوترها اعداد است. بنابراین برای فهماندن مسائل به کامپیوتر باید به زبان اعداد با اون صحبت کنیم. برای فهم داده متنی که به کامپیوتر می دهیم باید داده متنی را به عدد تبدیل کنیم. تکنیک هایی برای آن وجود دارد. یکی از اونها Word Embedding است. در واقع، Word Embedding معمولاً یک نوع مدل عمیق یا شبکه عصبی است که بر اساس توزیع ویژگیهای کلمات در یک مجموعه متنی آموزش داده میشود.
ایده Word Embedding به عنوان یک تکنیک خاص در یک مقاله واحد نبود. مفاهیمی که در نهایت به تکنیک Word Embedding منجر شدند، در طول زمان توسط چندین محقق مختلف مطرح شدند. مفهوم اولیه Word Embedding و اصطلاح "تمثیل ویژگیها" (Feature Representation) در دهه 1980 توسط Geoffrey Hinton مطرح شد، که ایده اصلی را برای تبدیل کلمات به بردارهای چگال بیان می کند. در Word Embedding کلمات را در یک جمله به اعداد رمزگذاری می کنیم و اون ها رو به صورت یک وکتور نمایش می دهیم تا کامپیوتر بتواند آن را ببیند و پردازش کند.
تعبیر واژگانی Word Embedding از معنای کلمات در یک مجموعه متنی استفاده میکند. وقتی که کلمات و ارتباطات معنایی آنها را شناسایی می کند، این اطلاعات را در یک فضای چگال نمایش می دهد. در این فضا، ارتباطات معنایی بین کلمات با فاصلههای چگالی بیان میشوند. به این ترتیب، کلمات با معانی مشابه یا مرتبط، در فضای چگال نزدیک به یکدیگر هستند. در قسمت بعد می خواهیم pre-trained model که برای پردازش متن کاربرد دارند و در اونها از Word Embeddingاستفاده شده است را بررسی کنیم.
مدل Word2Vec
مدل Word2Vec توسط تیم محققین گوگل در مقاله ای Tomas Mikolov ،Kai Chen، Greg Corrado ، Jeffrey Dean در سال 2013 به چاپ رسید.
الگوریتم Word2vec یک تکنیک در NLP است. همانطور که از نامش پیداست برای تولید نمایش برداری (vector representation) از کلمات استفاده میشود. کدی که در زیر می بینید مدل Word2Vec را با استفاده از`gensim.models` که یک زیرماژول از کتابخانه Gensim فراخوانی می کند. و در ادامه آن نحوه تولید vector representation را می بینید.
from gensim.models import Word2Vec
# Example data
sentences = [["this", "is", "a", "sentence"], ["another", "sentence"]]
# Create Word2Vec model
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, workers=4)
# Display word vectors
word_vectors = model.wv
word_vectors_dict = {}
for word in word_vectors.key_to_index:
word_vectors_dict[word] = word_vectors[word]
print(word_vectors_dict)
مدل Word2Vec از Word Embedding به عنوان روشی برای تولید نمایش برداری از کلمات استفاده میکند. هر کلمه با یک بردار اعداد حقیقی (معمولاً اعداد حقیقی 32 یا 64 بیتی) با ابعاد معین که از طریق آموزش مدلهای Word2Vec با دادههای متنی به دست میآیند نگاشت میشود. به نحوی که کلماتی که در متنها مشابه هستند، در فضای برداری نیز نزدیک به هم قرار میگیرند. این نمایش برداری از کلمات باعث می شود که روابط معنایی بین کلمات را در فضای برداری حفظ کنیم. اجزای اصلی یک جمله جز به جز کنار هم قر ار می گیرند و مفهومی را منتقل می کنند حال ممکن است این کلمات اگر در جمله نباشند به تنهایی مفهومی را منتقل نکنند. اما با رابطه ای که در جمله با هم برقرار می کنند معنا و مفهوم پیدا می کند. ما می خواهیم که Word Embedding این کار را برای کامپیوتر ها آسان کند. به عنوان مثال، در فضای برداری Word2Vec، کلماتی مانند "پرنده" و "پر" به دلیل معانی مشابه خود، به هم نزدیکتر هستند. در واقع اگر دو بردار مربوط به این دو کلمه در فضای برداری به هم نزدیک باشند، به این معناست که این دو کلمه مشابه یکدیگر هستند و ارتباط معنایی با هم دارند.
با این ویژگی می توان دانش زبانی را از تسکی به تسک دیگر منتقل کرد. به عبارت دیگر بردارهای آموزش دیده برای یک مجموعه داده خاص را می توان برای مجموعه ی دیگری استفاده کرد. بردارهایی که برای ترجمه ماشینی آموزش دیده شدهاند، ممکن است برای تحلیل احساسات نیز مفید باشند، زیرا معنایی مشابه بین کلمات در این وظایف حفظ شده است. بنابراین، مدل Word2Vec یکی از اولین مدلهایی بود که از این ایده استفاده کرد.
روشهای Word2Vec معمولاً بر اساس مدلهای شبکه عصبی عمیق (DNN) مانند مدلهای skip- gram model و Continuous Bag of Words (CBOW) زیرا که ترتیب کلمات در آن مهم نیست.
مدل CBOW
در مدل CBOW، کلمه مرکزی یا target word توسط مدل پیش بینی می شود. target word معمولا یک کلمه در جمله است که تصادفی انتخاب می شود. مدل با استفاده از کلمات قبل و بعد از target word، سعی میکند آن را پیش بینی کند. مثلا جمله "عشق، چشمان بارانی او را به سوی آسمان آبی انداخت."هدف پیشبینی target word (مثل "عشق") بر اساس کلمات قبل و بعد آن (مثل "چشمان بارانی او را به سوی آسمان آبی") است. به عبارت دیگر، با داشتن کلمات محیطی، الگوریتم سعی میکند target word را پیش بینی کند. در این جمله، ممکن است کلمات "عشق"، "چشمان"، "بارانی"، "او"، "را"، "به" و "سوی" به عنوان ورودیها به الگوریتم داده شوند و هدف، پیشبینی کلمه "آسمان" باشد.
مدل Skip-gram
مدل Skip-gram ، برعکس CBOW است. مدل با استفاده از یک target word، کلمات مجاور آن را پیشبینی می کند. در همان جمله بالا مدل با داشتن target word "آسمان"، الگوریتم سعی میکند کلماتی مانند "عشق"، "چشمان"، "بارانی"، "او" و ... یعنی کلماتی که ممکن است قبل و بعد از آن آمده باشند را پیشبینی کند. به عبارت دیگر مدل به دنبال به دست آوردن بردارهایی برای هر کلمه است که با استفاده از آنها بتواند کلمات مجاور را پیشبینی کند. به تصویر زیر دقت کنید.
مدل CBOW معمولاً در مواردی که متنها نسبتاً بلند و متنوع هستند، موثر است. Skip-gram برای مواردی که متنها کوتاهتر هستند و هدف پیدا کردن الگوهایی از روابط معنایی بین کلمات می باشد مناسب تر است. به طور کلی، مدل skip-gram به دلیل دقت بیشتر در یادگیری بردارهای کلمات، قویتر از مدل CBOW در نظر گرفته میشود. Word2Vec به عنوان پایهای برای بسیاری از LLMها، از جمله GPT-3 و BERT، عمل میکند. البته در حال حاضر، LLMها از روشهای مدرن تر مانند ترنسفورمرزها Transformer (در ادامه همین مقاله به اونها خواهیم پرداخت) برای یادگیری بردارهای کلمات استفاده میکنند. با این حال، Word2Vec هنوز هم به عنوان یک ابزار قدرتمند برای آموزش مدل های بزرگ زبانی LLMها به کار میرود.
مدل GloVe یا Global Vectors for Word Representation از Global Vectors ابداع شده است، مدلی برای نمایش کلمات توزیع شده است. مانند Word2Vec یک روش برای به دست آوردن نمایش برداری از کلمات در فضای برداری است. با این حال، روش محاسبه این بردارها در هر مدل متفاوتاست. مدل GloVe به عنوان یک پروژه open-source توسط University stanford در سال 2014 معرفی شد. این مدل یک الگوریتم unsupervised learning برای به دست آوردن نمایش برداری vector representation با استفاده از اطلاعات آماری مربوط به توزیع کلمات در متنها که شامل احتمالات توزیع کلمات در متون مختلف، ارتباطات معنایی بین کلمات، و ویژگیهای دیگری است که از متون استخراج میشود و برای ساخت بردارهای کلمات مورد استفاده قرار میگیرد.
در GloVe، با استفاده از آمارههای زبانی مانند word-word co-occurrence matrix، احتمالات نسبی ظاهر شدن همزمان دو کلمه با هم در متنها محاسبه میشود. سپس با استفاده از این احتمالات، بردارهای کلمات به نحوی که روابط معنایی بین کلمات حفظ شود بهروزرسانی میشوند.
الگوریتم های GloVe و Word2Vec معمولاً برای یافتن روابط معنایی بین کلمات مثل مترادفها، روابط مانند شرکت - محصول، کد پستی و شهرها و غیره مورد استفاده قرار میگیرند. با این حال، این الگوریتمها ممکن است در شناسایی روابطی مانند هموگرافها ( کلماتی با املای یکسان و معانی متفاوت) موثر نباشند. زیرا به طور معمول توزیع آماری کلماتی که هموگراف هستند، متفاوت است. فرض کنید کلمات "بانک" را معمولا به معنی مکانی برای ذخیره پول (بانک معاملاتی) می شناسیم. اما "بانک" می تواند معنای مکانی برای ذخیره اطلاعات (بانک اطلاعاتی) هم داشته باشد. در این صورت، این دو کلمه "بانک" که اشاره شد هموگراف هستند، یعنی املای یکسان اما معانی متفاوتی دارند.
با این حال، مدلهای Word2Vec به دلیل اینکه مبتنی بر روابط معنایی بین کلمات هستند ممکن است برای شناسایی هموگراف ها موثرتر باشند. با این حال در تشخیص هموگراف ها به رویکردهای ترکیبی یا مدل های پیشرفته تری وجود دارد که قادر به درک معانی متنوع کلمات با املای یکسان باشند.
مورد دیگر بزرگ یا کوچک بودن کلمات است که مدل های GloVe و Word2Vec به حروف بزرگ و کوچک حساس هستند و آنها را به عنوان کلمات متفاوت در نظر می گیرند و به تبع آن، بردارهای متفاوتی برای هر کلمه ایجاد میشود. بنابراین، برای استفاده از این مدلها، بهتر است که همه کلمات در متنها را به یک فرمت خاص تبدیل کنیم، به عبارت دیگر همه حروف را بزرگ یا کوچک کنیم. این کار باعث میشود که مدلها بتوانند به درستی الگوهای معنایی بین کلمات را یاد بگیرند و استفاده از آنها به درستی صورت گیرد. اما این کار ممکن است باعث از دست رفتن اطلاعات معنایی شود. فرض کنید کلمه” US” به معنای ایالات متحده است و اگر با حروف کوچک نوشته شود “us” به معنای ضمیر جمع "ما" می باشد.
البته اینکه تمام کلمات را به فرمت خاصی تبدیل کنیم باعث می شود که مدل ها الگو های معنایی را یاد بگیرند و به درستی عمل کنند. برای رفع مشکل حساسیت مدلهای GloVe و Word2Vec به حروف بزرگ و کوچک، از برخی روشهای پیش پردازش متن استفاده می کنند. روش اول تکنیک stemming که پیشوند و پسوندهای کلمات را حذف می کند تا به ریشهی کلمه برسد و کلمات مشابه به یک شکل استاندارد تبدیل شوند. برای مثال، کلمههای "running", "runs", "ran" و "runner" همگی از یک ریشه یا شکل اصلی یعنی "run" مشتق شدهاند. یکی از تکنیکهای معروف stemming، الگوریتم Porter است که از یک سری قوانین مبتنی بر الگوها برای حذف پسوندهای مختلف و تبدیل کلمات به ریشههای معنادار استفاده میکند. برای مثال، کلمه "cats" به "cat" و "running" به "run" تبدیل میشود.
ابتدا، باید NLTK را نصب کرده و دادههای مورد نیاز برای stemming را دانلود کنیم. سپس با استفاده از کد python ی زیر، میتوانیم تکنیک stemming را اعمال کنیم:
import nltk
from nltk.stem import PorterStemmer
# Download necessary data for stemming
nltk.download('punkt')
# Create an instance of PorterStemmer class
stemmer = PorterStemmer()
# Words to be stemmed
words = ["running", "runs", "ran", "runner", "cats", "cat"]
# Stemming words and printing results
for word in words:
stemmed_word = stemmer.stem(word)
print(f"{word} -> {stemmed_word}")
این کد به ترتیب کلمات "running", "runs", "ran", "runner", "cats" و "cat" را به ریشههای معنادار تبدیل میکند و نتایج را چاپ میکند.
running -> run
runs -> run
ran -> ran
runner -> runner
cats -> cat
cat -> cat
[nltk_data] Downloading package punkt to /root/nltk_data...
[nltk_data] Package punkt is already up-to-date!
روش دوم lemmatization که کلمات به شکل پایه یا لغت اصلی آنها تبدیل میشوند. در کد زیر مانند روش stemming از کتابخانه NLTK استفاده می کنیم. با این تفاوت اساسی که با متد مهمی مانند `nltk.download('wordnet')` دادههای مورد نیاز دانلود میشود. یک نمونه از کلاسی مهمی مانند `WordNetLemmatizer` می سازیم و این کلاس برای انجام عملیات lemmatization استفاده میشود. سپس کلماتی که قرار است lemmatized شوند در لیست `words` قرار می گیرند. سپس با استفاده از یک حلقه `for`، هر کلمه از لیست `words` گرفته شده و با استفاده از متد مهمی مانند `lemmatize` کلاس `WordNetLemmatizer` lemmatized میشود.
import nltk
from nltk.stem import WordNetLemmatizer
# Download necessary data for lemmatization
nltk.download('wordnet')
# Create an instance of WordNetLemmatizer class
lemmatizer = WordNetLemmatizer()
# Words to be lemmatized
words = ["running", "cats", "ate", "flying", "better"]
# Lemmatizing words and printing results
for word in words:
lemmatized_word = lemmatizer.lemmatize(word)
print(f"{word} -> {lemmatized_word}")
بعد از اجرای کد بالا نتیجه lemmatization هر کلمه به همراه خود کلمه اصلی به صورت یک جمله چاپ میشود. برای مثال، اگر کلمه "running" به عنوان ورودی داده شود، خروجی این عملیات "running" خواهد بود، زیرا کلمه "running" به عنوان یک فعل برگرفته از ریشه "run" در نظر گرفته میشود.
[nltk_data] Downloading package wordnet to /root/nltk_data...
running -> running
cats -> cat
ate -> ate
flying -> flying
better -> better
این روشها باعث میشوند که تمامی اشکال مختلف یک کلمه به یک شکل استاندارد تبدیل شوند و حساسیت به حروف بزرگ و کوچک کاهش یابد. با استفاده از این روشها، تمام کلمات به یک فرمت استاندارد تبدیل میشوند و حروف بزرگ و کوچک دیگر تفاوتی در نتیجهی تحلیل متن ایجاد نمیکنند. نکته قابل توجه این است که در یک مدل چونکه این دو روش به دو رویکرد متفاوت برای کاهش کلمات به شکل استاندارد میپردازند. بسته به نوع مسئله و اهداف آن می توان همزمان از هر دوتکنیک بسیار مهم stemming و lemmatization استفاده کرد. البته ممکن است منجر به افزایش پیچیدگی و کاهش کارایی در پردازش متن شود.
الگوریتمهای مانند GloVe و Word2Vec مدلهای Word Embedding بر اساس متن هستند و تنها به عنوان یکی از مراحل پیشپردازش متن و نمایش کلمات در مدلهایی مانند BERT و GPT به عنوان ورودی استفاده میشوند، اما خود به عنوان یک قسمت اصلی از این مدلها استفاده نمیشوند. برای مدلهای مانند BERT و GPT که به Pre-trained Language Models شناخته میشوند. این مدلها با استفاده از شبکههای Transformer ، به صورت Pre-trained و در مسائلی مانند ترجمه ماشینی، تولید متن، پرسش و پاسخ و مسائل پردازش زبان طبیعی عملکرد خوبی از خود نشان میدهند. در قسمت بعد به بررسی آنها خواهیم پرداخت. با من همراه باشید.
مدل های GloVe و Word2Vec دو مدل اولیه برای NLP بودند. در سال های بعد به وسیله مدل های pre-trained model مانند BERT، GPT-3 و RoBERTa ارائه شدند که بر پایه تبدیل متنی با Attention هستند و امروزه محبوبیت و کارایی بیشتری دارند. در سال 2017 مقاله ای منتشر شد و NLP را به طور جدی دستخوش تغییر و تحول قرار داد. شاید نویسندگان آن مقاله در زمان نوشتار آن تصور نمی کردند که این مقاله بتواندNLP را دگرگون کند. مقاله معروف " Attention is All You Need".
می توان گفت مکانیزم Attention یکی از ستون های اصلی و قدرتمند LLMs هست. در واقع مفهموم توجه Attention در یادگیری عمیق و مخصوصا در NLP برای بهبود RNN هاست تا بتوانیم دنبالهها یا جملات طولانیتر را بهتر مدیریت کنیم. مدلهای pre-trained مانند BERT، GPT-3، از ایدههای اولیه الهام گرفته و به شکلهای مختلفی گسترش یافتهاند. به عنوان مثال، BERT از ایده Attention استفاده میکند و GPT-3 از Self-Attention Models استفاده میکند. مدل GPT-3 از معماری ترنسفورمرها Transformer هم استفاده می کند که در اصل برای Self-Attention Models طراحی شده است.
مکانیزم Self-Attention بر خلاف RNNs ها که دادههای ورودی را به صورت متوالی پردازش میکنند یعنی هر ورودی (مانند کلمه در یک جمله)، در زمان مشخصی به صورت متوالی با وزنهایی مشخص، به نودهای شبکه منتقل میشود. در این روش، ارتباط بین کلمات به صورت زمانی (یا متوالی) در نظر گرفته میشود و وابستگیها در طول زمان به صورت پشت سر هم بررسی میشوند یا در معماری های CNNs، ویژگیهای مختلف دادههای ورودی با استفاده از فیلترهای کانولوشنی از آنها استخراج میشوند. در این روش، فیلترها به طور مستقل و بدون توجه به وابستگیهای زمانی اجزای مختلف دادههای ورودی را پردازش میکنند و اطلاعات مکانی (اطلاعاتی مربوط به مکان در دادهها) را در نظر میگیرند.
مکانیزم Self-Attention میتواند وابستگیها و ارتباطات بلند مدت بین کلمات در یک جمله را به طور موثرتری ضبط کند. نکته اصلی Self-Attention Models ، مکانیسم توجه به خود است که به هر کلمه در یک دنباله این امکان را میدهد که به همه کلمات دیگر همزمانتوجه کند و بر اساس اهمیت آنها برای یک وظیفه خاص نمایشهای وزندار بسازد. به عبارت دیگر، هر کلمه در جمله با توجه به تمام کلمات دیگر، نقش و اهمیت خود را مشخص میکند. این روش به مدل امکان میدهد تا روابط بین کلمات را به صورت بلند مدت و در تمام طول جمله در نظر بگیرد، بدون اینکه به ترتیب خاصی از کلمات بستگی داشته باشد. به عبارت دیگر Self-Attention Models با ارائه ابزارهای قدرتمندی برای ضبط الگوهای پیچیده در دادههای متنی NLP را به طور قابل توجهی تغییر دادهاند.
می توانیم از BERT، GPT برای انجام تسک های مختلف از جمله ساختن LLMs ها استفاده کرد. این دو به عنوان مدلهای pre-trained بسیار موفق برای پردازش زبان طبیعی شناخته شدهاند. برای ساختن یک LLM می توانیم از دادههای متنی بزرگ برای آموزش مدل استفاده کنیم. با انتقال این دادهها و آموزش مدل بر روی آنها، میتوانیم یک LLM سفارشی و با تواناییهای خاص برای پردازش زبان طبیعی ایجاد کنیم.
برای استفاده از این مدلها، معمولاً مدل خام را در اختیار داریم که شامل معماری و وزنهای متناظر با آن است. اما برای استفاده موثر از این مدلها برای وظایف خاص، میتوانیم آنها را با دادههای خودمان فاین تیونینگ( Fine-tuning ) کنیم. این کار بهبود عملکرد مدل برای وظایف خاص را فراهم میکند و تصور کنید که به چه میزان می تواند هزینه ساختن یک LLM را کاهش دهد. به طور مثال اگر بخواهیم از مدل GPT به عنوان یک مدل pre-trained برای پردازش زبان طبیعی استفاده کنیم. کافی است با اجرای کد زیر می توانیم مدل GPT را در اختیار بگیریم. کتابخانه transformers توسط شرکت Hugging Face توصعه داده شده و برای استفاده از اکثر pre-trained model برای پردازش زبان طبیعی (NLP) مانند DistilGPT-2، BERT، RoBERTa، DistilBERT، XLNet نیز می توانیم از همین کد استفاده کنیم.
در کد های زیر از مدل DistilGPT-2 برای تولید متن به دو روش مختلف استفاده میشود این کد ها از سایت huggingface گرفته شده است:
# With pipeline, just specify the task and the model id from the Hub.
from transformers import pipeline
pipe = pipeline("text-generation", model="distilgpt2")
در روش اول، از کلاس pipeline که در کتابخانه transformers وجود دارد، کلاس Pipeline برای استفاده سریع و آسان از pre-trainedmodel بدون نیاز به تعریف و ساختار مدل برای وظایف مختلف مانند ترجمه متن، تولید متن، تشخیص انواع متنها و غیره را انجام دهد. در این حالت، کافی است نوع تسک "text-generation" و مدل مورد استفاده model="distilgpt2 مشخص شود. کد زیر روش دوم را شرح می دهد.
# If you want more control, you will need to define the tokenizer and model.
from transformers import AutoTokenizer, AutoModelForCausalLM
tokenizer = AutoTokenizer.from_pretrained("distilgpt2")
model =AutoModelForCausalLM.from_pretrained("distilgpt2")
در روش دوم، ابتدا از کلاس AutoTokenizer برای بارگیری tokenizer استفاده میشود. سپس با استفاده از متد from_pretrained، tokenizer مربوط به مدل DistilGPT-2 بارگیری میشود. در مرحله بعدی، از کلاس AutoModelForCausalLM برای بارگیری مدل استفاده میشود. این روش برای افرادی است که نیاز به کنترل بیشتری بر روی مدل و tokenizer دارند.
بعد از اجرای هر کدام از این کدها pre-trained model را در اختیار داریم حال با استفاده از کد زیر می توانیم متنی را به مدل بدهیم و نمایش بردار ویژگیهای متن را ببینیم:
import torch
# Define your input text
input_text = "Love, her rain-filled eyes towards the blue sky."
# Tokenize the input text
input_ids = tokenizer.encode(input_text, return_tensors="pt")
# Get the model's output logits
with torch.no_grad():
outputs = model(input_ids)
logits = outputs.logits
# Print the shape of the output logits
print("Output logits shape:", logits.shape)
بعد از اجرای کد های بالا خروجی به صورت زیر است:
Output logits shape: torch.Size([1, 12, 50257])
خروجی logits که از مدل DistilGPT-2 بدست آمده است، یک tensor با ابعادی به
شکل `(batch_size, sequence_length, vocab_size)` است. بنابراین، ابعاد [1, 12, 50257] به معنای این است که برای نمونهی ورودی ما، مدل یک خروجی با طول توالی 12 و اندازه واژگان 50257 تولید کرده است.
در کد های بالا از PyTorch استفاده شده است. در واقع pre-trained model هایی که با استفاده از کتابخانههای TensorFlow و PyTorch ساخته شدهاند، در اصل معماری یکسانی دارند. اما، تفاوتهایی در استفاده از آنها وجود دارد.
در TensorFlow، مدلها به عنوان گراف محاسباتی تعریف میشوند و توابع مخصوص برای آموزش و استفاده از مدلها وجود دارد معمولاً از یک API سطح بالا (Keras و tf.keras) برای ساختن و آموزش مدلها استفاده میشود. اما در PyTorch، مدلها به صورت ماژول تعریف میشوند که به صورت مستقیم میتوانید آنها را با استفاده از توابع Pythonمدیریت کنید. همچنین رابط کاربری (API) اصلی برای ساخت و آموزش مدلها خود PyTorch است.
تا این قسمت از مقاله راجع به انواع pre-trained model مربوط به Text صحبت کردیم و ساختار آنها رو برررسی کردیم. حال برای استفاده از آنها روی Dataset ی که داریم و برای تسک خاصی که می خواهیم انجام دهیم باید مدل را Fine-tuning کنیم. یک مفهوم مهم در آموزش مدل های عمیق مخصوصا مدلهایی که از یادگیری انتقالی استفاده میکنند. به این صورت است که pre-trained model که روی یک مجموعه داده بزرگ آموزش دیده است با استفاده از Dataset که برای تسک خودمان داریم تنظیم کنیم. برای این کار معمولا لایه های آخر مدل را فریز می کنیم و فقط وزنهای لایههای پایینتر قابل بهینهسازی هستند. این فرآیند به مدل اجازه میدهد تا الگوهای خاص به مجموعه داده کوچکتر را یاد بگیرد، در حالی که از الگوهای عمیق کلی که در مجموعه داده بزرگتر آموزش دیده شدهاند، بهرهمند میشود.
مدل های pre-trained زیادی وجد دارد. ابتدا یک مدل مناسب انتخاب می کنیم و تمام مراحلی که در بالا گفته شد شامل تطبیق پارامترهای آن با داده های جدید و در عین حال حفظ دانش آموخته شده در طول آموزش انتخاب یک معماری مناسب، تعریف تابع هدف ویژه کار، تهیه مجموعه داده، مقداردهی اولیه مدل با وزنهای از پیش آموزشدیده، و تنظیم دقیق پارامترها از طریق بهینهسازی تکراری است. تکنیک هایی مانند یادگیری انتقال، تنظیم فراپارامترها و PEFT (تنظیم دقیق کارآمد پارامترها) محوری هستند. روش های منظم سازی و تنظیم هایپرپارامتر عملکرد را بهینه می کند. بعد از انجام مراحل بالا معیاری برای ارزیابی عملکرد مدل Fine-tuned را انتخاب میکنیم، مانند دقت، فراخوانی، یا هر معیار دیگری که برای مسئله مورد نظر مناسب است. سپس مدل را بر روی دادههای آمادهشده(دیتاست خودمان ) Fine-tuning می کنیم. در این مرحله، معمولاً از یک مرحلهبهمرحله (epoch-by-epoch) و یا batch-by-batch استفاده میشود و مقادیر توابع هدف (مانند تابع خطا) محاسبه میشوند و پارامترهای مدل بهروزرسانی میشوند. سپس مدل Fine-tuned را بر روی دادههای ارزیابی ارزیابی میکنیم و معیارهای ارزیابی را محاسبه میکنیم تا به عملکرد نهایی مدل برسیم.
به علت اینکه مقاله بسیار طولانی تر می شود از کد برای توضیح Fine-tuned استفاده نکردم اما در آینده ای نزدیک حتما در یک مقاله دیگر مرحله به مرحله با استفاده از یک pre-trained model برای text دیتاستی را انتخاب میکنم و مرحله به مرحله انجام آن را با هم یاد خواهیم گرفت.
در پارت 1 مقاله راجع به اصلی ترین pre-trained model های Textصحبت کردیم و اینکه این مدل ها از چه زمانی ارائه شدند و در کد هم مشاهده کردیم که این مدل ها چقدر می توانند مفید باشند . همانطور که می دانیم امروزه LLMs ها تقریبا به قسمتی از زندگی روزمره ما تبدیل شده اند و به سرعت در حال پیشرفت و بهبود هستند و در آینده ای نه چندان دور این مدل ها به دستیارهای شخصی برای ما تبدیل خواهند شد و حتی شاید اهمیت موتورهای جستجو به تدریج کمرنگ تر شود. همچنین دیدیم که یکی از موارد پر اهمیت برای استفاده بهینه از این مدل ها Fine-tuningکردن مدل برای انجام هر چه بهتر تسکی است که می خواهیم انجام دهیم. در پارت 2 به سراغ pre-trained model های مهم برای Image خواهیم رفت و مهم ترین آنها را از آغاز تا الان به صورت مقایسه ای بررسی خواهیم کرد. تا هر چه بیشتر اهمیت این مدل ها برای ما روشن تر شود. پارت 2 بزودی منتشر خواهد شد و از شما درخواست می کنم آن را هم ببینید و منتظر نظرات شما هستم.
ممنون از شما که در این سفر با من همراه بوده و هستید.
ممنون از شما که در این سفر به دنیای Deeps با من همراه بودید.
لینک پارت 1 به انگلیسی در Medium
# پارت 1 : مهم ترین pre-trained model برای text, را از آغاز بررسی و مقایسه خواهیم کرد.
# پارت 2 : بررسی مهم ترین pre-trained model ها در حوزه Image.
# پارت 3 : مهم ترین pre-trained model برای Robotics را از آغاز بررسی و مقایسه خواهیم کرد.
پارت 3 : انواع مهم ترین معماری های شبکه های عصبی عمیق (RNN / LSTM / CNN )
لطفا اگر مایل بودید مقاله دیگر من " مرحله به مرحله برای ساختن یک شبکه عصبی مصنوعی و دیدن چگونگی رخ دادن overfitting با MNIST و معماری CNN" رو در ویرگول ببینید .
ساخت موسیقی با هوش مصنوعی چگونه شکل گرفت و چطور انجام میشود؟
امیدوارم از مطالب لذت برده باشید .