توضیحی کاملا غیر فنی در مورد نحوه عملکرد LLM (Large Language Model) ها
من اخیراً به واسطه توسعه محصولی جدید در کسب و کار حامیسان ( welink.online ) در مورد هوش مصنوعی تحقیق میکنم و یاد میگیرم. مطمئنم شما هم درگیر بحثهای بیپایان درباره پیامدهای آن، سؤالات اخلاقی که مطرح میکند، جوانب مثبت و منفی آن هستید. با این حال، بحث کمی در میان دوستان غیر فنی من در مورد چگونگی کارکرد هر یک از این چیزها در واقعیت است. به این دلیل است که، از بیرون، مفاهیم دلهره آور به نظر می رسند و ایده درک چگونگی عملکرد مدل های زبان بزرگ (LLM) غیرقابل حل به نظر می رسد.
اما اینطور نیست. هر کسی می تواند آن را درک کند. و این به این دلیل است که اصل اساسی که باعث گسترش و فراگیری امروزی هوش مصنوعی می شود، نسبتاً ساده است.
پس با من کمتر از دو هزار کلمه را تحمل کنید، و من سعی خواهم کرد "بدون یک کلمه فنی یا معادله ریاضی" توضیح دهم که چگونه LLM واقعاً کار می کند.
تصور کنید: در حال پختن شام هستید، اما باید یک غذای جانبی دیگر هم برای سرو تهیه کنید. غذایی که در حال پخت آن هستید از ناکافی بودن رنج میبرد. بنابراین ما به یک جزء دیگر برای افزودن به غذایمان نیاز داریم.
اما گفتن این کار آسان تر از انجام آن است. آنچه انتخاب می کنیم باید با وعده غذایی خوانایی داشته باشد. اگر غذا شور است، آن ما هم باید نمکی یا شور باشد. اگر غذا سالادی است، نباید سالاد دیگری اضافه کنیم. اگر وعده غذایی نشاستهای و سنگین است، شاید بخواهیم کمی سبزیجات گریل اضافه کنیم.
آیا جالب نیست که اپلیکیشنی داشته باشید که فقط به شما بگوید چه چیزی بپزید؟ و نه به صورت تصادفی. شما کافی است تا چیزی که در حال حال درست کردن آن هستید را اعلام کنید، و به شما میگوید غذای جانبی بهینه برای اضافه کردن چیست. این برنامه باید برای هر وعده غذایی، با هر ترکیبی از غذاها و طعم ها، صرف نظر از اینکه به چهار نفر غذا می دهد یا چهل نفر، کار کند.
حالا نحوه ساخت این برنامه را در دو مرحله ساده توضیح میدهیم...
ابتدا، ما می خواهیم بفهمیم که چگونه در مورد هر وعده غذایی به گونه ای فکر کنیم که یک کامپیوتر بتواند آن را بفهمد. از این گذشته ، رایانهها قدرت چشایی ندارند. آنها باید بتوانند مفهومی را که هیچ درک شهودی از آن ندارند (غذا) بپذیرند و آن را به عنوان نوعی داده رمزگذاری کنند که هر چیزی را که ممکن است بر تناسب آن با سایر غذاها تأثیر بگذارد، ثبت کند.
دوم، ما می خواهیم روشی را بیاموزیم تا هر مجموعه ای از غذاهای در حال پخت را ببرد و دیگری را تف کند. این صرفاً آنچه را که قبلاً دیده است حفظ نمی کند. به یاد داشته باشید که این برنامه باید برای هر ترکیبی از ظروف کار کند، حتی آنهایی که هرگز با هم جفت نشده اند. بنابراین ما فقط سیستم را برنامه ریزی نمی کنیم. ما به آن آموزش خواهیم داد.
در قدم اول ما باید به کامپیوتر بیاموزیم که به وعده های غذایی به عنوان داده فکر کند. ما قرار نیست این کار را با گفتن جزییات درباره غذا به او انجام دهیم (مثل اینکه چه طعمی دارد یا چه چیزی با آن تناسب دارد). این نوع قدیمی یادگیری ماشین (Machine Learning) است. بیش از حد محدود کننده؛ بیش از حد مستعد خطا. درعوض، ما فقط دادههای زیادی در مورد انواع غذاهایی که مردم در گذشته برای وعدههای غذایی با هم جفت میکردند به آن میدهیم.
بیایید دو نوع غذا را در نظر بگیریم: مثلاً سالاد سزار و سالاد کاپریس. ما به عنوان انسان می دانیم که این دو ظرف شبیه هم هستند. هر دو ایتالیایی هستند، هر دو سالاد هستند، هر دو حاوی سبزیجات و پنیر هستند... اما برای اینکه کامپیوتر بفهمد این دو غذا چقدر شبیه هم هستند، نیازی به دانستن هیچ یک از موارد بالا ندارد.
بسیار محتمل است که وقتی در میان کوه داده های خود جستجو می کنیم، هر زمان که یک سالاد سزار میبینیم، احتمالاً آن را با سایر غذاهای ایتالیایی همراه می کنیم. و همچنین این احتمال وجود دارد که وقتی آن را می بینیم، سالاد دیگری را در غذا نبینیم. جالب اینجاست که همین را می توان در مورد سالاد کاپریس نیز گفت. آنها معمولاً با سالادهای دیگر ظاهر نمی شوند، اما با غذاهای ایتالیایی ظاهر خواهند شد.
از آنجایی که این دو ظرف اغلب با با غذاهای مشابه همراه می شوند، میتوانیم آنها را به عنوان مشابه دسته بندی کنیم. آنها معمولاً در الگوهای غذایی مشابهی یافت می شوند. ممکن است بگویید "یک غذا پرچمدار گروه خود است"
و این چندان شهودی نیست. توجه داشته باشید که ما به دنبال هیچ وعدهای نبودیم که سالاد سزار و کاپریس کنار هم باشد. آنها هرگز لازم نیست با هم اتفاق بیفتند تا ما غذاها را شبیه به هم بدانیم. به سادگی باید آنها را در کنار غذاهای دیگر پیدا کنیم تا بتوانیم تشخیص دهیم که مردم معمولاً آنها را قابل تعویض و بنابراین کاملاً مشابه هم میدانند.
راه دیگری برای فکر کردن در مورد کاری که انجام دادیم وجود دارد. تصور کنید میخواهیم تمام غذاها را در این نمودار ترسیم کنیم:
برای شروع، ما تمام غذاهای ممکنی را که در داده های خود یافتیم برداشتیم و به صورت تصادفی در نمودار قرار دادیم:
اینجا، ما فقط چهار غذا را برای اهداف توضیحی نشان می دهیم. اما به معنای واقعی کلمه هر غذایی را میتوانید تصور کنید.
اکنون که دادههای خود را بررسی میکنیم، هر بار که دو غذا را پیدا میکنیم که با غذاهای دیگر همزمانی دارند، میتوانیم آنها را به هم نزدیکتر کنیم. همانطور که انواع مختلف سوشی را میبینیم که تمایل دارند با یک مدل سوپ میسو ترکیب شوند، سوشی ها را به سمت یکدیگر حرکت میدهیم و باز هم همانطور که میبینیم پیتزا و اسپاگتی هر دو در کنار نان سیر ظاهر میشوند، اجازه میدهیم آنها هم کنار هم قرار بگیرند:
و پس از چندین بار انجام این کار (و منظورم بارها تکرار) جادو رخ می دهد. ظروف قابل تعویض بسیار نزدیک به هم قرار می گیرند. غذاهایی که تا حدودی قابل تعویض هستند (مثلاً تاکو و بوریتو) به یکدیگر نزدیکتر ظاهر میشوند و غذاهایی که به ندرت قابل تعویض هستند (مثلاً همبرگر و سوشی) دور از هم قرار میگیرند.
در عمل، دو بعد کافی نیست. هر دستپخت و غذای متفاوت با آن باید به اندازه کافی از هم فاصله داشته باشد، به این معنی که راه واقعی برای ترسیم این نمودار در نموداری متشکل از محورهای بسیار بیشتر (صدها، شاید هزاران) خواهد بود. تجسم آن غیرممکن است، اما مفهوم اساسی یکسان است. همه غذاهای خود را پراکنده میکنیم و سپس آنهایی که با غذاهای مشابه همراه می شوند را به هم نزدیکتر میکنیم.
خلاصه بگویم، میخواهم به این نمودار بزرگتر چند محوری به عنوان فضای غذا (Food-Space) اشاره کنم. هر غذای ممکنی در فضای غذا وجود دارد، نشسته در مختصاتی نزدیک به غذاهایی که با آنها قابل تعویض است و از غذاهایی که بسیار متفاوت هستند، فاصله دارد.
یک قدم به عقب برمیداریم، بیایید قبول کنیم که این چقدر جذاب است. ما فقط توانستیم مدل بسیار دقیقی از انواع غذا ارائه کنیم که به موجب آن انواع مشابه با هم گروهبندی میشوند و انواع مختلف از هم فاصله زیادی دارند. و ما این کار را بدون در نظر گرفتن چیزی در مورد طعم غذاها یا اینکه از چه چیزی ساخته شده اند انجام دادیم.
به علاوه، از آنجایی که ما این را روی داده های زیادی آموزش داده ایم، می توانیم کار دیگری هم انجام دهیم. ما قادر به انجام حسابداری غذا (Food Arithmetic) هستیم.
نکته: نمونه ساده Arithmetic در علم ریاضی دنباله ها هستند. به عنوان مثال از آنجایی که دنباله ۳، ۵، ۷، ۹ به واسطه اضافه شدن دو Arithmetic است و همین طور ۱۶، ۱۱، ۶، ۱ به واسطه کم شدن پنج.
فکر میکنید که دیوانه شدم؟ من به شما اطمینان می دهم که خیر دیوانه نشدم. شما باید حرف من را قبول کنید، همانطور که معلوم شد که قرار دادن غذاها در فضای غذای ما تصادفی نیست. در واقع، نه تنها وعده های غذایی مشابه با هم فاصله دارند، بلکه رابطه بین غذاها منطقی است. غذاهای حاوی نان همه با هم در یک صفحه ظاهر میشوند. غذاهای شور روی یک خط مشترک قرار دارند. غذاهایی با طعم افرا هم نوعی پیوند ریاضی دارند.
این به ما اجازه میدهد تا کارهایی مانند این را انجام دهیم: اگر بخواهم مختصات یک بوریتو را بگیرم و مختصات یک تورتیلا را از آن کم کنم، در نهایت نزدیک به نقطه یک کاسه بوریتو (خوراک بوریتو) میشوم. اگر بخواهم مختصات سوپ رشته با مرغ را در نظر بگیرم، مختصات رشته را کم کنم و مختصات برنج را اضافه کنم، در نهایت به نقطه خوراک مرغ با برنج (پلو مرغ) نزدیک می شوم.
حسابداری غذا! 🤯
نکته مهم: قرار دادن وعده های غذایی در فضای غذا دیگر تصادفی نیست. در واقع، الگوهای ریاضی پنهانی وجود دارد به این معنی که هر غذا به روشی منطقی در جایگاهی نسبت به سایر غذاها قرار می گیرد.
بسیار خوب، پس ما فضای غذا را ایجاد کردهایم و به هر نوع غذایی نوعی هماهنگی دادهایم که نسبت به هر غذای دیگری منطقی است. حالا چکار باید کرد؟
خوب، بیایید دوباره مدل خود را آموزش دهیم. فقط این بار، ما به او وعده های غذایی کامل میدهیم (ما در حال صحبت درباره هر وعده غذایی هستیم که تا به حال دیدهایم) و از او می خواهیم الگوهایی را کند. به طور خاص میخواهیم برنامه خود را برای پاسخ به این سؤال آموزش دهیم: اگر یک وعده غذایی حاوی A و B و C باشد، احتمالاً D حاوی چه نوع غذایی است؟
و برای انجام این کار، تنها کاری که باید انجام دهیم این است که برای هر وعده غذایی که در حال آموزش آن هستیم، بپرسیم: در فضای غذا چه شکلی است؟ به عنوان مثال، بگوییم که ما وعدههای غذایی زیادی را میبینیم که غذاهای مشترکی در این چهار قسمت از نمودار دارند:
اکنون میتوانیم صرفاً به مختصات در فضای غذا فکر کنیم و به آن تعمیم دهیم، بدون توجه به اینکه کدام غذاها حتی ما را برای تشخیص این الگو در وهله اول آموزش دادهاند. میتوان نتیجه گرفت که اگر یک وعده غذایی قبلاً شامل غذاهای این سه منطقه باشد، بهترین جزء چهارم در منطقه آخر یافت میشود:
به یاد داشته باشید که "یک غذا پرچمدار گروه خود است" و از آنجایی که مدل ما برای فکر کردن به جای اینکه چه غذاهای خاصی حاوی چه موادی هستند و طعم آنها چیست، استناد به انواع غذاها و روابط بین غذا آموزش دیده است، می تواند هر سناریو و هر ترکیبی از طعم ها را انجام دهد و بهینه ترین غذا را برای افزودن به غذای مورد نظر شما بیابد. با توجه به چند منطقه غذا، فقط باید رایج ترین منطقه ای را که غذای بعدی در آن قرار می گیرد پیدا کند...
...که ما را به هدف اصلی خود که اکنون تکمیل شده است برمیگرداند. ما میخواستیم برنامهای بسازیم که به طور قابل اعتماد به ما بگوید کدام غذاهارا را میتوانیم با مجموعهای از غذاهای دیگر جفت کنیم، و همین کار را کردیم.
پس همه اینها چه ربطی به مدل های LLM دارد؟
به سادگی مفهوم وعدههای غذایی که در یک دستهبندی قرار میگیرند را با جملات جایگزین کنید. و مفهوم غذا در آن وعدههای غذایی را با کلمات جایگزین کنید. این جایگزینی ساده، با همان چارچوب و رویکرد، اساساً شما را به ابزارهای مبتنی بر هوش مصنوعی مولد متنی (Generative text based AI) که امروزه همه با آن آشنا هستیم، میرساند.
مرحله اول: مدلی را برای درک روابط بین کلمات بر اساس تعداد دفعات ظاهر شدن آنها در زمینه های مشابه آموزش دهید. "یک کلمه پرچمدار گروه خود است" حجم زیادی از دادههای نوشته شده توسط انسان را به آن تغذیه کنید (و وقتی میگویم حجم زیاد، اساساً منظورم کل اینترنت است)، و اجازه دهید مختصات کلمه را به درستی تشخیص دهد.
خروجی دیگر فضای غذا نامیده نمی شود. به آن فضای بُرداری می گویند. اما اصول یکسان است. این سیستم از معنای هر کلمه ای آگاهی ندارد (همانطور که از طعم یک غذا آگاهی نداشت). فقط درک می کند که چگونه آن کلمه با هر کلمه دیگری در فضای بُرداری مرتبط است.
مرحله دوم: الگوها را پیدا کنید. اگر جمله ای حاوی کلمات A، B، C باشد، محتمل ترین کلمه بعدی که ظاهر می شود کدام است؟ اگر حاوی مختصات X و Y باشد، باید در کدام ناحیه از فضای بُرداری جستجو کند تا کلمه بعدی را حدس بزند؟
در مورد LLM ها، تنها کاری که آنها واقعاً انجام می دهند همان چیزی است که به عنوان «پیش بینی کلمه بعدی» شناخته می شود (همانطور که قیاس اصلی ما «پیش بینی غذای بعدی» را انجام می دهد). به عنوان مثال، فرض کنید از LLM درخواست کردید: «به من بگو دوستم داری». برای پاسخ به یک سوال در تمام الگوهای خود جستجو می کند: چه کلمه ای به احتمال زیاد از آن دنباله کلمات پیروی می کند؟ یا به شکلی متفاوت بیان می شود: با توجه به مختصات فضای بُرداری کلمات در آن جمله، چه الگوهایی را در جملات دیگر دیده ام تا مشخص کنم کجا می توانم کلمه بعدی را پیدا کنم؟
کلمه بعدی که LLM خواهد یافت «من» است. و پس از تعیین آن، «من» را به انتهای درخواست اصلی شما میچسباند و کل آن چیز را از سمت خودش بازگو میکند. حالا، چه کلمه ای به احتمال زیاد بعد از «به من بگو دوستم داری. من» آمده است؟ "عشق"! آن را بچسبانید، همه چیز را بردارید و دوباره بازگو کنید. آنچه در نتیجه ممکن است اتفاق بیفتد: «به من بگو که دوستم داری... من عاشقتم"…
مفهوم را متوجه شدید.
البته، کمی تفاوت های ظریف وجود دارد. مقداری ریاضیات شیک و محاسبات پیچیده وجود دارد. اما اصول اولیه واقعاً با مواردی که در مثال برنامه ریزی غذا گفتیم تفاوتی ندارند.
برای من، این موضوع روشن می کند که چرا این پدیده هوش مصنوعی که ما در آن زندگی می کنیم بسیار جذاب است. با توجه به اینکه این فناوری چقدر تحول آفرین است، در واقع آنقدرها هم پیچیده نیست. چند مفهوم ساده ریاضی، کلی داده های آموزشی، کمی نمک و فلفل، و حالا برای خود یک ماشین فکر ساخته اید.