یادگیری تقویتی (Reinforcement Learning)
جواب کوتاه
یادگیری تقویتی سومین راه یاد گرفتن توی یادگیری ماشینه. اینجا کسی به مدل جواب درست نمیده؛ مدل، که بهش عامل میگن، توی یه محیط یه کاری میکنه و بعدش یه پاداش یا جریمه میگیره. مثلا یه موش توی هزارتو، هر قدمی که برمیداره یا به پنیر نزدیکترش میکنه یا ممکنه بخوره به تله. عامل این کار رو بارها و بارها تکرار میکنه و کمکم یاد میگیره توی هر جا چه کاری بکنه که جمع پاداشهاش، نه فقط پاداش قدم بعدی، بیشتر بشه. به این قاعده که «توی هر حالت چی کار کنم» میگن سیاست. یادگیری تقویتی برای بازیهایی مثل تختهنرد و گو، کنترل ربات، رانندگی خودکار و حتی ساختن دستیارهای گفتگوی امروزی به کار رفته.
سومین راه
توی درس سه نوع یادگیری دیدیم که ماشین سه جور یاد میگیره. دو تاش رو تا اینجا کامل دیدیم؛ حالا نوبت سومیه:
توی یادگیری با جواب، یعنی نظارتشده، برای هر مثال یه جواب درست داریم. مثلا هزار تا عکس که زیر هر کدوم نوشتیم گربهست یا سگ، و مدل یاد میگیره همین کار رو خودش بکنه. توی یادگیری بی جواب، هیچ برچسبی نیست و مدل خودش توی داده دنبال گروه و الگو میگرده.
ولی یه جور یاد گرفتن دیگه هم هست که خیلی شبیه یاد گرفتن خود ماست. فرض کنید یه بچه داره دوچرخهسواری یاد میگیره. هیچکس یه برگه جلوش نمیذاره که «توی این لحظه دقیقا فرمون رو پنج درجه بچرخون». یه کاری میکنه، اگه افتاد یعنی بد بود، اگه جلو رفت یعنی خوب بود، و کمکم یاد میگیره. به این میگن یادگیری تقویتی: یاد گرفتن با انجام دادن و دیدن نتیجهش، یعنی پاداش یا جریمه.
جالبه که مغز حیوونها هم یه جورایی همینطوری کار میکنه. درد و گرسنگی رو یه چیز بد حساب میکنه و غذا و لذت رو یه چیز خوب، و حیوونها گاهی رفتاری یاد میگیرن که این پاداشها رو بیشتر کنه. اسم «تقویتی» هم از همینجا میاد؛ کاری که پاداش گرفته، تقویت میشه.
موش و هزارتو
برای اینکه همهچی ملموس بشه، بیاید یه مثال رو تا آخر درس با خودمون ببریم. یه موش توی یه هزارتوئه. یه جای هزارتو پنیره، یه جای دیگهش تله. موش نقشه نداره و نمیدونه پنیر کجاست:
توی یادگیری تقویتی هر کدوم از اینها یه اسم داره. خود موش، یعنی اونی که تصمیم میگیره و کار میکنه، اسمش عامل هست. هر چیزی که دور و بر عامله و عامل روش اثر میذاره، اینجا کل هزارتو، اسمش محیط هست.
هر لحظه موش یه جای مشخص از هزارتوئه. به این «الان کجام و اوضاع چطوره» میگن حالت. توی این مثال، حالت یعنی همون خونهای که موش توشه. کاری که موش میتونه بکنه، یعنی یه قدم به چپ یا راست یا بالا یا پایین، اسمش کنش هست. هر کنش موش رو به یه حالت تازه میبره.
و آخر از همه، پاداش: یه عدد که بعد از هر کنش به عامل میگه کارش چقدر خوب بود. رسیدن به پنیر یه پاداش بزرگ مثبته، مثلا ۱۰. افتادن توی تله یه پاداش منفیه، یعنی جریمه. قدمهای معمولی هم پاداششون صفره، یا گاهی یه جریمهی کوچیک میذارن که موش الکی دور خودش نچرخه.
دقت کنید که پاداش رو ما تعیین میکنیم، ولی راه رو نه. ما فقط میگیم پنیر خوبه و تله بده؛ پیدا کردن اینکه چطوری به پنیر برسه، کار خود عامله.
حلقهی کار
یادگیری تقویتی قدم به قدم جلو میره. هر قدم، بین عامل و محیط همین چهار تا اتفاق میافته:
- عامل به حالت فعلیش نگاه میکنه و یه کنش انتخاب میکنه؛ مثلا موش تصمیم میگیره یه قدم بره چپ.
- محیط اون کنش رو انجام میده و عامل رو به یه حالت تازه میبره؛ موش حالا توی خونهی کناریه.
- محیط همراه حالت تازه، یه پاداش هم میده؛ اگه اونجا پنیر بود مثبت، اگه تله بود منفی، وگرنه معمولا صفر.
- عامل این تجربه رو یادش نگه میداره و دوباره از قدم اول شروع میکنه.
هر بار که موش از اول هزارتو راه میافته تا به پنیر یا تله برسه، یه دور کامل بازیه. عامل صدها یا هزاران دور بازی میکنه، و هر دور یه کم بهتر از دور قبل.
یه نکتهی ریز ولی مهم: توی مثال ما موش دقیقا میدونه کجاست. ولی همیشه اینجوری نیست. مثلا یه رباتی که با دوربین میبینه، شاید فقط یه تیکه از اتاق رو ببینه یا تصویرش نویز داشته باشه. اونوقت عامل فقط یه بخشی از حالت رو میبینه و کارش سختتر میشه.
امروز یا فردا
حالا یه سوال مهم. فرض کنید نزدیک موش یه خردهنون افتاده که یه پاداش کوچیک داره، و یه کم دورتر پنیره که پاداشش خیلی بیشتره:
اگه موش فقط به پاداش قدم بعدی نگاه کنه، همیشه میره سراغ خردهنون و هیچوقت پنیر رو پیدا نمیکنه. برای همین هدف یادگیری تقویتی بیشتر کردن پاداش قدم بعدی نیست؛ بیشتر کردن جمع همهی پاداشها تا آخر بازیه. یعنی عامل باید به نتیجهی بلندمدت کارش فکر کنه، حتی اگه پاداش همین الانش کم یا حتی منفی باشه.
ولی یه ظرافتی هم داره. پاداشی که خیلی دیرتر میرسه، معمولا یه کم کمتر حساب میشه. مثلا فرض کنید هر قدم دیرتر، پاداش رو در ۹ دهم ضرب میکنیم. پنیر ۱۰ تایی که همین الان برسه ۱۰ میارزه، یه قدم بعد ۹، دو قدم بعد ۸ و یه دهم، و همینجوری کمکم کمتر. به این عدد ۹ دهم میگن ضریب تخفیف، و همیشه کمتر از یکه.
چرا این کار رو میکنن؟ مثل زندگی خودمون. اگه یکی بگه صد تومن رو همین الان میدم یا یه سال دیگه، معمولا الان رو انتخاب میکنیم، چون آینده همیشه یه کم نامعلومه. ضریب تخفیف هم به عامل میگه پاداش دور مهمه، ولی نه به اندازهی پاداش نزدیک. اگه ضریب نزدیک یک باشه، عامل خیلی دوراندیشه؛ اگه نزدیک صفر باشه، فقط به همین الان فکر میکنه.
برای همین یادگیری تقویتی مخصوصا برای کارهایی خوبه که توشون بین سود الان و سود بعدا یه بدهبستون هست؛ مثل بازیای که گاهی باید یه مهره رو فدا کنی تا چند حرکت بعد ببری.
ضریب تخفیف، با عدد
حرف «پاداش دیرتر، کمتر حساب میشه» رو با عدد ببینیم. موش دو تا راه داره: یه خردهنون با پاداش ۳ همین قدم اول، یا پنیر با پاداش ۱۰، ولی چهار قدم بعد:
# two ways for the mouse: a crumb right away, or cheese four steps later
crumb = [3] # reward on the first step, then the game ends
cheese = [0, 0, 0, 10] # nothing for three steps, then 10
def total(rewards, gamma):
# each later reward counts gamma times less than the one before
return sum(r * gamma ** t for t, r in enumerate(rewards))
for gamma in (0.9, 0.5):
a, b = total(crumb, gamma), total(cheese, gamma)
print("gamma", gamma, "crumb", round(a, 2), "cheese", round(b, 2), "->", "cheese" if b > a else "crumb")gamma 0.9 crumb 3.0 cheese 7.29 -> cheese gamma 0.5 crumb 3.0 cheese 1.25 -> crumb
با ضریب ۰٫۹، پنیر ۱۰ تایی که سه قدم بعد از اولی میرسه، ۱۰ ضرب در ۰٫۹ به توان ۳ حساب میشه، یعنی ۷٫۲۹؛ بیشتر از خردهنون، پس موش صبر میکنه و میره سراغ پنیر. با ضریب ۰٫۵، همون پنیر ۱۰ ضرب در ۰٫۵ به توان ۳، یعنی ۱٫۲۵ حساب میشه؛ کمتر از ۳، پس موش خردهنون رو برمیداره. همون محیط، همون پاداشها؛ فقط با عوض کردن یه عدد، عامل از دوراندیش به عجول تبدیل شد. برای همین انتخاب این ضریب خودش یه تصمیم مهمه، و معمولا یه عدد نزدیک یک، مثل ۰٫۹ تا ۰٫۹۹، میذارن.
آزمون و خطا
خب حالا موش چطوری یاد میگیره؟ اولش هیچی نمیدونه، پس هر قدمی که برمیداره تقریبا شانسیه. اگه برای هر خونهی هزارتو یه فلش بکشیم که بگه موش از اونجا کدوم طرف میره، اول کار این شکلیه:
هر دور که بازی میکنه، میبینه کدوم قدمها آخرش به پنیر رسیدن و کدومها به تله یا به هیچجا. قدمهایی که به پاداش رسیدن یه کم بیشتر احتمال پیدا میکنن، قدمهایی که به جریمه رسیدن یه کم کمتر. بعد از کلی رفت و برگشت، فلشها مرتب میشن و از هر خونه، راهی رو نشون میدن که به پنیر میرسه.
به همین جدول فلشها، یعنی قاعدهای که میگه «توی هر حالت چه کنشی انجام بدم»، میگن سیاست. هدف کل یادگیری تقویتی همینه که یه سیاست خوب پیدا کنه؛ سیاستی که جمع پاداشها رو تا جای ممکن بیشتر کنه. سیاست میتونه قطعی باشه، یعنی توی هر خونه دقیقا یه جهت، یا احتمالی، یعنی مثلا هفتاد درصد چپ و سی درصد بالا.
یه چیز دیگه هم هست که خیلی به کار میاد: اینکه بدونیم بودن توی یه خونه «چقدر خوبه». خونهای که دو قدم با پنیر فاصله داره، از خونهای که کنار تلهست بهتره. به این عدد میگن ارزش. سیاست و ارزش اونقدر مهمن که درس بعد کامل مال خودشونه: سیاست و ارزش.
شاید بپرسید چرا همهی سیاستها رو یکییکی امتحان نکنیم ببینیم کدوم بهتره؟ چون تعدادشون خیلی زیاده. حتی توی همین هزارتوی کوچیک ۲۰ خونهای، اگه توی هر خونه ۴ تا جهت داشته باشیم، تعداد سیاستهای ممکن از هزار میلیارد بیشتره. برای همین عامل باید از تجربههاش یاد بگیره، نه از امتحان کردن همهچی.
یه موش واقعی، با عدد
همهی اینها رو روی یه هزارتوی واقعی امتحان کردیم: ۴ ردیف و ۵ ستون، چند تا دیوار، یه پنیر با پاداش ۱۰، یه تله با منفی ۱۰، و برای هر قدم یه جریمهی کوچیک منفی ۰٫۱ که موش الکی نچرخه. یه بار یه موش کاملا شانسی، یه بار یه موش که از تجربههاش یاد میگیره:
موش شانسی فقط ۳۹٫۷ درصد وقتها به پنیر رسید، و بهطور میانگین ۶۴ قدم اینور و اونور رفت. موش یادگیرنده، دور اول هم چیزی بلد نبود و ۸۴ قدم طول کشید تا تصادفی به پنیر برسه. ولی تا دور ۱۰، میانگین شد ۳۲ قدم، تا دور ۵۰ حدود ۸ قدم، و آخرش، وقتی دیگه هیچ قدم شانسیای برنمیداشت، دقیقا ۷ قدم رفت؛ کوتاهترین راه ممکن توی اون هزارتو. هیچکس نقشه بهش نداده بود؛ فقط پاداشها رو.
روشی که اینجا استفاده کردیم یادگیری Q بود، که توی درس یادگیری Q قدم به قدم میبینیمش. فعلا همین بسه که ببینیم چطور یه عامل، فقط با امتحان کردن و پاداش گرفتن، از شانسی به بهترین راه میرسه.
زبون ریاضیاش
ریاضیدانها به این چیدمان، یعنی حالتها، کنشها، پاداشها و قاعدهای که میگه هر کنش از هر حالت به کجا میبره، فرایند تصمیم مارکوف میگن. اسمش از یه فرض ساده میاد: حالت بعد فقط به حالت الان و کنش الان بستگی داره، نه به اینکه قبلش از کجا اومدیم. برای موش ما درسته؛ اینکه یه قدم چپ کجا میبرتش، فقط به جای الانش بستگی داره. ریچارد بلمن دههی ۱۹۵۰ روی همین چیدمان، روشهایی برای حساب کردن بهترین سیاست ساخت که هنوز پایهی این رشتهان.
یه تقسیمبندی مهم هم هست. بعضی روشها اول یاد میگیرن محیط چطور کار میکنه، یعنی هر کنش کجا میبره و چه پاداشی داره، و بعد با این «مدل» از محیط، توی ذهنشون برنامهریزی میکنن؛ به اینها روشهای با مدل میگن. بعضیها هم بی اینکه محیط رو بشناسن، مستقیم یاد میگیرن هر کنش چقدر خوبه؛ روشهای بی مدل. موش ما بی مدل بود. روشهای با مدل معمولا با تجربهی کمتری یاد میگیرن، ولی اگه مدلشون از محیط اشتباه باشه، برنامهشون هم اشتباه میشه.
یه وقتایی راه تازه
یه مشکل کوچیک ولی مهم. فرض کنید موش یه راه پیدا کرده که بهش پاداش ۵ میده. از این به بعد همیشه از همین راه بره؟
اگه همیشه همون راه آشنا رو بره، هیچوقت نمیفهمه شاید یه راه دیگه پاداش ۱۰ داشته باشه. اگه هم همیشه راه تازه امتحان کنه، هیچوقت از چیزی که یاد گرفته استفاده نمیکنه. به امتحان کردن راه تازه برای بیشتر شناختن محیط میگن کاوش، و به استفاده از بهترین راهی که تا الان میشناسه میگن بهرهبرداری. پیدا کردن تعادل این دو تا، یکی از مسئلههای اصلی یادگیری تقویتیه.
یه راه ساده و خیلی رایج اینه که عامل یه تاس بندازه. مثلا ۹ بار از ۱۰ بار، بهترین کاری رو که فکر میکنه انجام بده، و ۱ بار از ۱۰ بار یه کار کاملا شانسی. به اون یک دهم میگن ε (اپسیلون). معمولا اولش ε بزرگتره که عامل بیشتر بگرده، و کمکم کوچیکش میکنن که بیشتر از چیزی که یاد گرفته استفاده کنه.
ولی کاوش کاملا شانسی، اون هم همیشه، نتیجهی خوبی نمیده؛ عامل وقتش رو هدر میده. برای همین روشهای زیرکانهتری هم ساختن که درس کاوش یا بهرهبرداری کامل بهشون میپردازه.
کجاها
هر جایی که یه سری تصمیم پشت سر هم داریم و نتیجهی خوب یا بد معمولا دیرتر معلوم میشه، یادگیری تقویتی به کار میاد:
- بازیهای تختهای، مثل تختهنرد و گو
- کنترل ربات
- ذخیرهی انرژی
- رانندگی خودکار
- برق خورشیدی
- دستیارهای گفتگو
بازیها معروفترین مثالشن. تختهنرد، چکرز و گو بازیهایی هستن که یادگیری تقویتی توشون به سطح خیلی بالا رسیده؛ چون بازی یه محیط مشخصه، میشه میلیونها بار بازی کرد، و برد یا باخت آخرش یه پاداش روشنه.
بیرون از بازی هم کاربرد داره؛ از کنترل ربات و رانندگی خودکار، تا تصمیمگیری دربارهی اینکه انرژی کی ذخیره بشه و کی خرج بشه، و کارکرد بهتر صفحههای برق خورشیدی.
و یه کاربرد خیلی امروزی: دستیارهای گفتگو که باهاشون حرف میزنید. یکی از قدمهای ساختنشون اینه که آدمها جوابهای مدل رو با هم مقایسه کنن و بگن کدوم بهتره، و مدل با همین بازخورد، به روش یادگیری تقویتی، بهتر بشه. درس خودش توی مسیر مدلهای زبانی هست: یادگیری تقویتی با بازخورد انسانی.
چرا سخته، و چند نکته
یادگیری تقویتی خیلی قدرتمنده، ولی ساده نیست. چند تا چیز رو خوبه از اول بدونید:
اول اینکه تجربهی خیلی زیاد میخواد. عامل باید هزاران یا میلیونها بار امتحان کنه؛ توی بازی این راحته، ولی یه ربات واقعی رو نمیشه میلیونها بار انداخت زمین، برای همین خیلی وقتها اول توی یه شبیهساز، یعنی یه نسخهی کامپیوتری از محیط، آموزش میبینه. دوم محیطهای بزرگ: هزارتوی ما ۲۰ تا خونه داره و میشه برای هر خونه یه فلش نوشت، ولی وقتی حالتها بیشمارن، مثل تصویر یه دوربین، دیگه نمیشه برای هر کدوم جدا چیزی نوشت؛ اونجا یه شبکهی عصبی کمک میکنه که از حالتهای دیدهشده، برای حالتهای تازه حدس بزنه. قدرت یادگیری تقویتی از همین دو تاست: یاد گرفتن از نمونهها، و تقریب زدن برای محیطهای بزرگ.
سوم اینکه تنها راه، امتحان کردنه: بهترین جا برای یادگیری تقویتی وقتیه که قاعدهی دقیق محیط رو نمیدونیم و تنها راه شناختنش، کار کردن توش و دیدن نتیجهست؛ اگه همهی قاعدهها رو بدونیم و بشه جواب دقیق رو حساب کرد، معمولا راههای سادهتری هست. و چهارم اینکه پاداش دیر میرسه: توی خیلی از کارها پاداش فقط آخر کار میاد، مثل برد یا باخت، و عامل باید بفهمه از اون همه قدم، کدومها واقعا باعث برد شدن؛ همون چیزی که یادگیری تقویتی رو سخت میکنه.
پاداش اشتباه، رفتار اشتباه
گفتیم پاداش رو ما تعیین میکنیم و راه رو عامل پیدا میکنه. این یه دام بزرگ داره: عامل دقیقا همون چیزی رو بیشینه میکنه که پاداش میگه، نه چیزی که ما توی ذهنمون داشتیم. جک کلارک و داریو آمودی سال ۲۰۱۶ یه مثال معروف ازش نوشتن: یه عامل توی یه بازی مسابقهی قایق، که امتیازش با برخورد به چند تا هدف روی مسیر بیشتر میشد، بهجای تموم کردن مسابقه، یاد گرفت توی یه دایره دور خودش بچرخه و هی همون چند تا هدف رو بزنه؛ امتیازش از بازیکنهایی که مسابقه رو تموم میکردن هم بیشتر شد.
ویکتوریا کراکوونا و همکارهاش بعدا یه فهرست بلند از این ماجراها جمع کردن و اسمش رو گذاشتن «بازی با تعریف». درسش برای ما اینه که پاداش رو خیلی با دقت بنویسیم، و همیشه رفتار عامل رو با چشم هم ببینیم، نه فقط عدد پاداشش رو. توی موش ما هم اگه اون جریمهی کوچیک هر قدم نبود، موش شاید یاد نمیگرفت عجله کنه.
چقدر تجربه؟
موش ما با چند ده دور یاد گرفت، چون هزارتوش فقط ۲۰ خونه داشت. ولی برای کارهای بزرگتر، عددها خیلی بزرگترن. ولادیمیر منیه و همکارهاش سال ۲۰۱۵ یه عامل ساختن که بازیهای قدیمی کامپیوتری رو فقط از روی تصویر صفحه یاد میگرفت، و برای هر بازی ۵۰ میلیون فریم تصویر آموزش دید؛ به گفتهی خود مقاله، حدود ۳۸ روز بازی پشت سر هم. یه آدم همون بازیها رو توی چند دقیقه یا چند ساعت یاد میگیره.
برای همین خیلی از تلاشهای این رشته روی اینه که عامل با تجربهی کمتر یاد بگیره: با ساختن یه مدل از محیط، با یاد گرفتن از تجربههای دیگرون، یا با شروع از یه چیزی که قبلا یاد گرفته؛ همون فکری که توی یادگیری انتقالی دیدیم.
از کجا اومد
یادگیری تقویتی ریشههای قدیمی توی روانشناسی داره:
ادوارد ثورندایک سال ۱۸۹۸ با گربههایی که از یه جعبه فرار میکردن، «قانون اثر» رو نوشت: رفتاری که نتیجهی خوب داره، تکرار میشه. ریچارد بلمن سال ۱۹۵۷ ریاضی تصمیمگیری پشت سر هم رو ساخت. ریچارد ساتن سال ۱۹۸۸ یادگیری اختلاف زمانی رو داد، و کریستوفر واتکینز سال ۱۹۸۹ یادگیری Q رو. جرالد تسورو اوایل دههی ۱۹۹۰ برنامهای ساخت که با بازی کردن با خودش، تختهنرد رو در حد بهترین بازیکنها یاد گرفت. سال ۲۰۱۵ بازیهای کامپیوتری از روی تصویر، ۲۰۱۶ برد در گو، و ۲۰۱۷ پل کریستیانو و همکارهاش یادگیری تقویتی از روی ترجیحهای آدمها رو نشون دادن، که بعدا پایهی آموزش دستیارهای گفتگو شد.
درس بعد یه قدم جلوتر میریم و میبینیم عامل چطوری یادش نگه میداره کدوم کار خوبه: سیاست و ارزش.
جمعبندی. آنچه از این درس با خودتان میبرید.
- نه جواب درست، نه بیجواب؛ با پاداش و جریمه.
- عامل، محیط، حالت، کنش، پاداش.
- حلقه: کنش، حالت تازه، پاداش، دوباره.
- پاداش دورتر کمتر حساب میشه، ولی حساب میشه.
- بیشتر وقتها بهترین راه، گاهی یه راه تازه.
خودتون رو بسنجید
۱۵ پرسش، هر بار تازه از میان ۳۰ پرسش این درس. آخرش فقط کارنامه رو میبینید: چند تا درست، چند تا نادرست.