강화학습을 어렵게 생각하는 사람들이 있는것 같아, 간단한 벽돌깨기 게임을 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 (미니 게임)
궁금한데 큐러닝은 저차원의 큐테이블 방식으로 쓰는거임?
그리고 DQN 알고리즘에서 에이전트의 특징벡터들이 인풋층에 들어가기전에 CNN으로 추출하는거야..?
몇년전에 공부하고 강화학습 구현한뒤에, 몇년동안 손놓았더니 기억이 가물함. 사실 질문한것도 무슨 얘기인지 잘 파악이 안됨. 일단 CNN을 언급해서 이에 대해서 답변을 하자면, 몇년전에 내가 기록한거 보고 얘기하면, 일단 벽돌깨기 문제에는 CNN으로 하지 않고 간단하게 고전 신경망으로 구현함. 신경망 네트웍: 5-300-100-3 입력 5개: agent x위치, 공의 위치(2), 공의 속도(2) 출력3개: Q함수값. {왼쪽으로 이동시키는 행동, 오른쪽 행동, 정지 행동}을 선택할경우의 가치값들. 이렇게 해서 랜덤미니배치를 이용하면 불과 2분이면 성공율 100%에 도달.
질문을 좀 쉽게하면 내가 예전에 기록했던걸 찾아보고(심지어 코드도 다시 확인해서) 여유있는 시간에 답변해주겠음.
지나가다 본건데 공 위치 속도 각각 x,y 위치 속도 말하는거죠?
yes. 위치 속도는 각각 크기 2인 벡터
실무에 적용해서 실제로 되게하는게 너무 힘든듯. 해결하고자 하는 문제를 mdp라는 틀에 어거지로 끼워맞추는 과정부터, 튜닝하는 것 까지. 강화학습으로 뭘 해보고자한다면 일단 딥러닝 쪽도 잘 알고있어야할둣
난 사실 실무에 적용해본적은 없음. 그냥 강화학습이 뭔지, 정말 이게 미래의 ai 의 핵심 기능이 될수있을지 독학해본것에 불과. 근데 독학하고 간단한것 구현해본 결과는 실망. 지금은 발전했을지는 모르겠지만, 몇년전에 강화학습은 기계적알고리즘에 불과. 사람 처럼 스스로 이해하고 판단하고 이런게 아니라, 그냥 경험한것을 무식하게 딥러닝으로 매번 기억해서, 약간 변형된 상태는 이전에 기억한 신경망 weight들로 대충 커버하는 무식한(?) 알고리즘. 강화학습은 인간 지능을 대체하는건 될수 없고, 사람의 운동기억은 대체할수 있을듯. 가령 테니스를 오래치면 몸의 수많은 근육들이 테니스에 적합하게 학습을하는것 처럼.
그리고 딥러닝은 그냥 블랙박스처럼 써도 되지않을까? 난 numpy로 신경망부분 직접구현했지만, pytorch로 해도 상관없겠다고 생각했었기때문에. 실무에 적용한다면 딥러닝 잘알아야하는 부분이 있을까?
RL쓰는 메소드로 탑컨퍼까지 내봤는데 RL쪽 리서치 개빡셈. 기본적으로 empirical한 결과에 더해 컨버전스 프루프까지 요구하는게 관례라. 정통 RL쪽 리서치 아니고라도 다른 도메인에서 문제를 Mdp든 Pomdp든 포뮬레이션 해서 그냥 방법만 가져오고 싶어도 RL 특유의 brittleness랑 독특한 훈련방식 때문에 빡세고