Lab22) DQN exercise
Deep Q learning Network(Exercise Cart Pole)
< Lab Objective and Whole simulation program flow >
Deep Q Networks
앞선 Lab 07 과제에서 배운 Q-learning 에서 Q-learning 이 다룰 수 있는 데이터의 스케일이 매우
크다면
계산 과정이 너무 많아진다는 단점이 생길 것이라는 것을 생각 할 수 있습니다. 따라서 여기서
딥러닝을 과정에 추가하면 어떨까 하는 생각으로 고안된 것이 바로 Deep Q Network 인 DQN 입니다.
Q-learning 과 deep learning 을 합친 것을 바로 Deep Q Networks 라고 부릅니다. 아이디어는 Q-table
대신 신경망을 사용해서, 그 신경망 모델이 Q value 를 근사한 값을 낼 수 있도록 학습시키는
것입니다. 그래서 이 모델은 주로 approximator 또는 approximating function 라고 부르기도 합니다.
모델에 대한 식은 Q(s,a;θ)으로 표현되며 여기서 θ 는 신경망에서 학습할 가중치를
나타냅니다. 앞서서 Q-learning 에서 사용했던 value estimate 식인 bellman-equation 은
Q(s,a)=r(s,a)+γmaxaQ(s′,a) 인데, 이때 Q value 가 수렴해서 참값에 도달했을 때 좌변의 식과 우변의
식이 같아지는 즉, 두 값은 완벽히 같아집니다. 따라서 두 값의 차이를 최소화하는 방향으로 모델을
학습해 나가도록 합니다. 그렇다면, cost function 은 다음과 같은 식으로 간단히 정의됩니다.

학습 과정에 대해서 보면 강화학습에서는, Training data set 이라는 게 처음에는 따로 없습니다.
지도학습과 비지도학습의 중간 형태의 RL 은 Agent 가 행동을 취함에 따라 데이터셋은 점점 쌓여
나가는 방식을 택하는데 따라서 Agent 는 매 순간 그때까지 학습된 네트워크를 통해 최적이라고
판단된 행동을 취하면서, 에피소드가 끝날 때까지 state, action, reward, 그리고 다음 state 에 대한
데이터를 쌓아 나갑니다.
데이터를 쌓으면서 학습하는 과정은 이렇습니다. 학습에 필요한 batch size 를 b 라고 한다면, Agent 는
행동을 b 번 취하면서 b 개의 데이터 set 들이 기록합니다. 이때 저장된 메모리 공간에서 방금 기록된
b 개의 데이터셋으로 학습하는 것이 아니라, 지금까지 쌓인 데이터셋 중 b 개를 랜덤으로 선택해서
신경망을 학습시킨다는 점입니다. 메모리를 저장하는 저장소의 형태는 몇 가지 종류가 있는데, 그 중
가장 많이 쓰이는 것은 cyclic memory buffer 입니다. 이는 Agent 가 학습에 관련 없는 데이터들보다,
조금 더 의미가 있을 최신의 데이터로부터 학습할 수 있도록 도와줍니다.
신경망은 현재 state 에 대한 정보와 현재 취할 action, 두 가지를 입력 받습니다. 그 후에는 모델
내에서 연산을 거쳐 Q-value 를 출력하게 됩니다. 그 이후의 형태는 다음과 같은 그림과 같다고 볼 수
있습니다. 그림에서 s 는 state 를 a 는 action 을 의미합니다.

하지만, 여기 위의 그림을 반영한 식을 생각하면 벨만 방정식에서 우리는 가치를 최대화하기 위해
미래에 선택할 수 있는 행동에 따른 가치 중 최대값을 취해야 하는 부분이 있었습니다.
maxaQ(s′,a)max 부분 이 존재하며 이부분을 위한 계산으로 모든 action 을 취해본 결과값을 비교하는
과정 즉, 신경망 연산을 여러 번 돌리는 과정이 필요하다는 비효율적인 부분이 존재합니다. 따라서
구조를 아래와 같이 변경하면 다음과 같습니다.

이렇게 수정하면 우리는 model 의 각 state 들만을 입력해줬을 때 각 행동에 대한 모든 Q-value 를 한
번에 얻을 수 있습니다. 그리고 이때 사용하는 수정된 구조에 쓰이는 모델은 논문이나 데이터셋이 큰
경우에는 CNN 구조를 취하며 우리 과제에서는 작은 데이터에 대한 과정이므로 FNN 을 이용하도록
하였습니다. 따라서 이번 과제 Lab08 에서도 이러한 DQN 을 이용하여 cartpole 게임을 실행하도록 해
볼 수 있도록 합니다.
전체적인 흐름을 간단히 코드 블록 단위로 나눠서 전체 진행을 보면 다음과 같이 설명할 수 있습니다.
Library Packages 를 준비합니다. GPU 환경을 setting 하고 현재 gpu 가 갖춰져 있는지와 gym 의
version 을 확인합니다 그리고 cartpole 의 예제를 simulaiton 할 수 있는 environment 를 select 합니다.
그리고 training 에 쓰일 함수들인 reset 과 step 의 등등의 함수를 정의합니다. Environment
variables 를 check 하고 보여줍니다. 여기서 environment 는 action, observation, state, value 와 같은
것들의 상세한 정보를 보여주도록 합니다. Agent 를 define, initialize 하는과정을 거칩니다. DQNet 을
FNN 으로 layer 를 쌓고 build 한 뒤 policy function 을 define 하고 그 모델을 summary 를 통해 잘
되었는지 확인하고, replay memory 를 define 하고 initialize 하는 과정을 거칩니다. 그리고 Training
loop 와 evaluation loop 의 one step 을 define 하고 epsilon function 또한 define 한 뒤 이에 쓰이는
hyperparameters 를 setting 한 뒤 main training loop 를 define 하고 training 시킵니다. 그리고 그에
따른 결과, Training Histories 를 plot 하고 agent 를 evaluate 하고 agent 가 어떻게 진행되는지 video 를
생성 후 보여주는 것으로써 그 결과를 확인합니다.
그리고 exercise하는 .ipynb 파일은 다음과 같습니다. https://github.com/LequalB/AI_programming/blob/main/Lab08_DQN_dist_2019202103_%EC%9D%B4%EC%9D%80%EB%B9%84/Lab08_DQN_dist_2019202103_%EC%9D%B4%EC%9D%80%EB%B9%84.ipynb