本文主要讨论两个目标:1. 如何让目标函数(total reward)在policy更新时是持续递增的。2. 如何让policy在更新后的“行为”与更新前相似,而不是“参数”相近,因为参数相近的两个模型行为上可能有很大差别。第二个目标也是为了保证更新时的稳定性,因为参数上的“一小步”走错了可能导致整个模型崩溃。为此需要在行为上在与旧的policy行为有一定相似程度的情况下进行更新。这个一定的相似程度就是Trust Region置信区间,如下图。下面从第一个目标开始推导,会省略很多推导步骤,最后优化的部分采用spinningup中的优化方法。
相关重要公式推导
首先对于第一点,作者构建下面这个目标函数,其中是旧的policy,是更新后的policy。,是PG的目标函数。下面这个公式的意思就是,更新后的policy 的total reward是在之前的policy的基础上增加了后面那一项。那么只要后面那一项大于等于0,就能保证policy的更新使目标函数变大。
上面的公式只取了最后的推导结果,原始公式是从时间序列相加的,推导成了在状态序列上相加求和。是 discounted visitation frequencies。现在有个问题是后面那项的数据是从更新后的policy进行采样的,更新后的policy还没有的,没法求解,所以作者将discounted visitation frequencies换成了旧的policy降低难度,变成下面公式:
然后经过一系列推导,作者给出上面两个公式的关系如下:
, 其中
上面的关系保证更新可以使目标函数递增。然后考虑的参数为,并且使用采样的方法来求解上式,上面的那个C会使得参数的更新很小,作者在KL上增加约束来提高更新的步伐,中间经过一些推导得到下式:
,
subject to
KL散度的约束就是保证一开始提到的第二个目标,就是置信区间。KL散度是作用在policy输出的动作概率分布上,不是参数上。接下来要求解上面的公式了,上面的公式里A前面那一项是更新后的policy,采样重要性采样的方法将他换成对更新前的policy采样,然后把上面求解公式变成下面目标函数:
subject to
以上两式就是TRPO最终的目标函数了,总体上看, 就是使用重要性采样的方式将原始的目标函数变成了代理目标函数(surrogate object function),并且在更新后的policy上增加了约束,与更新前的policy的KL散度不能大于某个置信值。
求解目标函数
上面的目标函数也不太好求解,于是作者将其泰勒展开,并用一节导数近似目标函数,用二阶导数近似KL散度,逼近后的公式如下:
其中g是policy gradient,H是KL散度的Hessian矩阵,上式使用拉格朗日算子求解可得:
上面的是后加上去的,叫backtracking coefficient,j是最小的非负整数,使KL散度小于。模型的参数一般很多,对上面的Hessian矩阵求逆开销是很大的,但Hessian一般以的形式出现。可以看成是的解,因此只要求解前面的线性方程就行。求解使用共轭梯度法,具体为:
从维基百科上截的,上面的A就是H,b就是g。可以看到,Hessian基本上是以的形式出现的(上面的,) ,所以可以直接求来避免计算及保存整个Hessian,使用如下公式:
总的算法流程(spinning up版)