1. 目标函数定义:
强化学习的目标是最大化期望折扣累积回报,简化来说就是让所有轨迹带来的奖励期望值最大,再特殊一些,如果所有轨迹出现概率相同,那么奖励期望就是平均值,但是这样也就没有优化意义了,所以每个轨迹出现概率就是我们优化的目标,也就是让奖励大的轨迹出现概率加大。这样期望值就也就最大了。
其中 是折扣因子,
是轨迹。
2. 目标函数积分形式:
期望要怎么求呢?我们需要转换成可以求解的积分形式(也可以是离散加和形式,但是这里一般化处理了)
其实很简单理解,在当前策略下,每条轨迹出现的概率乘上该轨迹的奖励,就是期望了。依然,如果还是特殊化,概率相等,其实这个形式就是求平均值吗。
3. 轨迹概率分解
奖励可以很容易获得,那么每条轨迹出现的概率怎么求呢,这就要根据不同的策略来计算了:
一般情况下,每个初始状态也是有出现概率的,所以首先乘出来,然后策略基于每个状态输出动作,然后根据该环境的状态转移概率计算进入到下一个状态的概率,这样一直循环直到结束。除此之外没有其他要考虑的因素了。
4. 计算目标函数梯度
这样我们有了轨迹概率,有了奖励,就可以计算目标函数了,下一步要考虑的就是如何让目标函数最优。可能有人会问,既然两个都齐全了为什么不直接代数求呢,这是因为我们的目的是要让目标函数最优而不是求它,我们之前的步骤都是在将抽象,general的概念、定义落实到具体的数值,从而进行优化。另外一方面是考虑到应用,因为现在基本上应用都是与真实世界相关的复杂任务,要遍历所有情况或者具体化状态转移概率基本上是不可能的。举个简单例子,机械臂末端从一个点到另外一个点的所有路径是无法全部列举出来的,传统路径规划都要撒格子。
5. 应用对数技巧
应用对数技巧的意义有三个,一个是简化计算从连乘转换到连加,至于为什么大家可以尝试算一下连乘函数的导数和连加函数的导数,当然说用电脑硬算也没毛病。一个是打消样本关联性,因为之前都是乘法,出现下一个状态都是要基于上一个状态的结果的,现在变成连加了,互相不相关了,是不是很神奇,而且没有关联的话,就完全可以应用replay buffer和并行/分布式训练了,因为取得是轨迹的片段而不是整段轨迹了(比如我可以直接吃八个鸡翅,而不用连续吃四只鸡从而吃到八个鸡翅)。最后一个就是防止梯度消失,概率都是小于1的,连续乘几十次就逼近0了,那需要多大的奖励才能梯度上升啊,借鉴0.99和1.01的一百次方的故事。
6. 分解对数轨迹概率
然后目标函数再转换成期望形式:
然后再求log轨迹概率:
log的基本运算哈:
然后对log轨迹概率求导,注意我们是要对策略的参数求导,不包含的参数是常数项,导数为0,这样就去掉了初始概率和状态转移概率,其实也好理解,这些参数都是环境定义的与policy自身无关也不在policy掌控范围之内,其实品着有点天地人的味道了。所以最后剩下的就是:
再带回到梯度的期望公式:
7. 因果性简化
我们注意到梯度公式提供的奖励是整条轨迹的,这样其实有些大水漫灌了,一方面会让方差增大另外一方面优化效率变低,等到整条轨迹出现和每一步都更新的效率是完全不一样的,而且优化是统一分配到所有动作,无法具体优化到关键性的单个动作。这个也很好理解,一个团队有划水,帮倒忙和猛猛干活的主力,但是成果均分肯定是不合理的也无法充分发挥团队能力。所以在这里会考虑到一个动作只对未来有影响,而过去已成定局无法改变,所以期望变成每一步动作概率与该动作之后的奖励乘积。
8.采样近似期望
到这里的话就是从理论到工程的步骤了。可能会有人说推导到这个形式也没有什么用处呀,求期望不是还要回到积分形式,再去求轨迹概率还是绕不开。其实前面的推导都是根据工程实践的需求出发进行理论证明,因为我们是不可能遍历所有情况也没有办法准确量化状态转移概率的,这也是为啥研究概率论,我们所做的一切都是试图通过有限的资源(样本)去推断(拟合)事情本质。之前的推导只是为我们的实践方法做理论支撑,论证它是合理的。比如这里我们求期望就可以通过大样本,大数据样本来近似逼近理想期望:
其中N为采样的N条轨迹
其实在这里已经很接近强化学习的代码了,log动作概率和状态价值相乘的负数作为梯度,进行梯度下降,对于如何取样和如何获得奖励是另外的事情了,蒙特卡洛与时序差分以及如何用在监督学习框架后续再写。