300x250

Ch10까지 강화학습이 어떻게 동작하는지, 학습을 진행하는 알고리즘은 어떤 것들이 있는지 살펴보았다.

이번 내용부터는 Deep Reinforcement Learning에 대해 알아볼 것이다. Deep Reinforcement Learning(DRL)은 인공지능 분야에서 큰 인기를 얻고 있는 딥러닝과 강화학습을 결합한 개념이다.

 

DRL을 이해하기 위해서는 인공신경망, 활성화 함수, Gradient Descent, Back Propagation 등의 딥러닝 기초 지식과 Convolutional Neural Network (CNN)에 대한 지식이 필요하다. 이는 다른 카테고리에서 자세히 다루도록 하고, 이러한 지식을 갖고있다는 가정 하에 Deep Q Network의 개념부터 알아보자.

 

 

목차

     

     

     

     

    1. Deep Q Networks (DQNs)

     

    DQN은 여러 Deep reinforcement Learning 알고리즘 중 하나로, 구글의 딥마인드 연구자들이 개발한 알고리즘이다.

    Atari game 등에서 screen image를 입력받아 사람 수준의 결과를 얻어내는 데 성공하여 큰 관심을 끌었다. (다들 딥러닝의 예시 하면 떠올리는 알파고 또한, 엄밀히 말하자면 DQN 기반이다.)

     

    DQN 네트워크가 어떤 구조로 어떻게 동작하는지 알아보고, double DQN, prioritized experience replay 등 DQN 아키텍쳐를 향상시킨 알고리즘은 어떤 것이 있는지 알아보자.

     

     

     

     

    1) Remind: Q function, Q-learning

     

    Q function을 다시 한 번 떠올려보자. 이는 state-action value function으로, state s에서 action a가 얼마나 좋은지에 대한 값을 나타낸다.

     

    그리고 Q-learning을 복기해보자. (이전 포스팅에서 자세히 다루었다.) 특히 DQN에서는 Temporal Difference Learning에서의 off-policy 방식을 선택하여 Q-learning을 진행할 것이다.

     

     

     

     

    2) DQN 아이디어 (Q network)

     

    지금까지 알아본 RL 환경은 매우 간단한 경우였다.

    모든 state-action pair를 만들고 저장하며, search하는 것이 그리 어렵지 않았다.

    하지만 실제 환경은 매우 복잡하다. state 수도 많고, 각 state에서 가능한 action 수도 많아 state-action pair를 모두 저장하고 search하는 것은 사실상 불가능하다.

     

    따라서 DQN에서는 Q function을 deep learning을 통해 근사화하는 아이디어를 사용했다.

    이를 수식으로 나타내면 다음과 같다.

    \( Q(s, a; \theta) \approx Q^*(s, a) \)

    수식의 의미 그대로, 기존의 Q function을 deep learning parameter(weight) \(\theta\)를 통해 근사화하겠다는 의미이다.

    이때 신경망이 \(\theta\)를 학습하도록 하여 Q value를 근사화할 수 있다.

     

    이렇게 Q function을 neural nework로 학습하는 것을 'Q network'라 한다.

     

     

     

     

    3) Objective Function

     

    Q network로 학습을 어떻게 시킬지는 objective function (cost function)을 무엇으로 설정하는가를 정하는 것과 같다.

     

    Temporal Difference Control에서 Q learning의 update rule을 복기해보자.

     

    \(Q(s, a) \leftarrow Q(s, a) + \alpha(R + \gamma \max Q(s', a') - Q(s, a)) \)

    • \(R + \gamma \max Q(s',a') \) : target value
    • \( Q(s, a) \) : predicted value
    • \(R + \gamma \max Q(s', a') - Q(s, a)\) : error

     

    이와 비슷하게 DQN에서는 loss function을 'squared difference'로 사용한다면, 다음과 같이 설정할 수 있을 것이다.

    \( Loss = (y_i - Q(s, a; \theta))^2\)

    • \(y_i = R + \gamma \max Q(s', a'; \theta) \)

     

    여기서 유의할 점은, prediction 값(\(Q\))과 target 값(\(y_i\))을 같은 network로 계산했다는 것이다. 이는 수식에 같은 parameter \(\theta\)를 사용한 것으로 확인할 수 있다.

     

    딥러닝의 개념을 활용하여, Gradient Descent 방법으로 loss function을 최소화하도록 weight를 update한다.

     

    참고로, 딥러닝에서의 loss function 중 mse(mean squared error)는 다음과 같다.

     

    \( J = \frac{1}{n} \sum_{i=1}^n \frac{1}{2} (y_i - \hat{y})^2\)

    • 이때 \( Loss = (y_i - \hat{y} )^2 \)

     

     

     

     

    4) DQN Architecture

     

    다음으로, DQN의 아키텍쳐를 살펴보자.

     

    먼저, 입력이 image이므로, input layer에서는 CNN을 사용하는 것이 좋을 것이다.

    이를 통해 convolutional layer는 image 내의 공간적인 관계 (spatial relationship)를 이해할 수 있다.

     

    여기서 주의할 점은, 일반 CNN 아키텍쳐에서 사용하는 'pooling layer'를 DQN에서는 활용하지 않는다는 점이다.

    pooling layer는 object detection, classification 등의 문제 해결을 위해 convolutional layer의 결과인 이미지 정보를 압축해주는데, DQN에서는 object가 다수 존재하고, 그 관계를 알아내야 하기 때문에 이미지를 압축해서는 안된다.

     

    그렇다면 Q value는 어떻게 계산해야할까?

     

    DQN의 입력으로 screen image 하나와 action 하나를 주어야 Q value를 출력할 것이다.

    하지만 이를 위해서는 network 전체가 한 번 실행되어야 한다.

    게다가 실제 상황에서는 state가 매우 많으므로 computational cost가 매우 높아진다.

     

    따라서 단순히 screen image 하나, 즉 action 없이 state만 입력으로 준다.

    이때 가능한 action 개수만큼 output layer의 뉴런 개수로 설정하여, 해당 state에서 모든 가능한 action에 대한 q value를 얻는다.

    이 과정을 그림으로 나타내면 다음과 같다.

     

    DQN Architecture

     

    이어서 game state에 대한 Q value를 예측하기 위해, 현재 screen과 과거 time step의 몇몇 screen을 사용한다. 이를 통해 agent의 움직임 등을 알 수 있을 것이다.

     

     

     

     

    5) Experience Replay (Replay Buffer)

     

    RL 알고리즘에서는 action \(a\)를 통해 state \(s\)에서 \(s'\)으로 transition이 일어나면서 reward \(r\)을 받는다.

    이러한 transition information을 '\(<s, a, r, s'>\)'과 같이 버퍼에 저장해둔 것을 'replay buffer' 또는 'experience replay'라 한다.

     

    이것이 필요한 이유는, 단순히 마지막 transition을 학습시키기 보다는 과거의 여러 경험 중 하나를 sampling하여 학습을 진행시키기 위해서이다.

    agent의 경험은 시간과 상관성이 매우 높아, 만약 단순히 마지막 transition을 학습시킨다면 network가 해당 상황에서만 동작하게 될 것이다. 즉, 일반화(generalization) 성능이 떨어질 것이다.

     

    따라서 replay buffer에서 random batch를 샘플링하는 것(고르는 것)으로 overfitting을 피할 수 있게 된다.

    여기서 replay buffer는 리스트가 아니라 큐(queue) 자료구조를 사용해야 할 것이다. 정해진 replay buffer 개수를 초과할 때마다 오래된 것들이 지워지고, 새로운 것이 추가되어야 하기 때문이다.

     

     

     

     

    6) Target Network

     

    앞서 언급했던 Loss Function에서, 우리는 다음과 같은 오차를 구했다.

     

    \( Loss = (R + \gamma \max Q(s', a'; \theta) - Q(s, a; \theta))^2 \)

     

    이때, DQN 아키텍쳐에서는 target value 계산과 predicted value 계산에 같은 parameter인 \(\theta\)를 사용한다고 하였다.

     

    하지만 이 경우, 발산하는 경우가 매우 많다. 따라서, 다음과 같이 target network에서 사용하는 parameter를 \(\theta'\)로 따로 둔다.

     

    \( Loss = (R + \gamma \max Q(s', a'; \theta') - Q(s, a; \theta))^2 \)

     

    여기서 \( R + \gamma \max Q(s', a'; \theta') \)는 target network, \( Q(s, a; \theta) \)는 Gradient Descent로 최적화할 대상인 actual Q network이다.

    이렇게 target network를 freeze시킨 상태에서 \(\theta\)를 update한 후, 일정 step마다 update된 \(theta\)를 \(theta'\)에 복사하는 방법으로 학습을 안정화시킨다.

    이때 복사할 step은 설계자가 설정한 hyperparameter이다.

     

     

     

     

    7) Clipping Rewards

     

    reward는 문제 종류마다 다르게 지정해야 한다.

    따라서 처음에는 단순히 -1과 +1로 clipping한 후, 학습을 진행하면서 설계자가 값을 바꿔주어야 할 것이다.

     

     

     

     

    8) Understanding the Algorithm

     

    전체적인 DQN 과정을 살펴보자.

    1. game screen(state)을 전처리하여 DQN에 feed, 즉 입력해준다. 이에 따라 DQN은 Q value와 가능한 action을 반환할 것이다.
    2. \(\epsilon\)-greedy policy를 통해 action을 선택한다.
    3. action에 따른 reward를 받는다. next state인 \(s'\)는 다음 입력이 된다.
    4. replay buffer에 transition 과정을 저장한다. ( \(< s, a, r, s' > \) )
    5. replay buffer에서 샘플을 추출하여 loss를 계산한다.
    6. gradient descent를 사용하여 actual network parameter \(\theta\)를 update한다.
    7. 매 \(k\) step마다 actual network의 weights \(\theta\)를 복사하여 target network weights \(\theta'\)에 할당한다.
    8. 1~7을 에피소드마다 반복한다.

     

     

     

     

     

    2. DQN Improvement

     

     

     

     

    1) Double DQN

     

    기존 DQN의 문제는 Q value를 overestimate하는 경향이 있다는 것이다.

    이는  Q-learning equation의 'max' operator 때문이다. max operator는 action을 고를 때에도, 평가할 때에도 같은 값을 사용하게 하여 이와 같은 문제를 발생시킨다.

     

    예를 들어, 현재 state \(s\)에서 \(a_1, a_2, a_3, a_4, a_5\)의 5개 action이 주어져 있고, \(a_3\)가 best action이라고 가정하자.

    state \(s\)에서 모든 action을 추정할 때, 추정값인 Q value는 실제값과 다를 것이다.

    이러한 차이를 noise라 하는데, 이때문에 optimal action인 \(a_3\)가 아니라 \(a_2\)의 값이 더 높게 나왔다고 해보자.

    그러면 best action을 고를 때 \(a_2\)를 골라버리는 상황이 발생한다.

     

    이를 해결하기 위해, Q function을 독립적으로 두 개를 사용하는 방법이 바로 Double DQN이다.

    하나는 action 선택에, 다른 하나는 action 평가에 사용하는 것이다. 이를 통해 target function을 조금 수정함으로써 문제를 해결할 수 있다.

    이는 마치 off-policy에서 behavior policy와 target policy를 독립적으로 구현하는 모습과 같다.

     

    기존 DQN의 target function은 다음과 같았다.

     

    \( y^{DQN}_{i} = R + \gamma \max Q(s', a'; \theta') \)

     

    이를 다음과 같이 수정한다.

     

    \( y^{DoubleDQN}_{i} = R + \gamma Q(s', argmax Q(s, a; \theta^{-}); \theta') \)

     

    여기서 weight가 \(theta'\)인 Q function은 action을 고르는 데 사용되고, weight가 \(theta^{-}\)인 Q function은 action을 평가하는 데 사용된다.

     

     

     

     

    2) Prioritized Experience Replay

     

    DQN 아키텍쳐에서 학습 샘플 간의 상관관계를 제거하기 위해 experience replay (replay buffer)를 사용하였다.

     

    그런데, replay buffer에서 transition을 샘플링 할 때, 모두 같은 확률로 뽑는 것은 효율성이 떨어진다.

    대신, transition에 우선순위를 부여하여 더 효과적으로 학습시킬 수 있다.

     

    이때, TD error 값이 높은 transition에 높은 우선 순위를 부여한다.

    TD error가 높다는 것은 학습이 덜 되었다, 즉 학습할 여지가 많은 transition이라는 것을 의미하고, 이를 우선적으로 학습시켜 다양한 상황에 대해 골고루 학습을 진행할 수 있다.

     

    prioritization은 두 가지 방법을 사용한다.

    • proportional prioritization
    • rank-based prioritization

     

     

     

    (1) proportional prioritization

     

    먼저, proportional prioritization의 수식은 아래와 같다.

     

    \( p_i = (\delta_i + \epsilon)^{\alpha} \)

     

    • \(\delta_i\) : transition의 TD error
    • \(\epsilon\) : 우선 순위 값이 0이 되지 않도록 해주는 매우 작은 양수 값 (\(p_i\) = 0\)이면 가능성이 영원히 사라짐)
    • \(\alpha\) : 우선순위를 얼마나 반영할 것인가 (0이면 uniform case, 즉 기존의 DQN과 같음)

     

     

     

    (2) rank-based prioritization

     

    rank-based prioritization의 수식은 아래와 같다.

     

    \( p_i = (\frac{1}{rank(i)})^{\alpha} \)

     

    • rank(i) : replay buffer 내에서 \(i\) 번째 transition
    • TD error가 높은 값(rank가 낮아지므로 \(p_i\)값이 커짐)부터 낮은 값(rank가 높아지므로 \(p_i\)값이 작아짐)으로 정렬됨

     

     

    728x90
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기