강화학습을 어렵게 생각하는 사람들이 있는것 같아, 간단한 벽돌깨기 게임을 numpy로 구현해본 입장에서

그렇게 어렵진 않다고 생각함.

 

대신 강화학습 구현하려면 신경망 학습으로 기억을 시켜야 하는 부분이 있는데,

이때 CNN같은 딥러닝 구현이 필요.  이걸 pytorch같은걸로 구현한다면 전체 코드양도 많지않을듯.

 

난 고전 신경망은 예전에 강의를 들은적 있지만,

CNN 같은건 독학했고, 강화학습도 독학했음.

 

=========================

 

강화학습은 순차적으로 행동을 결정하는 문제에 대해 최적의 행동을 결정할수 있게 해주는 기법이야.

 

"순차적으로 행동을 결정" 한다는게 무슨 소리야? 할수도 있는데 예를 들어보면 뭔소린지 바로 이해될거야.

 

바둑의 경우 한사람이 바둑알을 어느 위치에 놓고 다른 사람은 그 다음 수를 또 다른 위치에 놓고 이런 행위를 계속 이어나가는것처럼, 시간 순으로 일련의 적절한 행동이 실행되는걸 말하는 거지. 또 다른 예로 아래 동영상 처럼 벽돌깨기 게임의 경우에 한시점에 벽돌,공 상태를 보고 아래의 수평 막대를 왼쪽으로 움직일지 오른쪽으로 움직일지 판단을해서 행동을하고, 공이 막대에 부딪혀서 튕겨나갔다가 다시 내려오면 또 다시 수평 막대를 어떻게 할지 행동을 하게됨. 이런게 바로 "순차적으로 행동을 결정" 하는 거야. 사실 사람들이 매 일상에서 하는게 바로 "순차적으로 행동을 결정" 하는 거라고 볼수 있어.

 

 

그럼 이 행동을 어떻게 컴퓨터가 결정하게 만들수 있을까?

가장 원초적인 아이디어는 바로 보상이야. 이 보상이란건 종소리 들려줄때 먹이라는 보상을 주는 침흘리게하는 파블로프의 개의 예에서와 별반 다를바없는 기제라고 할수있어.

 

 

가령 벽돌깨기에서 공이 내려왔을때 수평 막대가 공을 받으면 (+1) 보상을 주고, 공을 못받으면 (-1) 보상을 주는거지.

그리고 이렇게 공이 내려왔던 중간 상태 각각에 대해서도 이 보상을 시간 역순으로 전파시켜주는거야(감가율을 포함).

 

이러한 과정을 수많은 공의 경로에 대해서 수행하면 임의의 공의 위치와 공의 이동 방향이 주어질때 수평 막대를 왼쪽 또는 오른쪽으로 각각 움직일때 받게되는 보상값을 추정할수가 있게되지.

 

이와같이 많은 경험을 통해서 보상을 역전파를 시켜서 보상값을 기억시킨뒤에, 이 기억한 보상값 함수들을 이용해서 각 시점에서 최대 보상이 주어지는 행동을 선택을함으로써 컴퓨터는 좋은 행동을 결정할 수 있게되.

 

이 보상값을 수치로 나타낸것을 가치라고 부르고, 행동별 가치를 큐함수라고 표현하기도 해. 가치를 함수로 이용하려면 각 행동별 실행확률을 나타내는 '정책' 함수를 별도로 운용해야하기 때문에 좀 단순하게 운용하기 위해 가치함수,정책함수 두가지를 하나로 통합한 효과를 가진 큐함수를 이용하기도 해. 위 벽돌깨기 동영상에서 구현한 방식이 바로 큐함수 방식이야(DQN).

 

큐함수 방식으로 보상을 역전파하려면 다음과 같은 수식을 이용하면되.

(다음 상태로 갈때 보상값 + 감가율 x 다음 상태의 큐함수값의 최대치) --> 현재 상태의 큐함수값

이때 감가율은 보상 시점과 멀수록 보상값을 차별화하기 위한것이고, 0.99 같은 값을 사용해.

 

 

의외로 강화학습이란건 간단함. 실제로 강화학습을 구현을 해봐도 간단해.

물론 초기에 지역적인 경험으로 학습이 왜곡되는걸 방지하기위해 경험리플레이메모리를 만든다든지, 또는 멀티에이전트 같은 방법을 사용한다든지 하는데, 이건 학습을 잘되게하는 실무적인 문제이고, 강화학습 방법 자체는 아주 간단함.

 

하지만 실제 문제에 적용하려면 복잡한 문제와 강화학습을 연결하려다 보니 복잡하게 보일수도 있고, 이 과정에서 프로그램 버그가 포함되어서 강화학습이 잘 안되는것처럼 보일수 있어. 강화학습 시간이 너무 많이 걸린다는 하소연을 가끔 볼수있는데, 버그 때문일수도 있어. 내가 어처구니없는 버그때문에 고생해봤거든.

 

 

강화학습 신문기사나 책을 보다보면 몬테카를로 딥러닝 같은 용어를 접할수 있는데, 위에서 설명할때는 이런 용어가 없는데 하고 궁금해 할수도 있는데.. 용어만 안썼을뿐이지 위에 설명에 포함되어있어.

수많은 경험을 통해서 이러한 보상 역전파를 수행하면 통계적으로 보상값을 얻을수 있다는게 몬테카를로이고, 역전파된 보상값을 기억하는게 바로 딥러닝으로 기억(학습)하는 거야. 굳이 딥러닝 아니어도 상관은 없지만, 다른 방법으로 이 보상값을 기억할만한 함수를 구하는게 간단한건 아니야.

 

강화학습을 구현하는게 복잡할수 있는 또다른 이유가 바로 딥러닝이야. 딥러닝 학습에 시간이 많이 소요되기때문에 이걸 다중 GPU를 사용한다든지 병렬컴퓨팅 한다든지 하면 복잡해지거든.

 

 

강화학습을 공부하고 싶다면 다음의 책과 소스코드를 보면 도움이 될거야.

책: "강화학습과 케라스로 배우는 강화학습"

공개된 딥러닝 파이썬 소스 코드:

https://github.com/rlcode/reinforcement-learning-kr (책의 소스 코드)

https://github.com/algolab-inc/tf-dqn-simple (미니 게임)