본문 바로가기

Quadruped Robot/Quadruped Robot Theory

Quadruped 공부 하고 싶다. #6-2 [Task1 - PPO: Cartpole with Pytorch③-2]

728x90

#PPO with Cartpole in Pytorch

일전에 이어서 올린다는 게 예약을 삭제로 했던 거 같다. 

블로그를 정리하다가 지금에서야 발견해서 다시 써보려고 한다. 

지난번 내용을 간략하게 정리하면, Algorithm을 완성시키기 위해서는

 

1. PPOMemory (Observated Data Processing)

 

Simulation에서 Observation 된  6가지의 Data에 대해 읽고 버릴 필요가 있다.

그래서 해당 부분을 class PPOMemory를 통해 Data 저장, 추가, 삭제 만들어주었고

Deep-Learning을 위해 Batch function도 만들어준 것을 볼 수 있다. 

 

PPOMemory에서의 키워드는 두가지로 정리된다.

DRL(Deep-Reinforcement-Learning)에 초점을 둔다면, observation의 return값에 주목을 하면 좋고

전체 알고리즘 구조에 초점을 둔다면, PPOMemory자체의 의미와 Batch 처리 과정을 중점적으로 보는 게 좋아 보인다.

 

2. ActorNetwork (Distribution about States)

 

OpenAI에서 제공되는 Cartpole예제는 Observation을 통해

아래의 맨 마지막 줄처럼 4가지의 state 정보를 return으로 내뱉는다.

그림 1. 실제 OpenAI-gym-Cartpole-v1 Data

>> observation = env.reset()
>> for _ in iteration :
..	env.render()
..	print(observation)
# OBSERVATION INFOMATIONS
>> [Cart_Position, Cart_Velocity, Pole_Angle, Pole_Angular_Velocity]

Simulation에서 측정된 4가지 state정보를 가지고 다음 action을 선정하는데,

확률적인 방법을 사용한다. torch의 Softmax Categorical function을 활용해

출력층 state를 Distribution으로 나타내며 return 해준다.

 

3. CriticNetwork (Value about States)

 

핵심이 되는 내용은 A2C를 참조하면 좋다.

 

Observation 된 state 정보를 가지고 최적의 action을 선정하기 위해

시시각각 변하는 state를 평가하고 거기에 대한 가치(value)를 메긴다. (output이 1개이다.)

오늘 소개할 class Agent에서 Advangate라는 list와 만나면서 CriticNetwork가 하는 일이 

제대로 나타난다.

 

일단 간단하게 설명하면 Agent의 Exploration에 관한 이야기라고 생각한다. 

 


4. Agent (Algorithms)

 

이제 가장 중요한 Algorithm 파트인데

주관적인 의견이지만 PPO논문을 펼쳐보고 이걸 바로 구현하는 사람이 얼마나 될까 싶다. 

손으로 직접 써보면서 논문에 나타난 식을 하나하나 곱씹어 봤는데도 영 와닿지를 않으니,

어디가 뭐가 어떻게 문제인지 감을 잡기도 힘들었다. 여기저기에 물어보고 다녔는데

다들 예제 코드 보면서 자기 걸로 만드는 거지라고 답해주시지만

정말 Custom 하게 짜인 코드는 잘 못 본 거 같다.

논문만 보고 바로 구현하는 것은 대기업에서도 힘든 일이라는 말을 듣고는

마음의 짐을 조금 더는 계기가 되기도 했다.

 

일단은 3가지의 시점 중 나에게 필요한 것을 중점적으로 class Agent를 접근해 보는 것을 추천한다.

❸은 코드를 따로 짜야하므로, 이번 페이지에서는 ❶, ❷ 위주로 설명해 본다. 

 

❶ 논문 구현을 위한 코드 정리와 구현

❷ Code flow를 위한 data type converting

❸ Simulation내에서 Env와 Agent가 Data를 주고받는 방법. <- 다음 문서 참조

 

그림 2. Agent-Setting

1) Agent-Constants & Load (❶) 

Agent를 처음 불러왔을 때 논문에서 정의된 Constant들을 정리해 줄 필요가 있다.

그래서 처음 def __init__에 정리해둔 모습이 보이고, print 구문은 observation의 shape과 action이 궁금해서 추가해 봤다.

이후에 위에서 만든 3개의 class (PPOMemory, ActorNetwork, CriticNetwork)를 불러온다. 

 

2) Agent-Structure (❶)

 

- remember : Env가 Agent를 Observate 하고 얻어낸 결과들을 저장. (PPOMemory의 store_memory function 사용)

- save_models & load_models : Simulation에서 train 한 결과를 save할 때, test를 위한 load를 할때 사용되는 function이다.

 

3) Agent-Action(❶, ❷,❸)

그림 3. Agent-Choose_Action

- state : action을 하기 위해 Env가 Observated 한 State를 변수로 받아낸다.

np.array로 observation을 받아내면 list로 받아내는 것보다 Data Processing이 빨라진다. 

- dist : action을 취해야 하므로 actor에서 Distribution 된 State를 가져온다.

- action : dist에서 임의로 한 개 sampling 한다.

- value : Policy update를 위해 CriticNetwork를 불러온다. 

 

❷ torch.Squeeze() -> 차원을 정리하는 함수이다. (https://pytorch.org/docs/stable/generated/torch.squeeze.html)

이제 여기서부터가 머리가 조금 아픈데,

개인적인 생각으로 이런 Python Data Type & shape까지 고려해가며 

새로운 응용 Code를 작성할 수 있을지 하는 의문이 들었다.

내 경험으로는 이런 문제가 들이닥치면 항상 코드를 썼다 지웠다

원하는 format을 찾아 삼만리 삼천포로 자주 빠지곤 했는데,

해결 못할 문제는 아니지만 시간을 많이 잡아먹는

체력적으로 고갈되는 Code 파트라고 생각한다.

 

- probs :

Policy Gradient 설명할 때 Fomula를 통해 log로 추출하는 방식을 소개한 적 있다.

이에 대한 식을 미리 setting 했다고 이해하면 된다.

 

마지막으로 return을 action, probs, value로 내보내면서

'환경에 새로운 action을 하고, Policy를 update 하기 위해 probs를 구하고 value를 측정한다.'

 

4) Agent-Policy_update (Advantage & Equations ❶,❷)

그림 4. Agent-Equation

이제 PPO를 나타내는 이 코드의 꽃 부분이다.

만일 이 논문(PPO [1])을 이해하고 코드로 구현하는 연습을 해보고 싶다면

아래 Highlighted 된 부분을 손으로 정리해보거나,

Eq(11,12)를 직접 대입 & 이항 해보는 것을 추천한다.

눈으로 코드만 보고 아 고런가 보다 넘어가는 것보다

20초 시간 들여서 이항 한번 하면 코드가 굉장히 쉬워 보인다. 

 

직접 손으로 써봤다면 직관적으로 Line : 167~171까지의 Code를 이해할 수 있다.

방대한 Data를 가지고 수식을 보며 코드로 표현하는 방법이 어려울 뿐이지, 이해는 것 자체는 어렵지 않다는 걸 

직접 해보면 알 수 있다. 

그러고 나서 다시 Data type & shape(❷)을 정리하는 모습을 볼 수 있다.

그림 5. PPO 논문

5) Agent-Clipped_Surrogate (❶,❷)

prob_ratio는 일전에 PPO논문 Probability Ratio를 축약한 것이고,

이후로는 논문에 표기된 방법 그대로 Python Code를 통해 나타낸다.

흐름대로 읽으면 직관적으로 이해할 수 있다.

그림 6. Agent-Clipped_Loss
그림 7. PPO-Loss

 


Conclusion

이렇게 Pytorch 라이브러리와 PPO가 어떻게 조합되는지 정리하는 시간을 가졌다. 

항상 느낀 것이 논문의 수식이 어떻게 코드로 표현되나? 이 부분이 가장 어려웠는데,

수식 정리 부분은 다른 vision 논문들보다 DRL은 상대적으로 쉬운 편이어서 

조금 넓은 마음으로 논문을 읽을 수 있었다.

 

다른 DRL논문을 보면 PPO는 성능 대비 굉장히 짧은 코드 줄을 자랑하는 게 장점이므로

심심할 때마다 PPOMemory class부터 Agent까지 쭉 반복해서 적어보는 걸 추천한다.

생각보다 빠르고 쉽게 습득이 돼서 응용하는 시야가 금방 트이고 다른 논문도 접근하기 쉬워질 것이다. 

물론 Actor-Critic을 완벽히 이해하지 못한 것이 흠이긴 하지만 성능의 초점보다는 Sim2Real에 초점을 두고

Task를 도전하기 때문에 추후에 문제가 생길 때 꼼꼼히 읽어봐도 문제가 없다고 생각한다. 

 


Next Task

그림 8. Next Task

다음은 슬슬 퍼즐을 맞춰가는 단계이다. 

PPO와 Isaac Gym에서 업로드한 Sim2 Real을 맞춰보는 단계를 거치기 이전에 

마지막 초석으로 OpenAI-gym(Cartpole)의 환경이 Neural Network과 어떻게 소통하는지 

알아보는 시간을 가지고 Cartpole Task를 마무리하려고 한다.

 

[References]

[1] https://arxiv.org/abs/1707.06347 (PPO)