我们已经知晓强化学习的基本要素有actor、environment、reward。强化学习的基本模型如下:
environment交给actor一个observation,即s;actor得到s向量以后给出动作action,即a;a、s输入reward模型,得到分数r,通过分数来衡量优势函数A的取值(上述例子直接用奖励r定义优势函数);损失函数通过交叉熵和A共同定义,通过减小损失函数,优化actor的参数
而实际上,每一个动作a会直接影响到后续的s和a,因此a之间并不是相互独立的。另外一个问题是,如果简单的用r来作为A的数值,会有一个问题,就是只有在做固定的action时A才会增加,这会导致actor只会选择固定的action,实际上的RL对A的定义有多种方法。
一种定义优势函数的方法是把动作a之后所有动作获得的r累计起来,作为该动作的优势函数。
优势函数,使用此优势函数将会使actor的action选择更加多样化,而不是只采用reward为正的动作,从而更可能从全局视角考虑问题的最优解。
但是上述定义优势函数的方法有一个问题,那就是奖励的值似乎并不直接受到动作
的影响,或者说受到其影响较小,更合适的一种优势函数设定的方法是
可能存在一种情况,即所有的action对应的A都是大于零的,这样actor将会认为所有的action都是好的,这显然不对;所以还需要对A进行标准化。最简单的标准化方法是直接减去一个baseline,即,
就是baseline,人为设定。
接下来介绍上述思想的程序逻辑:
1.actor是一个神经网络模型,首先需要初始化actor的参数
2.actor初始化之后,用其跟environment进行互动,得到一系列的对
3.计算优势函数,用于评价对的得分
4.定义损失函数,如交叉熵
5.用优化器结合损失函数更新actor参数
这里有一个重要问题,actor在训练过程中所使用的训练集使它自己和环境交互产生的,这是RL显著区别于传统的监督学习的地方。
上述例子中,actor每和environment互动一次,产生一组{s,a},然后再计算价值函数A,接着计算出损失函数,更新actor的参数;在下一个循环中,actor已经是新的actor了,其和environment互动将产生新的{s,a},然后循环此过程。这意味着actor每次用来的训练的数据都是它自己产生的。这种训练用自己产生的数据训练自己的方法叫做on-policy。这种方法的局限在于收集资料的过程太过于漫长,而不能像监督学习一样直接使用现成的数据集。
对应的,自然有actor依赖别的actor所产生的数据进行训练的方法,叫做off-policy。一种经典的off-policy算法就是之前提到过的PPO(近端策略优化)。
在训练过程中,为了使得模型泛化能力更强,需要给actor增加一定的随机性,如在actor的参数上加一些noise或者扩大actor输出的交叉熵