【强化学习理论基础-通用】(36)从零开始白话给你讲[数学原理]:Deep Q-learning(DQN),Experience replay(经验回放),off-policy 伪代码与应用示例

若需观看机器人系列相关博客,请劳驾至:【足式机器人无死角系列之-【强化学习基础-通用】、【仿真及训练环境】、【强化学习】:isaac-gym 与 isaac-lab 从零开始

郑重声明:该系列博客为本人 ( W e n h a i Z h u ) 独家私有 , 禁止转载与抄袭 , 首次举报有谢 , 若有需请私信授权! \color{red}郑重声明:该系列博客为本人(WenhaiZhu)独家私有,禁止转载与抄袭,首次举报有谢,若有需请私信授权! 郑重声明:该系列博客为本人(WenhaiZhu)独家私有,禁止转载与抄袭,首次举报有谢,若有需请私信授权!

回顾:上一篇博客介绍了最主流的强化学习算法 Deep Q-learning,其将深度神经网络整合到Q(动作价值)学习中,期为最早成功的深度强化学习算法之一。其中使用到一个比较特别的技巧就是,通过构建两个结构一致的神经网络,简化目标函数的梯度求解或者说简化反向传权重更新过程。

本系列博客链接为: {\color{blue}本系列博客链接为:} 本系列博客链接为:【强化学习理论基础-通用】(01)从零开始白话给你讲,简单推导公式,深刻理解,一眼万年!:https://blog.youkuaiyun.com/weixin_43013761/article/details/143168169

本博客编写于: 20250127 ,台式机为 u b u n t u 20.04 , 3090 G e F o r c e R T X 显存 24 G { \color{purple} 本博客编写于:20250127,台式机为 ubuntu 20.04,3090 GeForce RTX 显存24G} 本博客编写于:20250127,台式机为ubuntu20.043090GeForceRTX显存24G:与你现在的代码,或者环境等存在一定差异也在情理之中,故切勿认为该系列博客绝对正确,且百密必有一疏,若发现错误处,恳请各位读者直接指出,本人会尽快进行整改,尽量使得后面的读者少踩坑,评论部分我会进行记录与感谢,只有这样,该系列博客才能成为精品,这里先拜谢各位朋友了。

文末正下方中心提供了本人 联系方式, 点击本人照片即可显示 W X → 官方认证,请备注 强化学习 。 {\color{blue}{文末正下方中心}提供了本人 \color{red} 联系方式,\color{blue}点击本人照片即可显示WX→官方认证,请备注\color{red} 强化学习}。 文末正下方中心提供了本人联系方式,点击本人照片即可显示WX官方认证,请备注强化学习

一、前言

上一篇博客中,介绍了强化学习如何与深度学习如何结合起来,总体来来说就是动作价值估算部分使用非线性神经网络代替,但是为了使用深度学习框架,比如说 Pytorch 或者 Tensorflow 以实现高效编程,避免个人编写梯度下降、反向传播以及权重更新等复杂且重复的代码,使用到 Deep Q-learning(DQN) 算法。目标函数如下:
J ( w ) = E [ ( R + γ max ⁡ a ∈ A ( S ′ ) q ^ ( S ′ , a , w T ) ⏟ 第一项 − q ^ ( S , A , w ) ⏟ 第二项 ) 2 ] (01) \color{red} \tag{01}J(w)=\mathbb{E}\left[(R+{\color{blue} \underbrace{\gamma \max _{a \in \mathcal{A}\left(S^{\prime}\right)} \hat{q}\left(S^{\prime}, a, w_T\right)}_{第一项}}-{\color{blue}\underbrace{ \hat{q}(S, A, w)}_{第二项}})^{2}\right] J(w)=E (R+第一项 γaA(S)maxq^(S,a,wT)第二项 q^(S,A,w))2 (01) 该算法的核心就是构建两个孪生神经网络,被迭代优化的神经网络参数为第二项 q ^ ( S , A , w ) \hat{q}(S, A, w) q^(S,A,w) w w w,第一项中的 q ^ ( S ′ , a , w ) \hat{q}\left(S^{\prime}, a, w\right) q^(S,a,w) 作为常数来看待,其神经网络参数 w T w_T wT 并不会被迭代更新而是以一定时间或者迭代间隔拷贝至另一神经网络的权重 w w w

了解 Deep Q-learning(DQN) 核心部分之后,该篇博客再来讨论一下强化学习中神经网络训练过程具体是如何使用收集到的经验数据,其与纯粹的深度学习有一些相似性也有一些差异性。这里先把所有收集到的经验数据记为:  replay buffer  B ≐ { ( s , a , r , s ′ ) } (02) \color{purple} \tag{02} \text { replay buffer } \mathcal{B} \doteq\left\{\left(s, a, r, s^{\prime}\right)\right\}  replay buffer B{(s,a,r,s)}(02) B \mathcal{B} B 表示一个集合,值得注意的是,收集到的经验数据中,每两个连续状态的相关数据即可构建一个元组,所谓的元组这里可以理解为训练过程中所需数据的最小单位,如上 ( s , a , r , s ′ ) (s, a, r, s') (s,a,r,s),通常把其称呼为一个样本:

注解: s 为当前状态,a 为状态下执行的动作,s' 表示执行动作 a 与环境交互后切换的新状态,r 则表示切入到新状态 s' 获取到的即时奖励

在一个回合或者一条轨迹中通常包含多个这样的元素,这些元组共同组成 replay buffer ,因为一个元组(样本)至少包含收集两个时刻的相关数据,那么相应最少有一个数据属于历史数据,直白的说,就是把过去的数据进行重复利用。

Q-learning 算法相对于 蒙特卡洛(Monte Carlo Basic) 算法存在一个优势,那就是并不需要收集整个回合(生命周期)的轨迹数据即可进行迭代优化,当然 Q-learning 的进阶版 Deep Q-learning(DQN) 同样继承了这个优势。

二、数据分布

通过上面可以知道训练所需数据最小单位为元组 ( s , a , r , s ′ ) (s, a, r, s') (s,a,r,s),虽然其对最小单位存在时序要求,但是对于一个 mini-batch 数据的采样并没有时序要求,且训练过程也并不要求时间在前的数据则需要优先训练,比如说收集了一小段的轨迹数据,这里使用小写表示实际采样: τ = { s t , a t , r t + 1 , s t + 1 , a t + 1 , r t + 2 , s t + 2 , a t + 2 , r t + 3 , s t + 3 } (03) \color{purple} \tag{03}\tau=\{s_{t},a_{t},r_{t+1},s_{t+1},a_{t+1},r_{t+2},s_{t+2},a_{t+2},r_{t+3},s_{t+3}\} τ={st,at,rt+1,st+1,at+1,rt+2,st+2,at+2,rt+3,st+3}(03)上述轨迹共包含 t 、 t + 1 、 t + 2 、 t + 3 t、t+1、t+2、t+3 tt+1t+2t+3 四个时刻的经验数据,那么共可构建 3 个最小元组数据: ( s t , a t , r t + 1 , s t + 1 )           ( s t + 1 , a t + 1 , r t + 2 , s t + 2 )            ( s t + 2 , a t + 2 , r t + 3 , s t + 3 ) (04) \color{green} \tag{04}(s_{t},a_{t},r_{t+1},s_{t+1})~~~~~~~~~(s_{t+1},a_{t+1},r_{t+2},s_{t+2})~~~~~~~~~~(s_{t+2},a_{t+2},r_{t+3},s_{t+3}) (st,at,rt+1,st+1)         (st+1,at+1,rt+2,st+2)          (st+2,at+2,rt+3,st+3)(04)从上可以看出,只需要连续两时刻相关数据,即可组成训练所需要数据的最小单位(样本),上述示例共 3 个样本数据,需要注意训练过程中最小单位(样本)数据是可以打乱的,即随机抽取训练,但是最小单位内部数据时序不可打乱。

对这些样本组成的 replay buffer(回放数据) B ≐ { ( s , a , r , s ′ ) } \mathcal{B} \doteq\{\left(s, a, r, s^{\prime}\right)\} B{(s,a,r,s)} 进行 随机 \color{red} 随机 随机 采样用于训练时,注意随机二字。编程实现通常先以最小元组为单位打乱,然后再按顺序进行训练。另外需要注意采样过程要遵循 uniform distribution(均匀分布),也就是每个样本被拿到概率是一致的,为什么呢?具体缘由还是回到 (01) 式:
J ( w ) = E [ ( R + γ max ⁡ a ∈ A ( S ′ ) q ^ ( S ′ , a , w T ) ⏟ 第一项 − q ^ ( S , A , w ) ⏟ 第二项 ) 2 ] (05) \color{green} \tag{05}J(w)=\mathbb{E}\left[(R+{\color{blue} \underbrace{\gamma \max _{a \in \mathcal{A}\left(S^{\prime}\right)} \hat{q}\left(S^{\prime}, a, w_T\right)}_{第一项}}-{\color{blue}\underbrace{ \hat{q}(S, A, w)}_{第二项}})^{2}\right] J(w)=E (R+第一项 γaA(S)maxq^(S,a,wT)第二项 q^(S,A,w))2 (05) 上式是对 R , S ′ , A R,S',A RSA 这三个随机变量求期望,前面博客 【强化学习理论基础-通用】(31)从零开始白话给你讲[数学原理]:值函数近似,目标函数介绍,状态概率分布,及状态转移矩阵回顾 有提到 uniform distribution(一致分布) 与 stationary distribution(稳态分布)。总的来说,样本的对应的概率分布等价于其在求期望过程中的权重,采用 uniform distribution 则认为所有样本重要性是一致的,便于算法实现与推导(后续会讲解重要性采样,这里先略过),

上面提到的是,以相同的重要性来看待这些样本,即描述样本的概率分布。此外,每个样本都包含 R , S ′ , A R,S',A RSA 这三个随机变量的实际采样,那么这三个随机变量具体来说又是如何分布的呢?

( S , A ) ∼ d : \color{blue} (S,A)\sim d: (S,A)d对于状态 S S S 与 动作 A A A 来说,可以把他们看做一体来对待,类似于前面学习过的 状态-动作 对。那么把一个二维的随机变量看做一个随机变量,符号 d d d 表示其概率分布。为简单起,这里假设其为均匀分布,也就是所谓的 uniform distribution(一致分布)。具体而言可以构建一个 S S S 为纵轴, A A A 为横轴的图示,然后在该图示上均匀选取二维点,类似于把 ( S , A ) (S,A) (S,A) 看做二维点的索引。

R ∼ p ( R ∣ S , A ) : \color{blue} R \sim p(R \mid S, A): Rp(RS,A) 该描述的是,处于状态下 S S S 下,执行动作 A A A 获得奖励 R R R 的概率分布,该分布通常由系统制定,属于游戏规则一部分,具体采样结果需与环境交互才可获得或计算。

S ′ ∼ p ( S ′ ∣ S , A ) : \color{blue} S^{\prime} \sim p\left(S^{\prime} \mid S, A\right): Sp(SS,A) 该描述的是,处于状态下 S S S 下,执行动作 A A A 获得转移状态至 S ′ S' S 的概率分布,该分布通常也由由系统制定,属于游戏规则一部分,具体采样结果需与环境交互才可获得或计算。

三、经验回放

这里需要阐述一个比较重要的概念,那就是 Experience replay(经验回放),直白的说对样本的重复采样就是经验回放,深度学习基本都会进行重复采样,即一个样本会被重复训练多次。回顾一下前面的博客:【强化学习理论基础-通用】(19)从零开始白话给你讲[数学原理]:随机梯度下降系列:BGD、MBGD 数学推导(SGD推广) 中介绍的 BGD 算法就是经验回放的极端例子。

有印象的朋友应该记得,BGD 就是每次迭代的时候把所有数据都利用上。比如说收集到的经验数据  replay buffer  B ≐ { ( s , a , r , s ′ ) } \text { replay buffer } \mathcal{B} \doteq\left\{\left(s, a, r, s^{\prime}\right)\right\}  replay buffer B{(s,a,r,s)} 共计 N N N 个样本,那么每次迭代或者权重更新都需要 N N N 个数据,但是并不意味着总的迭代次数为 N N N 次,可以迭代任意次数,只要收敛,目标函数损失足够小即可。假设迭代次数为 m m m,则每个数据被利用,或者说回放了 m m m 次,这就是所谓的经验回放,即对样本数据的重复利用。

MBGD 算法则不一样,每次迭代并不是所有数据都参与优化,通常每次采集若干数据进行一次迭代训练。假设每次迭代随机抽取 n n n 个样本,迭代 m m m 次,若 n ∗ m > N n*m>N nm>N 那么必然存在数据被重复抽取,也就是重采样,这也可以说是经验回放。SGD 算法也同样可以进行经验回放,比如说每次迭代随机抽取一个样本,若迭代 m m m 次,若 1 ∗ m > N 1*m>N 1m>N,同样存在重采样,这就是经验回放。

了解 Experience replay(经验回放) 的基本概念之后,再来讨论一下之前学习过的算法,离散(表格)算法包含有:TD-SV、Sarsa、Expected Sarsa、 n-step Sarsa 以及 Q-learning;连续(拟合)算法包含有:Sarsa,Q-learning,DQN。当然 TD-SV、Expected Sarsa、 n-step Sarsa 也有连续形式,只是没有讲解而已。

无论是离散还是连续,上述这些算法大致可以被分别 on-policy 与 off-policy 这两类,Experience replay(经验回放) 通常被用于 off-policy。前面博客 【强化学习理论基础-通用】(28)从零开始白话给你讲[数学原理]:时序差分算法 --> Q-learning 伪代码(on-policy 与 off-policy),示例对比说明 中同时给出了 Q-learning 算法 on-policy 与 off-policy 形式的伪代码。

通常情况下 off-policy 会使用一个策略 π b \pi_b πb 与环境进行交互,收集多条或者说大量的经验数据,这些数据可以构建多个样本组合成的  replay buffer  B ≐ { ( s , a , r , s ′ ) } \text { replay buffer } \mathcal{B} \doteq\left\{\left(s, a, r, s^{\prime}\right)\right\}  replay buffer B{(s,a,r,s)}。收集到这些数据之后,会使用随机采样(Experience replay-经验回放) 会用来优化动作价值评估策略 q q q 或者目标动作策略 π T \pi_T πT

然而 on-policy 一般情况下是不会使用 (Experience replay-经验回放),其本质设计是利用策略 π \pi π 与环境进行实时交互,每次交互都会获得一个样本,让后利用该样本优化动作价值评估策略 q q q 或者目标动作策略 π \pi π。通常来说这里与环境交互以及被优化动作策略为同一策略 π \pi π。其并不是把数据先收集起来,然后再进行随机采样,而是即得即用。

四、伪代码示例(off-policy)

Deep Q-learning(DQN) 属于 Q-learning 升级版本,前者通过神经网络代替 Q-learning 中的函数(linear function)拟合部分,所以 DQN 具备很强非线性拟合能力。DQN 与 Q-learning 类似,同样适用于 on-policy 与 off-policy 两种策略。为了深刻理解 Deep Q-learning(DQN) 与 Experience replay(经验回放),该篇博客给出 DQN 算法 off-policy 形式。另外需要提及到的一点是,Deep Q-learning(DQN) 与 Q-learning 仅具备动作价值评估 (policy evaliation) 能力,即评估动作决策策略 π \pi π 的优劣,以指导其进行策略改善(policy improment),伪代码大致实现过程如下:
在这里插入图片描述

图1

1.孪生网络

上一篇博客 【强化学习理论基础-通用】(35)从零开始白话给你讲[数学原理]:值函数近似,Deep Q-learning(DQN),神经网络提梯度求解之巧妙设计(双网络) 中有介绍,为方便使用深度学习框架,其采用了双网络设计,这样只需要简单构建好目标函数,让框架自动完成梯度计算以及反向传播与权重更新。

所以伪代码最开始初始化阶段,其需要初始化两个结构以及权重一样的网络,分别称呼为 target network 与 main network ,其分别对应于(01)式中的第一项 q ^ ( S ′ , a , w T ) \hat{q}\left(S^{\prime}, a, w_T\right) q^(S,a,wT) 以及第二项中的 q ^ ( S , A , w ) \hat{q}(S, A, w) q^(S,A,w),初始化是,两者的权重 w T w_T wT w w w 相同的。另外需要提及一点,这两个网络都动作价值评估 (policy evaliation) 网络。

2.优化目标

上述的伪代码只包含对动作价值评估 (policy evaliation) 网络 q ^ ( S , A , w ) \hat{q}(S, A, w) q^(S,A,w) 的优化,而不涉及到动作决策策略 π T \pi_T πT 的优化,关于动作决策策略 π T \pi_T πT 优化部分已经省略,有兴趣的朋友可以参考 【强化学习理论基础-通用】(28)从零开始白话给你讲[数学原理]:时序差分算法 --> Q-learning 伪代码(on-policy 与 off-policy),示例对比说明 中的伪代码,其有关于动作决策策略 Epsilon Greedy 优化部分。

3.经验数据

初始化两个动作价值评估网络 q ^ ( S ′ , a , w T ) \hat{q}\left(S^{\prime}, a, w_T\right) q^(S,a,wT) q ^ ( S , A , w ) \hat{q}(S, A, w) q^(S,A,w),以及却优化目标之后。还需要构建一个与环境进行交互的动作决策策略 π b \pi_b πb,该策略通常称呼为 behavior 策略。其与环境进行多个回合(或者说一个生命周期十分长的回合)交互,以收集到足够多的经验数据。

这些经验数据主要包含状态随机变量 S S S S ′ S' S,动作随机变量 A A A,奖励随机变量 R R R 的实际采样。由两个时刻的实际采样数据可以构建一个样本 ( s , a , r , s ′ ) (s, a, r, s^{\prime}) (s,a,r,s),所有样本总和记录为集合 B ≐ { ( s , a , r , s ′ ) } \mathcal{B} \doteq\{\left(s, a, r, s^{\prime}\right)\} B{(s,a,r,s)},该样本集合用于后续的随机采样,也就是前面提到的 Experience replay(经验回放),这里假设共收集到 N N N 个样本。

4.随机采样

若通过上面几个步骤,收集到训练所需样本集合共记 N N N 个,表示为 B ≐ { ( s , a , r , s ′ ) } \mathcal{B} \doteq\{\left(s, a, r, s^{\prime}\right)\} B{(s,a,r,s)},接着就是对这些数据进行随机采样 Experience replay(经验回放),每采集到 n n n 个样本之后进行一次迭代优化。这里的 n n n 等价于 mini batch size,通常情况下该参数 n n n 会在训练之前就确定下来,且训练过程中不进行变更。

上面伪代码给出的是 n = 1 n=1 n=1 时的示例情况,本质上对应于随机梯度下降中的 SGD 算法。但是实际应用于编程过程中通常会使用 MBGD 算法,即 0 < n < N 0<n<N 0<n<N。因为其能较大程度上发挥 GPU 的性能,尽量保证训练迭代优化过程稳定性。随机深度学习的朋友应该很容易理解,就是通一个神经网络,一次投喂 n n n 个样本然后获得 n n n 个输出结果。

5.迭代优化

随机采集到一次迭代所需要的 n n n ( s , a , r , s ′ ) (s, a, r, s^{\prime}) (s,a,r,s) 样本之后,首先利用该些样本构建出与之对应的真值,也就是伪代码中计算出来的 y T y_T yT,其对应于(01)式中的如下部分: R + γ max ⁡ a ∈ A ( S ′ ) q ^ ( S ′ , a , w T ) (06) \color{green} \tag{06} R+\gamma \max _{a \in \mathcal{A}\left(S^{\prime}\right)} \hat{q}\left(S^{\prime}, a, w_T\right) R+γaA(S)maxq^(S,a,wT)(06)原本的数据公式为随机变量形式,在编程实现时使用实际采样代替了随机变量,故代码具体实现为:
y T = r + γ max ⁡ a ∈ A ( S ′ ) q ^ ( s ′ , a , w T ) (07) \color{green} \tag{07}y_T= r+\gamma \max _{a \in \mathcal{A}\left(S^{\prime}\right)} \hat{q}\left(s^{\prime}, a, w_T\right) yT=r+γaA(S)maxq^(s,a,wT)(07)这里的 y T y_T yT 可以认为该次迭代优化目标或者标签,需要注意的的是上面神经网络 q ^ ( s ′ , a , w T ) \hat{q}\left(s^{\prime}, a, w_T\right) q^(s,a,wT) 对应的权重参数 w T w_T wT 并不会被优化。优化的目标权重是(01)式中神经网络 q ^ ( S , A , w ) \hat{q}(S, A, w) q^(S,A,w) 权重参数 w w w

需要申明一下,这里的迭代优化并不只执行一次,也不一定就执行 N N N(样本数量) 次,而是会一直迭代下去,知道(01)计算出来的损失(l误差)足够小,或者说确定模型已经收敛的预设范围内,才停止优化迭代。

6.权重复制

持续迭代优化过程中有一个比较重要点,哪就是每迭代一定次数 c 之后,需要把 q ^ ( S , A , w ) \hat{q}(S, A, w) q^(S,A,w) 权重参数 w w w 拷贝给 神经网络 q ^ ( s ′ , a , w T ) \hat{q}\left(s^{\prime}, a, w_T\right) q^(s,a,wT) 的权重参数 w T w_T wT。具体缘由与推导细节在上一篇博客中有详细解读,忘记的朋友可以回顾一下。

7.动作策略

上面已经提到,伪代码中并没有包含动作决策策略改善(policy improment)部分,不过等待动作价值评估策略 q ^ ( S , A , w ) \hat{q}(S, A, w) q^(S,A,w) 收敛之后,该神经网络 q ^ ( S , A , w ) \hat{q}(S, A, w) q^(S,A,w) 能够准确的评估出策略 π \pi π 在某个状态 s s s 下执行某个动作 a a a 的状态价值,也就是评估 状态-动作对 价值。

总的来说,有了一个比较优秀的状态-动作对价值评估策略(网络),则可以很容易构建出一个不错的动作决策策略 π \pi π,比如说初始化一个 Epsilon Greedy 策略,设其所有状态下执行所有动作的概率都为 1 A ( s ) \frac{1}{\mathcal{A}(s)} A(s)1 A ( s ) \mathcal{A}(s) A(s) 表示状态 s s s 可以执行动作的 a a a 的总数。接着可以把每个状态下,每个动作都进行动作价值评估。最后 把每个状态下其动作价值最高的动作被执行的概率设置为 1 1 1 即可。这样就把 Epsilon Greedy 转换成了一个 Greedy 的最优策略。

五、训练技巧

官网的 Deep Q-learning(DQN) 实现其是 on-policy,与上面讲解的伪代码略有差异,不过这并不影响对 DQN 算法的理解。除此之外,官方源码还采用了一个十分有用的技巧,同样来自于神经网络的结构设计。

上一篇博客,以及上面伪代码实现的神经网络记为 q ^ ( S ′ , a , w ) \hat{q}(S', a, w) q^(S,a,w) 或者 q ^ ( S , A , w T ) \hat{q}(S, A, w_T) q^(S,A,wT),但是两者本质是一样的,就是输入一个状态 s s s 以及动作 a a a 然后获得该状态下执行这个动作的价值 q q q。这样为计算 max ⁡ a ∈ A ( S ′ ) q ^ ( S ′ , a , w T ) \color{blue} \max _{a \in \mathcal{A}\left(S^{\prime}\right)} \hat{q}\left(S^{\prime}, a, w_T\right) maxaA(S)q^(S,a,wT) 也就是找到状态 S ′ = s ′ S'=s' S=s 下最大动作价值,需要运行 A ( s ′ ) \mathcal{A}(s') A(s) 次神经网络,然后再遍历比较大小以求的最大动作价值。

官网 DQN 的神经网络设计更加巧妙与实用,这里记其为 q ( s , w ) q(s,w) q(s,w),其运行过程中只需要输入一个状态即可,然后该网络会输出该状态执行所有动作的动作价值。即输入一个状态 s s s,获得 A ( s ) \mathcal{A}(s) A(s) 个输出,接着对所有输出进行遍历比较即可知道那个动作价值最大。其只需要运行一次神经网络即可。

有的朋友可能已经发现了,这里的官网 DQN 的神经网络设计设计貌似可以只用代替动作决策策略 π \pi π,即输出当前状态,获得所有动作的状态价值,选择最高状态价值的动作执行即可。这当然是没有问题的,不过这只适用于离散,或者输出动作可遍历的情况。具体细节这里就不做过多讨论,后续博客会有更加详细的推导与分析。

六、应用示例

为与前面表格(离散)形式的 Q-learning 算法形形成鲜明对比,这里同样把 Deep Q-learning(DQN) 应用于迷宫游戏,规则与 【强化学习理论基础-通用】(28)从零开始白话给你讲[数学原理]:时序差分算法 --> Q-learning 伪代码(on-policy 与 off-policy),示例对比说明 中 [四、迷宫示例] 部分基本保持一致,不过切入到环境静止的区域 r f o r b i d e n r_{forbiden} rforbiden 有改变,现在设置为:
r b o u n d a r y = − 1 ,    r f o r b i d e n = − 10 ,    r p a s s a b l e = 0 ,    r t a r g e t = 1 ,    γ = 0.9 (10) \color{green} \tag{10} r_{boundary}=-1,~~~{\color{red}r_{forbiden}=-10},~~~r_{passable}=0 ,~~~r_{target}=1,~~~\gamma=0.9 rboundary=1   rforbiden=10   rpassable=0   rtarget=1   γ=0.9(10)

1.Q-learning

表格(离散)形式的 Q-learning 算法,只收集一条轨迹数据 τ \tau τ,其包含 1 1 1 millinon 状态-动作对的经验数据,用于动作价值评估策略与动作决策策略的优化。为显示迭代优化过程中策略的变化,其每次迭代都会对动作决策策略更新,且计算其与 Ground Truth 策略的误差, 1 1 1 millinon 次迭代优化误差曲线如下右图所示:
在这里插入图片描述

图2

从上右图可以看出,基本在迭代 8 万次左右左右误差才收敛至零,这显然是一个比较庞大的数据。另外需要注意,上述的策略是基于 r f o r b i d e n = − 1 {\color{red}r_{forbiden}=-1} rforbiden=1(惩罚较低) 进行迭代优化,所以上左图最终策略在某些状态下会选择通过黄色(forbiden)区域,以便更快抵达终点,如处于 s ( 4 , 1 ) s_{(4,1)} s(4,1) 状态时,其会选择右边进入到黄色禁止区域。

2.DQN

现在来看DQN算法,这里使用同样的策略 π b \pi_b πb,算法选择 Epsilon Greedy。初始该算法所有状态下每个动作执行的概率分布为都为 0.2 0.2 0.2。同样收集一条轨迹的经验数据,不过只与环境进行 1000 step 交互,若是使用该经验数据去构成样本 ( s , a , r , s ′ ) (s, a, r, s^{\prime}) (s,a,r,s),则共可制造 999 999 999 个,来看如下三幅图示:
在这里插入图片描述

图3

左图: \color{blue} 左图: 左图:该图表示与环境交互策略 π b \pi_b πb,在每个状态下执行每个动作的概率,可以看到各个方向箭头长度都是一样的。需要注意的是,除以四个方向的动作,还有一个保持原位的动作,故一个是五个动作,随意每个动作执行的概率都为 0.2 0.2 0.2

中图: \color{blue} 中图: 中图:该图表示策略 π b \pi_b πb与环境交互过程的状态动作轨迹,其从 s ( 1 , 1 ) s_{(1,1)} s(1,1) 出发,共与环境进行 1000 1000 1000 次交互(交互过抵达终点 s ( 4 , 5 ) s_{(4,5)} s(4,5)并不会结束生命回合),最后在状态 s ( 5 , 2 ) s_{(5,2)} s(5,2) 下结束。可以看到,虽然只与环境进行 1000 1000 1000 次交互,但是每次已经访问所有的状态-动作对。

右图: \color{blue} 右图: 右图:该图表示迭代优化 1000 次之后最动作决策策略示意图, 虽然只迭代优化了 1000 次,但是该策略已经收敛到最优,因为 r f o r b i d e n = − 10 {\color{red}r_{forbiden}=-10} rforbiden=10(惩罚较大),所以其会避免进入黄色禁止区域,比如说其处于 s ( 4 , 1 ) s_{(4,1)} s(4,1) 状态时,其会选择向上的动作避免进入到禁止区域 s ( 4 , 2 ) s_{(4,2)} s(4,2)

接着再来看一组图示,其分别表示迭代过程中的 TD 误差(loss-损失),以及优化期间对应动作决策策略与 Ground Truth 之间的误差变化:
在这里插入图片描述
很容易看出,迭代到 800 次左右,价值评估策略基本已经收敛,损失或者误差基本为 0。与 Q-learning(离散表格) 算法迭代 80000 次才收敛,显然 Deep Q-learning(DQN) 优势巨大。

3.总结

有的朋友可能会比较奇怪,为什么 Deep Q-learning(DQN) 比离散(表格)形式的 Q-learning 收敛会快那么多。其主要原因是Deep Q-learning(DQN) 属于值函数近似算法,在 强化学习理论基础-通用】(33)从零开始白话给你讲[数学原理]:值函数近似,linear function approximation 示例,平面与曲面拟合 中有提到,其具备一定泛化能力:在对被访问的状态拟度进行优化时,会传播到其附近的状态,也得到一定的优化。

七、额外试验

上面 DQN 应用示例中,共采集 1000 个状态-动作对的经验数据,即表示与环境进行 1000 次交互。且通过图3中的b图可以知道,收集数据虽然不多,但是已经访问了所有状态-动作对,也就是数据基本达标。那若是为访问所有状态-动作对会出现什么情况呢?先来看下图:
在这里插入图片描述
如上图(b)所示,若收集数据时只与环境交互 100 次,可以看到有什么状态-动作对都没有被访问到。使用这样的数据同样进行 1000 次迭代训练优化(包含重复采样),由图(d)(e)可以知道最终策略无法收敛到最终状态,策略误差较大。

总的来说,数据是十分重要的,哪怕神经网络与算法设计得再好,若是没有好的数据,最终的效果也会差强人意。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江南才尽,年少无知!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值