advantage优势值,是指该状态写做出该动作相比于其他动作而言有多好。在之前做强化学习的时候用了ppo2算法,由于是将多个智能体同时并行计算,需要对网上单个智能体的算法更新部分做一个改动,因此在之前自己写的算法中出现了错误:
在执行到需要更新的时候,计算优势函数使用了每个回合每一步的动作与奖励值,然后计算了总的Rt与At(advantage),然后计算损失函数的时候一直用的是这个Rt与At,但是实际上是计算智能体每一步的Rt与At,存成数组,然后在使用batch数据计算损失函数的时候,那个状态就要对应该状态智能体所有的At与Rt
在我的代码里面,At的shape应当是(peo_num, epoch_step),一个二维矩阵
别人的batch是指一个智能体在几轮运行结束之后从数据中取数据的batch,我的batch是指在每一轮数据中取的batch,其实差不多,都代表了某几次行动,只是在我的项目里,取得数据是peo_num个智能体的某几(peo_num,batch_size)
因此在运行的时候,actor_loss应该是由peo_num个actor_loss求mean而来(就是二维矩阵求mean),因此应当先按批处理 得到每一个智能体的actor_loss,再进行求平均
advantage标准化
我看了别人的代码说明,由于他们的代码在计算advantage的时候存在跨episode取值的问题,因此需要对advantage标准化,但是我存储数据的时候是按照回合来存储的,因此计算的时候也是安按照batch取回合,然后遍历回合计算回合里面每一步的At,因此我不存在需要标准化的问题。
advantage中的目标值与实际值
计算advantage的公式为:目标值函数V_target - 实际值函数V_real,其中V_real就是critic网络的输出值,V_target为 r +gamma * critic(next_state),观察advantage计算公式就可以知道advantage就是一个TD-error.