한달 넘게 잠 줄여가며 전기세 3배가 나오며 구현한 

DQN으로 Breakout 학습시키는 코드다.

다른 코드들처럼 여러 파일이 있는게 아니고 달랑 이거 하나만 있으면 된다.

코드에 대한 설명은 주석이랑 docstring을 통해 해놨으니 궁금한점을 댓글로.



  1. MCLearning2 2017.08.03 16:01 신고

    정말 감사합니다 제가 찾던거에요!!

 


저번 1편에서는 기본적인 내용만 익히고 아직 Q-table이 업데이트 되지 않았다. 

아마 위와 같은 환경에서 끝이 나버렸을 것이다. 계속 이어나가보자.

agent가 랜덤하게(Q값이 모두 0이기 때문에) 돌아다니다가 state (14)인 점에 도착했다고 생각을 해보자. 그리고 여기서 다른 action이 아닌 오른쪽으로 가는 action을 취했다고 생각해보자. 그러면 Q(14, 오른쪽) = 1 + Max Q(15,a) = 1 + 0 이 될 것이다. 목표지점에 도착했기때문에 reward r = 1 으로 리턴을 해준다. 그럼 아래와 같이 Q-table이 업데이트 될 것이다. 



이런식으로 무한이 반복되다보면 Q-table이 업데이트 될 것이다. 계속해서 업데이트를 해보자.

이번에는 agent가 랜덤하게 돌아다니다가 state(13)에 있다가 오른쪽으로 움직일 것이다. 그럼 Q(13,오른쪽)=0 + 1 이 될것이다. 왜냐하면 Reward는 역시 0일 것이다. 그리고 Max Q(14,a)를 구해야 하는데 이때 state(14)를 보면 Q(14,왼쪽) = 0, Q(14,오른쪽) = 1, Q(14,위쪽) = 0, Q(14,아래쪽) = 0 이므로 가장 큰값은 1이다. 그러므로 Max Q(14,a) = 1 이 되고 Q(13,오른쪽) = 1이 될것이다. 그러면 아래 그림과 같이 또 업데이트가 될 것이다.




계속 업데이트 하면서 이런 방향으로 업데이트 된다고 가정을 해보자



그럼 결국 아래와 같이 Q-table이 작성 될 것이다. 



그러면 이 작성된 Q-table을 통해 움직여 보자

1편에서 말했던것 처럼 agent는 가장 높은 reward를 받을 수 있는 길로 가면 그것이 Optimal한 방법이 될 것이라고 했다. 그러면 agent는 (0) state에서 당연히 오른쪽으로 가게 될 것이다. 왜냐하면 가장 Q값이 높기 때문이고, Q값이 높다는 것은 그 행동을 하였을 때 받을 수 있는 reward의 기댓값이 높다는 말이다. 그러면 이 agent는 항상 update가 된 길로만 다니게 될 것이다. 더 최단의 길이 있는데도 불구 하고 말이다. 이것은 미래에 대해서 고려를 하지 않아서 생기는 문제와 exploration의 문제이다. 


3편에서는 최단거리로 갈 수 있게 미래에 대해 각각 다른 가중치를 줄 수 있는 discount factor와 이미 학습한 Q말고 이외로 도전적으로도 움직이게 할 수 있는 exploration 문제에 대해 다뤄볼 것이다.


위와 같은 알고리즘으로 코딩을 하면 아래와 같다. 













 Q-learning 이랑 action-value function 값을 업데이트 해주면서 가장 나은 action을 취해주는 알고리즘이다. 예전 포스트 보면 Gridworld와 Frozenlake 에 적용한 알고리즘인 Q-Table을 작성하여 action을 취하는 이론을 정리할 것이다.


 action value function을 Q-Table로 작성하여 푸는 방법을 Tabular Methods라고 한다. 서튼 교수님 책에서는 이 Tabular Methods를 state 나 action이 작을때만 적용 가능 하다고 한다. 왜냐하면 각각의 state에 action마다 Q값을 넣어줘야 하기 때문이다. 그래서 실제 환경이나 실생활, 혹은 연속적인 환경에서는 적용을 할 수 없다.


 OpenAI Gym 에 있는 FrozenLake-v0 의 Environment 이다. agent가 있을 수 있는 state가 총 16개 밖에 되지 않고, action 또한 4개밖에 되지 않기 때문에 Q-table을 이용하여 학습을 할것이다.


 간단하게 FrozenLake Environment에 대해 설명하겠다. 

 agent, 즉 action을 당할 놈은 초록색에서 시작을 해서 저기있는 노란색 위치까지 가야한다. 중간에 파란색 부분은 빠지면 게임이 끝나버리는 구멍이라고 보면 된다. Environment에서는 action값을 입력해주면 그에 맞는 Next_state, reward, done, info를 리턴해준다. 여기서 Next_state는 action을 통해 움직여서 바뀐 state라고 보면 된다. reward는 그 action을 했을때 주는 보상값이고 done은 이 환경이 끝났는지 안끝났는지를 알려주는 boolean 값이다. info는 기타 추가 정보를 가져와준다. 여기서 done이 일어날 state는 각각의 파란색 구멍과 도착지점인 노란색 부분이다. 이 Env에서는 목표 지점이 아닌 곳으로 움직이면 reward를 0을 주고 목표지점에 도착하면 reward 1 을 준다.



 이제 움직이면서 학습을 해보자!

 agent가 움직일때는 먼저 어디로 가야 가장 reward를 높게 받을 수 있는지 판단을 해야한다. 그것이 Q-Learning의 핵심이다. 가장 reward를 많이 받을 수 있는 action을 취해야하는데, 이때 다음 state에서 가장 높게 받을 수 있는 reward 까지 생각을 해야하기때문에 Q 값을 업데이트 하려면 다음 상태의 Q값도 알아야 한다.

정리해보자면 

1. agent 는 state s에 있다.

2. agent가 action 를 했을 때, reward r을 받고 state s'로 움직인다.

3. 그러면 Q(s',a')도 존재 할 것이다

라고 가정을 해놓고 해야한다.


 이것으로 Q(s,a)를 표현하면 Q(s, a)= r + max Q(s',a') 이다. 이해 안가는 분들을 위해 다시 정리하자면

현재 상태에서 action a 의 Q값은 그 action a를 했을 때의 reward값과 다음 stats s'에서 가장 많이 받을 수 있는 Q값을 더해준다. 

역시 글보다는 그림이다. 위에 Q-table을 보자.


 agent의 위치, 각각의 state는 0~15로 표현하겠다.

아직 Q-table 이 하나도 업데이트 되지 않은 상황이라 agent는 현재 Q값을 통해 action을 구할 수 없다. 구할 수 없다기보다는 모두 Q값이 0으로 같기 때문에 agent 입장에서는 모두 다 가치가 같은 행동이다. 그렇기 때문에 값이 같을 때는 랜덤으로 여기저기 움직인다고 정책을 정하자.

(0)에 있는 agent가 오른쪽으로 움직여서 (1)로 갔다고 하자. 그러면 움직이면서  Q(s, a)= r + max Q(s',a') 이 식을 이용하여 Q값을 업데이트 해야한다. 그럼 Q(0,오른쪽 a) = 0 + 0 이다. 무슨말인지 이해가 안갈 수 있다. 


 첫번째 값 0은 action을 취했을 때 받는 reward r값이다. 위에 Environment 설명을 할때 목표지점을 제외한 모든 state에서는 0을 준다고 했기 때문에 0이고, 

 두번째 값0은 다음 state에서 가장 크게 받을 수 있는 reward 값이다. 하지만 여기서는 아직 하나도 Q-table이 업데이트 되지 않았기 때문에 Q(1,a)들의 값들은 모두 0이다. 그렇기 때문에 가장 큰 값은 0이 되는 것이고 결국 Q(0,오른쪽 a) = 0 + 0 이 되는 것이다.


여기까지 보면 대충 짐작이 갈 것이다. 아무리 움직여봤자 Q-table은 업데이트 되지 않는다. 단, 목표지점을 도착하기 전까지 말이다.


다음편에서는 목표지점에 도착했을때 비로소 어떻게 Q-table이 업데이트 되는지 알아볼 것이다.


sung kim 교수님 말대로 hole에 빠졌을때 -1 인 reward를 주지 않는 방향으로 생각해봤다.


아예 처음부터 싹 지우고 Q-Learning 알고리즘 그대로 이용해서 작성해보기로 했다.


(이번에는 미끄러짐 옵션도 켜둔 상태로)



이런 알고리즘이다.


진짜 이 알고리즘 그대로 구현한 코드가 이것이다.


이대로 모니터링을 하고 레코드를 하여 openAI gym에 업로드 하였다.


물론 미끄러짐 옵션 때문인지 성능이 오락가락 했지만


나름 상위권의 점수로 기록되었다.


https://gym.openai.com/envs/FrozenLake-v0


ps. 저기 나와있는 episode 35 짜리는 미끄러짐 옵션을 꺼뒀을때 레코드 한것이다.

+ Recent posts