강화학습이 무엇인지, 강화학습을 이용해 어떤 성과들을 이뤘는지 살펴본다. 또한 강화학습에서 사용하는 기본 용어들을 알아본다.
기계 학습이란?
기계 학습은 아서 사무엘이 "기계가 일일이 코드로 명시하지 않은 동작을 데이터로부터 학습하여 실행할 수 있도록 하는 알고리즘을 개발하는 연구 분야"라고 정의했다. 기계 학습은 크게 지도 학습, 비지도 학습, 강화 학습으로 나눌 수 있다.
지도 학습(Supervised Learning)은 정답(Label)이 있는 학습 데이터 세트(Train Dataset)이 필요하다. 지도 학습 기법을 이용하는 경우에는 머신러닝 알고리즘이 데이터 세트의 특징(Feature)을 통해 예측(Predict)한 값과 실제 정답의 오차를 줄여나가도록 반복적으로 학습한다. 학습이 완료되면 데이터의 특징을 통해 실제 정답과 유사한 예측을 수행할 수 있는 것이다. 지도 학습은 주로 회귀(Regression)나 분류(Classification)와 같은 문제를 해결하는 데 사용된다.
비지도 학습(Unsupervised Learning)은 지도 학습과 반대로 데이터 세트에 정답이 따로 존재하지 않는다. 단지 데이터가 가진 특징을 기반으로 학습하여 데이터가 어떻게 구성돼 있는지 알아 나간다. 비지도 학습은 주로 군집화(Clustering)와 같은 문제를 해결하는 데 사용된다.
강화 학습(Reinforcement Learning)은 지도 학습처럼 정답이 있지도 않고 비지도 학습처럼 데이터만을 기반으로 학습하지도 않는다. 강화학습은 에이전트가 환경과 상호작용하고, 이 환경에는 보상이라는 기준이 있어 다양한 시행착오를 겪어가며 보상을 최대화하는 방향으로 학습한다.
강화학습의 기본 용어
강화학습은 보상을 최대화하는 의사결정전략 즉, 순차적인 행동을 알아나가는 방법이다. 순차적으로 계속 행동을 결정해야 하는 문제를 수학적으로 정의한 것이 MDP(Markov Decision Problem)이다.
MDP는 상태(State), 행동(Action), 보상 함수(Reward Function), 감가율(Discount Factor), 상태 변환 확률(State Transition Probability)로 구성되어 있다. MDP의 구성 요소를 포함한 강화학습의 기본 용어를 알아본다.
에이전트(Agent) : 강화학습에서 의사결정을 하는 역할을 한다. (게임에서 우리가 조종하는 주인공이라고 할 수 있다.)
환경(Environment) : 에이전트의 의사결정을 반영하고 에이전트에게 정보를 주는 역할을 한다. (게임에서 플레이어가 조작하는 대로 게임 화면, 점수, 목숨 정보와 같은 것을 바꿔주는 게임 시스템 자체라고 할 수 있다.)
관측(Observation) : 관측은 환경에서 정보를 제공해주는 정보이다. 통상적으로 현재 스텝의 관측은 $O_t$ 라고 표기한다. 유니티 ML-Agents에서는 관측을 시각적 관측(Visual Observation)과 수치적 관측(Vector Observation)으로 구분한다. 시각적 관측은 현재 상태의 정보를 이미지로 표현한 것이고, 수치적 관측은 수치로만 표현한 것을 의미한다.
상태(State) : 에이전트는 상태를 기반으로 의사결정을 한다. 상태는 에이전트가 의사결정을 할 때 사용하기 위해 관측값, 행동, 보상을 가공한 정보이다. 이전 스텝의 관측값들을 저장했다가 이 히스토리를 에이전트에게 넘겨줄 수도 있고, 그중 원하는 정보만 골라서 상태로 넘겨줄 수 있다. 일반적으로 현재 스텝의 상태는 $S_t$ 라고 표기한다.
행동(Action) : 에이전트가 의사결정을 통해 취할 수 있는 행동을 의미한다. 일반적으로 현재 상태에서 취하는 행동을 $A_t$ 라고 표기한다. 행동에는 이산적인(Discrete) 행동과 연속적인(Continuous) 행동이 있다. 이러한 행동은 환경에 따라 정해진다. 이산적인 행동을 하는 환경은 행동의 선택지가 있고 그중 하나를 선택하는 것이며 연속적인 행동을 하는 환경은 선택지마다 특정 값을 수치로 입력하여 행동하는 것이다.
보상 함수(Reward Function) : 에이전트가 특정 상태에서 특정 행동을 했을 때 보상을 받게 되고 에이전트는 이 보상 정보를 통해 학습을 진행한다. 일반적으로 현재 상태 $s$에서 특정 행동 a를 했을 때 얻는 보상의 기댓값을 $R_s^a$라고 표기한다. 이를 수식으로 표기하면
$$R_s^a=E[R_{t+1}|S_t=s, A_t=a]$$
라고 표기한다. 수식에서 $t$는 현재 스텝을 의미한다. 따라서 $R_s^a$는 현재 상태 $s$에서 행동 $a$를 취해서 얻을 수 있는 보상 $R_{t+1}$의 기댓값을 의미한다.
감가율과 반환값
강화학습은 시행착오를 겪으며 보상을 최대화하는 의사결정 전략을 학습하는 것이다. 강화학습에서는 에피소드가 끝나면 지나왔던 상태에서 했던 행동에 대해 정보를 기록한다. 그리고 그 정보를 이용해 다음 에피소드에 의사결정을 한다. 또 에피소드가 끝나면 이 에피소드를 통해 얻었던 정보를 기록으로 업데이트하는 과정을 반복한다.
어떤 정보를 기록하면 좋은 의사결정을 할 수 있을까? 미래에 대한 정보를 미리 알면 좋은 의사결정을 할 수 있을 것이다. 따라서 $t$ 스텝에서 받았던 보상 $R_{t+1}$부터 에피소드가 끝날 때까지 받았던 보상들을 더한 것을 정보로 이용한다.
다음을 통해 학습 과정을 살펴본다. 현재 모든 기록 정보는 0으로 초기화된 상황이다.
아래 그림과 같이 빨간색 경로를 한 에피소드를 마치고 나서 $t$ 스텝에서부터 얻은 보상들의 합 정보를 기록해본다. 그러면 빨간색 경로를 지나며 방문한 상태에서 취한 행동에 대해서는 1이, 그 외에는 0이 기록된다.
그렇다면 다음 에피소드를 이용할 때 이 정보를 이용한다고 하면 어떻게 될까? 에이전트는 자신의 상태에서 기록한 값이 높은 행동만 하게 된다면 사과에 도착할 수 있다. 하지만 현재 빨간색 루트는 불필요한 경로를 포함하고 있다. 즉, 파란색 경로가 빨간색 경로보다 효율적이라고 할 수 있다.
하지만 에이전트는 초기 상태에서 위로 갈 때 왼쪽으로 갈지 판단할 수 없다. 즉 현재 기록하는 정보로는 어느 경로가 효율적인지 알 수 없다. 이를 보완하기 위해 **감가율(Discount Factor)**이라는 개념을 도입한다.
감가율은 통상적으로 $\gamma$라고 표기한다. 0부터 1 사이의 값으로 설정을 하며, 1에 가까울수록 미래의 보상에 많은 가중치를 두는 것을 의미한다. 이제 감가율이 반영된 보상 정보를 기록해보면 아래 그림과 같이 $t$ 스텝부터 받았던 보상 $R_{t+1}$부터 에피소드가 끝날 때까지 받았던 보상들에 감가율을 스텝 차이만큼 곱해서 더해준다.
$$R_{t+1}+{\gamma}R_{t+2}+{\gamma}^2R_{t+3}+...+{\gamma}^{T-t}R_{T+1} $$
($T$는 종료 스텝)
예를 들어 $t+3$ 스텝에서 의사결정을 통해 받은 보상 $R_{t+4}$에는 감가율 ${\gamma}$을 3번 곱하여 ${\gamma}^3R_{t+1}$를 더해준다. 그리고 이 값을 **반환 값(Return Value)**라고 부른다. $t$ 스텝에서의 반환 값은 일반적으로 $G_t$라고 표기한다. 반환 값을 수식으로 표현하면 다음과 같다.
$$G_t=R_{t+1}+{\gamma}R_{t+2}+{\gamma}^2R_{t+3}+...$$
위 수식에서 ${\gamma}R_{t+2}$가 아니라 ${\gamma}^2R_{t+2}$인지 헷갈릴 수 있다. 하지만 $t$ 스텝에서 의사결정을 통해 받은 보상은 $R_{t+1}$이다. 따라서 $R_{t+2}$는 $t+1$스텝에서 의사결정을 통해 받은 보상이므로 감가율을 한 번만 곱해준다. 아래 그림에서 감가율은 0.9로 설정했다.
위 그림에서 보면 알 수 있듯이 반환 값을 기록할 때는 종료된 상태부터 처음 상태까지 거꾸로 계산하는 것이 쉽다. 예시 환경에서 보상은 사과에 도착할 때만 얻기 때문에 각 $t$ 스텝의 반환 값 $G_t$는 ${\gamma}^{T-t}{\times}1$이다. 여기서 $T$는 에피소드가 종료된 스텝을 의미한다. 이렇게 반환 값을 기록하면 이전에 어느 경로가 효율적인지 판단하기 어려운 문제를 해결할 수 있다. 에이전트가 초기 상태에서 왼쪽으로 이동하는 것보다 위로 이동하는 것의 반환값이 더 높기 때문에 효율적인 경로로 이동하게 되는 것이다.
하지만 에이전트 첫 에피소드에서 빨간색 루트를 찾고 반환값이 높은 상태로만 이동하게 되면 파란색 루트를 찾을 수 없을 것이다. 그래서 가끔은 무작위로 움직여 여러 경로를 탐험해보는 것도 중요하다. 이를 **탐험(Exploration)**과 **이용(Exploitation)**이라고 한다.
상태 변환 확률(State Transition Probability) : 상태 변환 확률이란 상태 $s$에서 행동 $a$를 했을 때 다음 상태가 $s'$이 될 확률을 의미한다. 일반적으로 상태 변환 확률은 $P_{ss'}^a$라고 표기한다.
정책(Policy) : 정책은 특정 상태에서 취할 수 있는 행동을 선택할 확률 분포를 출력해준다. 일반적으로 $\pi$라고 표시하며, 아래 그림과 같이 취할 수 있는 행동들에 대한 확률을 의미한다. 현재 상태 s에서 정책을 이용하여 가능한 행동들에 대한 확률을 수식적으로 표현하면 다음과 같다.
$$\pi(a|s) = {\begin{matrix} 0.4\quad (if\;a = up) \\ 0.4\quad (if\;a = left) \\ 0.1\quad (if\;a = down) \\ 0.1\quad (if\;a = right) \end{matrix}}$$
가치 함수와 큐 함수
강화학습의 목적은 보상을 최대화하는 의사결정 방법을 학습하는 것이다. 즉, 에이전트가 특정 상태에서 보상을 최대화할 수 있는 행동을 선택해야 한다. 여기서 보상을 최대화할 수 있는 행동이란 현재 상태에서 이동할 수 있는 다음 상태 중 가장 가치가 높은 상태로 이동할 수 있는 행동을 의미한다. 그렇다면 가치가 높은 상태는 어떤 상태를 의미하는가? 가치가 높은 상태는 그 상태의 반환 값에 대한 기댓값이 높다는 것을 의미한다. 그리고 이 가치를 수식적으로 표현하기 위해 가치 함수라는 개념을 도입한다.
가치 함수에는 **상태 가치 함수(State Value Function)**와 **행동 가치 함수(Action Value Function)**가 있다. 상태 가치 함수는 통상적으로 **가치 함수(Value Function)**라고 줄여서 부른다. 그리고 행동 가치 함수는 통상적으로 **큐 함수(Q Function)**라고 부른다. 그러면 가치 함수와 큐 함수를 통해 어떻게 보상을 최대화하는 행동을 결정할 수 있는지 살펴본다.
가치 함수(Value Function) : 가치 함수는 특정 상태에 대한 가치를 도출하는 함수이다. 이 함수는 상태를 입력으로 받고 그 상태의 가치를 출력한다. 일반적으로 가치 함수는 $V$라고 표기한다. 특정 상태 $s$에 대한 가치 함수는 다음과 같다.
$$V(s) = E[G_t|S_t=s]$$
수식에서 반환 값을 풀어서 표기하면 다음과 같다.
$$V(s) = E[R_{t+1}+{\gamma}R_{t+2}+{\gamma}^2R_{t+3}+...|S_t=s]$$
예를 들어 설명하면 각 상태에 대한 가치를 아래 그림과 같이 나타낼 수 있다. 즉 현재 상태 s에서 가치 함수를 표기하면 V(s)=0.1이 된다. 아래 그림과 같은 상황에서 에이전트 주변에 가치가 높은 상태로만 이동하면 사과에 도착할 수 있다. 즉 최적의 행동을 가치 함수를 통해 표현하면 다음 식과 같다.
$$a^*={\argmax}_{a\in{A}}V(s')$$
현재 상태 $s$에서 취할 수 있는 행동들 $A$ 중에서 최적의 행동 $a^*$는 가장 높은 가치를 얻을 수 있는 다음 상태 $s'$로 이동할 수 있는 행동 $a$를 의미한다.
큐 함수(Q Function) : 가치 함수가 상태에 대한 가치를 도출했다면, 큐 함수는 상태에서 특정 행동에 대한 가치를 도출한다. 따라서 큐 함수는 입력으로 상태와 행동을 받고 해당 상태에서 행동에 대한 가치를 출력한다. 일반적으로 큐 함수는 $Q$라고 표기한다. 특정 상태 $s$에서 특정 행동 $a$에 대한 큐 함수는 다음과 같다.
$$Q(s,a)=E[G_1|S_t=s, A_t=a]$$
즉 현재 상태 $s$에서 행동 $a$를 통해 얻을 수 있는 반환 값들의 평균을 의미한다. 그리고 큐 함수를 이용하여 가치 함수를 수식으로 나타낸 결과는 다음과 같다.
$$v_x(s)=\Sigma_{a{\in}A}\pi{(a|s)q_{\pi}(s, a)}$$
즉 현재 상태 $s$에서의 가치 함수 값은 각 행동 $a$에 대한 큐 함수의 값에 해당 행동을 할 확률 ${\pi}(a|s)$를 곱해서 더한 값이다. 큐 함수를 가치 함수를 이용해 수식으로 나타내면 다음과 같다.
$$q_{\pi}(s,a)=R_s^a+{\gamma}\Sigma_{s'{\in}S}P_{ss'}^av_{\pi}(s')$$
$q_{\pi}(s, a)$는 현재 상태 s에서 행동 a를 통해 얻은 보상 $R_s^a$와 ${\gamma}\Sigma_{s'{\in}S}P_{ss'}^av_{\pi}(s')$를 더한 것이다. 이때 $\Sigma_{s'{\in}S}P_{ss'}^av_{\pi}(s')$는 가능한 다음 상태 $s'$에 대한 가치 함수 $v_{\pi}(s')$에 현재 상태 $s$에서 행동 $a$를 했을 때 다음 상태 $s'$로 넘어갈 상태 변환 확률 $P_{ss'}^a$을 곱한 것들의 합이고, ${\gamma}\Sigma_{s'{\in}S}P_{ss'}^av_{\pi}(s')$는 $\Sigma_{s'{\in}S}P_{ss'}^av_{\pi}(s')$에 감가율 ${\gamma}$를 곱한 것이다.
각 상태에서 각 각 행동에 대한 큐 함수 값을 표기한 예는 아래 그림과 같다. 사과를 향한 방향에 대해서만 1의 보상을 얻을 수 있고, 각 상태에 대해 큐 함수 값이 높은 행동만 선택하면 사과에 도착할 수 있다. 즉 최적의 행동 구하는 식을 큐 함수를 이용해 표현하면 다음과 같다.
$$a^*={\argmax}_{a{\in}A}Q(s,a)$$
현재 상태 $s$에서 취할 수 있는 행동들 $A$ 중에서 최적의 행동 $a^*$는 가장 높은 큐 함수 값을 얻을 수 있는 행동 $a$로 설정하는 것을 의미한다.
벨만 방정식
잘 학습된 가치 함수, 즉 최적의 가치 함수가 있다면 상태마다 최적의 행동이 무엇인지 알 수 있고, 이를 통해 보상을 최대화할 수 있다고 배웠다. 가치 함수는 어떻게 학습할 수 있을까? 가치 함수는 벨만 방정식을 이용해 업데이트한다.
**벨만 방정식(Bellman Equation)**은 리처드 벨만이 제한한 것으로, 강화 학습에서 상당히 중요한 부분을 차지한다. 벨만 방정식은 현재 상태의 가치 함수와 다음 상태의 가치 함수 사이의 관계를 표현한 것이다.
$$v_{\pi}(S)=E_{\pi}[R_{t+1}+{\gamma}v_{\pi}(S_{t+1})|S_t=s]$$
첫 번째 항인 $R_{t+1}$은 시간 $t$에서 취한 행동에 대한 보상 값이며, 두 번째 항인 ${\gamma}v_{\pi}(S_{t+1})$은 감가율을 적용한 가치 함수 값을 의미한다. 즉 현재 상태의 가치 함수를 다음 상태의 가치 함수로 표현한 다음, 기댓값으로 나타낸 것이다. 큐 함수 또한 벨만 기대 방정식으로 표현할 수 있다.
$$q_{\pi}(s,a)=E_{\pi}[R_{t+1}+{\gamma}q_{\pi}(S_{t+1},A_{t+1})|S_t=s,A_t=a]$$
위의 벨만 기대 방정식으로 업데이트하다 보면 양변의 차이가 0으로 수렴하게 된다. 즉 현재 정책 $\pi$에 대한 참 가치 함수 혹은 큐 함수를 구할 수 있습니다. 하지만 강화학습의 목적은 최적의 의사결정을 하여 보상을 최대화하는 것이다. 이를 위해 현재 정책에 대한 참 가치 함수가 아닌 최적 가치 함수를 찾아야 한다. 최적의 가치 함수는 모든 가능한 정책 중 제일 높은 가치를 반환하는 가치 함수를 의미한다.
$$v_*(s)={\max_{\pi}v_{\pi}(s)}$$
최적의 큐 함수를 수식으로 표현하면 아래와 같다.
$$q_*(s,a)={\max_{\pi}}q_{\pi}(s,a)$$
최적의 가치 함수를 다음 상태의 가치 함수를 이용해 식으로 나타내면 아래와 같다. 이 식이 벨만 최적 방정식이다.
$$v_*(s)={\max_a}E[R_{t+1}+{\gamma}v_{\pi}(S_{t+1})|S_t=s,A_t=a]$$
최적의 큐 함수에 대해서도 벨만 최적 방정식으로 표현하면 아래와 같다.
$$q_(s,a)=E[R_{t+1}+{\gamma}{\max_{a'}}q_(S_{t+1}, a')|S_t=s, A_t=a]$$
이 벨만 방정식을 이용해 가치 함수 혹은 큐 함수를 업데이트 할 것이다. 기대값에 대해서는 어떻게 계산할 수 있을까? 앞으로 사용할 방법은 샘플링 기반 방법들이다. 직접 에피소드를 실행하면서 시행착오를 거치며 정보를 얻고, 이 정보들에 대해 기댓값을 취할 것이다. 이에 대해서는 가치 기반 강화학습 부분에서 구체적으로 살펴본다.
가치 기반 강화학습과 정책 기반 강화학습
강화학습 방법에는 크게 가치 기반 강화학습과 정책 기반 강화학습이 있다. 두 학습은 최적의 의사결정을 위해 학습하는 대상의 차이가 있다.
가치 기반 강화학습(Value based Reinforcement Learning) : 가치를 토대로 의사결정을 하는 것이다. 즉, 큐 함수를 학습하여 최적의 큐 함수를 얻고 이를 토대로 의사결정을 한다. 이때 최적의 큐 함수는 어떻게 얻을 수 있을까?
최적의 큐 함수는 벨만 최적 방정식을 이용한 **시간차 예측(Time-Difference Prediction)**을 이용해 업데이트한다.
$$Q_{k+1}(S_t,A_t){\leftarrow}Q_k(S_t,A_t)+{\alpha}(R_{t+1}+{\gamma}{\max_{a'}}Q_k(S_{t+1},a')-Q_k(S_t,A_t)$$
즉 $Q_{k+1}(S_t, A_t)$는 기존 $Q_k(S_t, A_t)$에서 ${\alpha}(R_{t+1}+{\gamma}{\max_{a'}}Q_k(S_{t+1},a')-Q_k(S_t, A_t))$를 더한 값으로 새로 정의된다. 여기서 $\alpha$는 학습률로 학습 스텝의 크기를 조정하는데 사용한다. 그리고 $(R_{t+1}+{\gamma}{\max_{a'}}Q_k(S_{t+1}, a')-Q_k(S_t, A_t))$를 **시간차 오차(Time-Difference Error)**라고 한다. 즉 시간차 오차는 $t$ 스텝에서 계산한 큐 함수 값과 실제 $t+1$ 스텝에서 확인한 큐 함수 값 $R_{t+1}+{\gamma}{\max_{a'}}Q_k(S_{t+1},a')$의 차이를 의미한다.
그렇다면 여러 번 업데이트를 통해 최적의 큐 함수로 수렴했다는 것은 무엇을 의미할까? 큐 함수가 수렴했다는 것은 결국 $k$번 업데이트한 큐 함수 $Q_k(S_t, A_t)$와 $k+1$번 업데이트한 큐 함수 $Q_{k+1}(S_t, A_t)$의 차이가 없다는 것이다. 다시 말해 시간차 오차가 0이 되었음을 의미한다.
즉 에피소드를 진행하며 예측한 $Q_k(S_t, A_t)$ 값을 학습의 목표로 하는 $R_{t+1}+{\gamma}{\max_{a'}}Q_k(S_{t+1}, a')$ 값에 가까워지도록 업데이트 하는 것이다. 큐 함수를 업데이트 하기 위해서는 $L(\theta)$라는 손실함수를 정의한다. 이 설명에서 $L(\theta)$는 시간차 오차의 제곱의 기댓값으로 정의했고 수식은 다음과 같다.
$$L(\theta)=E[(R_{t+1}+{\gamma}{\max_{a'}}Q(S_{t+1},a';\theta)-Q(S_t,A_t;\theta))^2]$$
큐 함수의 인자 안에 있는 $\theta$는 큐 함수가 변수 $\theta$로 구성된 식이라는 것을 의미하며, $L(\theta)$를 줄이는 방향으로 $\theta$를 업데이트하는 것이다. $\theta$를 업데이트하는 식은 다음과 같다.
$${\theta}{k+1}{\leftarrow}{\theta}k-{\alpha}{\cdot}{\bigtriangledown}{\theta}L(\theta)|{\theta={\theta}_k}$$
${\theta}{k+1}$은 $\theta_k$에서 ${\alpha}{\cdot}{\bigtriangledown}{\theta}L(\theta)|{\theta={\theta}k}$를 뺀 값으로 새로 정의하는 것이다. 여기서 ${\bigtriangledown}{\theta}L(\theta)|{\theta={\theta}_k}$는 $L(\theta)$를 $\theta_k$에서 $\theta$에 대한 그래디언트 값, 즉 미분한 값을 의미한다. 따라서 $\theta$는 아래 그림과 같이 점점 더 $L(\theta)$가 작아지는 방향으로 업데이트된다.
최적의 큐 함수를 얻기 위해 큐 함수를 업데이트하는 방법을 살펴보았다. 그렇다면 최적의 함수를 토대로 하는 최적의 의사결정 즉, 최적의 정책은 무엇일까? 최적의 정책은 다음과 같다.
$$\pi_(a|s)=\begin{matrix}1\quad if\;a= \argmax_{a\in A}q_(s,a) \\ 0\quad otherwise \end{matrix}$$
현재 상태 $s$에서 행동 $a$를 할 확률은 가장 높은 큐 함수 값을 얻는 $a$에 대해서만 1이고 나머지는 0이다. 이런 정책을 **결정론적(Deterministic)**이라고 표현하며 이는 정책이 가능한 행동에 대한 확률을 출력하는 것이 아닌 한 가지 행동을 출력하는 것을 의미한다.
아래 그림과 같이 가치 기반 강화학습은 가치 함수를 학습하여 최적의 가치 함수를 구하고, 이를 토대로 최적의 정책에 따라 행동을 고르는 것이다. 가장 대표적인 알고리즘으로는 **DQN(Deep Q-Network)**가 있다.
정책 기반 강화학습(Policy based Reinforcement Learning) : 정책 기반 강화학습은 가치 기반 강화학습과 다르게 의사결정에 있어서 가치 함수를 이용하지 않는다. 즉 가치 함수가 아닌 정책을 바로 학습하여 학습한 정책을 가지고 의사결정을 한다. 정책은 **정책 경사(Policy Gradient)**를 이용해 학습한다. 정책 경사를 통해 정책을 학습시키기 위해 **목적 함수 $J(\theta)$**를 다음과 같이 설정한다.
$$J(\theta)=v_{\pi_{\theta}}(s_0)$$
여기서 $\pi_{\theta}$는 $\pi$가 변수 $\theta$로 구성된 식이라는 것을 의미한다. 목적 함수는 정책 $\pi_{\theta}$를 통해 의사결정을 했을 때 초기 상태의 가치 함수를 의미한다. 초기 상태의 가치 함수는 한 에피소드에 대한 가치라고 생각할 수 있다. 한 에피소드의 가치라고 생각할 수 있는 $v_{\pi_{\theta}}(s_0)$의 값은 정책 $\pi_{\theta}$가 최적의 정책일수록 높아진다. 따라서 목적 함수 $J(\theta)$가 커지는 방향으로 $\theta$를 업데이트하면 된다.
$$\theta_{k+1}{\leftarrow}\theta_k+{\alpha}{\cdot}{\bigtriangledown_{\theta}}J(\theta)|_{\theta=\theta_k}$$
즉 $\theta_{k+1}$은 $\theta_k$에서 ${\alpha}{\cdot}{\bigtriangledown_{\theta}}J(\theta)|{\theta=\theta_k}$를 더한 값으로 새로 정의하는 것이다. 여기서 ${\bigtriangledown{\theta}}J(\theta)|_{\theta=\theta_k}$는 $J(\theta)$를 $\theta_k$에서 $\theta$에 대한 그래디언트 값, 즉 미분한 값을 의미한다. 따라서 $\theta$는 아래 그림과 같이 $J(\theta)$가 커지는 방향으로 업데이트된다.
${\bigtriangledown}_{\theta}J(\theta)$를 구하는 방법을 알아본다.
$$⁍$$
앞에 $J(\theta)=v_{\pi_{\theta}(s_0)}$라고 했다. 따라서 목적 함수의 그래디언트는 초기 상태의 가치 함수의 그래디언트와 같다.
$${\bigtriangledown_{\theta}}J(\theta)={\bigtriangledown_{\theta}}\Sigma_s{d_{\pi_{\theta}}(s)}\Sigma_a{\pi_{\theta}(a|s)q_{\pi}(s,a)}$$
초기 상태의 가치 함수는 모든 상태에 대해 상태가 나올 확률 $d_{\pi_{\theta}}(s)$와 그 상태에서 가능한 행동들을 할 확률 $\pi_{\theta}(a|s)$에 그 행동을 했을 때 얻을 수 있는 보상 $q_{\pi}(s,a)$의 곱이라고 표현할 수 있다. 하지만 $d_{\pi_{\theta}}(s)$에 대해서 알 수 없을 수도 있다. 이를 방지하기 위해 다음 트릭을 사용해 $d_{\pi_{\theta}}(s)$를 몰라도 계산할 수 있도록 한다.
먼저 그래디언트 ${\bigtriangledown_{\theta}}$의 위치를 다음과 같이 바꿀 수 있다.
$${\bigtriangledown_{\theta}}J(\theta)=\Sigma_s{d_{\pi_{\theta}}(s)}\Sigma_a{\bigtriangledown_{\theta}}{\pi_{\theta}(a|s)q_{\pi}(s,a)}$$
그리고 다음과 같이 정책 $\pi_{\theta}(a|s)$를 나누고 곱한 상태로 표현할 수 있다.
$${\bigtriangledown_{\theta}}J(\theta)=\Sigma_s{d_{\pi_{\theta}}(s)}\Sigma{{\pi_{\theta}(a|s)}\frac{\bigtriangledown_{\theta}\pi_{\theta}(a|s)}{\pi_{\theta}(a|s)}q_{\pi}(s,a)}$$
즉, 로그 미분 성질을 이용해 다시 다음과 같이 정책에 로그를 취한 것의 그래디언트와 큐값을 곱한 것의 기댓값으로 나타낼 수 있다. 이제 에피소드를 통해 샘플링 방식으로 정보를 수집한 뒤 $E[\bigtriangledown_{\theta}\log{\pi_{\theta}(a|s)}{\cdot}{q_{\pi}(s,a)}]$를 구하고 이를 통해 $\theta$를 업데이트 할 수 있다.
$$\bigtriangledown_{\theta}J(\theta)=E[\bigtriangledown_{\theta}\log{\pi_{\theta}(a|s)}{\cdot}{q_{\pi}(s,a)}]$$
이렇게 정책을 업데이트하여 최적의 정책을 구한 다음 아래와 같이 최적의 행동을 선택하는 것이 정책 기반 학습이다. 정책 기반 학습의 가장 대표적인 알고리즘으로는 REINFORCE가 있다.
지금까지 가치 기반 강화학습과 정책 기반 강화학습에 관해 설명했다. 강화학습에는 이 두 개를 합친 액터-크리틱(Actor-Critic) 방식의 강화학습도 있다. 액터-크리틱 방식의 가장 대표적인 알고리즘으로는 **A2C(Advantage Actor Critic)**가 있다.
탐험(Exploration)과 이용(Exploitation)
강화학습의 목적은 에이전트가 많은 보상을 얻기 위한 최적의 정책을 학습하는 것이다. 에이전트가 최적 정책을 찾기 위해서는 여러 상황에서 다양한 행동을 하며 많은 경험을 해보는 것이 필수이다.
위 그림에서 에이전트는 위, 아래, 왼쪽, 오른쪽으로 이동하는 4개의 행동을 취할 수 있다. 처음에는 에이전트가 어느 방향으로 이동했을 때 얼마만큼에 보상을 받는지 알지 못한다. 만약 에이전트가 한 번 아래쪽으로 이동하여 +1의 보상을 받았다고 가정해본다. 에이전트가 위 그림과 같은 상황에서 다른 방향으로 이동하면 어떤 보상을 받는지 알지 못하지만, 아래로 이동하면 +1의 보상을 받는다는 것을 학습했기 때문에 다시 그림과 같은 상황이 되면 +1의 보상을 받기 위해 아래로 이동할 것이다. 하지만 다른 방향으로 이동하면 더 좋은 보상을 받을 수 있기 때문에 이는 좋은 선택이라고 할 수 없다. 즉 에이전트가 위와 같은 상황에서 위, 아래, 왼쪽, 오른쪽 모두를 가봐야 어떤 방향으로 이동하는 것이 가장 좋은지 알 수 있다. 이렇게 에이전트는 다양한 경험을 통한 학습을 거쳐 가장 최적의 정책을 학습할 수 있게 된다. 이렇게 에이전트가 다양한 경험을 할 수 있도록 에이전트의 행동을 결정하는 기법을 **탐험(Exploration)**이라고 한다. 탐험의 가장 기본적인 방법의 하나는 **무작위 탐색 방법(Random Exploration)**이다.
하지만 에이전트가 너무 다양한 경험만을 추구하는 것도 좋지 않다. 예를 들어 엄청나게 다양한 상태와 행동이 존재하는 환경에서 에이전트가 모든 경험을 다 해보려면 너무 많은 시간이 필요할 것이기 때문이다. 이에 따라 어느 정도는 에이전트가 학습된 대로 행동하는 것도 필요하다. 이렇게 학습된 결과에 따라 에이전트의 행동을 결정하는 기법을 **이용(Exploitation)**이라고 한다. 이용의 기본적인 방법의 하나는 **탐욕적 방법(Greedy Method)**이다. 탐욕적 방법은 주어진 시점에 에이전트가 가장 큰 보상을 줄 것이라고 기대하는 행동만을 선택하는 것이다. 예를 들어 상하좌우 네 방향의 큐 함수 값을 알고 있을 때, 가장 큰 큐 함수 값을 가지는 행동을 선택하는 것이다. 이를 통해 해당 시점까지 학습된 큐 함수 값을 이용하여 에이전트가 행동할 수 있도록 한다.
최적의 정책을 찾기 위해서는 탐색과 이용이 적절한 밸런스를 잘 맞추어 수행되어야 한다. 이를 위해 제안된 기법이 바로 ε-greedy라는 기법이다. 이 방법은 학습 초기에는 탐색을 수행할 확률을 높게 설정하고, 학습이 진행될수록 이용을 수행하는 확률을 늘려가는 방식으로 진행된다. 이때 각 기법을 선택할 확률을 결정하는 값이 ε 값이다. 이 ε은 무작위 행동(Random Action)을 취할 확률을 의미한다. 이에 따라 1-ε는 가장 높은 큐 함수 값을 가지는 행동을 취하도록 하는 탐욕적인(greedy) 행동을 수행할 확률을 의미한다. 이 ε 값에 따라 어떤 행동을 취할지 결정하는 예시는 아래와 같다.
일반적으로 ε-greedy 기법이 어떻게 사용되는지 알아본다. 일반적으로 ε-greedy 기법을 사용할 때는 아래 그림과 같이 ε의 값을 1부터 시작해 조금씩 감소시킨다.
일반적으로는 학습 초반에 ε의 값을 1로 설정한다. 따라서 에이전트는 100% 무작위 탐색을 수행한다. 그리고 학습이 진행됨에 따라 조금씩 ε 값을 줄여나간다. 이에 따라 무작위 탐색을 수행할 확률은 조금씩 줄어들고 탐욕적 행동을 할 확률이 조금씩 늘어난다. 그리고 학습의 마지막 단계가 되면 ε의 값을 점점 줄여나가다가 일정 값(일반적으로 0.1)으로 고정해 학습을 수행한다. 마지막으로 학습을 마무리하고 학습된 성능을 테스트할 때는 ε의 값을 0으로 하여 완전히 학습된 대로 에이저트가 행동하도록 설정한다.
출처 : 텐서플로와 유니티 ML-Agents로 배우는 강화학습 (민규식 외 5분 지음, https://wikibook.co.kr/tensorflow-mlagents/)