long8v / PTIR

Paper Today I Read
19 stars 0 forks source link

[168] Proximal Policy Optimization Algorithms #187

Open long8v opened 3 weeks ago

long8v commented 3 weeks ago
image

paper

TL;DR

Details

preliminary

policy network에 대한 gradient를 advantage에 가중하여 미분하는 형태 여기서 E는 sample을 뽑아서 그냥 평균 취하는 형태

image

loss는 이러한 policy를 따르는 trajectory에 대한 advantage 가중합의 기대값이 최대가 되도록 하면 된다 그러나 large policy update가 될 경우 성능이 좋지 않다

실제로는 제약이 아니라 penalty term을 추가함 여기서 $beta$는 하이퍼파라미터임.

image

이 논문에서 말하는 TRPO의 문제점은 $\beta$가 하나로 골라질 수 없다 정도인듯.

Clipped Surrogate Objective

image image

결론적으로 $rt(\theta) = \frac{\pi\theta(a_t | st)}{\pi{\theta_{old}}(a_t | s_t)}$가 너무 크거나 작지 않도록 clip했다고 보면 됨

image

이렇게 하니 policy network의 변동이 적었다고 함

image

Adaptive KL Penalty Coefficient

image

아이참 이것도 아주 직관적이고 간단하다..

Algorithm

위에는 policy에 대한 gradient 업데이트를 어떻게 할지 정한거고 외의 것들은 괜찮은 것들 갖다 씀. V(s)를 도입하여 reward의 variance 줄임. 즉 policy surrogate와 value function error term을 추가함. 여기에 exploration 더 많이 하라고 entropy bonus를 추가해줌.

image

advantage는 현재 할인된 Reward의 summation에서 현재의 V를 빼고 미래의 V를 할인해서 더함.

image

잘 기억 안나는데.. fixed time step에서 bias // vairance를 최적화하는 기법을 써서 아래와 같이 구함

image

Experiments

long8v commented 3 weeks ago

def learn

                rollout = self.runner.run(callback)
                # Unpack
                obs, returns, masks, actions, values, neglogpacs, states, ep_infos, true_reward = rollout

def setup_models (loss 정의부)

image
                    loss = self.pg_loss - self.entropy * self.ent_coef + self.vf_loss * self.vf_coef

https://github.com/Stable-Baselines-Team/stable-baselines/blob/master/stable_baselines/ppo2/ppo2.py#L176-L188

                    vf_losses1 = tf.square(vpred - self.rewards_ph)
                    vf_losses2 = tf.square(vpred_clipped - self.rewards_ph)
                    self.vf_loss = .5 * tf.reduce_mean(tf.maximum(vf_losses1, vf_losses2))
image
                    ratio = tf.exp(self.old_neglog_pac_ph - neglogpac)
                    pg_losses = -self.advs_ph * ratio
                    pg_losses2 = -self.advs_ph * tf.clip_by_value(ratio, 1.0 - self.clip_range_ph, 1.0 +
                                                                  self.clip_range_ph)
                    self.pg_loss = tf.reduce_mean(tf.maximum(pg_losses, pg_losses2))