SAC 알고리즘을 정리하면 다음과 같다.
[1] Q 신경망과 액터 신경망의 파라미터를 초기화한다.
[2] Q 신경망의 파라미터를 타깃 Q 신경망에 복사한다.
[3] 리플레이 버퍼를 초기화 한다. 그리고 [4]-[9]를 반복한다.
[4] 정책을 실행하여 발생된 천이샘플(transition sample) \(\left( \mathbf{x}_i, \mathbf{u}_i, r_i, \mathbf{x}_{i+1} \right) \) 를 리플레이 버퍼에 저장한다.
[5] 리플레이 버퍼에서 N개의 천이샘플 \(\left( \mathbf{x}_i, \mathbf{u}_i, r_i, \mathbf{x}_{i+1} \right) \) 를 무작위로 추출한다.
[6] \( q_i=r(\mathbf{x}_i, \mathbf{u}_i )+ \gamma [Q_{\phi^\prime} (\mathbf{x}_{i+1}, \bar{\mathbf{u}}_{i+1} ) - \alpha \log \pi_\theta (\bar{\mathbf{u}}_{i+1} | \mathbf{x}_{i+1} ) ]\) 를 계산한다.
여기서 \(\bar{\mathbf{u}}_{i+1}\) 는 리플레이 버퍼에서 추출한 \(\mathbf{x}_{i+1}\) 를 이용하여 현재 정책 \(\pi_\theta\) 로 샘플링한 행동이다.
[7] \(L_Q (\phi)= \frac{1}{2} \sum_i \lVert Q_\phi (\mathbf{x}_i, \mathbf{u}_i)- q_i \rVert^2 \) 로 Q 신경망을 업데이트 한다.
[8] \(L_\pi (\theta)= \sum_i \left( \alpha \log \pi_\theta (\bar{\mathbf{u}}_i | \mathbf{x}_i ) - Q_\phi (\mathbf{x}_i, \bar{\mathbf{u}}_i ) \right) \) 로 액터 신경망을 업데이트 한다.
여기서 \(\bar{\mathbf{u}}_i\) 는 리플레이 버퍼에서 추출한 \(\mathbf{x}_i\) 를 이용하여 현재 정책 \(\pi_\theta\) 로 샘플링한 행동이다.
[9] 타깃 Q 신경망을 업데이트 한다.
알고리즘을 비교해 보면 알겠지만, \(\alpha=0\) 이면 SAC 알고리즘은 DDPG 알고리즘과 매우 유사해진다.
SAC를 처음 제안한 논문에서는 Q 함수의 과대추정 오차를 감소시키기 위해서 두 개의 독립적인 Q 신경망을 사용했다. 각각의 Q 신경망은 별도로 타깃 Q 신경망을 가지고 있으므로 총 5개의 신경망을 사용한 것이다. 복잡한 문제에서는 한 개의 Q 신경망을 사용할 때 보다 두 개의 Q 신경망을 사용할 때가 학습 속도가 훨씬 빨랐다고 한다.
두 개의 Q 신경망을 사용할 때는 알고리즘 [6]번과 [8]번에서 두 개의 Q 값중 작은 값을 사용한다.
[1] Q1 신경망과 Q2 신경망, 그리고 액터 신경망의 파라미터를 초기화한다.
[2] Q1, Q2 신경망의 파라미터를 각각 타깃 Q1, Q2 신경망에 복사한다.
[3] 리플레이 버퍼를 초기화 한다. 그리고 [4]-[9]를 반복한다.
[4] 정책을 실행하여 발생된 천이샘플(transition sample) \(\left( \mathbf{x}_i, \mathbf{u}_i, r_i, \mathbf{x}_{i+1} \right) \) 를 리플레이 버퍼에 저장한다.
[5] 리플레이 버퍼에서 N개의 천이샘플 \(\left( \mathbf{x}_i, \mathbf{u}_i, r_i, \mathbf{x}_{i+1} \right) \) 를 무작위로 추출한다.
[6] \( Q_{\phi^\prime} (\mathbf{x}_{i+1}, \bar{\mathbf{u}}_{i+1} ) = \min \left[ Q_{\phi^\prime_1} (\mathbf{x}_{i+1}, \bar{\mathbf{u}}_{i+1} ), Q_{\phi^\prime_2} (\mathbf{x}_{i+1}, \bar{\mathbf{u}}_{i+1} ) \right] \),
\( q_i=r(\mathbf{x}_i, \mathbf{u}_i )+ \gamma [Q_{\phi^\prime} (\mathbf{x}_{i+1}, \bar{\mathbf{u}}_{i+1} ) - \alpha \log \pi_\theta (\bar{\mathbf{u}}_{i+1} | \mathbf{x}_{i+1} ) ]\) 를 계산한다.
여기서 \(\bar{\mathbf{u}}_{i+1}\) 는 리플레이 버퍼에서 추출한 \(\mathbf{x}_{i+1}\) 를 이용하여 현재 정책 \(\pi_\theta\) 로 샘플링한 행동이다.
[7] \(L_Q (\phi)= \frac{1}{2} \sum_i \lVert Q_\phi (\mathbf{x}_i, \mathbf{u}_i)- q_i \rVert^2 \) 로 Q
신경망을 업데이트 한다.
[8] \( Q_{\phi} (\mathbf{x}_i, \bar{\mathbf{u}}_i ) = \min \left[ Q_{\phi_1} (\mathbf{x}_i, \bar{\mathbf{u}}_i ), Q_{\phi_2} (\mathbf{x}_i, \bar{\mathbf{u}}_i ) \right] \),
\(L_\pi (\theta)= \sum_i \left( \alpha \log \pi_\theta (\bar{\mathbf{u}}_i | \mathbf{x}_i ) - Q_\phi (\mathbf{x}_i, \bar{\mathbf{u}}_i ) \right) \) 로 액터 신경망을 업데이트 한다.
여기서 \(\bar{\mathbf{u}}_i\) 는 리플레이 버퍼에서 추출한 \(\mathbf{x}_i\) 를 이용하여 현재 정책 \(\pi_\theta\) 로 샘플링한 행동이다.
[9] 타깃 Q1, Q2 신경망을 업데이트 한다.
SAC 논문의 후속편에서는 엔트로피의 가중치인 \(\alpha\) 를 고정값으로 설정하는 대신에 학습을 통해 찾는 방법도 제안하였다. 이 경우에는 \(\alpha\) 대신에 최소 엔트로피 \(\mathcal{H}_0\) 를 설정해야 하므로 \(\mathcal{H}_0\) 가 하이퍼파라미터가 된다.
'AI 딥러닝 > RL' 카테고리의 다른 글
정책 이터레이션 (Policy Iteration)과 LQR (0) | 2021.06.22 |
---|---|
Tensorflow2로 만든 SAC 코드: Pendulum-v0 (0) | 2021.06.01 |
Soft Actor Critic (SAC) 알고리즘 - 1 (0) | 2021.05.29 |
소프트 정책 이터레이션 (0) | 2021.05.28 |
소프트 벨만 방정식 (Soft Bellman Equation) (0) | 2021.05.27 |
댓글