这是对 《深度强化学习》 王树森 张志华 中 DQN 部分的缩写以及部分内容的个人解读
书中的 DQN 是一个相对终极版本的存在,相信体量会比网络上其他资料要大很多
我们通过贪吃蛇来引入几个基本概念
符号 | 中文 | 说明 |
---|---|---|
S , s S,s S,s | 状态 | 贪吃蛇和食物的位置,空间的大小等 |
A , a A,a A,a | 动作 | 贪吃蛇当前时刻要做出的行为,如前进和左转 |
R , r R,r R,r | 奖励 | 贪吃蛇当前时刻做出行为会获得的奖励,如吃到食物奖励100分 |
U , u U,u U,u | 回报 | 每一步奖励累加到游戏结束为止的和,或者说总奖励,我们的目标是最大化总奖励 |
γ \gamma γ | 折扣率 | 每一步奖励的权重不同,这是衰减率,即越往后权重越小,一般可以取 γ = 0.95 \gamma=0.95 γ=0.95 |
π ( a ∣ s ) \pi (a | s) π(a∣s) | 随机策略函数 | 条件概率密度函数,在 s s s 状态下,执行 a a a 动作的概率,是待学习的 |
p ( s t + 1 ∣ s t , a t ) p(s_{t+1}|s_{t},a_{t}) p(st+1∣st,at) | 状态转移函数 | 见下 |
Q π ( s t , a t ) Q_{\pi}(s_{t},a_{t}) Qπ(st,at) | 动作价值函数 | 见下 |
Q ⋆ ( s , a ) Q_{\star}(s,a) Q⋆(s,a) | 最优动作价值函数 | 最好的随机策略函数 π \pi π对应的动作价值函数 |
状态转移函数:
条件概率密度函数,在 s t s_{t} st 状态下执行 a t a_{t} at 操作,转移到 s t + 1 s_{t+1} st+1 的概率,对于贪吃蛇来说,随机性来自于可能吃掉了食物,出现新的食物,换言之如果没有吃掉食物,在给定条件下下一个状态是确定的,也就是只有一个 s t + 1 s_{t+1} st+1 的值为 1 1 1,其他都为 0 0 0
动作价值函数:
完成 t t t 时刻决策后,我们希望估计局势,也就是接下来回报的期望,显然当我们确定了该时刻的状态和动作后,之后的行为可以唯一确认之后的回报,而之后的行为只与随机策略函数 π \pi π有关(我们认为状态转移函数 p p p是固定的)
符号说明:
若下文出现花体字符,他们的意义是对应的全体可行集合
直接学习策略函数 π \pi π,然后让智能体概率采样地执行。
我们越过策略函数直接学习最优价值函数,然后让智能体每一步都执行最优价值函数最高的动作。例如在 s s s 状态下
Q ⋆ ( s , 上 ) = 100 , Q ⋆ ( s , 左 ) = 200 , . . . = 100 , . . . = 0 Q_{\star}(s,\text{上})=100,Q_{\star}(s,\text{左})=200,...=100,...=0 Q⋆(s,上)=100,Q⋆(s,左)=200,...=100,...=0
那么我们令其执行“左”。
我们接下来只涉及价值学习的原理和方法
首先让我们快速回顾一下深度神经网络,它可以抽象成一组输入,一组参数,一组预测输出,一组事实输出,它的学习是对参数执行梯度下降以最小化预测输出和实时输出的差距,而接下来我们要介绍深度强化学习网络DQN,和对应的学习算法 TD 算法(事实上本文中只提及 TD 算法中的 Q 学习算法,所以有时候我混为一谈,但本章中仍称之为 TD 算法)
TD算法和传统神经网络最大不同就是强化学习网络不存在一个事实输出,所以它将事实输出替换为部分事实输出,下面会展示这一点
上文我们提到,价值学习是越过策略函数直接学习最优价值函数,也就是“策略”其实是一个黑箱,我们不用知道是什么,我们这里直接给出蒙特卡罗近似和最优贝尔曼方程结合的一个关键结果(下简称最优贝尔曼方程,因为多次用到)
Q ⋆ ( s t , a t ) ≈ r t + γ ⋅ max a ∈ A Q ⋆ ( s t + 1 , a ) Q_{\star}\left(s_{t}, a_{t}\right) \approx r_{t}+\gamma \cdot \max _{a \in \mathcal{A}} Q_{\star}\left(s_{t+1}, a\right) Q⋆(st,at)≈rt+γ⋅a∈AmaxQ⋆(st+1,a)
它的意义是显然的,类似动态规划,当前最优显然是当前行为的奖励加上之后的最优得到的
敲黑板,重点来了:我们假设目前学习中的 Q ⋆ Q_{\star} Q⋆函数是一个效果很差的 Q ⋆ Q_{\star} Q⋆函数,通过这个函数我们得到了等号左边的预测值,我们希望用等号右边作为事实输出学习,但是等号右边仍然包含我们待学习的 Q 函数
如果是过去的神经网络,这样的学习是没有意义的,相当于用错误的方法求两遍,自己和自己对照
然而等号右边还包含了一个确定的事实值 r t r_t rt,所以等号右边的事实程度要更高一些,于是我们把右侧全体看作一个部分事实输出去做学习,这就是TD算法,这是一种自举算法(自己更新自己)
与环境交互得到四元组 ( s t , a t , r t , s t + 1 ) (s_t,a_t,r_t,s_{t+1}) (st,at,rt,st+1),每个四元组就是一个样本,也是最优贝尔曼方程中所有与环境相关的值,对于每一个样本就是代入 Q 函数中,(右侧需要枚举多个 Q 函数取最大值),然后执行梯度下降
值得注意的是,如何采样,强化学习中叫行为策略。一种方法是随机采样,随便玩,随便采,但是这显然不是我们想要的,我们希望我们的AI是一个聪明的AI,所以我们应该给它对应的问题。
常见的行为策略是 ϵ − g r e e d y \epsilon-greedy ϵ−greedy 策略,我们以一定概率选择最优的行动,而剩下的概率随机行动,我的理解中这是基于高分更难遇见,而且更难学习这个共识,人为去平衡样本,和机器学习中偏采样相关的内容是一致的。
Q学习是学习 Q ⋆ Q_{\star} Q⋆,对应的又有SARSA学习的是 Q π Q_{\pi} Qπ,二者都归属于TD算法,目前前者是托管更主流的算法,后者则用于动作好坏的评估,因为 Q π Q_{\pi} Qπ 才和具体的动作有关
DQN是用深度神经网络来作为Q学习中 Q ⋆ Q_{\star} Q⋆的表达形式,过去是用表格
下文中 DQN 和 Q ⋆ Q_{\star} Q⋆ 函数混为一谈,但实际上 Q ⋆ Q_{\star} Q⋆ 函数可以有多种表达形式
DQN 最初不带任何优化的实现取得的效果是有限的,下面会介绍实际应用场合中被广泛采用的技巧
将四元组 ( s t , a t , r t , s t + 1 ) (s_t,a_t,r_t,s_{t+1}) (st,at,rt,st+1)储存在一个经验回放数组中,当记忆填满时再开始更新参数(学习),何时填满是超参数,填满后以随机抽样的方式进行学习。
对经验回放进行改进,优先经验回放以一定的规则对记忆赋权,加权抽样
它的权重定义为 δ + ϵ \delta + \epsilon δ+ϵ,其中 δ \delta δ 即上文提到的TD算法中的预测值和部分事实值的差
δ = Q ⋆ ( s t , a t ) − [ r t + γ ⋅ max a ∈ A Q ⋆ ( s t + 1 , a ) ] \delta = Q_{\star}\left(s_{t}, a_{t}\right) - [r_{t}+\gamma \cdot \max _{a \in \mathcal{A}} Q_{\star}\left(s_{t+1}, a\right)] δ=Q⋆(st,at)−[rt+γ⋅a∈AmaxQ⋆(st+1,a)]
ϵ \epsilon ϵ 是一个极小的正数
相当于多做错题
非均匀采样需要对应地调整学习率,一种可行的办法是这样
α j = α ( b ⋅ p j ) β \alpha_{j}=\frac{\alpha}{\left(b \cdot p_{j}\right)^{\beta}} αj=(b⋅pj)βα
其中 β \beta β 是超参数
另外我们采样时计算得到的 δ \delta δ 是旧参数下的,我们学习时要用新的参数重新计算
原始的 Q 学习算法会导致 Q ⋆ Q_{\star} Q⋆ 函数非均匀地被高估,因为 TD 是一种自举算法,即自己更新自己,而估计中的噪声,即高估(低估)就会自己传给自己,导致整体和谐地被高估(低估)。这里因为算法中是取max,所以会把高估的噪音过滤出来,总体来看就是 Q 函数最后一定是被高估的。
然而高估本身没有问题,问题出在不平衡地高估,因为我们的决策是取最优决策,均匀高估不会影响确定最优决策,但是实验发现它往往是不均匀地,如因为采样很难均匀的缘故。
有两种方法来解决这个问题,目标网络和双Q学习
目标网络的想法是通过两个网络来切断自举
具体地,上文我们一直在用的网络我们称为DQN,我们另外定义一个网络结构一模一样的网络称为目标网络
我们要学习的DQN仍然是最优贝尔曼方程的左式,但是右式我们用新定义的网络目标网络去计算,两个网络的差为新定义的误差,用这个误差去更新DQN,再用 DQN 和 目标网络 加权平均去更新 目标网络,这个权重是一个超参数
双Q学习和目标网络很像,我们可以这样引入双Q学习
把
r t + γ ⋅ max a ∈ A Q ⋆ ( s t + 1 , a ) r_{t}+\gamma \cdot \max _{a \in \mathcal{A}} Q_{\star}\left(s_{t+1}, a\right) rt+γ⋅a∈AmaxQ⋆(st+1,a)
拆分成选择(选择出估值最大的行为)和求值(计算最大行为对应的估值)
如果不拆分,这两步对于原始 Q 学习和目标网络来说是统一的,因为选择最大值行为本身就计算完对应最大值了
双Q学习可以解读为用DQN网络做行为选择,但是用"目标网络"求值,这时前者选择出来的行为不一定对应后者的最大行为了。但我们用这个不一定最大的估值去学习,结果就是
y ~ t ⏟ 双 Q 学习 ≤ y ^ t − ⏟ 用目标网络的 Q 学习 \underbrace{\tilde{y}_{t}}_{\text {双 } \mathrm{Q} \text { 学习 }} \leq \underbrace{\widehat{y}_{t}^{-}}_{\text {用目标网络的 } \mathrm{Q} \text { 学习 }} 双 Q 学习 y~t≤用目标网络的 Q 学习 y t−
而这恰恰就是我们想要的,缓解最大化造成的高估
和目标网络是基本一致的,最后仍然是一个加权平均
另外以上方法中,双Q算法是效果最好的
以上是学习方法,接下来介绍两种对神经网络结构的改进
对决网络将 DQN 拆分成两部分 最优优势函数 D ⋆ ( s , a ) D_{\star}(s,a) D⋆(s,a) 和 最优状态价值函数 V ⋆ ( s ) V_{\star}(s) V⋆(s)
先给出直观的理解:
最优状态价值函数 V ⋆ ( s ) V_{\star}(s) V⋆(s) 描述的是一个状态本身的优劣,它对所有动作取平均
即 V π ( s ) V_{\pi}(s) Vπ(s) 是 Q π ( s , a ) Q_{\pi}(s, a) Qπ(s,a) 其中当步 a a a 按照 π \pi π 决策的期望,最优就是选取最优的 π \pi π,类似 Q ⋆ Q_{\star} Q⋆ 和 Q π 的差别 Q_{\pi} 的差别 Qπ的差别
优势函数则是 a a a 动作较期望动作的优势,最优则是最优相对最优的优势
即 D ⋆ ( s , a ) = Q ⋆ ( s , a ) − V ⋆ ( s ) D_{\star}(s,a) = Q_{\star}\left(s, a\right) - V_{\star}(s) D⋆(s,a)=Q⋆(s,a)−V⋆(s)
容易证明
Q ⋆ ( s , a ) = V ⋆ ( s ) + D ⋆ ( s , a ) − max a ∈ A D ⋆ ( s , a ) ⏟ 恒等于零 , ∀ s ∈ S , a ∈ A Q_{\star}(s, a)=V_{\star}(s)+D_{\star}(s, a)-\underbrace{\max _{a \in \mathcal{A}} D_{\star}(s, a)}_{\text {恒等于零 }}, \quad \forall s \in \mathcal{S}, a \in \mathcal{A} Q⋆(s,a)=V⋆(s)+D⋆(s,a)−恒等于零 a∈AmaxD⋆(s,a),∀s∈S,a∈A
因为最优的时候, π \pi π 一定能正确地唯一选到期望最大的动作,此时 D D D 也必须选到那个 a a a 才能让这个“优势”为0,否则就是负数
我们的网络就可以定义为
Q ( s , a ; w ) ≜ V ( s ; w V ) + D ( s , a ; w D ) − max a ∈ A D ( s , a ; w D ) Q(s, a ; \boldsymbol{w}) \triangleq V\left(s ; \boldsymbol{w}^{V}\right)+D\left(s, a ; \boldsymbol{w}^{D}\right)-\max _{a \in \mathcal{A}} D\left(s, a ; \boldsymbol{w}^{D}\right) Q(s,a;w)≜V(s;wV)+D(s,a;wD)−a∈AmaxD(s,a;wD)
之所以要把一件事拆成两部分,我的理解中这可以和残差神经网络统一地解释,即人为地用外界知识精细化网络结构,省去了让他自己进化出这样的框架的时间
其中我们预期的结果中 max a ∈ A D ( s , a ; w D ) \max _{a \in \mathcal{A}} D\left(s, a ; \boldsymbol{w}^{D}\right) maxa∈AD(s,a;wD) 应该是 0 0 0,所以这个 max 看似可以删除,但其实不可以
直接说结论就是它可以让结果唯一,若去掉这一项,存在这样一种情况, V V V 和 D D D 相对应地增大减少,总结果是不变的,结果就是这两个网络很难收敛,比如两个锯齿状的网络,和两个平滑的网络,都可以使得结果正确,没有一个可以稳定收敛的位置
而加上 max 我的理解是它可以过滤掉这种波动,因为 max 的存在,在学习过程中,这种对应性的相消是很难同步的,为了互相迁就,它会趋向某一个由初值决定的固定的偏差,网络就会收敛到一个固定的位置了
更高的层次来说,我们硬生生拆开成两个网络其实丢失了一些信息,max 相当于给网络结构注入了更多信息(这里信息的表现形式就是性质),有类似剪枝的效果
值得注意的是:实际上这两者这样训练,最后单独看必然是不准确的,例如我事后同加同减,对于输入输出来说一定还是正确的。但是我学习的本来就是他们的和,所以没有关系
和对决网络独立,这是第二种优化网络的方法
这是神经网络的通法,即给每个参数加上一个正态分布的随机扰动,使得每个参数实际上是从一个正态分布中产生的。其中正态分布的平均值实际上是没有扰动时的参数,正态分布的方差也是需要梯度下降学习的参数,值得注意的是,这两者往往采用不同的学习率
这样做的优点是显而易见的,即增加鲁棒性,同时鼓励网络进行探索
另外这样可以免去采用 ϵ − g r e e d y \epsilon-greedy ϵ−greedy 行动策略,而直接固定选择期望最大的动作行动,因为噪音本身就会鼓励探索,事实证明效果更好
另外在训练结束后,实际决策时把方差设为 0 使之退化回原来的 DQN 就可以了
在实际训练时,我们往往采用以上所有方法的总和,以下摘抄原书
实际编程实现 DQN 的时候, 应该将本章的四种技巧一优先经验回放、双 Q 学习、 对决网络、噪声 DQN一全部用到。应该用对决网络的神经网络结构, 而不是简单的 D Q N \mathrm{DQN} DQN 结构。往对决网络中的参数 w \boldsymbol{w} w 中加人噪声, 得到噪声 D Q N \mathrm{DQN} DQN, 记作 Q ~ ( s , a , ξ ; μ , σ ) \widetilde{Q}(s, a, \boldsymbol{\xi} ; \boldsymbol{\mu}, \boldsymbol{\sigma}) Q (s,a,ξ;μ,σ) 。 训练要用双 Q \mathrm{Q} Q 学习、优先经验回放, 而不是原始的 Q \mathrm{Q} Q 学习。双 Q \mathrm{Q} Q 学习需要目标网络 Q ~ ( s , a , ξ ; μ − , σ − ) \widetilde{Q}\left(s, a, \boldsymbol{\xi} ; \boldsymbol{\mu}^{-}, \boldsymbol{\sigma}^{-}\right) Q (s,a,ξ;μ−,σ−)计算 TD 目标。它跟噪声 D Q N \mathrm{DQN} DQN 的结构相同, 但是参数不同。
初始的时候, 随机初始化 μ 、 σ \mu 、 \sigma μ、σ, 并且把它们赋值给目标网络参数: μ − ← μ 、 σ − ← σ 。 \mu^{-} \leftarrow \boldsymbol{\mu} 、 \boldsymbol{\sigma}^{-} \leftarrow \boldsymbol{\sigma}_{\text {。 }} μ−←μ、σ−←σ。 然后重复下面的步骤更新参数。把当前的参数记作 μ now 、 σ now 、 μ now − 、 σ now − \boldsymbol{\mu}_{\text {now }} 、 \sigma_{\text {now }} 、 \boldsymbol{\mu}_{\text {now }}^{-} 、 \sigma_{\text {now }}^{-} μnow 、σnow 、μnow −、σnow −