[8] DQN
"강화학습 학습하기"시리즈는 KAIST 신하용 교수님의 수업 IE540 "DP and RL"수업 내용을 제가 제 방식대로 요약 및 정리한 것입니다. 퍼가실때는 미리 물어봐주시고, 내용은 제가 변형하고 추가하되 렉쳐노트에 쓰인 그림은 사용해도 된다고 교수님께 허락 받았습니다.
지난 시간에는 lookup table을 사용한 경우를 넘어서 Linear Value Function approximation을 배웠다.
value function을 approximation할 때는 우리가 알고 있는 익숙한 형태의 value function으로 approximaiton을 한다. 저번 편에서는 Linear value function approximation만을 배웠는데, 이는 복잡한 feature vector을 이용해서 value function을 linear하게 만든다. 그러나 linear만으로 general한 경우의 문제를 풀기란 어렵기 때문에, 새로운 근사 방법이 필요했고, 이것이 바로 오늘 배울 Neural Net을 이용한 RL방법이다.
NN을 사용하면, 더 일반적인 문제들에 대해서 function을 근사할 수 있다. 파라미터도 압도적으로 많고, nonlineartiy도 고려할 수 있기 때문에, NN으로 대부분의 근사가 이뤄진다. Value Function을 근사한다는 것은 굉장히 중요하다. Value function은 현재 상태 혹은 현재상태에서의 취할 액션에 대한 총 return이기때문에, value function을 안다는 것(True value function)은 어떤 상태와 어떤 액션이 가장 best 혹은 greedy하다는 것을 안다는 것이다. 구글 Deepmind에서 이런 문제에 관심이 많았는데, 2015년에 기념비적인 논문이 나온다. 아타리(Atari) 라는 비디오게임팩 시리즈이다. 총 45개의 게임이 있으며, 게임에 대한 사전 정보가 없이 agent를 훈련시키는 것이다.
DRL : Reinforcement Learning Framework + Deep learning for approximating value function.
처음에 들어오는 Input이 82*82 scale이고, 한 장이 아니라 4장을(4 프레임을) 측정한 값들까지 반영된다. 활성함수로는 ReLU를 사용했다. ReLU란 max(0,x)이다. 위에 있는 예제의 경우, Atari를 조정할 조이스틱의 8방향과 가만히 있는 것들을 더하고(총 9가지의 선택지) 여기에 두배를 했다. 이때 2를 곱하는 이유는 조이스틱에는 조이스틱 손잡이만 있는 게 아니라, 상호작용할 수 있는 것(발사버튼(빨간색))이 있기 때문이다. 다시 정리하자면, Input은 sequence of screen images (84*84*4 images), Network architecture는 3개의 CNN, 2개의 FC를 사용한다.
DQN에는 세 가지 혁신이 있다. 첫 번째로는 Deep learning과 Reinforcement learning을 합쳐서 input image로 강화학습이 가능하다는 것이다. 이때 강화학습의 방법으로 Q-learning을 사용하고, Q function에 대한 Neural Net은 action out form이다. state를 input으로 받아서, 모든 action에 해당하는 q값들이 여러 output으로 나오는 것이다. action - in form보단 action - out form이 모든 action을 한꺼번에 계산하기 때문에, 더 효율적이고 많이 사용한다.
두 번째로 Replay Buffer이다. Replay Buffer의 시작은 학습하면서 계산한 이전 값들을 버리지말고, 어딘가에 저장해서 나중에 활용하자는 것이다. (현재상태 s, 현재 action a, reward r, next state s')의 set들을 차곡차곡 모아서 Queue를 만든다. 그리고 이렇게 모인 replay buffer에서 random한 set을 꺼내서 현재 값과 비교하여 학습을 진행한다. 이런 방식의 장점은 random한 과거값들을 가져오기때문에, "break correlation between succesive states"이다. 이 뜻은 예를 들어, 어떤 안 좋은 state에 빠지면, 그 다음 state도 안 좋아지고, 값이 점점 안 좋아지면서 학습이 더뎌지는데, 어쩌다 안 좋은 state에 빠져도, 연속되는 state들끼리의 영향을 벗어나 이전의 안 좋은 경향과는 다른 경향으로 state를 진행할 수 있다.
세 번째로는 fixed parameter for TD target이다. 수 많은 parameter들을 이용해서 TD 에러를 계산하면, converge하기 쉽지 않다. 그래서 10번 혹은 20번 에 한번만 parameter를 바꾸는 fixed parameter가 있다고 생각하자. 이 값은 사실상 상수처럼 작용할 것이다. 당연히 off-target이지만, 이런 방식은 쉽게 안정적으로 수렴한다는 장점이 있다. 결국 시간과 episode를 아주 많이 사용하면, 방향만 맞으면 어쨌든 수렴하기 때문에, off-target이어도 적용할 수 있다. off-target이어도 practical한 경우가 이번 시리즈를 시작으로 많이 나온다. 왜냐하면 실제 알고리즘을 구현하고 학습하는 것은 이론적으로 알고리즘을 세우는 것과는 다른 이야기이기 때문이다.
1. DQN
기존의 current state에서 action-out form으로 모든 action에 대한 값을 계산하고, epsilon-greedy policy를 적용해서 next state와 reward를 받고 나면, TD error로 다음 state와 현재 state를 계산했다.
하지만 이젠 이런 방식에서 experience replay buffer를 적용해서, (s,a,r,s')의 set들을 계속 저장한다.
그렇게 저장된 experience replay buffer D에서 이제 minibatch로 sample set을 꺼낸 후에 현재 estimated q function값과 TD target(fixed parameter)을 계산해서 그 둘의 차이를 최소화하는 regression 으로 푼다.
2. Experience Replay
Buffer에는 가장 최근의 experience를 update하고 여기서 mini batch size만큼 random sample을 뽑는다. 앞서 말했지만 연속되는 상태들에 대해서 correlate하고, experience replay가 model for environement과 비슷하다. 왜냐면 현재 값과 replay되는 experience의 차이가 TD error가 되기 때문에, model for 환경과 유사한 역할을 한다. 주로 ER에 쓰이는 자료구조는 어디서든 random하게 output을 만들 수 있는 circular queue로 하고 최근의 자료들만 더 impact있게 하기 위해 fixed capacity로 한다.
반드시 Deep network를 사용했을때가 더 좋은 결과를 얻는 것은 아니다. Linear value function approximation할 때보다 안 좋은 결과를 갖는데, 이는 instability of VF convergence때문이다.
1. Double DQN
앞에 나온 double Q learning을 DQN에 적용하여, maximization bias를 줄여준다. 이미 DQN은 fixed parameter, current parameter 두 개를 사용하므로, 추가적인 계산없이 적용가능하다.
fixed parameter는 target Q-network parameter가 되며, 이 값을 이용해서 TD target값을 계산하고, current Q-network parameter는 어떤 액션이 best인지 선택한다. Loss 함수와 w 업데이트는 replay buffer에 있는 minibatch에서 해결하고, fixed parameter는 10번에 한 번 copy해서 update하거나 exponential로 점차 일정하게 한다.
2. Pritorized experience replay
DP에서 배웠던 prioritized sweeping과 유사하다. 오차가 가장 큰 것부터 update하는 것이 DP에서였다면, DQN에서는 오차가 큰 것이 random으로 뽑힐 확률이 크다.
TD오차에 비례하게 확률을 정할 수도 있고, stochastic prioritization은 hyperparameter c를 통해서 uniform probability, greedy probability를 정한다. 그리고 가장 학습이 많이 된 episode인 가장 최근 episode는 가장 큰 확률을 가지고 buffer에 들어온다. 실제로 효율적으로 사용하기 위해서는 sum tree라는 구조를 써야한다. sum tree란 parent node vlaue=left node value+right node value를 계산하는 것이다.
3. Dueling DQN
Q값은 현재 상태에서 내가 취할 action에 대해서 미래까지 얼마나 좋은지를 평가하는 이득이다. 그래서 두 가지에 의해서 영향을 받는데, 첫 번째로는 현재 상태에 강하게 영향을 받고 두 번째로는 그 이후에 있는 action에 대해서도 받는다. action에 의존하지 않는 V값과 action에 대한 값인 A의 합이 우리가 구하려고 하는 Q값이다. 기존의 방식과 다른 점은 아래쪽 그림처럼, 각각 다른 parameter alpha, beta로 각각 학습된다는 것이다. 그래서 more deep한 방법이다. Bellman optimality VF를 사용해서 A의 max값또한 0이다. 하지만, 이걸 계속 보장하면서 학습을 진행하기란 어렵다. 여기에는 두 가지 방법이 있다.
첫 번째로는 정의 그대로 A(action advantage function)값에다가 max값을 빼주는 것이다. 이렇게 한다면 그 어떤 상황에서도 A의 max는 0이지만, 실제로는 impractical하다. max함수의 nonlinearity도 있다.
그래서 두 번째 방법을 사용한다. 두 번째 방법은 off-target이지만 훨씬 practical하다. 이때 A에 대해서 평균을 빼주는데 이러면 당연히 A의 max는 0이 아니지만, stable하게 수렴하기 때문에 오히려 더 실용적이다.
주로 앞에서도 배우고 좋은 extension을 많이 적용했다. Double Q, Prioritized ER, Dueling network, multi-step learning(use n-step target), Distributional RL(Learn Q as a distribution), noisy net을 결합하여 결과를 분석해본다. 결과는 초기 DQN보다 300%로 우수한 성능을 보인다. 여기서 하나씩 변인을 제거하는 ablation study결과, PER과 multi step learning이 가장 결정적이었다.
참고
Activation function을 사용하는 이유
1. Restircted number
2. Add a nonlinearity