Изградете един от най-простите алгоритми за обучение за подсилване с PyTorch

Някога чудили ли сте се как работи обучението с подсилване (RL)?

В тази статия ще изградим една от най-простите форми на RL от нулата – алгоритъм за ванилен градиент на политика (VPG). След това ще го обучим да изпълни известното предизвикателство „CartPole“ — да се научи да движи количка отляво надясно, за да балансира стълб. Правейки това, ние също ще завършим първото предизвикателство към ресурса за обучение „Spinning Up“ на OpenAI.

Кодът за тази статия може да бъде намерен на адрес https://github.com/alan-cooney/cartpole-algorithms/blob/main/src/vanilla_policy_gradient.py

Нашия подход

Ще се справим с този проблем, като създадем прост модел за дълбоко обучение, който взема наблюдения и извежда стохастични политики (т.е. вероятности за предприемане на всяко възможно действие).

Тогава всичко, което трябва да направим, е да съберем опит, като действаме в околната среда, използвайки тази политика.

След като имаме достатъчно опит за партида (колекция от няколко епизода опит), ще трябва да се обърнем към градиентно спускане, за да подобрим модела. На високо ниво — искаме да увеличим очакваната възвръщаемост на политиката, което означава коригиране на теглата и отклоненията, за да увеличим вероятността от действия с висока очаквана възвръщаемост. В случая на VPG това означава използване на теоремата за градиента на политиката, която дава уравнение за градиента на тази очаквана възвращаемост (показана по-долу).

И това наистина е всичко – така че нека започнем да кодираме!

Създаване на модела

Ще започнем със създаването на доста прост модел с един скрит слой. Първият линеен слой взема входните характеристики от пространството за наблюдение на CartPole, а последният слой връща стойности за възможните резултати.

Получаване на полица

Също така ще трябва да получим политика за модела, веднъж на времева стъпка (за да знаем как да действаме). За да направим това, ще създадем функция get_policy, която използва модела за извеждане на вероятности за всяко действие съгласно правилото. След това от това можем да върнем категорично (мултиномиално) разпределение, което може да се използва за избиране на конкретни действия, произволно разпределени според тези вероятности.

Извадкови действия от политиката

От това категорично разпределение за всяка времева стъпка можем да вземем извадка, за да върнем действие. Ще получим и логическата вероятност за това действие, която ще ни бъде полезна по-късно, когато изчисляваме градиентите.

Изчисляване на загубата

Градиентът, който е извлечен изцяло тук, е даден по следния начин. Свободно казано, това е градиентът на сумата от логаритмичната вероятност на всяка двойка състояние-действие, умножена по възвръщаемостта за цялата траектория, от която тази двойка е част. Допълнителната външна сума е малко над няколко епизода (т.е. партида), така че имаме значителни данни.

За да изчислим това с PyTorch, това, което можем да направим, е да изчислим псевдо-загуба по-долу и след това да използваме .backward(), за да получим градиента по-горе (имайте предвид, че току-що премахнахме термина за градиент):

Това обикновено се нарича загуба, но всъщност не е загуба, тъй като не зависи от представянето. Просто е полезно за получаване на градиента на политиката.

Обучение на епоха

Обединявайки всичко по-горе, вече сме готови да обучим една епоха. За да направим това, ние просто преминаваме през епизоди, за да създадем партида. Във всеки епизод създайте серия от действия и награди (т.е. опит), които могат да се използват за обучение на модела.

Изпълнение на алгоритъма

И с това сте готови да изпълните алгоритъма. Можете да изпълните пълния код от https://github.com/alan-cooney/cartpole-algorithms/blob/main/src/vanilla_policy_gradient.py и трябва да видите, че моделът е научил добре средата (отбелязвайки 180 +/200) след около 40 епохи.

Надявам се да ви е харесало да прочетете това и ако имате въпроси, просто ме уведомете в коментарите!

Алън