强化学习学习笔记2-PPO
摘要
看来还是看大师的讲解最有效,自己看了一大堆网文也没搞懂ppo。看李宏毅的视频一下就懂了。。
PPO大致思路
在PG方法中,构建了一个智能体pi_theta和环境互动,收集到了一大堆trajectory或者说一大堆(S_t,a_t)后,即可通过最大化pi_theta的收益来优化模型。
而PG是一种on policy方法,跑的很慢,因为收集了一大堆资料后,只能训练模型一轮然后就得重新收集资料(模型参数已经变了,梯度就得重新算了)。
所以PPO就考虑每次收集资料的时候,用一个克隆体pi_theta’来收集训练资料,而用克隆体收集到的资料来训练母体。
为了完成这个目标,就需要用到很多的策略,如用重要性采样来抹平克隆体和母体之间的差异;在优化目标中加入KL散度信息来减小克隆体和母体之间的差异,或者直接对差异进行clip限制。
同时,为了尽速训练。PPO还使用了一个神经网络critic用来计算收益值。
整体流程
advantage = f# 一个用于计算当前回报的函数,可以是critic或者别的
PI = NN()
env
buffer # 用于存储数据
S = env.reset()
for i in range(NUM_EPOSIDES):
# 收集数据
PI_ = PI.clone()
logits_ = PI_(S)
a = argmax(logits_)
r,S_ = env.setp(S)
buffer.append([S,a,r,S_])
# 进行训练
for j in range(NUM_steps):
S,a,r,S_ = buffer.sample() # 这里取出来是一个batch的数据
logits_ = PI_(S)
logits = PI(S)
#### 2. 重要性采样,用克隆体的数据训母体 ####
J = ( (logits[a]/logits_[a])*advantage(a) ) # 未经修正的目标函数
#### 3. 目标使得PI和PI_之间差距不要太大 ####
# J = J - beta * KL(PI,PI_) # 第一种方案,用PI行为间的KL散度进行约束
J = min( J, clip(J, 1-epi, 1+ epi) )# 第二种方案,直接使得J不要太小,不要太大。这里对advantage正负进行分情况讨论就能理解了
#### 目标使得PI和PI_之间差距不要太大 ####
loss = -J
loss.backward()
# ... 再做一些辅助的工作