본문 바로가기
AI 딥러닝/강화학습

Soft Actor Critic (SAC) 알고리즘 - 2

by 세인트 워터멜론 2021. 5. 30.

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\) 가 하이퍼파라미터가 된다.

 

 

 

댓글