Just Fighting
[강화학습] A2C 알고리즘 본문
목적함수 그래디언트 계산
목적함수 그래디언트는 샘플링 기법을 이용하면 다음과 같이 근사적으로 계산할 수 있다.
\begin{align*}
\bigtriangledown_\theta J(\theta)
&\approx \sum_{t=0}^{T} \left( \frac{1}{M} \sum_{m=1}^{M} \left ( \bigtriangledown_\theta log \pi_\theta (u_t^{(m)}|x_t^{(m)}) A^{\pi_\theta}(x_t^{(m)}, u_t^{(m)}) \right ) \right ) \\
\end{align*}
여기서, m은 에피소드 인덱스이며, M은 에피소드 개수다.
한 개의 에피소드만 고려하면 목적함수는 근사적으로 다음과 같다.
\begin{align*}
\bigtriangledown_\theta J(\theta)
&\approx \sum_{m=1}^{M} \left ( \bigtriangledown_\theta log \pi_\theta (u_t|x_t) A^{\pi_\theta}(x_t, u_t) \right ) \\
\end{align*}
어드밴티지 계산
어드밴티지를 계산하기 위해 행동가치 함수의 식을 이용한다.
두번째 식이 나오는 이유를 내 나름 생각해보자면,,
$x_{t+1}$이 나올 수 있는 값이 하나라면? 즉, 한가지 경우 밖에 없거나, 그 경우의 확률이 아주아주 크다면
기댓값이 아닌 그냥 그 값을 쓸 수 있지 않을까. 그러나 그게 아니기 때문에 $=$이 아닌 $\approx$를 쓴 것이 아닐까라는 나으 궁예,,
$$Q^\pi(x_t, u_t) = r(x_t, u_t)+E_{x_{t+1}\sim p(x_{t+1}|x_t,u_t)} \left [ \gamma V^\pi (x_{t+1}) \right ]$$
\begin{align*}
A^{\pi_\theta}(x_t,u_t) &= Q^{\pi_\theta}(x_t,u_t) - V^{\pi_\theta}(x_t) \\
&\approx r(x_t, u_t) + \gamma V^{\pi_\theta}(x_{t+1}) - V^{\pi_\theta}(x_{t})
\end{align*}
따라서, 이제 상태가치를 정확하게 예측하면 된다. 신경망을 사용해서.
정책 신경망은 $\pi_\theta (u_t|x_t)$를 추정하고 가치 신경망은 $\phi$로 파라미터화 된 가치함수 $V_\phi (x_t) \approx V^{\pi_\theta} (x_t)$를 추정한다.
정책 신경망은 에이전트가 어떻게 행동해야 하는지 알려주므로 액터(actor) 신경망이라고 하며,
가치 신경망은 그 행동을 평가하기 때문에 크리틱(critic) 신경망이라고 한다.
두 개의 신경망을 분리해서 쓰기도 하지만,
실제로 두 개의 신경망이 중첩되는 부분이 많아 공통의 신경망을 쓰고, 출력만 다른 층을 사용하는 경우도 있다.
가치함수를 근사하는 $V_\phi (x_t) \approx V^{\pi_\theta} (x_t)$를 구하는 알고리즘을 구하기 위해서는 벨만 방정식을 사용한다.
벨만 방정식에 의하면, 현재 상태와 다음 상태의 가치함수가 다음과 같은 관계가 있다.
$$V^\pi(x_t) = E_{u_t \sim \pi(u_t|x_t)} \left [ r(x_t, u_t)+E_{x_{t+1}\sim p(x_{t+1}|x_t,u_t)} \left [ \gamma V^\pi (x_{t+1}) \right ] \right ]$$
따라서, 가치함수를 근사하는 함수 $V_\phi (x_t)$는 다음과 같이 근사적으로 추정할 수 있다.
$$V_\phi(x_t) \approx r(x_t, u_t)+ \gamma V_\phi (x_{t+1}) $$
시간차 타깃(TD target)을 $y_i = r(x_i, u_i)+\gamma V_\phi(x_{i+1})$로 설정하면,
다음 손실함수가 최소가 되도록 근사 가치함수 $V_\phi(x_t)$를 추정할 수 있다.
(실제값 - 추정값)
$$Loss_{critic}(\phi) = \frac {1} {2} \sum_{i} \left\| r(x_i,u_i) + \gamma V_\phi(x_{i+1})-V_\phi (x_i) \right\|^2$$
여기서 $(x_i, u_i, r(x_i,u_i), x_{i+1})$은 상태 천이 데이터이며, 일정 시간 스텝 $N$동안 모으면 샘플의 개수는 $N$개가 된다.
어드밴티지도 다음과 같이 근사적으로 계산할 수 있다.
$$A_\phi (x_i,u_i) \approx r(x_i, u_i) + \gamma V_\phi (x_{i+1}) - V_\phi (x_{i})$$
액터 신경망의 손실함수
액터 신경망의 손실함수로는 아래 식을 사용한다.
$$Loss_{critic}(\phi) \approx - \sum_i \left ( log \pi_\theta(u_i|x_i)A_\phi (x_i,u_i) \right )$$
$$\theta \leftarrow \theta - \alpha\bigtriangledown_{\theta} \sum_i \left ( log \pi_\theta(u_i|x_i)A_\phi (x_i,u_i) \right )$$
여기서 $A_\phi(x_i, u_i)$는 $\theta$의 함수가 아니기 때문에 그래디언트 $\bigtriangledown_\theta[ \cdot ]$안에 포함될 수 있다.
앞의 마이너스 부호는 목적함수를 최대로 하기 위함이다.
손실함수의 구조는 이진분류 문제에서 사용하는 참값이 1인 교차엔트로피에 어드밴티지를 곱한 형태다.
따라서 어드밴티지가 큰 정책의 샘플은 그래디언트 계산 시 더 큰 영향을 미치며, 어드밴티지가 작은 정책의 샘플은 덜 영향을 미친다.
그렇게 되면, 점진적으로 정책이 향상되는 것을 기대할 수 있다.
액터 - 크리틱 알고리즘
1. 크리틱과 액터 신경망의 파라미터 $\phi$, $\theta$ 초기화
2. 반복
2-1. 반복
2-1-1. 정책 $u_i \sim \phi_\theta(u_i|x_i)$으로 행동을 확률적으로 선택
2-1-2. $u_i$를 실행해 보상 $r(x_i,u_i)$과 다음 상태변수 $x_{i+1}$ 측정
2-1-3. 샘플 $(x_i, u_i, r(x_i,u_i), x_{i+1})$ 저장
2-2. 시간차 타깃 계산
2-3. 크리틱 신경망 손실함수 계산
2-4. 어드밴티지 계산
2-5. 크리틱 신경망 업데이트
$$\phi \leftarrow \phi +\alpha_{actor} \sum_i \left [ (y_i - V_\phi (x_i)) \bigtriangledown_{\theta} V_\phi (x_i) \right ]$$
2-6. 액터 신경망 업데이트
$$\theta \leftarrow \theta - \alpha\bigtriangledown_{\theta} \sum_i \left ( log \pi_\theta(u_i|x_i)A_\phi (x_i,u_i) \right )$$
[참고]
박성수, 「수학으로 풀어보는 강화학습 원리와 알고리즘」, 위키북스(2020)