Въведение в методите на Advantage Actor Critic: нека играем Sonic the Hedgehog!

От началото на този курс сме изучавали два различни метода за засилване на обучението:

  • Методи, основаващи се на стойности (Q-обучение, дълбоко Q-обучение): където научаваме функция на стойност, която ще преобразува всяка двойка действия на състоянието в стойност. Благодарение на тези методи намираме най-доброто действие за всяко състояние - действието с най-голяма стойност. Това работи добре, когато имате ограничен набор от действия.
  • Методи, основани на политики (УСИЛЕТЕ с градиенти на политики): където директно оптимизираме политиката, без да използваме стойностна функция. Това е полезно, когато пространството за действие е непрекъснато или стохастично. Основният проблем е намирането на добра функция за оценка, за да се изчисли колко добра е политиката. Ние използваме общите ползи от епизода.

И двата метода имат големи недостатъци. Ето защо днес ще проучим нов тип метод за засилване на обучението, който можем да наречем „хибриден метод“: Актьорски критик . Ще използваме две невронни мрежи:

  • Критик, който измерва колко добро е предприетото действие (въз основа на стойността)
  • актьор, който контролира поведението на нашия агент (базиран на политики)

Овладяването на тази архитектура е от съществено значение за разбирането на съвременните алгоритми като Проксимална оптимизация на политиката (известна още като PPO). PPO се основава на Advantage Actor Critic.

И ще внедрите агент на Advantage Actor Critic (A2C), който се научава да играе таралежа Sonic!

Стремежът към по-добър модел на обучение

Проблемът с градиентите на политиката

Методът Gradient на политиката има голям проблем. Ние сме в ситуация на Монте Карло, чакаме до края на епизода, за да изчислим наградата. Можем да заключим, че ако имаме висока награда ( R (t) ), всички действия, които сме предприели, са били добри, дори ако някои са били наистина лоши.

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

В резултат на това да има оптимална политика,имаме нужда от много проби. Това води до бавно учене, защото отнема много време, за да се сближи.

Ами ако вместо това можем да направим актуализация на всяка стъпка от времето?

Представяме ви актьорски критик

Моделът на актьорския критик е по-добра функция за оценка. Вместо да чакаме до края на епизода, както правим в Монте Карло REINFORCE, ние правим актуализация на всяка стъпка (TD Learning).

Тъй като правим актуализация във всяка времева стъпка, не можем да използваме общите награди R (t). Вместо това трябва да обучим Critic модел, който апроксимира функцията стойност (не забравяйте, че функцията стойност изчислява каква е максималната очаквана бъдеща награда при състояние и действие). Тази функция на стойност замества функцията за награда в градиент на политиката, която изчислява наградите само в края на епизода.

Как действа Actor Critic

Представете си, че играете видеоигра с приятел, която ви предоставя обратна връзка. Вие сте актьорът, а вашият приятел е критикът.

В началото не знаете как да играете, така че опитвате някакво действие на случаен принцип. Критикът наблюдава действията ви и предоставя обратна връзка.

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

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

Както виждаме, идеята на Actor Critic е да има две невронни мрежи. Ние оценяваме и двете:

И двете работят паралелно.

Тъй като имаме два модела (Актьор и Критик), които трябва да бъдат обучени, това означава, че имаме два набора тежести (? За нашето действие и w за нашия Критик), които трябва да бъдат оптимизирани отделно:

Процесът на критик на актьора

На всяка стъпка от време t, ние вземаме текущото състояние (St) от околната среда и го предаваме като вход през нашия Актьор и нашия Критик.

Нашата политика взема състоянието, извежда действие (At) и получава ново състояние (St + 1) и награда (Rt + 1).

Благодарение на това:

  • Критикът изчислява стойността на това действие в това състояние
  • актьорът актуализира параметрите на политиката (тежестите), използвайки тази стойност q

Благодарение на актуализираните си параметри, Актьорът произвежда следващото действие при At + 1, като се има предвид новото състояние St + 1. След това критикът актуализира своите параметри на стойността:

A2C и A3C

Представяне на функцията Advantage за стабилизиране на обучението

Както видяхме в статията за подобрения в Deep Q Learning, методите, базирани на стойността, имат голяма вариабилност.

За да намалим този проблем, говорихме за използването на функцията предимство вместо функцията стойност.

Функцията за предимство се дефинира по следния начин:

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

Ако A (s, a)> 0: нашият градиент се натиска в тази посока.

Ако A (s, a) <0 (действието ни е по-лошо от средната стойност на това състояние) нашият градиент се изтласква в обратна посока.

Проблемът при прилагането на тази функция на предимството е, че се изискват две стойностни функции - Q (s, a) и V (s). За щастие можем да използваме грешката TD като добър оценител на функцията за предимство.

Две различни стратегии: Асинхронна или Синхронна

Имаме две различни стратегии за прилагане на агент за критичен актьор:

  • A2C (известен още като Advantage Actor Critic)
  • A3C (известен още като критик за асинхронен актьор)

Поради това ще работим с A2C, а не с A3C. Ако искате да видите пълно изпълнение на A3C, разгледайте отличната статия на Arthur Juliani за A3C и изпълнението на Doom.

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

От друга страна, единствената разлика в A2C е, че ние синхронно актуализираме глобалната мрежа. Изчакваме, докато всички работници завършат обучението си и изчислят своите градиенти, за да ги осреднят, за да актуализираме нашата глобална мрежа.

Избор на A2C или A3C?

Проблемът с A3C е обяснен в тази страхотна статия. Поради асинхронния характер на A3C, някои работници (копия на агента) ще си играят с по-стара версия на параметрите. По този начин обобщаващата актуализация няма да бъде оптимална.

Ето защо A2C чака всеки актьор да завърши своя сегмент от опит, преди да актуализира глобалните параметри. След това рестартираме нов сегмент от опит с всички паралелни участници с едни и същи нови параметри.

В резултат на това обучението ще бъде по-сплотено и по-бързо.

Внедряване на A2C агент, който играе таралежа Sonic

A2C на практика

На практика, както е обяснено в този пост на Reddit, синхронният характер на A2C означава, че не се нуждаем от различни версии (различни работници) на A2C.

Всеки работник в A2C ще има еднакъв набор от тегла, тъй като за разлика от A3C, A2C актуализира всички свои работници едновременно.

Всъщност ние създаваме множество версии на среди (да кажем осем) и след това ги изпълняваме паралелно.

Процесът ще бъде следният:

  • Създава вектор от n среди, използвайки многопроцесорната библиотека
  • Създава обект-бегач, който обработва различните среди, като се изпълнява паралелно.
  • Има две версии на мрежата:
  1. step_model: който генерира опит от среди
  2. train_model: който обучава преживяванията.

Когато бегачът направи стъпка (модел с една стъпка), това изпълнява стъпка за всяка от n среди. Това извежда партида опит.

След това изчисляваме градиента наведнъж, използвайки train_model и нашата партида опит.

И накрая, актуализираме стъпковия модел с новите тегла.

Не забравяйте, че изчисляването на градиента наведнъж е същото като събирането на данни, изчисляването на градиента за всеки работник и след това усредняването. Защо? Тъй като сумирането на производни (сумиране на градиенти) е същото като вземането на производни на сумата . Но вторият е по-елегантен и по-добър начин за използване на GPU.

A2C с таралежа Соник

Така че сега, когато разбираме как работи A2C като цяло, можем да внедрим нашия A2C агент, играещ Sonic! Това видео показва разликата в поведението на нашия агент между 10 минути обучение (вляво) и 10 часа обучение (вдясно).

Внедряването е в репозитория на GitHub тук, а бележникът обяснява изпълнението. Давам ви запазения модел, обучен с около 10h + на GPU.

Тази реализация е много сложна от предишните реализации. Започваме да прилагаме съвременни алгоритми, така че трябва да бъдем все по-ефективни с нашия код. Ето защо при това изпълнение ще отделим кода на различни обекти и файлове.

Това е всичко! Току-що създадохте агент, който се научава да играе таралежа Соник. Това е страхотно! Можем да видим, че с 10 часа обучение нашият агент не разбира цикъла, например, така че ще трябва да използваме по-стабилна архитектура: PPO.

Отделете време, за да обмислите всички постижения, които сте постигнали от първата глава на този курс: преминахме от прости текстови игри (OpenAI такси-v2) към сложни игри като Doom и Sonic the Hedgehog, използвайки все по-мощни архитектури. И това е фантастично!

Следващият път ще научим за проксимални градиенти на политиката, архитектурата, която спечели ретро конкурса OpenAI. Ще обучим нашия агент да играе Sonic the Hedgehog 2 и 3 и този път, и той ще завърши цели нива!

Не забравяйте да внедрите всяка част от кода сами. Наистина е важно да се опитате да модифицирате кода, който ви дадох. Опитайте се да добавите епохи, да промените архитектурата, да промените скоростта на обучение и т.н. Експериментирането е най-добрият начин да се научите, така че се забавлявайте!

Ако харесате статията ми, моля, кликнете върху? долу толкова време, колкото сте харесали статията, така че другите хора ще видят това тук в Medium. И не забравяйте да ме последвате!

Тази статия е част от моя курс за задълбочено подсилване с TensorFlow? ️. Вижте учебната програма тук.

Ако имате някакви мисли, коментари, въпроси, не се колебайте да коментирате по-долу или да ми изпратите имейл: hello [at] simoninithomas [dot] com, или да ми чуруликате @ThomasSimonini.

Курс за дълбоко подсилване:

Правим видео версия на учебния курс за дълбоко подсилване с Tensorflow ? където се фокусираме върху частта за изпълнение с tensorflow тук.

Част 1: Въведение в подкрепящото обучение

Част 2: Потопете се по-дълбоко в подкрепящото обучение с Q-обучение

Част 3: Въведение в Deep Q-Learning: нека играем Doom

Част 3+: Подобрения в дълбокото Q обучение: Дуели Double DQN, Приоритизирано преиграване на опит и фиксирани Q-цели

Част 4: Въведение в политическите градиенти с Doom и Cartpole

Част 6: Оптимизация на проксималната политика (PPO) със Sonic the Hedgehog 2 и 3

Част 7: Обучението, управлявано от любопитство, улеснява Част I