说明:本系列文章是我在学习了西湖大学赵世钰老师的《Mathematical Foundations of Reinforcement Learning》一书后的学习笔记,在B站上有赵老师的完整课程视频。
课程视频链接
PDF教材链接
本文代码链接
一、从表格到函数
之前我们都是用表格的方法来维护策略的s-value和q-value,当状态空间有限且较小的时候,表格的方式很好用,但是当状态空间是连续的或者非常大的时候,表格的方式将使得存储和计算的需求就爆炸式的增长。从现在开始,我们介绍用函数的方式来位数s-value和q-value,用有限的参数通过函数的方式来表达value。
还是以gridworld为例:
在表格方法中:
在函数方法中:
- 用
来近似
;
是状态
的一个函数;
- 其中
是我们要优化的参数;
叫做状态
的特征向量(feture vector)。
对比:
- 在表格方法中,我们通过查找对应单元格来获取v-value,在函数方法中,我们通过计算函数值来获取v-value。
- 在表个方法中,我们通过修改对应单元格来直接更新v-value,在函数方法中,我们通过更新参数
来间接更新v-value。
- 函数的表达方式具有更强的泛化能力,因为在表格方法中,我们更新某个v-value,只会影响对应的状态s;在函数方法中,我们更新参数,会影响其他状态s通过函数计算的输出值。
从上图中,我们可以看出,函数的方式替代表格的方式,本质上是一个用曲线拟合一个数据集合。上图是用一条直线来拟合所有v-value,但是如果这些点的分布不是一条类直线呢?世界上,我们可以根据需要选用多种不同的函数来拟合,比如用更复杂的高阶多项式。
随着用来拟合的函数阶数的增高,参数量增大,拟合的精度会增加,随之而来的是存储和计算的资源需求也增加。
在上面的公式(8.1)和(8.2)中,对参数
都是线性的,我们称之为线性方程近似。(虽然它对状态s不是线性的)
近似函数的选择:
这取决于具体的任务,但选择一个好的函数并不简单,所以我们通常直接选用神经网络来作为非线性函数近似。
目标函数:
既然我们要优化参数,使得,则显然目标函数应该是:
二、基于函数近似的TD Learning
期望形式目标函数:
这里S是一个随机变量,是随机变量就涉及到概率分布:
- 如果s是均匀分布:
- 如果s不是均匀分布(绝大多数情况下):
这里的意义:
在策略下,agent从任一初始状态s出发,经过足够长的episode,在这个过程中访问所有状态s概率分布,称之为平稳分布。(Stationary distribution of a Markov decision process)
然而,并不容易获取,因此,我们采用梯度下降的方法来优化参数w:
计算梯度:
带入可得:
从GD的期望形式转为SGD的elementwise form:
其中是在t时刻S的采样。
等式中依赖一个我们并不知道的真实值,有两种方法获得:
- 一是蒙特卡罗方法,采样一个episode
,用从
开始的discounted return,
来近似
。
- 另一种方法是时序差分的方法(TD)
伪代码:
线性的方法较容易理解,但是其近似能力有限,对于复杂任务,选择合适的特征向量也不容易,较难收敛。通常情况下,我们更多的使用神经网络来近似。
这里是估计s-value,无法更新策略,原因还是Mode-free得方法,只有数据,没有模型,因此,我们下面要切换为估计q-value的方法。
在线性估计中,由于对
是线性的,所以其对
的导数
就是特征向量
三、TD based on q-value approximation
简单的将替换为
,得到:
伪代码:
如果是线性估计,则由于对
是线性的,所以其对
的导数
就是特征向量
四、Q-Learning with function approximation
将q-value近似的公式中,替换为
,得到:
伪代码:
这是一个on-policy的伪代码,和上一章中的Q-Learning一样,我们也可以将其改写为off-policy形式。
五、Deep Q-Learning
我们使用神经网络替代函数近似,就是DQN。
目标函数(损失函数):
要求解,则需要用到梯度下降算法:
在(8.37)中,显然和
中都是w的函数,由于target中有max项,计算梯度并不容易。
因此,我们假定target中的w是固定的,不参与迭代,则只需要计算estimate项的梯度。令:
则有:
双网络:
- 这样target和estimate中的神经网络就变成了两个不同的网络,我们成estimate中的网络为main network,target中的网络为target network。
- main network中的参数在每次迭代中都更新
- target network则每经过一定的迭代次数后,将main network中的参数复制给target network
经验重放:
从目标函数(8.27)我们可以看出,计算中只依赖于和前后两个状态的q-value,而q-value就是神经网络的输出。
也就是说,当我们采样一个episode后,我们可以将其截断成一个个的,而无需关心整个episode的链条关系,每个
就是一个sample。
这样,我们就只需要采样一个足够长的episode,然后将其封装成一个数据集,并将其打乱,重复使用(使得每个(s,a)都变成了独立分布)。这不就是深度学习中的典型dataset吗?
每个训练epoch都使用相同的数据集,每个batch从中随机选取部分sample训练迭代(MBGD)。这就是经验重放。
经验重放的好处:
- 只需采样一次,重复利用,数据利用率高
- 打乱的数据,满足GD对采样独立分布的要求
伪代码: