[168] Proximal Policy Optimization Algorithms
Opened this issue · 1 comments
TL;DR
- I read this because.. : 배경지식 차
- task : RL
- problem : q-learning은 너무 불안정하고, trpo 는 상대적으로 복잡. data efficient하고 sclable한 arch?
-
idea : KL divergence term 대신에 clipping을 사용하자. step size
$\beta$ 를 adaptive하게 변동시키자 - input/output : state -> action
- architecture : MLP
-
objective :
$L^{CLIP}(\theta) = \hat{\mathbb{E}}_t \left[ \min(r_t(\theta)\hat{A}_t, \text{clip}(r_t(\theta), 1 - \epsilon, 1 + \epsilon)\hat{A}_t) \right]$ - baseline : loss(no clipping, KL penalty), A2C, CEM, TRPO
- data : OpenAI Gym(Mujoco), human control task(Roboschool), Atari
- evaluation : 몰라
- result : 좋다
- contribution : 간단하고 직관적인 loss.. 사실 이 논문만 보면 직관적인 이해가 되어서 굳이 그 전 내용을 알았어야 하는 생각도.. ㅎㅎ
- etc. :
Details
preliminary
- policy gradient method
policy network에 대한 gradient를 advantage에 가중하여 미분하는 형태
여기서 E는 sample을 뽑아서 그냥 평균 취하는 형태
loss는 이러한 policy를 따르는 trajectory에 대한 advantage 가중합의 기대값이 최대가 되도록 하면 된다
그러나 large policy update가 될 경우 성능이 좋지 않다
- Trust Region methods
TRPO는 대리 함수를 사용하여 성능 개선이 보장되는 policy update를 할 수 있는 surrogate 함수를 증명했고(#154) 이는 policy가 업데이트 될 때의 제약이 생겨서 결론적으로 아래와 같이 new, old policy network의 importance weight와 advantage가 곱해진 형태
실제로는 제약이 아니라 penalty term을 추가함 여기서
이 논문에서 말하는 TRPO의 문제점은
Clipped Surrogate Objective
결론적으로
이렇게 하니 policy network의 변동이 적었다고 함
Adaptive KL Penalty Coefficient
아이참 이것도 아주 직관적이고 간단하다..
Algorithm
위에는 policy에 대한 gradient 업데이트를 어떻게 할지 정한거고 외의 것들은 괜찮은 것들 갖다 씀.
V(s)를 도입하여 reward의 variance 줄임. 즉 policy surrogate와 value function error term을 추가함. 여기에 exploration 더 많이 하라고 entropy bonus를 추가해줌.
advantage는 현재 할인된 Reward의 summation에서 현재의 V를 빼고 미래의 V를 할인해서 더함.
잘 기억 안나는데.. fixed time step에서 bias // vairance를 최적화하는 기법을 써서 아래와 같이 구함
Experiments
- loss term
- other RL algorithms
봐도 모르쥬 ㅎ
def learn
rollout = self.runner.run(callback)
# Unpack
obs, returns, masks, actions, values, neglogpacs, states, ep_infos, true_reward = rollout
def setup_models (loss 정의부)
loss = self.pg_loss - self.entropy * self.ent_coef + self.vf_loss * self.vf_coef
-
self.entropy
: 논문에서$S$ . entropy bonus
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))
vf_losses
: Value 함수 업데이트 하는 부분. value 예측값도 clipping을 하나봄..!
PPO 논문엔 생략 되어 있지만 value 함수가 따로 있고 이를 업데이트 해야함
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))
-
neglogpac
:Negative Log-likelihood probability of Actions
-
train_model.proba_distribution.neglogp(self.action_ph)
action이 확률분포로 나올 텐데 이에 대해 negative log 를 구하면 됨
-
-
ratio
: 논문에서$r_t(\theta)$ . neglogpac의 이전것과 현재 것의 차이에 exponential 취한 것 -
pg_losses
: 수식에서 첫번째 term -
pg_losses2
: 수식에서 두번째 term -
pg_loss
: 수식에서$L^{CLIP}$ -
self.advs_ph
:$\hat A_t$