HiddenBeginner / hiddenbeginner.github.io

데이터사이언스 기술 블로그
https://hiddenbeginner.github.io/
MIT License
7 stars 1 forks source link

[강화학습] Soft Actor-Critic 논문 리뷰 - 재야의 숨은 초보 #31

Open utterances-bot opened 2 months ago

utterances-bot commented 2 months ago

[강화학습] Soft Actor-Critic 논문 리뷰 - 재야의 숨은 초보

[강화학습] Soft Actor-Critic 논문 리뷰

https://hiddenbeginner.github.io/rl/2022/11/06/sac.html

asdfGuest commented 2 months ago

도움 많이 되었습니다!! 그런데 이해가 가지 않는 부분이 있는데, Importance Sampling을 사용하지 않고도 off-policy가 달성되는 이유가 뭔가요?

HiddenBeginner commented 2 months ago

@asdfGuest 안녕하세요. 좋은 질문 감사드립니다. SAC가 off-policy actor-critic 알고리즘이기 때문에 critic network와 actor network 업데이트를 위한 목적함수가 있습니다. 두 경우를 나눠서 설명드리도록 하겠습니다. 그 전에 $(s, a, r, s')$을 replay buffer에서 샘플링한 transition이라고 하겠습니다. 여기서 행동 $a$는 어떤 behavior policy $\beta(\cdot|s)$에서 샘플링되었다고 하겠습니다.

  1. Critic 네트워크 업데이트를 위한 TD learning

    • SAC의 경우 행동가치함수를 critic으로 사용한다는 점이 중요합니다. 행동가치함수 $Q(s, a)$에서 행동 $a$는 모든 $a\in\mathcal{A}$에 대해서 각각 정의되는 것이기 때문에 현재 정책에서 샘플링된 $a$가 아니어도 괜찮죠? 따라서 $Q(s, a)$에 대한 타겟값 $r + \gamma Q(s', a')$을 만들 때 $a'$만 정책에서 뽑아준다면 importance sampling을 하지 않아도 됩니다 ( 즉, $a' \sim \pi_\phi(\cdot|s')$ ).
  2. Actor 네트워크 업데이트를 위한 policy gradient (reparametrization 없는 policy gradient)

    • Policy gradient는 다음과 같습니다. $$\nabla\phi J(\phi) = \mathbb{E}{S\sim d^{\pi_\phi}, A\sim\pi_\phi(\cdot|S)}\left[ \log \pi_\phi(A|S) Q(S, A) \right]$$
    • 여기서 기댓값이 취해지는 행동 $A\sim\pi_\phi(\cdot|S)$은 현재 정책에서 샘플링 되어야만 하죠? 하지만 replay buffer에서 나온 $(s, a, r, s')$의 $a$는 현재 정책 $\pi_\phi$에서 나온 것이 아니고요. 그래서 SAC에서 policy gradient 계산할 때, transition $(s, a, r, s')$에서 상태 $s$만 가져와서 행동 $a^{\pi} \sim \pi_\phi(\cdot|s)$을 뽑아서 policy gradient를 추정하게 됩니다.

위 내용이 이해가 잘 안 되신다면, 조금 더 쉬운 경우인 DQN은 off-policy 알고리즘인데 왜 importance sampling을 하지 않을까에 대하여 고민해보시면 좋습니다. 우선, Q-learning의 목표는 optimal action value function을 근사하는 것입니다. 이를 위하여 다음 optimal action value function의 성질을 이용할 것입니다.

$$Q^{*}(s, a) = r + \gamma \mathbb{E}{S'\sim p(\cdot|s, a)} \left[ \max\{a'} Q^{*}(S', a') \right].$$

여기서 주목할 점은 우변 기댓값에서 확률변수 (random variable)는 $S'$ 밖에 없다는 것입니다. 그리고 $S'$은 현재 정책과 상관 없이 주어진 $(s, a)$에 대한 $p(\cdot|s, a)$에서 샘플링되는 것이고요. 한편, replay buffer 안의 $(s, a, r, s')$에서 $s'$이 딱 $p(\cdot|s, a)$에서 샘플링된 것이죠. 즉, 확률변수 $S'$의 관측값 $s'$을 정확히 갖고 있는 상황이라서 importance sampling이 필요 없습니다.

다시 DQN으로 돌아오자면, DQN에서는 Q-network $Q_\theta$을 정의하고, 모든 $(s, a)$에 대해서 위 등식에서 좌변을 우변으로 근사시키는 방식으로 Q-network를 업데이트시킵니다. 한편, replay buffer에서 샘플링한 transition $(s, a, r, s')$이라고 할 때, 행동 $a$는 behavior policy에 의해 만들어진 것이며, target policy인 행동가치함수에 대한 greedy policy이 만들어 낸 행동이 아닙니다.

하지만, 아래 업데이트 식에서 행동 $a$가 사용되는 부분은 행동가치함수의 입력값이기 때문에 target 정책을 따를 필요가 없습니다. 따라서 행동 $a$에 대해서는 importance sampling이 필요 없습니다. 그리고 다음 행동 $a'$은 정상적으로 greedy policy를 따라서 샘플링되었기 때문에 target 정책을 따르고 있습니다. 따라서 importance sampling을 적용하지 않아도 됩니다.

$$\sum{(s, a, r, s') \in \mathcal{D}}(r + \gamma \max{a'} Q(s', a') - Q(s, a))^2$$


지금까지는 행동 $a$에 대해서 importance sampling 해주지 않아도 된다고 말씀을 드렸습니다. 하지만, replay buffer 안에 저장된 $s$들의 분포와 현재 정책의 따랐을 때 만들어지는 상태들의 분포 $d^{\pi_\phi}$의 분포가 엄연히 다를 것입니다. 기댓값을 더 정확하게 근사하기 위해서는 상태 $s$들이 $d^{\pi_\phi}$을 따라야 하고, 그렇지 못하면 importance sampling을 해줘야 합니다. 하지만, replay buffer 안에 $s$의 분포나 $d^{\pi_\phi}$의 분포나 계산하는 것이 불가능하기 때문에 그 부분은 그냥 bias로 받아들이게 됩니다.


저는 개인적으로 CS285 Lec6의 3번 째 강의에서 이를 잘 설명하고 있다고 생각합니다.

asdfGuest commented 2 months ago

자세한 답변 감사합니다! 말씀해주신 내용은 어느정도 이해한것 같은데, 추가로 궁금한 점이 있습니다. 제가 이해한 바로는 off-policy 알고리즘에서 q-function을 학습시킬때, 1-step td는 가능한데, GAE나 n-step td 같이 사전에 계산을 해놔야 하는 방법들은 타겟 q 값에 old policy가 관여(?)하니까 사용할 수 없는 건가요?

HiddenBeginner commented 2 months ago

@asdfGuest GAE를 사용하는 것은 못 봤습니다. 하지만 $n$-step return은 DQN 계열 및 SAC 계열 모두에서 많이 사용됩니다. 다만, 이때는 제가 위에서 설명한 것들과 다르게 $n$-step trajectory가 모두 old policy로부터 생성된 것이고, 현재 정책의 것으로 바꿀 수도 없습니다. 따라서 importance sampling이 필요한 것이 맞습니다. 하지만 구현에서는 IS를 해주지 않습니다. 이론적 오류를 감수하고 사용하는 것 같습니다. ]

참고로 구현에서는 replay buffer 안에 데이터를 집어넣을 때, $(s_t, a_t, rt, s{t+1})$ 대신 queue 자료구조에 $n$개 trajectory를 유지하며 $(s_t, at, G{t:t+n}, s_{t+n})$을 저장하고, 이것을 데이터로 사용합니다.