Ојачавање учења са Керасом + ОпенАИ: Основе

Учење ојачања многи су најавили као једну од технологија / концепата који су произашли из теоријских студија машинског учења. Проћи ћемо кроз врло брзи преглед учења о појачању пре него што уђемо у шифру.

Брза позадина

Учење ојачања (РЛ) је општи израз кишобрана за сваки алгоритам који не захтева експлицитне парове података и њихове одговарајуће жељене ознаке, као што је случај у традиционалном супервизираном учењу, али захтева одређену нумеричку назнаку „какав је узорак.“ Овај квалитет „доброта“ узорка нема апсолутног значења. Ово опћенито можете замислити као резултат у видео игри. Ако на екрану буде приказана оцена „218“, претпостављате да за вас, играче, апсолутно нема смисла, осим ако нисте свесни колико је тешко или лако зарадити поен и са којим резултатом започињете. И то је у основи опсег позадине о којем ћемо размишљати: у будућности ће бити детаљније расправе о РЛ-у, али код који пролазимо у овом посту је врло основни пример РЛ-а и не укључује ниједан даље мешање у теорију предмета.

Керас Нотес

За све који су тек започели у АИ / МЛ програмирању, добродошли! Терен је толико нарастао претходних година да је прилично неодољиво за скочити тек сада. Али још увек има довољно времена да се укључимо и учимо на овом огромном пољу! У складу с тим, Керас је библиотека коју ћу првенствено користити за своје наставнике који долазе, укључујући и ову. Керас је у основи библиотека омота за Тенсорфлов и Тхеано. Његов интерфејс је прилично сличан ономе који је изложио тфлеарн, али је мало опћенитији у својој применљивости на Тхеано као подупирач. Имајте на уму, ипак! Димензије у Тхеану мало су различите од оних у Тенсорфлову. Стога бих препоручио да свој Керас прилагодите кориштењу ТФ-а као подупирача како би се избјегле фрустрације с димензијама које иду према напријед (требало би бити задано кад инсталирате, ако већ имате инсталиран ТФ).

То једноставно можете учинити и са ТФ-ом, али Керас нам даје лепу флексибилност када почнемо да не морамо да пратимо димензије кроз завојнице и све то срање. У сваком случају, довољно речи: време за прелазак на шифру!

Код

Овде ћемо истражити најосновније окружење ОпенАИ: ЦартПоле! За крајњу белешку можете пронаћи упутства за инсталирање ОпенАИ-јевог теретаног пакета овде: хттпс://гим.опенаи.цом/доцс. Само покретање „судо пип инсталл гим“ требало би радити на већини платформи.

Окружје ЦартПоле има веома једноставну премису: уравнотежите стуб на колицима.

Прикупљање података

Први део било ког проблема са машинским учењем је прикупљање података, а ни овај се не разликује. Срећом, ОпенАИ-јево теретано окружење пружа врло једноставан начин прикупљања података: ми у основи можемо само проћи кроз симулацију више пута и сваки пут подузимати случајне кораке. Околине ОпенАИ Гим-а су структуриране око два главна дела: осматрачки простор и акциони простор. Проматрамо бившег из околине и користимо га за одређивање како га је најбоље ажурирати акцијом, тј. На основу тренутног стања пола (проматрање), одредити да ли померити колица улево или удесно (акција).

Као резултат, морамо предузети акцију која се уклапа у опсег дозвољених радњи акционог простора, који је у овом случају величине 2 (лево или десно). Сматрамо да излазни простор буде кодиран једном врућом, разлог је што желимо да неуронска мрежа на крају предвиди вероватноћу померања улево у десно с обзиром на тренутно стање окружења. У овом случају, могли бисмо се извући само ако излаз буде једнострука 1к1 матрица пловака (тј. Скаларна) и заокружимо је за наш коначни резултат, али пракса кодирања са једним врућим може бити широко примењена.

Дакле, да бисте сакупили акције и одговарајућа запажања, прва мисао може једноставно бити:

за _ у распону (10000):
    опсервација = енв.ресет ()
    траининг_самплеКс, траининг_самплеИ = [], []
    за корак у распону (сим_степс):
        ацтион = нп.рандом.рандинт (0, 2)
        оне_хот Манагед = нп.зерос (2)
        оне_хот Манагед [радња] = 1
        траининг_самплеКс.аппенд (осматрање)
        траининг_самплеИ.аппенд (оне_хот★)
        
        посматрање, награда, урађено, _ = енв.степ (акција)
        ако завршите:
            пауза
    траинингКс + = траининг_самплеКс
    траинингИ + = траининг_самплеИ

Међутим, ако бисмо тренирали на томе, крајњи предиктор вероватно неће имати ништа више од случајне шансе. На крају, "смеће унутра, смеће ван": ми бисмо радили ништа више него што бисмо хранили неуронску мрежу колекцијом и добрих и лоших узорака и очекивали да ће се само научити од добра. Ако направимо корак уназад, то је потпуно неупадљиво јер се један узорак не разликује од било којег другог, чак и поредећи оне који потичу из добрих испитивања и оне из лоших испитивања.

Уместо тога, гледаћемо само узорке који резултирају испитивањима са високим резултатима. Односно, желимо да филтрирамо узорке како бисмо омогућили само оне који на крају резултирају високим резултатима у својим испитивањима. У овом случају, произвољно смо изабрали 50 да би били „минимални прекид“ који се сматра „добрим покусом“, и одабрали смо само оне узорке:

деф цоллецтион_дата (енв):
    мин_сцоре = 50
    сим_степс = 500
    траинингКс, траинингИ = [], []
    сцоре = []
    за _ у распону (10000):
        опсервација = енв.ресет ()
        скор = 0
        траининг_самплеКс, траининг_самплеИ = [], []
        за корак у распону (сим_степс):
            ацтион = нп.рандом.рандинт (0, 2)
            оне_хот Манагед = нп.зерос (2)
            оне_хот Манагед [радња] = 1
            траининг_самплеКс.аппенд (осматрање)
            траининг_самплеИ.аппенд (оне_хот★)
            
            посматрање, награда, урађено, _ = енв.степ (акција)
            бод + = награда
            ако завршите:
                пауза
        ако резултат> мин_сцоре:
            сцоре.аппенд (скор)
            траинингКс + = траининг_самплеКс
            траинингИ + = траининг_самплеИ
    траинингКс, траинингИ = нп.арраи (траинингКс), нп.арраи (траинингИ)
    принт ("Просек: {}". формат (нп.меан (оцене)))
    принт ("Медијан: {}". формат (нп.медиан (оцене)))
    повратак тренингКс, тренингИ

Дефиниција модела

Сада када имамо податке, морамо да кренемо у дефинисање модела. Пре него што направите било какав проблем машинског учења, увек је корисно одступити како бисмо размотрили о чему се ради, конкретно који су очекивани улози и жељени резултати. У нашем случају примит ћемо тренутно стање окружења (тј. „Запажања“ од раније) и жељет ћемо предвидјети вјеројатност кретања у сваком од два смјера. Из овога лако можемо схватити који од њих треба узети узимањем мак арг.

Модел који овде користимо веома је једноставан: неколико потпуно повезаних слојева (а.к.а. густи слојеви у Керасу). То су често завршни слојеви који се користе у дубоким ЦНН-овима (Цонволутион Неурал Нетворкс) јер они комбинирају све карактеристичне мапе или слојеве улаза у коначне скаларне вриједности. Потпуно повезани слојеви у основи чине окосницу неуронских мрежа и оно што им омогућава да ефикасно пресликавају функције високих димензија, занемарујући сва модерна побољшања конволуцијама, ЛСТМс, Дропоут итд.

Једино од ових побољшања које је овде релевантно је одустајање, јер помаже да се осигура да не претерамо са подацима о обуци. Дакле, ми у суштини сендвичемо Дропоут слој између сваког потпуно повезаног мапирања како бисмо били сигурни да ниједан слој мапирања не зависи од малог подскупина веза које су посебно видљиве у подацима обуке.

На крају, морамо утврдити функцију губитка против које ћемо тренирати. Будући да смо излазни простор кодирали као врући 2Д вектор, природни избор постаје категорична унакрсна ентропија, с обзиром да желимо идентификовати резултат било лево ([1,0]) или десно ([0,1]). Нећу детаљно говорити о томе шта подразумева умрежена ентропија, али то је веома вредна функција за разумевање, с обзиром на њену учесталост у оваквим проблемима. С високог нивоа, умрежена ентропија је, с обзиром на две дистрибуције (истинску подлогу и наш модел), мерило колико нам информација треба да бисмо пренели нешто извучено из праве дистрибуције помоћу дистрибуције модела.

Стога модел дефинишемо као:

фром керас.моделс импорт Секвенцијални
из керас.лаиерс импорт Денсе, Дропоут
деф цреате_модел ():
    модел = секвенцијални ()
    модел.адд (густо (128, инпут_схапе = (4,), активација = "релу"))
    модел.адд (одустајање (0.6))
    
    модел.адд (густо (256, активација = "релу"))
    модел.адд (одустајање (0.6))
    
    модел.адд (густо (512, активација = "релу"))
    модел.адд (одустајање (0.6))
    
    модел.адд (густо (256, активација = "релу"))
    модел.адд (одустајање (0.6))
    
    модел.адд (густо (128, активација = "релу"))
    модел.адд (одустајање (0.6))
    модел.адд (густо (2, активација = "софтмак"))
    
    модел.цомпиле (
        лосс = "категоријска_кроссентропија",
        оптимизер = "адам",
        метрицс = ["тачност"])
    повратни модел

Неколико суптилнијих техничких тачака модела: сваки од слојева модела има РеЛУ активације како би модел омогућио брже тренирање него са засићујућим функцијама активирања, попут танха и сигмоида. Модел ће вероватно такође тренирати у овим случајевима, али би било потребно много дуже времена за конвергирање него ако користите РеЛУ активацију.

Предвиђање

Одатле једноставно можемо добити податке о тренингу, обучити модел и поновити кроз неколико испитивања да бисмо видели колико добро наш модел ради!

увоз теретана
увести нумпи као нп
из увоза података цоллецтион_дата
од увоза модела цреате_модел
деф предицт ():
    енв = гим.маке ("ЦартПоле-в0")
    траинингКс, траинингИ = прикупити_дата (енв)
    модел = цреате_модел ()
    модел.фит (ТраинингКс, ТраинингИ, епохе = 5)
    
    сцоре = []
    нум_триалс = 50
    сим_степс = 500
    за пробу у домету (број_трилија):
        опсервација = енв.ресет ()
        скор = 0
        за корак у распону (сим_степс):
            ацтион = нп.аргмак (модел.предицт (
                опажање.облика (1,4)))
            посматрање, награда, урађено, _ = енв.степ (акција)
            бод + = награда
            ако завршите:
                пауза
        сцоре.аппенд (скор)
    
    принт (нп.меан (партитуре))

Пуни код

Уз овај корак по корак, ево и комплетног изворног кода имплементације ОпенАИ Цартполе Керас!

Пазите на следећи Керас + ОпенАИ туториал!

Коментирајте и кликните ❤ доље да бисте показали подршку!