'바닥부터 배우는 강화 학습' 10장에는 MCTS(Monte Carlo Tree Search)의 개념과 알파고에 대해서 설명하고 있습니다. 아래 내용은 공부하면서 핵심 내용을 정리한 것입니다.
참고자료
도서: 바닥부터 배우는 강화 학습 / 10장 알파고와 MCTS
10.1 알파고
- 알파고는 2016년 3월에 이세돌과 바둑을 뒀던 버전
- 학습(learning) 단계
◦ 이세돌을 만나기 전에 이루어지는 과정
◦ 이후 단계에서 사용될 재료들을 미리 만들어 두는 과정 - 플래닝(decision-time planning)
◦ 이세돌과의 대국 도중에 실시간으로 이루어지는 과정
◦ 알파고 차례가 되었을 때 어디에 바둑알을 놓을지 고민하는 과정
◦ 알파고는 실시간 플래닝 알고리즘으로 MCTS(Monte Carlo Tree Search) 사용
◈ 학습 단계
- 학습 단계는 실시간 플래닝, 즉 MCTS에 쓰일 재료를 만드는 과정
- MCTS에 필요한 4가지 (3개의 정책 네트워크, 1개의 밸류 네트워크)
◦ 사람의 기보를 이용해 지도 학습한 정책 πslπsl
◦ 롤아웃 정책 πrollπroll
◦ 스스로 대국하며 강화 학습한 정책 πrlπrl
◦ 밸류 네트워크 vrlvrl

1. 지도 학습 정책 πslπsl

- 알파고의 모든 과정은 바둑 기사의 기보 데이터를 활용해 πslπsl이라는 뉴럴넷을 학습시키는 것으로부터 시작
- 바둑판의 상태 정보 ss가 인풋으로 들어오면 총 19*19 = 361개의 바둑 칸들 중 현재 둘 수 있는 곳에 대해 실제로 돌을 내려놓을 확률을 리턴 (361개의 클래스가 있고 그중에 하나로 분류(classification) 해주는 네트워크)
- 위와 같은 방법으로 3천만 개의 기보 안에 있는 "평균 전략"을 학습
- 13개 층의 컨볼루션 레이어(convolutional layer)를 쌓아 올려서 구성
- 바둑판의 정보를 토대로 사람의 지식을 이용하여 만든 feature를 48겹을 쌓아서 인풋으로 제공 (19×19×4819×19×48)
- 학습 결과 πslπsl은 주어진 데이터에 대해 57%의 정답률을 기록 (아마 5단 정도의 실력)
2. 롤아웃 정책 πrollπroll
- 롤아웃 정책 πrollπroll은 πslπsl의 가벼운 버전
- 사람의 지식을 이용하여 만든 수많은 feature에 대해 선형 결합 레이어가 1개
- 속도가 매우 빠름 (πsl:3ms,πroll:2μsπsl:3ms,πroll:2μs), πslπsl이 πrollπroll 보다 1500배 시간이 필요
- πrollπroll의 정확도는 24%
- πrollπroll이 필요한 이유는 MCTS 단계에서 같은 시간 동안 더 많은 수를 시뮬레이션해 볼 수 있음.
결국 MCTS의 성능을 올려 줌
3. 강화 학습 정책 πrlπrl

- πrlπrl은 πslπsl과 완벽히 똑 같이 생긴 뉴럴 네트워크이고 πrlπrl의 파라미터들은 πslπsl을 이용해 초기화
- πrlπrl은 self-play를 통해 계속해서 강화됨
- πslπsl로 초기화된 정책끼리 대결은 훨씬 고품질의 경기를 생산. (위 그림처럼 높은 산을 오르는데 산의 중간부터 오르는 것)
- 자신의 과거 모델들을 이용해 풀을 만들고, 풀에서 랜덤 하게 하나를 뽑아와서 경기를 펼치는 방식

- 학습을 받고 있는 네트워크가 500번 업데이트될 때마다 해당 모델을 풀에 넣어줌
- 알파고의 보상함수는 경기를 이기면 1, 지면 -1, 그 외의 중간 보상은 전혀 없음
- policy gradient 방법론을 사용하였고 그중에서도 리턴만 있으면 학습할 수 있는 REINFORCE 알고리즘 사용
∇θJ(θ)=E[∇θlogπθ(s,a)∗Gt]∇θJ(θ)=E[∇θlogπθ(s,a)∗Gt]
- γγ 값은 1.0
◦ 이긴 경기에서 발생한 모든 액션의 확률은 동등하게 증가
◦ 진 경기에서 발생한 모든 액션의 확률은 동등하게 감소 - GPU 50대를 이용해 1일간 학습, 128경기의 데이터를 이용해 1개의 미니 배치를 구성
- 학습이 끝난 πrlπrl은 80%의 승률로 πslπsl을 이김
- MTCS 과정에서 πrlπrl이 직접적으로 사용되지 않음. πrlπrl은 다음 재료인 vrlvrl을 구하는데 핵심 역할을 할 뿐
4. 밸류 네트워크 vrlvrl

- vrlvrl의 신경만 구조는 πslπsl, πrlπrl과 동일하지만 아웃풋이 19×1919×19가 아니라 1개의 값
vπrl(s)=E[Gt|st=s]vπrl(s)=E[Gt|st=s]
- γ=1.0γ=1.0이고 중간 보상이 없기 때문에 결국 ss에서 시작하여 1을 받을지, -1을 받을지 예측하는 함수, 즉 승자를 예측하는 함수 임
- vrlvrl의 손실함수는 MSE(mean squared error)로 정의
- 총 3천만 개의 각기 다른 게임에서 나온 상태를 가지고 데이터 셋을 만드고 50개의 GPU로 1주일간 학습
- vrlvrl은 임의의 상태를 인풋으로 넣었을 때 해당 경기의 승가가 누가 될지 그 결과를 가늠할 수 있음
◈ Monte Carlo Tree Search(MCTS)
- MCTS는 주어진 상황에서 시작하여 "그냥 많이 둬 보는" 방법론
- MCTS는 주어진 상황에 특화된 해를 찾는데 쓰이는 플래닝(planning) 알고리즘

- 주어진 상황을 ss라 하면 ss부터 시작하여 주어진 시간 안에 초대한 많은 게임을 시뮬레이션해 보는 것
- ss에서 할 수 있는 액션 a1,a2,...,a180a1,a2,...,a180까지 할 수 있는 액션을 최대한 다양하게 해 봄
- 다양한 액션을 해 보고 결과가 가장 좋았던 액션을 실제로 선택하는 방법이 MCTS
- πrlπrl이 바로 결정을 내리는 것보다 좋음
- MCTS를 사용하기 위한 몇 가지 까다로운 조건
◦ MDP의 모델을 알아야 함 (Pass′,Ras)(Pass′,Ras)
◦ 게임 중간마다 MCTS를 실행할 시간적 틈이 있어야 함 - MCTS는 선택, 확장, 시뮬레이션, 백 프로파게이션 4 단계로 구성
- 4단계가 한 바퀴 돌면 새로운 노드가 생성됨, 노드(node)는 바둑판의 상태에 해당, 엣지(edge)는 액션에 해당
- 노드를 평가하고 그 노드에 오기까지 거쳐온 모든 경로의 모든 엣지(액션)의 가치를 업데이트
- 이 평가를 바탕으로 좋았던 액션을 선택

1. 선택
- 루트 노두에서 출발하여 리프 노드(leaf node, 자식이 없는 노드)까지 과는 과정
리프 노드에 도착하면 다음 단계인 확장 단계로 넘어감 - 기존에 평가해 놓은 각 액션의 벨류를 높은 액션을 선택
at=argmaxa(Q(st,a)+u(st,a))at=argmaxa(Q(st,a)+u(st,a))
- Q(st,a)Q(st,a): 시뮬레이션 실행 후 얼마나 좋은 지
- u(st,a)u(st,a): 시뮬레이션 실행 전 얼마나 좋을 것이라 추측하는지(prior)
- 시뮬레이션을 진행하면 경험이 쌓일수록 Q(st,a)Q(st,a)의 영향력이 커지고 u(st,a)u(st,a)의 영향력은 줄어듦
- 시뮬레이션 도중 어떤 상태 s78s78에서 액션 a33a33을 선택하는 경험을 총 100번 했다고 가정한 경우
Q(s78,a33)=1100100∑i=1V(siL)Q(s78,a33)=1100100∑i=1V(siL)
- 다시 말해 (s78,a33)(s78,a33)을 지나서 도달한 리프 노드의 평균 밸류
u(st,a)∝P(s,a)1+N(s,a)u(st,a)∝P(s,a)1+N(s,a)
- P(s,a)P(s,a)는 사전 확률(prior probability)로 시뮬레이션해 보기 전에 각 액션에 확률을 부여함
P(s,a)=πsl(s,a)P(s,a)=πsl(s,a) - N(s,a)N(s,a)는 시뮬레이션 도중 엣지 (s, a)를 지나간 횟수
N(s,a)=0N(s,a)=0에서 시작하여 한 번 지나갈 때마다 1씩 더해 짐
시뮬레이션이 진행되면 분모가 커지면서 사전 확률의 영향이 줄어듦 - πrlπrl 보다 πslπsl이 더 다양한 액션을 시도하는 정책이었기 때문에 πslπsl로 사전확률을 초기화
2. 확장(Expansion)
- 방금 도달한 리프 노드를 실제로 트리에 매달아 주는 과정
- 또한 이 노드에서 뻗어나가는 엣지들의 다양한 정보를 초기화
P(s,a)←πsl(s,a)N(s,a)←0Q(s,a)←0
3. 시뮬레이션(Simulation)
- 리프 노두가 트리의 정식 노드가 되었기 때문에 노드의 가치를 평가, V(sL)를 계산
- MCTS에서 노드의 벨류를 계산하는 두 가지 방법
◦ 리프 노드 sL부터 시작하여 게임이 끝날 때까지 빠르게 시뮬레이션해 봄 (πroll을 이용해 zL 계산)
◦ 벨류 네트워크 vrl(s)를 활용 - 알파고는 위 두 가지 방법을 섞어서 계산
V(sL)=12vrl(sL)+12zL
4. 백 프로파게이션(Back propagation)
- 백 프로파게이션은 에지를 지나서 도달한 리프 노드 밸류의 평균값인 Q(s,a)를 계산해 주는 과정
- 이미 계산된 평균값에 새롭게 도달한 리프 노드의 밸류를 평균에 반영하기 위해 평균값 Q(s, a)를 업데이트해 주는 과정
N(s,a)←N(s,a)+1Q(s,a)←Q(s,a)+1N(s,a)(V(sL)−Q(s,a))
- 값이 리프 노드로부터 루트 노드로 전파된 것이니 "역전파"라고 부름
- 48개의 CPU와 8개의 GPU를 이용한 병렬 연산을 이용해 빠른 속도로 MCTS를 수행

- MCTS에서 계산했던 액션 벨류인 Q(s,a)가 가장 높은 액션이 제일 액션이라 할 수 있음
- 하지만 알파고는 Q(s,a) 대신 방문 횟수, 즉 N(s,a)가 가장 큰 액션을 선택, 위 그림에서는 a1을 선택
- 아래 식과 같이 MCTS을 결정론적(deterministic)이 아닌 확률적(stochastic)으로도 움직일 수 있음
πmcts(s,ai)=N(s,ai)N(s,a1)+N(s,a2)+N(s,a3)i=1,2,3

- 위 그림과 같이 확률분포로 부터 샘플링하여 액션을 뽑는 방법도 가능
10.2 알파고 제로
- Mastering the Game of Go without Human Knowledge
- 사람의 지식을 배제하고도 바둑을 정복함
◈ 인간을 대신할 새로운 선생님, MCTS

- 알파고와 달리 알파고 제로는 학습 때도 MCTS를 사용
- MCTS를 현재 상태 s를 인풋으로 그에 특화된 정책 π(s)를 내놓는 모듈로 생각할 수 있음
- MCTS는 현재 정책을 이용해 여러 번 시뮬레이션해 보고 얻은 결과 이기 때문에 현재 정책보다 좋은 정책
이를 정답으로 보고 학습함 - MCTS의 분포와 현재 정책 네트워크의 아웃 풋 사이 차이를 줄이는 방향으로 네트워크를 업데이트

- 각 상태 si에서 MCTS 실행 후 액션 ai 샘플링, 이 과정을 게임이 끝날 때까지 반복
- 위와 같은 방법으로 수백만 경기의 데이터를 얻음
- 각 데이터는 (st,πt,zt) 형식, zt는 게임의 결과 (이겼으면 +1, 졌으면 -1)
- 이 데이터를 이용해 뉴럴넷 fθ(s)=(p,v)를 학습

- 상태 st를 fθ에 인풋으로 넣어서 정책 네트워크의 아웃풋 pt와 벨류 네트워크 아웃풋 vt를 계산
- pt는 MCTS가 알려주는 확률 분포인 πt와의 차이를 줄이는 방향으로 업데이트 (크로스 엔트로피)
- vc는 경기 결괏값인 zt와의 차이를 줄이는 방향으로 업데이트 (MSE)
L(θ)=(zt−vt)2−πtlogpt
- 결국은 MCTS가 선생님 역할을 수행
◈ 알파고 제로에서의 MCTS
- MCTS 진행은 fθ(s)=(p,v)만을 이용해 진행

- 학습이 진행됨에 따라 p가 조금씩 발전할 것이기 때문에 MCTS 성능도 점점 좋아질 것으로 기대할 수 있음
- sL의 벨류를 평가할 때는 fθ의 아웃풋인 v를 이용
'강화 학습 > 바닥부터 배우는 강화 학습' 카테고리의 다른 글
바닥부터 배우는 강화 학습 | 09. 정책 기반 에이전트 (0) | 2023.01.28 |
---|---|
바닥부터 배우는 강화 학습 | 08. 가치 기반 에이전트 (0) | 2023.01.21 |
바닥부터 배우는 강화 학습 | 07. Deep RL 첫 걸음 (0) | 2023.01.17 |
바닥부터 배우는 강화 학습 | 06. MDP를 모를 때 최고의 정책 찾기 (0) | 2023.01.05 |
바닥부터 배우는 강화 학습 | 05. MDP를 모를 때 밸류 평가하기 (0) | 2022.11.29 |