با تأخیر خیلی زیاد دوباره اومدم با هم به کتاب الگوریتم اصلی سر بزنیم و ببینیم نویسنده چی برامون داره.
اگر خاطرتون باشه تو قسمتهای قبل گفتیم یادگیری ماشین قبایل مختلفی دارند. قسمت قبلی هم راجع به الگوریتمهای درختی صحبت کردیم. تو این قسمت هم میخوایم به یادگیری عمیق بپردازیم و به سؤالات زیر پاسخ بدیم:
- سیستمهای یادگیری عمیق چطوری دادهها رو ذخیره میکنند و ارتباطشون با مغز ما چیه؟
- زمستان هوش مصنوعی چرا شکل گرفت؟
- این سیستمها با چه موانعی شروع شدند؟
- و چی باعث شد که دوباره اوج بگیرند؟
(تو لینک پست این قسمت، چند تا ویدئوی جالب هم وجود داره که با هوشمصنوعی درست کردم. یه سری بهش بزنید. جالبه).
اگر خاطرتون باشه تو قسمت ششم هم قدری راجع به یادگیری عمیق صحبت کردیم. اونجا بیشتر نظر و دید خودم رو گفتم. اینجا با دید نویسنده کتاب هم آشنا میشیم.
شنیدن اپیزود
همه اپیزودهای این پادکست تو کانال کست باکس منتشر میشه و البته میتونید از جاهای دیگه هم بشنوید.اینجا هم میتونید فایل صوتی این قسمت رو گوش بدید:
موارد تولید شده هوش مصنوعی
Link to Videos:
مدلسازی Perceptron
قبلش بگم که برای تهیه این اپیزود خیلی زیاد از هوش مصنوعی کمک گرفتم. علیالخصوص Notebook LM گوگل خیلی بهم کمک کرد و اخیراً خیلی ویژگیهای کاملی به خودش اضافه کرده.
برای تولید این قسمت هم اینطوری ازش کمک گرفتم که بهش گفتم برام از این فصل کتاب پادکست و ویدئو درست کنه (البته به زبان انگلیسی) و واقعیتش انقدر قشنگ درست کرد که جفتش رو براتون تو همین پست مربوط به پادکست منتشر کردم.
اصلاً بخشی از علتی که چند وقتی اپیزود ندادم همین بود. جدای از این که مدتی درگیر اسبابکشی بودم، داشتم فکر میکردم که کار من چه ارزشی ایجاد میکنه؟
به نظرم فعلاً نکتهاش اینه که همونطور که قسمت اول هم گفتم کتاب رو با فیلتر من میشنوید؛ یعنی اون بخشهایی که خودم دوست دارم رو میام هایلایت میکنم و جوری که خودم دوست دارم روایت میکنم. و اگر سلیقه خودم رو از این وسط حذف کنم، عملاً دیگه هیچ هویتی برای اینجا وجود نداره.
اگر خاطرتون باشه قسمت قبل راجع به سیستمهای یادگیری مبتنی بر درخت صحبت کردیم. سیستمهایی که شبیه ترکیب یک سری گیت منطقی هستند. با این تفاوت که گیتهای منطقی ما خروجیشون میتونه احتمال باشه و لزوماً قطعی نیست. سیستمهایی که مثل ترکیب یک سری AND و OR ساخته شدند.
اما روشهای یادگیری عمیق متفاوت هستند. شبیهترین چیزی که ازشون ایده گرفتن، مغز انسانه. ایدهشون این بوده که مدلی درست کنند که مثل مغز ما فکر کنه و از این روش بتونند هوش ما رو هم تقلید کنند.
تو مدلسازی یادگیری عمیق از مغز، اکثر اطلاعات در لینکها ذخیره میشن نه در خود نورونها. انگار اون بخش لینک بین نورونها خیلی مهمتره. مغز ما اینطور نیست که یک سری فولدر داخلش داشته باشه و مثلاً یک فولدر با نام خانه ذخیره شده باشه که دادههای مربوط به خانه داخلش باشه.
مثال بخوام بزنم یاد الگوریتم گوگل میافتم. الگوریتم اولیه گوگل هم برخلاف بقیه سیستمهای سرچ اون زمان، اومده از لینکها استفاده کرده. یعنی مهمترین چیز رو این نکته در نظر گرفته که چه کسانی به سایت لینک دادن و اون به چه کسانی لینک داده.
اگر بخوام تو سیستمهای مدیریت دانش هم مثال بزنم یاد روش Zettelkasten میافتم. روشی که طبق گفته خود نیکلاس لومن، اون رو به یکی از پرخروجیترین آدمهای عصر خودش تبدیل کرد. من یک زمانی وقت گذاشته بودم و بسیار از سیستم نوتبرداریاش لذت بردم. ایده اصلیش همین لینک هست. این که نیازی به فولدرهای تو در تو و پیچیده نیست و همه چیز با لینک قابل مدیریتکردن هست. اگر فرصت کردید به نظرم ارزشش رو داره یک زمانی برای یادگیری این روش بگذارید. خیلی جالبه و به شدت مقیاسپذیر. و انقدر مقیاسپذیر هست که کل اینترنت با همین روش مدیریت شده.
خلاصه ایده اصلی مدلسازیشون این بود که نورونهایی که با هم فعال میشن، به مرور به هم وصل میشن.
Neurons that fire together, wire together.
و این کار به مرور حافظه رو شکل میده. ایده اینه که هر چقدر از یک مسیر بیشتر استفاده بشه، اون مسیر قویتر میشه. انگار اطلاعات در مغز ما مثل کامپیوتر بصورت فولدر ذخیره نمیشه. بلکه یک عالمه سلول با هم یک مفهوم (یا Concept) رو نشون میدن (چیزی که بهش Cell Assembly میگن).
و اینجا شاید یکی از مهمترین تفاوتهای مغز ما و کامپیوتر توان مصرفی میشه. مغز ما معادل یه لامپ انرژی مصرف میکنه و در مقابل کامپیوتر کم مصرف حساب میشه. ولی تعداد اتصالاتش چند برابر کامپیوتره.
از بحث خارج نشیم. هر کدوم از نورون مغز ما چند تا واحد دارن: دندریت و واحد پردازنده و آکسون.
دندیریت ورودی سلول هست. سیگنالهای الکتروشیمیایی از دندریت وارد میشن و در جسم سلول جمع و فیلتر میشن. و اگر مجموع اون از آستانهای بیشتر بشن، یه پالس از آکسون خارج میشه.
بالاخره مدلسازیشون از سلول به این شکل بوده. با الهام از همین مدلسازی هم اومدند Perceptron رو درست کردند. یعنی گفتند که:
$$ y = \begin{cases} 1, & \text{if } \displaystyle \sum_{i=1}^{n} w_i x_i + b > 0 \ 0, & \text{otherwise} \end{cases} $$
اینجا یک سری ورودی به نام x داریم که در وزنهامون ضرب میشن. اگر از حد آستانه بزرگتر بشن، خروجی فعال میشه. به همین سادگی.
این روش مدلسازیشون بود. الگوریتم یادگیری وزنهاشون هم بر اساس سعی و خطا بود. اگر پیشبینی مدل درست بود، وزنها نیازی به آپدیت نداشتند. ولی اگر پیشبینی مدل غلط بود، با یک فرمولی وزنها رو اپدیت میکردند. و به مرور زمان میتونستیم چیزهای مختلف رو تشخیص بدیم.
این چیزی بود که تحت عنوان Perceptron شناخته شد. این مدل رو حتی بصورت کاملاً سختافزاری پیادهسازی کردند و موفقیتهایی هم داشت.
اما این موفقیتها با کتابی که میسنکی و همکارانش نوشتند، کاملاً به حاشیه رفت. تو این کتابها نشون دادند که مدل Perceptron ذاتاً نمیتونه مسائلی که با خط نمیشه جدا کرد، حل کنه.
هیچ راهی هم مورد تصورشون نبود که بتونند از این مخصمه دربیان. شاید الان به نظرمون ساده بیاد اما اضافهکردن لایه هم عملی نبود؛ چون الگوریتم یادگیریاش رو بلد نبودیم.
این بود که دورهای که تحت عنوان «زمستان هوش مصنوعی» میشناسند، پدید اومد. و بودجه هوش مصنوعی کم شد. اتفاقی که به نظر خیلیها بعد از LLMها هم ممکنه دوباره اتفاق بیفته.
میدونیم الان مدلهای یادگیری عمیق خیلی متداول هستن. سؤال اینه که چی شد که دوباره Deep Learning رونق گرفت؟
رونق دوباره یادگیری عمیق
این سؤال برای خودم هم مدتها مطرح بود که نکته الگوریتمهای یادگیری عمیق کجاست که تا ۲۰۱۰ چندان سر و صدا نداشت و کمتر کسی روش کار میکرد؟
یکی از پیشرفتها، پیشرفت تو مدلسازیمون بود. این که ورودیها رو ضربدر یک وزنی میکنیم و با هم جمع میکنیم، عالیه. اما چرا فقط خروجی صفر و یک میدیم؟ اولین ایده مربوط به اینجا بود که خروجی باینری نباشه و تابع نسبتآ پیچیدهتری باشه که بین صفر و یک خروجی بده!
تابعی که او معرفی کرده تابعی به نام Sigmoid هست و خواص ریاضی جالبی داره. اما الان میدونیم که از توابع خیلی زیادی میشد استفاده کرد. همین که خروجیمون صفر و یک نباشه و تابعمون غیرخطی باشه کافیه.
این تابع سیگموید هم خیلی جالبه. اگر بخواید تو ذهنتون تصور کنید، میتونید یه پله رو تصور کنید که گوشههاش نرم شده. یا مثل یه S کشیده میشه تصورش کرد. تو طبیعت هم خروجی صفر و یک متداول نیست.
مشکل از اینجاست که وقتی چند تا تابع خطی رو با هم ترکیب کنیم، هیچوقت نمیتونیم تابع غیرخطی رو مدل کنیم. پس مدلسازیمون ذاتاً محدودیت داره.
ولی اگر مثلاً یکی درمیون یه تابع غیرخطی هم اضافه کنیم و با هم ترکیب کنیم، میتونیم هر تابعی دوست داریم رو مدل کنیم. پس یه تابع خطی و یه تابع غیرخطی رو پشت سر هم میگذاریم و بهش میگیم لایه. اگر این لایهها از چند تا بیشتر بشه، میشه شبکه عمیق! میگن بیشتر سه تا باشه عمیق هست ولی در عمل به راحتی بیشتر از ۱۰۰ لایه هم میرن.
نکته دوم این بود که از ترکیب الگوریتم Back-propagation (فارسیاش میشه انتشار رو به عقب) و Gradient Descent (گرادیان کاهشی) استفاده کردند.
هر کدوم از این توابع خطی و غیرخطی یک سری وزن دارند. یک سری مقدار که با هم ضرب و جمع میشن و نهایتاً خروجی ما رو تشکیل میدن. حالا سؤال اینه که وقتی خروجی اشتباهه کدوم وزن یا وزنها اشتباه بوده؟ و هر کدوم چقدر اشتباه بوده؟ و چقدر وزن رو تصحیح کنیم؟
اگر بهش فکر کنید واقعاً کار بزرگی هست. یک شبکه یادگیری عمیق داریم با صدها میلیون وزن. حالا به جای اسب اشتباهی گربه تشخیص داده. کدوم وزنها رو تغییر بدیم و هر کدوم رو چقدر تغییر بدیم که اشتباهش به مرور تصحیح بشه؟
مثال بزنم. فکر کنید که تو یک کوه چشمتون رو بستن و میخواید برید پایین. تو هر نقطه از شیب اون نقطه میتونید حدس بزنید که کدوم سمت پایین میره. و همینطور بر مبنای شیب میرید پایین تا انشاءالله به پایین کوه برسید. واقعاً هم ممکنه برسید. ولی تا وقتی چشمتون بسته است ممکنه تو یه چاله محلی گیر کنید و فکر کنید که دیگه پایینتر نمیشه رفت.
این الگوریتمها هم همین کار رو میکنند. اول الگوریتم Back Propagation میاد به ازای هر وزن، حساب میکنه که مشتق خطاش چقدره؟ بخوام با استعاره خودمون بگم میشه تو کوهنوردی میگه که شیب هر نقطه چقدره.
از اون جاهایی بود که من تازه به مشتق ایمان آوردم! یکی از سؤالات من تو دوره دبیرستان همیشه این بود که حالا این مشتقها به چه دردی میخورن و اینجا یکی از زیباترین کاربردهای مشتق تو ابعاد بالا رو میشه دید.
خیلی زیباست. از آخرین لایه شروع میکنه و با قاعده مشتق زنجیری، میگه مشتق خطا نسبت به هر کدوم از وزنها چقدره. خلاصه این الگوریتم اینه که میگه هر کدوم از وزنها چقدر در اشتباهبودن خروجی نقش داشتند.
بعد سؤال اینه که چقدر و چطوری این وزنها رو آپدیت کنیم؟ اینجا از گرادیان کاهشی استفاده میکنیم. تو ذهنتون اگر یک نمودار U شکل تصور کنید، جاهایی که شیب زیاده راحتتر و زیادتر میتونیم بیایم پایین ولی هر چی مشتق کمتر بشه و به صفر نزدیکتر بشه، قدمها رو کوتاهتر برمیداریم.
اگر بخوام دقیق بگم، الگوریتم back propagation مشتق به ازای هر نقطه رو میده که میشه شیب پای شما تو کوهنوردی. الگوریتم گرادیان کاهشی هم میگه بر مبنای شیب پاتون چقدر به سمت چپ و راست، جلو و عقب برید که بتونید برید پایین.
ولی خب اگر دقیق نفهمیدید، تعجب نکنید. یه کورس دیپلرنینگ هست که ساعتها میشینن سر این جزئیات بحث میکنند و چیزی نیست که اینجا بشه توضیح داد.
جالب این که مقالهای که برای بار اول راجع به Back-Propagation در سال ۱۹۸۰ نوشته شده بود، توسط داورین رد شد؛ چون که مینسکی و همکاران نشون داده بودند که کار نمیکنه. ول کنید دیگه.
اصلاً یکی دیگه از گیرهای مینسکی و همکاران این بود که که چطوری میخوایم تضمین کنیم که تو الگوریتم گرادیان کاهشی در فضای چندبعدی (شاید هزاران بعدی) توی بهینه محلی گیر نکنیم؟
و این سؤالی هست که الگوریتمهای یادگیری عمیق امروز هنوز هم جوابی براش ندارن. مسئله اینه که تضمین نمیکنیم :)) و مسئله حل میشه.
مسئله اونها این بود که میخواستند اثبات کنند و خب اثبات نمیشه کرد شما با چشم بسته بتونی حتماً در اون فضا نقطه بهینه کامل رو پیدا کنی. اصلاً نیازی نیست. خیلی وقتها بهینه محلی کار ما رو راه میاندازه و تا الان که حداقل راه انداخته.
از نظر ریاضی هم بهش نگاه کنید تو ۳ بعد خیلی راحت میشه که تو بهینه محلی گیر کرد. اما وقتی چند میلیون بعد داریم (که تو مسائل یادگیری ماشین عجیب نیست)، بالاخره تو یکی از بعدها میشه پایین رفت و از بهینه محلی فرار کرد. ولی خب حرف نویسنده اینه که حالا همچین بهینه محلی لزوماً چیز بدی هم نیست.
نکته سوم هم بحث GPU بود. تا قبل از اون محاسباتی که انجام میدادیم همگی روی CPU بودند ولی نبوغ پدران یادگیری عمیق بود که گفتن بیایم از GPU که برای بازی استفاده میشه برای آموزش مدل استفاده کنیم.
الان شاید برامون خیلی بدیهی باشه. GPU برای محاسبات ماتریسی بسیار سریعه و دقیقاً برای این قضیه ساخته شده. چیزی که تو بازی و کارهای گرافیکی خیلی لازم میشه. یادگیری ماشین هم همینه. ته تهش یک سری ماتریس هست که داریم روش محاسبات انجام میدیم.
این که تونستن محاسباتی که سابقاً روی CPU انجام میشد رو ببرن روی GPU قطعاً خیلی موثر بوده.
این خلاصهای بود از یادگیری عمیق. این که یک ترکیبی از توابع خطی و غیرخطی رو بگذاریم پشت سر هم و امیدوار باشیم که بتونیم یک شبکه آموزش بدیم و وزنهاش رو جوری بدست بیاریم که چیزی که میخوایم رو تشکیل بده. روشی که از مدلسازی نورون شروع شد و الان LLMهایی که هر روز داریم باهاشون وقت میگذرونیم هم از همین روش درست شدند!
اما شاید این روش مدلسازی هم روشی نباشه که بتونیم به الگوریتم اصلی برسیم. این روش یه سری چیزها رو نمیتونه انجام بده. مثلاً نمیتونه استدلال کنه. ذاتش مثل درخت بر مبنای استدلال منطقی نیست. ذاتش یک سری وزن هست که دارن آپدیت میشن.
از نظر علمی میدونیم که بسیاری از کارهای ما ریشه ژنتیکی داره. شاید این که صرفاً تعداد لایهها و پارامترها رو زیاد کنیم کافی نباشه و نتونیم به چیزی به قدرت ذهن انسان برسیم.
شاید ژنتیک هم خیلی مؤثر باشه و ما با مدلسازی مغز و نورون داریم بخش مهمی از اطلاعات رو از دست میدیم. اینه که تو فصل بعدی نویسنده به سراغ جناب داروین و تکامل میره که ببینه الگوریتمهای ژنتیک چه کمکی میتونند بهمون بکنن؟