前言
本篇旨在总结强化学习相关术语,主要参考了邹伟等人所著的《强化学习》(清华大学出版社)这本书。
策略
在状态s下执行动作a的概率。
\pi(a \mid s)=P\left(A_{t}=a \mid S_{t}=s\right)
确定性策略:输出动作a为确定的一个动作。
随机性策略:输出动作a多个动作的概率分布。
预测与控制
预测(评估):评估当前的策略有多好,即求解既定策略下的状态值函数。
控制(改善):改善当前策略,即求解所有可能策略中最优价值函数及最优策略。
贝尔曼方程
状态值函数
状态值函数指从状态s开始,遵循当前策略\pi 时所获得的期望回报。
V_{\pi}(s)=E_{\pi}\left[G_{t} \mid S_{t}=s\right]=E_{\pi}\left[R_{t+1}+\gamma R_{t+2}+\cdots \mid S_{t}=s\right]
通过下面的推导,可以将其化成迭代形式:
\begin{aligned} V_{\pi}(s) &=E_{\pi}\left[G_{t} \mid S_{t}=s\right] \\ &=E_{\pi}\left[R_{t+1}+\gamma R_{t+2}+\gamma^{2} R_{t+3}+\cdots \mid S_{t}=s\right] \\ &=E_{\pi}\left[R_{t+1}+\gamma\left(R_{t+2}+\gamma R_{t+3}+\cdots\right) \mid S_{t}=s\right] \\ &=E_{\pi}\left[R_{t+1}+\gamma G_{t+1} \mid S_{t}=s\right] \\ &=E_{\pi}\left[R_{t+1}+\gamma V\left(S_{t+1}\right) \mid S_{t}=s\right] \end{aligned}动作值函数
和状态值函数类似,动作值函数在状态s下多了一个选择动作a。
\begin{aligned} Q_{\pi}(s, a) &=E_{\pi}\left[G_{t} \mid S_{t}=s, A_{t}=a\right] \\ &=E_{\pi}\left[R_{t+1}+\gamma Q_{\pi}\left(S_{t+1}, A_{t+1}\right) \mid S_{t}=s, A_{t}=a\right] \end{aligned}贝尔曼期望方程
贝尔曼期望方程有四种表达方式。(其实就是将一个迭代图进行了拆分)
(1)基于状态s,采取动作a,求
V_{\pi}(s)V_{\pi}(s)=\sum_{a \in A} \pi(a \mid s) Q_{\pi}(s, a)
(2)采取行为a,状态转变成s’,求
Q_{\pi}(s, a)Q_{\pi}(s, a)=R_{s}^{a}+\gamma \sum_{s^{\prime} \in S} P_{s s^{\prime}}^{a} V_{\pi}\left(s^{\prime}\right)
(3)基于状态s,采取行为a,状态转变至s’,求
V_{\pi}(s)V_{\pi}(s)=\sum_{a \in A} \pi(a \mid s)\left(R_{s}^{a}+\gamma \sum_{s^{\prime} \in S} P_{s s^{\prime}}^{a} V_{\pi}\left(s^{\prime}\right)\right)
(4)采取行为a,状态转变至s’,采取行为a’,求
Q_{\pi}(s, a)Q_{\pi}(s, a)=R_{s}^{a}+\gamma \sum_{s^{\prime} \in S} P_{s s^{\prime}}^{a} \sum_{a^{\prime} \in A} \pi\left(a^{\prime} \mid s^{\prime}\right) Q_{\pi}\left(s^{\prime}, a^{\prime}\right)贝尔曼最优方程
首先定义两个符号:
同样,贝尔曼最优方程也可表达成四种形式。
(1)基于状态s,采取动作a,求
V^{*}(s)V^{*}(s)=\max Q^{*}(s, a)
(2)采取动作a,状态转变成s‘,求Q^{*}(s, a) 。
Q^{*}(s, a)=R_{s}^{a}+\gamma \sum_{s^{\prime} \in S} P_{s s^{\prime}}^{a} V^{*}\left(s^{\prime}\right)
(3)基于状态s,采取行为a,状态转变至s’,求
V^{*}(s)V^{*}(s)=\max _{a} R_{s}^{a}+\gamma \sum_{s^{\prime} \in S} P_{s s^{\prime}}^{a} V^{*}\left(s^{\prime}\right)
(4)采取动作a,状态转变成s‘,采取行为a‘,求Q^{*}(s, a) 。
Q^{*}(s, a)=R_{s}^{a}+\gamma \sum_{s^{\prime} \in S} P_{s s^{\prime}}^{a} \max _{a^{\prime}} Q^{*}\left(s^{\prime}, a^{\prime}\right)策略评估
策略评估:给定一个策略\pi ,计算该策略下的值函数V_{\pi}(s) 使用贝尔曼期望方程进行迭代:
V_{\pi}(s)=\sum_{a \in A} \pi(a \mid s)\left(R_{s}^{a}+\gamma \sum_{s^{\prime} \in S} P_{s s^{\prime}}^{a} V_{\pi}\left(s^{\prime}\right)\right)
该方式利用后继状态s’的值来求当前值,也称作自举法
策略改进
策略评估之后,值函数已经计算出来。因此策略改进就是利用值函数来找到最优策略。
采用贪心算法来选取动作:
Q_{\pi}(s, a)=R_{s}^{a}+\gamma \sum_{s^{\prime} \in S} P_{s s^{\prime}}^{a} V_{\pi}\left(s^{\prime}\right)\pi^{\prime}=\max _{a \in A} Q_{\pi}(s, a)
理论可证明,通过这样操作可以不断迭代,总而让值函数V_{\pi}(s)变大。
动态规划
动态规划(DP)即反复使用策略评估和策略改进进行迭代,每次迭代都会让值函数增加。逐渐收敛后,就找到了最优策略。
蒙特卡罗
动态规划(DP)方法必须依赖于状态转移概率和回报已知的情况,参照策略评估的式子,P和R必须是已知的值,因此这个方法属于有模型方法
。
然而实际中,这两个量通常是未知的,需要智能体不断和环境交互才能估计出来,这就引入了无模型方法
中的蒙特卡罗方法(MC)。
蒙特卡罗评估
和策略评估类似,蒙特卡罗评估指的是用蒙特卡罗的方式来估计值函数。蒙特卡罗本质上就是利用了大数定律,通过大量多次实验来逼近真实值。
因此,要评估值函数,首先利用策略\pi 产生多个轨迹,每个轨迹都是从任意的初始状态开始到终止状态。
对于每个轨迹,都可以用下面的公式来计算累积回报:
G_{t}=r_{t+1}+\gamma r_{t+2}+\cdots=\sum_{k=0}^{\infty} \gamma^{k} r_{t+k+1}得到累积回报之后,对于每个状态的价值有两种做法来计算:
第一种是首次访问法,每次只利用状态第一次出现的累积回报。
V\left(s_{1}\right)=\frac{G_{12}+G_{2 k}+\cdots}{N\left(s_{1}\right)}
第二种是每次访问法,将所有的状态回报纳入计算。
V\left(s_{1}\right)=\frac{G_{12}+G_{1 k}+G_{2 k}+\cdots}{N\left(s_{1}\right)}除此之外,还可以采用增量式更新对评估公式进行优化。
V\left(s_{t}\right) \leftarrow V\left(s_{t}\right)+\frac{1}{k+1}\left(G_{t}-V\left(s_{t}\right)\right)
将1/(k+1)替换成常数\alpha ,就可以将上面的更新公式进一步简化。
V\left(s_{t}\right) \leftarrow V\left(s_{t}\right)+\alpha\left(G_{t}-V\left(s_{t}\right)\right)\alpha可视作更新步长,这样,就和机器学习比较类似。
同样,可以用类似的方式来更新动作值函数,公式如下:
Q\left(s_{t}, a_{t}\right) \leftarrow Q\left(s_{t}, a_{t}\right)+\alpha\left(G_{t}-Q\left(s_{t}, a_{t}\right)\right)蒙特卡罗控制
前面提到,控制即策略改进。蒙特卡罗方法同样可以采用贪心算法来改进策略。
\pi^{\prime}\left(s_{t}\right)=\underset{a_{t} \in A}{\operatorname{argmax}} Q\left(s_{t}, a_{t}\right)
然而,如果一直采用贪心算法存在一个问题。例如,有多家餐馆,每次吃饭时总选取当前认为最好吃的一家(这家的动作价值最大),如此,其它餐馆就得不到品鉴的机会,他们可能更好吃。
因此,引入一个随机机制,保证所有的动作都会被选中执行,即 \varepsilon -贪心探索。以\varepsilon 的概率从所有动作中随机选取一个,以1-\varepsilon 的概率选取当前最优动作,策略数学表达如下:
\pi(a \mid s)\left\{\begin{array}{ll} \frac{\varepsilon}{m}+1-\varepsilon & a^{*}=\underset{a \in A}{\arg \max _{a}} Q(s, a) \\ \frac{\varepsilon}{m} & \text { 其他 } \end{array}\right.
这里的m表示动作总数。
该方法能够保证改进后的策略比原策略要好,相关证明书里有提到,这里省略。
同轨策略/离轨策略
在蒙特卡罗学习以及后面的时序差分方法中,都会涉及这个概念:同轨策略和离轨策略。
同轨策略(on-policy)指产生数据的策略与评估改进的策略是同一个策略。
离轨策略(off-policy)指产生数据的策略与评估改进的策略不是同一个策略。
举个例子,同轨策略就是篮球运动员在场上自己根据环境交互来改进自己的策略;离轨策略就是篮球运动员在场上和环境交互来产生数据,这些数据输送到篮球教练那里,改进篮球教练的策略。这一块更多内容可参看B站的这个视频【强化学习】蒙特卡洛方法-同轨VS离轨
(注:由于英译的问题,书里的同轨、离轨分别翻译为在线和离线,这里以Sutton《Reinforcement Learning》中译版的翻译为主)
时序差分
蒙特卡罗的方法固然合理,但存在一个致命缺陷是更新时间太长,因为每次轨迹的采样需要一直到终止状态,对于某些不具有终止状态的场景就不太适用。因此,时序差分法就起到作用。
时序差分法(TD)并不是到每次的终止状态再进行更新,而是每走一步就进行更新,因此,对蒙特卡罗法的Gt进行改进,公式如下:
V\left(s_{t}\right) \leftarrow V\left(s_{t}\right)+\alpha\left(R_{t+1}+\gamma V\left(S_{t+1}\right)-V\left(s_{t}\right)\right)
其中,
R_{t+1}+\gamma V\left(S_{t+1}\right)称为TD目标值;
\delta_{t}=R_{t+1}+\gamma V\left(S_{t+1}\right)-V\left(s_{t}\right)称为TD误差。
三种方式对比
上面总共有三种方式:动态规划(DP)、蒙特卡罗(MC)、时序差分(TD),下面进行一个简单的对比。
Sarsa
Sarsa是同轨策略的TD。
动作值函数更新公式如下:
Q(S, A) \leftarrow Q(S, A)+\alpha\left(R+\gamma Q\left(S^{\prime}, A^{\prime}\right)-Q(S, A)\right)
从公式中可以发现,Sarsa的更新主要依赖于五个值:当前状态S,当前选择动作A,回报R,下一状态S’,下一状态选择动作A’。这也就是Sarsa起名的由来。
Sarsa算法的伪代码如下图所示:
Q-learning
Q-learning是离轨策略的TD。
动作值函数更新公式如下:
Q\left(S_{t}, A_{t}\right) \leftarrow Q\left(S_{t}, A_{t}\right)+\alpha\left(R_{t+1}+\gamma Q\left(S_{t+1}, A^{\prime}\right)-Q\left(S_{t}, A_{t}\right)\right)R_{t+1}+\gamma Q\left(S_{t+1}, A^{\prime}\right)=R_{t+1}+\gamma Q\left(S_{t+1}, \operatorname{argmax} Q\left(S_{t+1}, a^{\prime}\right)\right)=R_{t+1}+\max _{a^{\prime}} \gamma Q\left(S_{t+1}, a^{\prime}\right)产生采样的策略是\varepsilon -贪心策略,评估改进的策略是贪心策略。
Q-learning算法的伪代码如下图所示:
Sarsa/Q-learning实例
为了进一步理解比较Sarsa和Q-learning的区别,选择两个实例来对两者进行分析。由于涉及程序与环境介绍,内容较多,我将其单独成篇。
【强化学习】迷宫寻宝:Sarsa和Q-Learning
【强化学习】悬崖寻路:Sarsa和Q-Learning
多步TD评估
在前面记录时序差分(TD)方法时,每次评估只取了一步,再引申一下可以变成多步TD。
n步TD的更新目标为n步回报:
G_{t}^{n}=r_{t+1}+\gamma r_{t+2}+\cdots+\gamma^{n-1} r_{t+n}+\gamma^{n} V\left(s_{t+n}\right)
n步状态值函数更新为:
V\left(s_{t}\right) \leftarrow V\left(s_{t}\right)+\alpha\left(G_{t}^{n}-V\left(s_{t}\right)\right)TD(\lambda )
在多步TD的基础上,还能再做进一步延申。 TD(\lambda )就是将多个TD(n)进行组合,引入\lambda 作为权重,保证所有的TD(n)的权重之和为1。
这样可以更新回报:
G_{t}^{\lambda}=(1-\lambda) \sum_{n=1}^{T-t-1} \lambda^{n-1} G_{t}^{n}+\lambda^{T-t-1} G_{t}状态值函数更新为:
V\left(s_{t}\right) \leftarrow V\left(s_{t}\right)+\alpha\left(G_{t}^{\lambda}-V\left(s_{t}\right)\right)从更新公式不难看出,该方法使用了后面的状态值函数来计算回报,可以用前向视图来进行理解。
资格迹
TD(\lambda )更新是运用前向视图,也就是每次更新需要用到后面很多步的信息,但是这并不高效。
为了解决这一问题,引入资格迹。
首先通过一个例子来简单理解什么是资格迹。
假设存在这么一个场景:一只小狗在接受3次拳击和1次电击后死亡,那么究竟是拳击还是电击更导致了小狗的死亡,也就是说,需要这么一个量来衡量两者对既定事实的贡献度,这个量就是资格迹。
累积迹
假设所有状态都有一个初始资格迹,设置为0,即
E_{0}(s)=0
之后,对于每个被访问到状态,资格迹乘以迹退化参数\lambda 和衰减因子\gamma ,然后加1;对于未被访问到的状态,只进行衰减而不加1。将两种情况融合,可以得到下面的更新公式。
E_{t}(s)=\gamma \lambda E_{t-1}(s)+1\left(S_{t}=s\right)
其实这种定义方式就是累积迹
,是资格迹的一种形式。
这个图比较清晰的解释了累积迹,被访问到,+1形成跳变;未被访问,持续衰减。
下面代入“小狗死亡”的例子,来计算拳击s1和电击s2的资格迹。
计算得到,s1的资格迹为1.61,大于电击的资格迹1,因此拳击是小狗致死的主要原因。
我们将累积迹引入TD的更新中,用资格迹来衡量当TD误差发生时,各状态的值函数更新会受到多大程度的影响。
TD误差公式如下:
\delta_{t}=R_{t+1}+\gamma V_{t}\left(S_{t+1}\right)-V_{t}\left(S_{t}\right)
状态价值更新:
V(s) \leftarrow V(s)+\alpha \delta_{t} E_{t}(s)
从公式上可以看出,使用资格迹进行依赖以前的状态,这就是所谓后向视图。
引入累积迹后,TD(\lambda )的后向算法流程如下:
替换迹
上面的运用到的是累积迹,除此之外还有替换迹
。
主要原理都是一样的,区别在于更新公式。
替换迹的计算公式如下:
E_{t}(S)=\left\{\begin{array}{ll} \gamma \lambda E_{t-1}(s) & s_{t} \neq s \\ 1 & s_{t}=s \end{array}\right.
可以发现,衰减其实是不变的,唯一变化的是当状态访问到时,不再是资格迹的累加,而是直接置1.
下面的图直观展示了累积迹和替换迹的区别。
资格迹除了累积迹、替换迹之外,sutton的书里还提到一个荷兰迹
,但荷兰迹适用条件有限(仅适用于线性情况),这里不作过多解读。
值函数逼近
前面所有的理论均适用于小样本的离散情况,而当处于大量样本的连续情况时,再适用Q表格显然无法满足需求。因此,我们引入函数逼近的方式来对值函数进行改写。
V(s)=\hat{V}(s, \theta)\theta表示引入的参数,通常为一个向量。
具体的逼近形式大致可分为线性逼近和非线性逼近。
线性逼近
线性逼近并不常用,因此这里简单记录一下几种形式,不作进一步解读。
增量法
1.基于蒙特卡罗方法的参数逼近
参数更新公式:
\nabla \boldsymbol{\theta}=\alpha\left(G_{t}-\boldsymbol{\theta}^{\mathrm{T}} \boldsymbol{x}\left(\boldsymbol{s}_{t}\right)\right) \boldsymbol{x}\left(\boldsymbol{s}_{t}\right)
2.基于时序差分方法的参数逼近
参数更新公式:
\nabla \boldsymbol{\theta}=\alpha\left(R_{t+1}+\gamma \boldsymbol{\theta}^{\mathrm{T}} \boldsymbol{x}\left(\boldsymbol{s}_{t+1}\right)-\boldsymbol{\theta}^{\mathrm{T}} \boldsymbol{x}\left(\boldsymbol{s}_{t}\right)\right) \boldsymbol{x}\left(\boldsymbol{s}_{t}\right)批量法
损失函数:
L(\boldsymbol{\theta})=\sum_{t=1}^{T}\left(V_{t}^{\pi}-\boldsymbol{\theta}^{\mathrm{T}} \boldsymbol{x}\left(\boldsymbol{s}_{t}\right)\right)^{2}对参数求导,令导数为0:
-\frac{\partial L(\boldsymbol{\theta})}{\partial \boldsymbol{\theta}}=2 \sum_{t=1}^{T}\left(V_{t}^{\pi}-\boldsymbol{\theta}^{\mathrm{T}} \boldsymbol{x}\left(\boldsymbol{s}_{t}\right)\right) \boldsymbol{x}\left(\boldsymbol{s}_{t}\right)=03.蒙特卡罗参数为
\boldsymbol{\theta}=\left(\sum_{t=1}^{T} \boldsymbol{x}\left(\boldsymbol{s}_{t}\right) \boldsymbol{x}\left(\boldsymbol{s}_{t}\right)^{\mathrm{T}}\right)^{-1} \sum_{t=1}^{T} \boldsymbol{x}\left(\boldsymbol{s}_{t}\right) G_{t}
4.时序差分法参数为
\boldsymbol{\theta}=\left(\sum_{t=1}^{T} \boldsymbol{x}\left(\boldsymbol{s}_{t}\right)\left(\boldsymbol{x}\left(\boldsymbol{s}_{t}\right)-\gamma \boldsymbol{x}\left(\boldsymbol{s}_{t+1}\right)\right)^{\mathrm{T}}\right)^{-1} \sum_{t=1}^{T} \boldsymbol{x}\left(\boldsymbol{s}_{t}\right) R_{t+1}非线性逼近
非线性逼近主流方式是通过神经网络来进行实现,这一内容是重点,后面会详细解读。
DQN
DQN全称Deep Q-Network,从这里开始就进入到深度强化学习。
DQN创新点
DQN是基于Q-Learning,主要有做了三点创新。
1.使用深度神经网路从原始数据提取特征来近似动作值函数(Q函数)
这个就是非线性逼近。
DQN的神经网络结构是三个卷积层和两个全连接层。
2.采用了经验回放机制
经验回放的设计是受到人脑中海马体的启发。人在与环境交互时,类似的经验不会直接吸收到大脑皮层,而是会存放到海马体(类似内存),在夜间会把一天的记忆重放给大脑皮层(硬盘)。
因此,DQN建立了一个数据库,每一次进行参数更新时,采用随机采样的方式从数据库中抽取数据,这样做的好处在于能够打破数据之间的关联,令神经网络的训练收敛且稳定。
3.设置单独的目标网络来处理TD偏差
利用神经网络对参数更新时,采用的是梯度下降法,更新公式如下:
\boldsymbol{\theta}_{t+1}=\boldsymbol{\theta}_{t}+\alpha\left(r+\gamma \max _{a^{\prime}} Q\left(\boldsymbol{s}^{\prime}, \boldsymbol{a}^{\prime} ; \boldsymbol{\theta}_{t}\right)-Q\left(\boldsymbol{s}, \boldsymbol{a} ; \boldsymbol{\theta}_{t}\right)\right) \nabla Q\left(s, \boldsymbol{a} ; \boldsymbol{\theta}_{t}\right)
但是这样做存在一个问题,目标值和要更新的Q值共用同一个网络,这会导致每次更新后,目标也发生变化,从而导致训练不稳定。比如,猎人拿枪射猎物,每次射击猎物同时运动。
为了解决这一问题,使用了一个目标网络。起初目标网络是将原网络进行复制,之后每隔一段固定步数,目标网络再次进行复制,期间保持不变,这样就让目标稳定。
因此,参数的更新公式修改为:
\boldsymbol{\theta}_{t+1}=\boldsymbol{\theta}_{t}+\alpha\left(r+\gamma \max _{a^{\prime}} Q\left(\boldsymbol{s}^{\prime}, \boldsymbol{a}^{\prime} ; \boldsymbol{\theta}_{t}^{-}\right)-Q\left(\boldsymbol{s}, \boldsymbol{a} ; \boldsymbol{\theta}_{t}\right)\right) \nabla Q\left(\boldsymbol{s}, \boldsymbol{a} ; \boldsymbol{\theta}_{t}\right)DQN实例:Flappy Bird
下面将通过一个实例,从编程的角度来更深入的理解DQN。
2022.4.10
目前暂时更到这里,后面还有策略梯度,DDQN,DDPG,A2C等更复杂的网络,待日后研究透彻再更新。