DQN 두가지 버전
1. 아카이브(리뷰잉 과정들을 통해서 타당성 검증 없음)
2. 개선된 Nature버전.
Alexnet 기존에 컴퓨터 비전보다 나은성능이라고 실험적으로 확인
DQN이 해결한(혹은 해결의 실마리를 제공한) 3가지 문제
Sensory인풋을 RL 에이전트에 적용하는 방법. DQN이전에는 난제였음.
Moving Q-target : 기존의 table setup에서 학습을 하는것과는 달리 function approximation을 사용하게 되면 학습에 불안정성이 생기게 된다.
DQN 한눈에 보기
sensory input에서 함수근사(여기선 CNN)를 통해 action을 아웃풋으로 내는 Q값을 학습했고,
추가적으로 Target network라는 트릭과 Experience replay라는 트릭을 사용할 것을 제안했음.
Target network : 아카이브에서는 구체적으로 기술안되고, 네이쳐에서 자세히 기술됨.
Experience replay : 1993년에 아이디어는 나왔었지만, resource문제가 있었나봄.
input(가로(width)*세로(Height)*채널(channel)이 주어지는데, 차원의 저주라는 문제가 심각하게 발생하게 된다.
합성곱신경망을 이용해서 완화를 했음.
두개의 트릭 (target network / Experience replay)를 이용해서 학습과정을 안정화 시킴.\
심층신경망이 RL에 적용된것이 DQN이 처음은 아니다.
단지 Computational , Data, 구조적인 문제 등으로 이전까지는 학습이 잘 되지 않았음. 그래서 case by case로 풀었으나
DQN에서는 최소한 Artary게임에 대해서는 특별히 하이퍼파라미터 튜닝 없이 다양한 아타리 게임을 풀 수 있는 심층 신경망 구조가 제시 된 것임.
그래서 DQN이 뭘한건데?
2013년 당시에 최고의 구조를 가졌던 CNN을 활용해서 차원의 저주 극복.
세가지 포인트들에 대해서 차근히 얘기해볼 것.
1. Sensory input과 차원의 저주
각셀안에 8bit로 표현된 (0, 255)까지의 숫자
3Channel로 표현된 RGB값
각 Channel의 Layer W*H
= State가 2^8 * 3 * W*H가 된다.
너무 큼.
CNN으로 차원의 저주 넘어가기
Alexnet의 구조를 가져왔기 때문에 Alexnet에 대해서 알아보자.
이 당시(2012) ImageNet 경연이 있었다 (물론 지금도 있음)
1000개의 class를 가지는 이미지 셋이 있었음.
임의로 이미지를 받았을 때 어떤 이미지인지 분류해내는 문제.
사람보다 심층신경망이 점점 잘하게 되는데..
2015년부터 사람보다 잘하는 분류기를 생성해냄.
Alexnet : 2012년의 대장 CNN
원래 256*256 이미지가 있는데, 이를 전처리 과정을 통해 224*224로 바꾸게 되고
GPU의 메모리가 부족해서 2갈래로 나눠서 처리하고(위/아래) 각각의 GPU에서 나오는 결과를 하나로 합쳐주는 과정이 있음.
DQN의 Forward과정
이미지 인풋을 받고, 이미지 전처리를 함.
회색조 전처리 + 사이즈 조절은 보통 하는 트릭이고
과거의 상태를 이미지 전처리 할 때 추가해줬음.
회색조 전처리는 RGB 3이-> gray Scale 1로 바뀌어서 기존에 1*W*H로 바꼈을텐데.
과거의 상태 3이 추가되서 (1+3)*W*H가 됐다.
무슨 의미냐면 새롭게 DQN의 state를 정의할때 기존에 있었던 St에다가 St-1, St-2, St-3을 추가해줌.
CNN에서는 AlexNet을 가져오고 , MLP붙여서 상하좌우 4dimension에 대한 Q를 구하게 구조를 바꿔줌.
과거의 상태를 왜쓰는거야 ?
다음을 보자
과거의 상태가 왜 도움이 되나요 ?
공의 움직임을 관측한다고 생각하고 원하는 힘을 주어 공을 제어한다고 생각해보자.
특정 시점의 상태는 xt,yt로 t시점의 공의 x,y위치.
액션은 x,y축으로 주는 힘 F으로 정의하고 보면
t=0에서 t=1로 됐을때 a0에 의해서 상태가 s1으로 바뀐건 알 수 있지만, 공이 가지는 가속도에 대해서는 모르게 된다.
cartpoll문제에서는 그래서 state에 각속도도 함께 넣어줬었음.
그런데 과거의 상태를 추가해주면 t값은 고정되었으니 빼주면 거리가 나올거고 등등 활용하면 가속도까지도 알 수 있게된다.
이런 공의 이동같은것은 유저의 직관이 들어가서 가속도를 알지 못할 것이다. 라고 생각해서 과거의 상태를 넣어줌으로써 해결하지만 모든 현실문제에 대해서 직관을 얻기 힘들고 파악하기도 힘들다. 그래서 과거의 상태를 왕창 넣어줌으로써 그나마 상태가 Markovian이 되도록 바꿔주고 어떻게든 RL을 잘 할수있게 만들어준다. (기대하는 것에 불과하지만 일반적으로 많이 쓰인다.) Non-MDP -> MDP로 바꾸는 기법중 하나임.
다음 문제도 보자.
2. 샘플간의 시간적 연관성 문제
과거의 상태를 사용하고 CNN을 사용해서 curse of dimensionality를 해결하는 문제에 대해서 다뤄봤다.
두번쨰 이슈인 샘플간의 시간적 연관성 문제인데. 일단 이게 왜 문제인지보자.
온라인 Q-Learning은 Q를 학습할 때 불안정 할 수 밖에 없다. 왜냐하면 Td setup이다 보니까
max가 잘못 추정되면 당연히 Q값도 산으로 갈수밖에 없고, 학습초기에는 부정확해짐.
또한, Q-learning에서 max값이 의도치않게 높은값이 나올수있음.
특히나 입실론 탐욕적 정책의 경우에 a0와 a1이 비슷한데도 불구하고 미세하게나마 큰놈을 무조건 쓰게 되다보니 한버니의 업데이트로 매우 크게 변한다.
또한 MDP 자체가 순차적으로 진행되므로 최근 얻은 경험들은 서로 연관성을 가질 수 밖에 없다.
그러니 한번 진행에 한번 업데이트 하지말고 batch단위로 Q를 업데이트하는 방식이 제안됨
이를 experience replay라고 한다.
Noisy한 환경에서 온라인 업데이트 vs 배치 업데이트
위의 데이터를 임의로 생성하고(Noise있는 데이터)
1.Online-like (sample update에 해당)
2.mini-batched update (유사 experience replay)
로 모델을 만들고 비교를 해보면
train셋에서 loss가 online이 잘나오지만, validation에서는 mini batch가 더 좋음.
즉 online은 아는것에 대해서 잘 판단하지만, 모르는것(validation)에서 잘 못한다.
우리가 function approximation을 사용하는 이유가 관측해보지 않은 Q(s,a)에 대해서 Q값을 잘 추산하기를 바랬는데,
online은 이에 부적합하다라고 볼 수 있다.
Replay buffer OR Experience replay
DQN 논문에서는 위와같은 문제가 있으니 batch를 사용하고 싶기에 Replay buffer를 통해서 해결했다.
이전에 Part4에서 Memory에 대해서 공부했는데, Episoding memory같은경우 에피소드들을 잔뜩 큐에다 넣어놓고 필요할때마다 가져와서 쓰는거였는데, Replay buffer도 유사한 기능이다.
조금 차이가 잇다면 Q-learning에 기반한 방식이고, Q-learning은 off-policy이다.
off-policy 방식은 어떻게든 얻어진 샘플을 계속 사용할 수 있었다.
Epsoding memory의 경우는 Policy 파라미터가 업데이트 되게 되면 기존에 있었던 Experience들을 다 버렸어야 했다.
Replay Buffer의 경우는 다 버릴 필요는 없고, 버퍼의 최대크기를 일단 결정해놓고, 버퍼에 새로운 경험을 Enque해주면 된다. deque의 경우 가장 오래된 경험을 pop한다.
그래서 우리는 experience들을 큐(버퍼)에 넣어두고 필요할때마다 샘플링해와서 training하게 된다.
Notation은 D로 한다.
Batch Q-update
배치버전의 Q를 업데이트 할 수 있게 배치버전의 Q-update 수식을 알아보자.
1은 기존 바닐라버전의 Q값 계산이고
함수근사를 사용하면 Loss를 minimize하는 L값으로 업데이트를 하는 반면에
Experience replay를 사용하게되면, buffer D에서 m개의 데이터를 가져와서 L을 구하고, 그것들의 평균값에 대해서 경사하강법을 진행하면 된다.
Automatic differentiation tool 로 Q-Learning 구현하기
파란색 부분(max부분)에 대해서 편미분을 절대로 계산하면 안된다.
기존에 했던것 처럼 동일한 네트워크를 복제해서 input으로 s'(다음상태)에 대해서 Q값을 계산해서 argmax를 통해 가져온거랑 현재상태의 reward를 더해서 target이 된다.
Experience replay 사용에 주의점
Experience replay자체가 기존에 얻었던 경험들을 재활용 하겠다 이므로 on-policy에는 적용 불가하다.
배치사이즈(m)이 어떤값을 가지는 것이 좋은지는 아직 정해지지 않았다. 하이퍼파라미터라고 생각하면 됨.
Moving target issue
함수 근사가 없는 Q-learning의 경우 특정한 Q(s,a)의 업데이트가 다른 Q(S,a)에 영향을 미치지 않는다.(함수근사 없는 업데이트의 좋은점임)
위처럼 주황색부분들을 보면 S0의 A3만 -1로 변했을 뿐, 다른 A1,A2,A4,A5에는 영향을 미치지 않았다.
그러나 함수근사로 업데이트를 하면 A3를 -1로 업데이트 한것이 다른데에도 영향을 미친다.
이게 무슨 문제가 있는걸까
특히 Q-learning에서는 target을 계산할때
이런걸 타겟으로 뒀는데, 우리가 맞춰야하는 녀석이 내가 내자신을 업데이트 함에 따라 계속적으로 target도 update되서 절대 맞출 수 없는 값이 되어버린다.
Target Network로 해결
Q-learning을 하고있는 네트워크가 존재하고, 현재 Q-learning parameter와 동일한 parameter를 가지는 network가 하나 더있는 것이다.
그래서 Q-learning을 하고있는 Q-network를 C번 업데이트 할 동안 target-network는 고정됨.
그 고정된 target-network에 대해서 Q-network의 파라미터로 업데이트 하게된다.
C번이 지나게되면 업데이트된 Qtheta의 파라미터를 다시 복사해서 target-network에 적용한다.
이처럼 타겟네트워크에서만 target(ri+rmaxQ)를 계산.
DQN의 트레이닝 과정(전체)
NATURE에 실린 DQN 트레이닝 의사코드
1. replay memory D의 크기를 N으로 정함.(무한한 버퍼는 필요없고, 엄청 오래된 과거경험은 필요없음)
2. Q function 랜덤하게 초기화
3. Q-target network도 2와 같게끔 초기화
For문에서..
1. 환경 리셋(env.reset())
2. preprocessed - Gray Scale만드는것, 사이즈맞추기, 과거 히스토리 넣는것.
3. 입실론 그리디로 랜덤 액션 select or argmax로 액션 을 선택
4. 액션을 에뮬레이터에 넣음(카트폴이나 아터리 게임) -> 보상과 다음상태 얻음.
5. Φ를 다시 구하고 샘플을 D에 넣어주고
6. 버퍼에서 샘플링 해오고 DQN타겟을 만듦.
7. target하고 , 현재 네트워크 추산치의 차이를 최소화 하기위해서 경사하강법 시행.
8. Cstep마다 Q-network의 파라미터를 target network에 적용시켜줌.
Target network 이야기.
다음에 볼 DDPG에 대해서..
DQN에서 제안된 target network update를 hard라고 하고 이는 새로운 파라미터를 온전히 받아들임.
DDPG에서는 soft한 방식을 제안했는데, target network를 업데이트를 할 때 새로운 파라미터를 얻었어도 기존의 파라미터를 고려해서 target network를 업데이트 하는 방식이 제안됨.
그래서 타우가 0이 되면 DQN스타일이 되는거고, 1이 되면 사실상 업데이트 안하는것과 같다.
이렇게 하는 이유는 moving target을 hard하게 움직이는것보다. soft하는게 낫다는 취지에서 제안되었다.
Ablation study
논문에서 제안했던 새로운 장치들을 넣고 빼보면서 특정 장치가 얼마나 성능에 영향을 미쳤는지에 대한 report임.
DQN에서는 Experience replay, target Q-network를 제안했기에 테스트됨.
ER : Experience replay
맨 오른쪽이 naive DQN.
마무리.
'인공지능 > Reinforce_Learning' 카테고리의 다른 글
강화학습 기초내용 contents (1) | 2021.06.10 |
---|---|
[PART 3] Ch 02. Pytorch로 선형회귀 모델 만들기 (0) | 2020.12.29 |
[PART 03] CH02. 심층 신경망을 활용한 함수근사(선형근사) (0) | 2020.12.29 |
[PART3] CH01. 함수근사 소개 (0) | 2020.12.25 |
[Part2] CH05. Off-policy TD contorl과 Q-Learning (0) | 2020.12.23 |