PyTorch로 스크래치에서 PPO 코딩 (1 부)

4 부작 시리즈의 로드맵.

소개

이것은 독자가 PyTorch를 사용하여 처음부터 베어 본 PPO (Proximal Policy Optimization)를 구현하는 방법을 배워야하는 예상되는 4 부작 시리즈의 1 부입니다. 시리즈의 대략적인 로드맵을 보려면 위의 다이어그램을 참조하십시오. 저는이 가이드를 썼습니다. 왜냐하면 정책 그라데이션 알고리즘과 PPO에 대해 배우고 결국 처음부터 직접 구현하려고 시도했을 때 간단하고 잘 문서화되고 스타일이 잘 지정되어 있고 실제로 올바른 PPO 구현이 온라인에 얼마나 적은지 우스꽝 스럽습니다. "ppo github"의 처음 몇 번의 Google 검색에서 찾을 수있는 자칭 "간단한"PPO 구현조차도 종종 혼란스럽고, 주석이 잘 못되거나, 읽을 수 없으며, 명백히 잘못되었습니다.

이 시리즈의 목표는 신뢰할 수 있고 잘 문서화되고 스타일이 잘 지정되어 있으며 가장 중요한 PPO의 베어 본 구현을 제공하고 실행하여이 문제를 해결하는 것입니다. 이 시리즈에서는 처음부터 PPO를 코딩 한 단계를 안내하고 진행하면서 내 결정에 대한 생각 프로세스를 제공합니다. 이상적인 독자는 Python 및 PyTorch에 대한 경험이 있고 강화 학습 (RL), 정책 기울기 (pg) 알고리즘 및 PPO의 기본 이론을 알고있는 사람입니다 (PPO 작성 방법을 알려주는 가이드이므로 PPO를 포함합니다. PPO 의 이론을 배우지 마십시오 ). 위의 내용 중 어느 것이라도 불편한 경우 계속하기 전에 익숙해 져야 할 몇 가지 훌륭한 링크가 있습니다.

파이썬 배우기

PyTorch 배우기

강화 학습 소개

정책 그라디언트 소개

PPO 소개

위의 모든 내용에 익숙하지 않은 경우 계속하기 전에 각 링크를 위에서 아래로 순서대로 살펴 보는 것이 좋습니다.

코드의 핵심 (2 부에서 시작)으로 들어가기 전에 먼저 작성한 코드의 개요와 성능에 대한 통계를 제공하겠습니다.

코드 개요

코드 : 초보자를위한 PPO

내 PPO 구현에서 모든 교육 코드를 main.py, ppo.py, network.py 및 arguments.py의 4 개의 개별 파일로 분할했습니다.

main.py : 실행 파일입니다. arguments.py를 사용하여 명령 줄 인수를 구문 분석 한 다음 환경 및 PPO 모델을 초기화합니다. 여기에서 PPO 모델을 훈련하거나 테스트 할 수 있습니다.

ppo.py : PPO 모델입니다. 모든 학습 마법이이 파일에서 발생합니다.

network.py : PPO 모델에서 Actor / Critic 네트워크를 정의하는 데 사용할 신경망 모듈입니다. 여기에는 샘플 피드 포워드 신경망이 포함되어 있습니다.

arguments.py : 명령 줄 인수를 구문 분석합니다. main에서 호출하는 함수를 제공합니다.

Actor / Critic 모델은 주기적으로 바이너리 파일 인 ppo_actor.pthppo_critic.pth에 저장되며, 테스트하거나 교육을 계속할 때로드 할 수 있습니다.

또한 주로 main.py에 의해 호출되는 eval_policy.py에 테스트 코드가 있습니다.

eval_policy.py : 지정된 환경에서 훈련 된 정책을 테스트합니다. 이 모듈은 다른 모든 파일과 완전히 독립적입니다.

다음은 학습 및 테스트 파이프 라인을 대략적으로 보여주는 두 개의 다이어그램입니다.

교육 파이프 라인

파이프 라인 테스트

결과

아래에서 볼 수 있듯이 다양한 환경에서 Stable Baselines PPO2를 사용 하여 PPO 구현 인 PPO for Beginners를 벤치마킹했습니다 . 그래프에서 실선은 모든 시행에 대한 평균을 나타내고 강조 표시된 영역은 모든 시행에 대한 분산을 나타냅니다. 모르는 경우 Stable Baselines 는 연구에서 벤치 마크 및 신뢰할 수있는 RL 알고리즘 구현으로 사용할 수있는 최적화 된 기존 RL 알고리즘의 저장소입니다. 사용 된 모든 하이퍼 파라미터는 여기 에서 찾을 수 있습니다 .

초보자 용 PPO는 주로 바닐라 PPO 의사 코드를 고수하는 반면 PPO2는이 시리즈의 4 부에서 살펴볼 수있는 여러 최적화 및 트릭을 수행합니다.

진자 -v0

Pendulum-v0 링크

초보자 용 PPO로 푸는 Pendulum-v0 GIF (왼쪽) | (오른쪽) Pendulum-v0에서 초보자를위한 PPO2 대 PPO의 성능을 보여주는 그래프.

BipedalWalker-v3

BipedalWalker-v3 링크

초보자 용 PPO로 해결 후 BipedalWalker-v3 GIF (왼쪽) | (오른쪽) BipedalWalker-v3에서 초보자를위한 PPO2 대 PPO의 성능을 보여주는 그래프.

LunarLanderContinuous-v2

LunarLanderContinuous-v2 링크

초보자 용 PPO로 해결 후 LunarLanderContinuous-v2 GIF (왼쪽) | (오른쪽) LunarLanderContinuous-v2에서 초보자를위한 PPO2 대 PPO의 성능을 보여주는 그래프

MountainCarContinuous-v0

MountainCarContinuous-v0에 연결

초보자 용 PPO로 해결 실패 후 MountainCarContinuous-v0 GIF (왼쪽) | (오른쪽) MountainCarContinuous-v0에서 초보자를위한 PPO2 대 PPO의 성능을 보여주는 그래프

MountainCarContinuous-v0은 두 PPO 구현 모두에서 해결하지 못했습니다 (좋은 점수는 거의 100 점). 그 이유가 무엇일까요?

답변 : PPO는 대부분의 기존 RL 알고리즘과 마찬가지로 고밀도 보상 시스템을 통해 가장 잘 학습하는 정책 기반 알고리즘입니다. 즉, 원하는 동작으로 지속적으로 수렴하려면 향상된 성능으로 잘 확장되는 일관된 신호가 필요합니다. 이 특정 환경에는 희소 한 보상 시스템이 있습니다. reward = 100-0.1 (action²), flag가 히트되면 else -0.1 (action²). 따라서 PPO는 드물게 무작위 탐색을 통해 깃발에 부딪히지 않는 한 학습에 대한 좋은 지표를 많이 얻지 못합니다. 더 나쁜 것은 보상 함수를 자세히 살펴보면 실제로 시간이 지남에 따라 이동하는 데 페널티를줍니다. 따라서 운이 좋아서 깃발을 몇 번 연속으로 누르지 않는 한 PPO는 최소한으로 이동하여 로컬 최대 값 (즉, 부정적인 보상을 최대화)으로 최적화하는 경향이 있습니다. 따라서 계곡 바닥에 갇히고 깃발.

초보자를위한 PPO 그래프에서 성능이 비정상적으로 급증하여 평균 에피소드 수익 70까지 증가했지만 여전히 평균적으로 학습하지 못하는 것을 알 수 있습니다. PPO가 몇 번의 실행으로 운이 좋게 탐색을 통해 플래그를 칠 수 있지만 학습률이 낮은 단일 라운드의 정책 그래디언트 업데이트로는 PPO가 플래그를 지속적으로 공격하기에 충분하지 않기 때문입니다. 결과적으로 다음 반복에서 PPO는 운이 좋게되고 플래그를 다시 칠 수있을 때까지 성능이 저하됩니다. 정책을 벗어난 알고리즘은 과거 경험 (성공 포함)에 대해 훈련하기 위해 재생 버퍼를 사용하기 때문에 이러한 시나리오에서 약간 더 나은 성능을 발휘하는 경향이 있지만 PPO는 정책 기반 알고리즘이므로 각 반복 후에 새로운 데이터 배치가 필요합니다 (따라서 필요 학습을 위해 탐색을 통해 성공적인 데이터 라운드를 재생성합니다.)

요약

보시다시피 초보자 용 바닐라 PPO 결과는 안정적인 기준에 비해 그다지 인상적이지 않습니다. 그러나이 저장소의 요점은 PPO2 (원본 문서에없는 많은 트릭과 최적화를 사용함)를이기는 것이 아니라 독자가 처음부터 간단한 PPO를 구현하는 과정을 안내하는 것입니다. 파트 4에서 바닐라 PPO에 통합 할 몇 가지 최적화 및 트릭을 살펴볼 수 있습니다.

다시 말하지만, 초보자 용 PPO 코드를 원하는 경우 여기에 있습니다 .

이 시리즈를 작성하는 데 도움을 주신 Zhizhen Qin과 Sicun Gao 교수에게 특별히 감사드립니다.

eyyu@ucsd.edu로 저에게 연락 주시기 바랍니다.

PPO 작성을 처음부터 심층적으로 시작하기 위해 Part 2 에서 뵙겠습니다 !

Suggested posts

코드 리뷰 : PyTorch를 사용한 정서 순환 신경망

코드 리뷰 : PyTorch를 사용한 정서 순환 신경망

Udacity PyTorch의 마지막 강의를 마쳤습니다. 정말 어려웠습니다. PyTorch는 학습 곡선이 매우 가파르 며 다른 기계 학습 라이브러리 인 sklearn보다 학습하는 데 훨씬 더 오래 걸립니다.

우리는 확실히 알고있다

우리는 확실히 알고있다

강화 학습 (RL)은 간단한 전제를 따릅니다. 감지하고 상호 작용할 수있는 세계와 행동을 통해 영향을 미칠 수있는 선 또는 악의 척도가 있습니다. 다른 모든 것은 시행 착오의 변형입니다.