11 Reinforcement Learning
🚧 Դասախոսության սլայդերը պատրաստ են (L32), գործնականի նախագիծը՝ նույնպես (ներքևում)։ Տեսանյութը դեռ չի ձայնագրվել։
Դասը հենվում է misc/dl4nlp/18_reinforcement_learning-ի վրա, բայց զգալիորեն ընդլայնված է․ այնտեղ RL-ը լեզվական մոդելների գործիք է, այստեղ՝ առանձին թեմա, իսկ LLM-ները վերջում են՝ որպես կիրառություն։
🎲 Random
TBD
📚 Նյութը
Մեկ դասախոսություն (սլայդերը ml/ch11_rl/ պանակում)։
- L32 — Reinforcement Learning — սովորել հետևանքներից, ոչ թե պատասխաններից։ Դասը սկսվում է AlphaGo-ի 37-րդ քայլից (Lee Sedol, 2016), անցնում է MDP-ով, արժեքային ֆունկցիաներով և Bellman-ի հավասարմամբ, Q-learning-ով ու DQN-ով, հասնում policy gradient-ին, baseline-ին և PPO-ին, ապա ցույց է տալիս, որ լեզվական մոդելը պարզապես մեկ այլ agent է․ state = մինչ այժմ գեներացված token-ները, action = հաջորդ token-ը, reward = պատասխանի վերջում։ Ավարտվում է RLHF-ով, reward hacking-ով և the bitter lesson-ով։ PDF
ml/llm_training/-ը 12 հոդվածի սեմինար է՝ կառուցված PPO, GRPO, DPO, InstructGPT և R1-ի վրա — բոլորը reinforcement learning։ Բայց RL-ը դասընթացում ոչ մի տեղ չէր դասավանդվում, այսինքն ուսանողները կարդում էին այդ հոդվածները առանց հիմքի։ Այս դասը փակում է հենց այդ բացը, և ավարտվում է ուղիղ հղումով դեպի այդ գլուխը։
Ինչ կա դասի մեջ, որ սկզբնաղբյուրում չկար․
- «Reward-ը loss չէ» — ուշացած, նոսր և ոչ-դիֆերենցելի ազդանշան, plus այն, որ տվյալները կախված են քաղաքականությունից (i.i.d. ենթադրությունը վերանում է)։
- Ձեռքով հաշված Q-update իրական թվերով։
- Exploration vs exploitation — \(\epsilon\)-ի գինը ճշգրիտ հաշված մեր gridworld-ի վրա (0.208 → 0.152 → −0.418)։
- Predict-first frame — ո՞ր ուղղությամբ է նայում փոսի տակի վանդակը։ (Պատասխանը՝ ձախ, ոչ թե վեր — քանի որ 10% սայթաքումը փոսի մեջ է գցում։)
- The bitter lesson (Sutton, 2019) — և՛ ինչու է ճիշտ, և՛ ինչու չի նշանակում «կառուցվածքը երբեք չի օգնում»։
Բոլոր թվերը չափված են, ոչ թե պնդված․ figure-ները գեներացվում են py_src/-ից։ Օրինակ՝ baseline-ը REINFORCE-ի սխալ ուղղության հաճախությունը իջեցնում է 33.9%-ից 0%։
Եվ agent-ը իսկապես սովորում է։ py_src/q_learning_demo.py-ում tabular Q-learning-ը նույն gridworld-ի վրա տեսնում է միայն sampled անցումներ (ոչ մի P(s'|s,a)), և՝
- 135-րդ էպիզոդին նրա քաղաքականությունը համընկնում է ճշգրիտ պատասխանի հետ, վերջում՝ 12/13 վանդակ ճիշտ (մեկը իսկական «ոչ-ոքի» է՝ 0.018 տարբերությամբ, և ամեն դեպքում փոսի կողքով չի անցնում)։
- Սխալը կանգ է առնում ~0.12-ի վրա, ոչ թե 0։ Պատճառը՝ 13/13 վիճակ գերագնահատված է (միջինը +0.079) — դա maximisation bias-ն է, և դասը դրա համար առանձին frame ունի (plus Double Q-learning)։
📝 Թեմայի վերաբերյալ հարցաշար (Google Form): TBD
🏡 Գործնական
Նախագիծ — սովորել «X-O» self-play-ով, հետո գնահատել կատարյալ խաղի դեմ 🧀🧀
Գործնականի պարապմունքի համար։ Ինչու հենց «X-O»․ դա ամենամեծ խաղն է, որը դեռ լուծվում է ճշգրիտ minimax-ով, ուստի ամեն դիրքի համար ունենք ճշմարիտ պատասխան։ Ճիշտ այնպես, ինչպես դասին Q-learning-ը համեմատում էինք value iteration-ի V*-ի հետ։
Ինը մաս, tabular, առանց լրացուցիչ գրադարանների, ~5 րոպե CPU-ի վրա։ Ամենակարևոր պահերը․
- Ծուղակը (Part 3). Պատահական հակառակորդի դեմ սովորած agent-ը հաղթում է 95.4% (X) և 88.0% (O) դեպքերում։ Հետո կատարյալ խաղացողի դեմ՝ որպես O պարտվում է 16.6%, մինչդեռ self-play-ի agent-ը՝ 0%։ Win rate-ը թույլ հակառակորդի դեմ դա չէր ցույց տալիս։
- Self-play-ը լուծում է դա. կատարյալ խաղի դեմ 100% ոչ-ոքի և՛ X-ով, և՛ O-ով։
- Ground truth-ով գնահատում. minimax-ը լուծում է բոլոր 5478 դիրքերը, ուստի ամեն քայլը ստուգվում է․ 93.5% ընդդեմ 99.6% օպտիմալ քայլերի։ Բայց ավելի հետաքրքիրն այն է, թե որտեղ են սխալները — պատահականի դեմ սովորածինը ամենավատն է բացման փուլում, ոչ թե վերջում, որովհետև պատահական հակառակորդը երբեք չի պատժում վաղ սխալը։
- ε = 0-ի փլուզումը. 120,000 խաղում այցելում է ընդամենը 41 դիրք 4520-ից (խաղի ծառի <1%-ը)։
- Reward shaping-ի սահմանը. նույն էվրիստիկան, միայն մեծությունը փոխած․ bonus 0.3 → գործնականում ոչինչ չի փոխում, bonus 3.0 → պարտվում է կատարյալ խաղին 50.7% (X) և 62.4% (O), որովհետև «արգելափակելը» սկսում է ավելի շատ վճարել, քան հաղթելը։
Լուծումը (ամբողջական walkthrough): L32_tictactoe_project_solution.ipynb (download) · view on GitHub