深度强化学习(三)(DQN)

深度强化学习(三)DQN与Q学习

一.DQN

通过神经网络来近似最优动作价值函数 Q ∗ ( a t , s t ) Q_*(a_t,s_t) Q(at,st),在实践中, 近似学习“先知” Q ⋆ Q_{\star} Q 最有效的办法是深度 Q \mathrm{Q} Q网络 (deep Q network, 缩写 DQN), 记作 Q ( s , a ; w ) Q(s, a ; \boldsymbol{w}) Q(s,a;w).训练DQN最常用的算法是时间差分(temporaldifference,缩写TD

在上一节中我们推导了最优贝尔曼方程
Q ⋆ ( s t , a t ) ⏟ U t  的期望  = E S t + 1 ∼ p ( ⋅ ∣ s t , a t ) [ R t + γ ⋅ max ⁡ A t + 1 ∈ A Q ⋆ ( S t + 1 , A t + 1 ) ⏟ U t + 1  的期望  ∣ S t = s t , A t = a t ] (1.1) \underbrace{Q_{\star}\left(s_t, a_t\right)}_{U_t \text { 的期望 }}=\mathbb{E}_{S_{t+1} \sim p\left(\cdot \mid s_t, a_t\right)}[R_t+\gamma \cdot \underbrace{\max _{A_{t+1} \in \mathcal{A}} Q_{\star}\left(S_{t+1}, A_{t+1}\right)}_{U_{t+1} \text { 的期望 }} \mid S_t=s_t, A_t=a_t] \tag{1.1} Ut 的期望  Q(st,at)=ESt+1p(st,at)[Rt+γUt+1 的期望  At+1AmaxQ(St+1,At+1)St=st,At=at](1.1)
贝尔曼方程的右边是个期望, 我们可以对期望做蒙特卡洛近似。当智能体执行动作 a t a_t at 之后, 环境通过状态转移函数 p ( s t + 1 ∣ s t , a t ) p\left(s_{t+1} \mid s_t, a_t\right) p(st+1st,at) 计算出新状态 s t + 1 s_{t+1} st+1 。奖励 R t R_t Rt 最多只依赖于 S t 、 A t 、 S t + 1 S_t 、 A_t 、 S_{t+1} StAtSt+1 。那么当我们观测到 s t 、 a t 、 s t + 1 s_t 、 a_t 、 s_{t+1} statst+1 时, 则奖励 R t R_t Rt 也被观测到, 记作 r t r_t rt 。有了四元组
( s t , a t , r t , s t + 1 ) ,  \left(s_t, a_t, r_t, s_{t+1}\right) \text {, } (st,at,rt,st+1)
我们可以计算出
r t + γ ⋅ max ⁡ a t + 1 ∈ A Q ⋆ ( s t + 1 , a t + 1 ) . r_t+\gamma \cdot \max _{a_{t+1} \in \mathcal{A}} Q_{\star}\left(s_{t+1}, a_{t+1}\right) . rt+γat+1AmaxQ(st+1,at+1).

它可以看做是下面这项期望的蒙特卡洛近似:
E S t + 1 ∼ p ( ⋅ ∣ s t , a t ) [ R t + γ ⋅ max ⁡ A t + 1 ∈ A Q ⋆ ( S t + 1 , A t + 1 ) ∣ S t = s t , A t = a t ] . \mathbb{E}_{S_{t+1} \sim p\left(\cdot \mid s_t, a_t\right)}\left[R_t+\gamma \cdot \max _{A_{t+1} \in \mathcal{A}} Q_{\star}\left(S_{t+1}, A_{t+1}\right) \mid S_t=s_t, A_t=a_t\right] . ESt+1p(st,at)[Rt+γAt+1AmaxQ(St+1,At+1)St=st,At=at].

由式 1.1 1.1 1.1 和上述的蒙特卡洛近似可得:
Q ⋆ ( s t , a t ) ≈ r t + γ ⋅ max ⁡ a t + 1 ∈ A Q ⋆ ( s t + 1 , a t + 1 ) . Q_{\star}\left(s_t, a_t\right) \approx r_t+\gamma \cdot \max _{a_{t+1} \in \mathcal{A}} Q_{\star}\left(s_{t+1}, a_{t+1}\right) . Q(st,at)rt+γat+1AmaxQ(st+1,at+1).
把公式 (4.3) 中的最优动作价值函数 Q ⋆ ( s , a ) Q_{\star}(s, a) Q(s,a) 替换成神经网络 Q ( s , a ; w ) Q(s, a ; \boldsymbol{w}) Q(s,a;w), 得到:
Q ( s t , a t ; w ) ⏟ 预测  q ^ t ≈ r t + γ ⋅ max ⁡ a t + 1 ∈ A Q ( s t + 1 , a t + 1 ; w ) ⏟ TD 目标  y ^ t . \underbrace{Q\left(s_t, a_t ; \boldsymbol{w}\right)}_{\text {预测 } \hat{q}_t} \approx \underbrace{r_t+\gamma \cdot \max _{a_{t+1} \in \mathcal{A}} Q\left(s_{t+1}, a_{t+1} ; \boldsymbol{w}\right)}_{\text {TD 目标 } \widehat{y}_t} . 预测 q^t Q(st,at;w)TD 目标 y t rt+γat+1AmaxQ(st+1,at+1;w).

左边的 q ^ t ≜ Q ( s t , a t ; w ) \widehat{q}_t \triangleq Q\left(s_t, a_t ; \boldsymbol{w}\right) q tQ(st,at;w) 是神经网络在 t t t 时刻做出的预测, 其中没有任何事实成分。右边的 TD 目标 y ^ t \widehat{y}_t y t 是神经网络在 t + 1 t+1 t+1 时刻做出的预测, 它部分基于真实观测到的奖励 r t r_t rt q ^ t \widehat{q}_t q t y ^ t \widehat{y}_t y t 两者都是对最优动作价值 Q ⋆ ( s t , a t ) Q_{\star}\left(s_t, a_t\right) Q(st,at) 的估计, 但是 y ^ t \widehat{y}_t y t 部分基于事实, 因此比 q ^ t \widehat{q}_t q t 更可信。应当鼓励 q ^ t ≜ Q ( s t , a t ; w ) \widehat{q}_t \triangleq Q\left(s_t, a_t ; \boldsymbol{w}\right) q tQ(st,at;w) 接近 y ^ t \widehat{y}_t y t 。定义损失函数:
L ( w ) = 1 2 [ Q ( s t , a t ; w ) − y t ^ ] 2 . L(\boldsymbol{w})=\frac{1}{2}\left[Q\left(s_t, a_t ; \boldsymbol{w}\right)-\widehat{y_t}\right]^2 . L(w)=21[Q(st,at;w)yt ]2.

假设 y ^ \widehat{y} y 是常数 , 计算 L L L 关于 w \boldsymbol{w} w 的梯度:
∇ w L ( w ) = ( q ^ t − y ^ t ) ⏟ TD 误差  δ t ⋅ ∇ w Q ( s t , a t ; w ) . \nabla_{\boldsymbol{w}} L(\boldsymbol{w})=\underbrace{\left(\widehat{q}_t-\widehat{y}_t\right)}_{\text {TD 误差 } \delta_t} \cdot \nabla_{\boldsymbol{w}} Q\left(s_t, a_t ; \boldsymbol{w}\right) . wL(w)=TD 误差 δt (q ty t)wQ(st,at;w).

做一步梯度下降, 可以让 q ^ t \widehat{q}_t q t 更接近 y ^ t \widehat{y}_t y t :
w ← w − α ⋅ δ t ⋅ ∇ w Q ( s t , a t ; w ) . \boldsymbol{w} \leftarrow \boldsymbol{w}-\alpha \cdot \delta_t \cdot \nabla_{\boldsymbol{w}} Q\left(s_t, a_t ; \boldsymbol{w}\right) . wwαδtwQ(st,at;w).

二.训练流程

让我们思考一下训练网络需要那些数据,最重要的是 q ^ t , y ^ t \hat q_{t},\hat y_{t} q^t,y^t,而 q ^ t = Q ⋆ ( s t , a t , w ) \hat q_{t}=Q_{\star}(s_t,a_t,\boldsymbol w) q^t=Q(st,at,w),所以我们需要知道 a t , s t ( w 随机初始化 ) a_t,s_t(\boldsymbol w随机初始化) at,st(w随机初始化),而TD目标 y ^ t \hat y_{t} y^t r t , s t + 1 r_t,s_{t+1} rt,st+1相关,所以要进行一次完整的反向传播,我们仅需要知道四元组 ( s t , a t , r t , s t + 1 ) (s_t,a_t,r_t,s_{t+1}) (st,at,rt,st+1)而不需要知道策略 π \pi π(策略 π \pi π所代表的 a t , s t a_t,s_t at,st已经在四元组中)

收集训练数据:我们可以用任何策略函数 π \pi π 去控制智能体与环境交互, 这个 π \pi π 就叫做行为策略 (behavior policy)。比较常用的是 ϵ \epsilon ϵ-greedy 策略:
a t = { argmax ⁡ a Q ( s t , a ; w ) ,  以概率  ( 1 − ϵ ) ;  均匀抽取  A  中的一个动作,   以概率  ϵ . a_t= \begin{cases}\operatorname{argmax}_a Q\left(s_t, a ; \boldsymbol{w}\right), & \text { 以概率 }(1-\epsilon) ; \\ \text { 均匀抽取 } \mathcal{A} \text { 中的一个动作, } & \text { 以概率 } \epsilon .\end{cases} at={argmaxaQ(st,a;w), 均匀抽取 A 中的一个动作 以概率 (1ϵ); 以概率 ϵ.

把智能体在一局游戏中的轨迹记作:
s 1 , a 1 , r 1 , s 2 , a 2 , r 2 , ⋯   , s n , a n , r n . s_1, a_1, r_1, s_2, a_2, r_2, \cdots, s_n, a_n, r_n . s1,a1,r1,s2,a2,r2,,sn,an,rn.

把一条轨迹划分成 n n n ( s t , a t , r t , s t + 1 ) \left(s_t, a_t, r_t, s_{t+1}\right) (st,at,rt,st+1) 四元组, 存入数组, 将这种数组叫做经验回放数组(replay buffer)。

更新 DQN 参数 w w w : 随机从经验回放数组中取出一个四元组, 记作 ( s j , a j , r j , s j + 1 ) \left(s_j, a_j, r_j, s_{j+1}\right) (sj,aj,rj,sj+1) 。设 DQN 当前的参数为 w now  \boldsymbol{w}_{\text {now }} wnow , 执行下面的步骤对参数做一次更新, 得到新的参数 w new  \boldsymbol{w}_{\text {new }} wnew 

  1. D Q N \mathrm{DQN} DQN 做正向传播, 得到 Q \mathrm{Q} Q 值:
    q ^ j = Q ( s j , a j ; w now  )  和  q ^ j + 1 = max ⁡ a ∈ A Q ( s j + 1 , a ; w now  ) . \widehat{q}_j=Q\left(s_j, a_j ; \boldsymbol{w}_{\text {now }}\right) \quad \text { 和 } \quad \widehat{q}_{j+1}=\max _{a \in \mathcal{A}} Q\left(s_{j+1}, a ; \boldsymbol{w}_{\text {now }}\right) . q j=Q(sj,aj;wnow )  q j+1=aAmaxQ(sj+1,a;wnow ).
  2. 计算 TD 目标和 TD 误差:
    y ^ j = r j + γ ⋅ q ^ j + 1  和  δ j = q ^ j − y ^ j . \widehat{y}_j=r_j+\gamma \cdot \widehat{q}_{j+1} \quad \text { 和 } \quad \delta_j=\widehat{q}_j-\widehat{y}_j . y j=rj+γq j+1  δj=q jy j.
  3. 对 DQN 做反向传播, 得到梯度:
    g j = ∇ w Q ( s j , a j ; w now  ) . \boldsymbol{g}_j=\nabla_{\boldsymbol{w}} Q\left(s_j, a_j ; \boldsymbol{w}_{\text {now }}\right) . gj=wQ(sj,aj;wnow ).
  4. 做梯度下降更新 DQN 的参数:
    w new  ← w now  − α ⋅ δ j ⋅ g j . \boldsymbol{w}_{\text {new }} \leftarrow \boldsymbol{w}_{\text {now }}-\alpha \cdot \delta_j \cdot \boldsymbol{g}_j . wnew wnow αδjgj.

智能体收集数据、更新 DQN 参数这两者可以同时进行。可以在智能体每执行一个动作之后, 对 w \boldsymbol{w} w 做几次更新。也可以在每完成一局游戏之后, 对 w \boldsymbol{w} w 做几次更新。

三.Q学习

与DQN并无本质区别,唯一不同是DQN采用神经网络来近似 Q ⋆ Q_{\star} Q,使用梯度下降更新迭代公式。而Q学习迭代公式为
Q ~ new  ( s j , a j ) ← Q ~ now  ( s j , a j ) − α ⋅ δ j ← ( 1 − α ) Q ~ now  ( s j , a j ) + α y ^ j \begin{aligned} \widetilde{Q}_{\text {new }}\left(s_j, a_j\right) &\leftarrow \widetilde{Q}_{\text {now }}\left(s_j, a_j\right)-\alpha \cdot \delta_j \\ & \leftarrow (1-\alpha)\widetilde{Q}_{\text {now }}\left(s_j, a_j\right)+\alpha \hat y_j \end{aligned} Q new (sj,aj)Q now (sj,aj)αδj(1α)Q now (sj,aj)+αy^j

四. 同策略 (On-policy) 与异策略 (Off-policy)

目标策略 (target policy):强化学习的目的,用这个策略函数来控制智能体。例如 a t = argmax ⁡ a Q ( s t , a ; w ) a_t=\underset{a}{\operatorname{argmax}} Q\left(s_t, a ; \boldsymbol{w}\right) at=aargmaxQ(st,a;w)

行为策略 (behavior policy):控制智能体与环境交互的策略,作用是收集经验 (experience), 即观测的状态、动作、奖励。

Q \mathrm{Q} Q 学习算法用任意的行为策略收集 ( s t , a t , r t , s t + 1 ) \left(s_t, a_t, r_t, s_{t+1}\right) (st,at,rt,st+1) 这样的四元组, 然后拿它们训练目标策略, 即 DQN。

行为策略和目标策略可以相同, 也可以不同。同策略是指用相同的行为策略和目标策略,异策略是指用不同的行为策略和目标策略, DQN 属于异策略。

由于 DQN 是异策略, 行为策略可以不同于目标策略, 可以用任意的行为策略收集经验, 比如最常用的行为策略是 ϵ \epsilon ϵ-greedy:
a t = { argmax ⁡ a Q ( s t , a ; w ) ,  以概率  ( 1 − ϵ ) ;  均匀抽取  A  中的一个动作,   以概率  ϵ . a_t= \begin{cases}\operatorname{argmax}_a Q\left(s_t, a ; \boldsymbol{w}\right), & \text { 以概率 }(1-\epsilon) ; \\ \text { 均匀抽取 } \mathcal{A} \text { 中的一个动作, } & \text { 以概率 } \epsilon .\end{cases} at={argmaxaQ(st,a;w), 均匀抽取 A 中的一个动作 以概率 (1ϵ); 以概率 ϵ.

让行为策略带有随机性的好处在于能探索更多没见过的状态。在实验中, 初始的时候让 ϵ \epsilon ϵ 比较大 (比如 ϵ = 0.5 \epsilon=0.5 ϵ=0.5 ); 在训练的过程中, 让 ϵ \epsilon ϵ 逐渐衰减, 在几十万步之后衰减到较小的值(比如 ϵ = 0.01 \epsilon=0.01 ϵ=0.01 ), 此后固定住 ϵ = 0.01 \epsilon=0.01 ϵ=0.01

比较大 (比如 ϵ = 0.5 \epsilon=0.5 ϵ=0.5 ); 在训练的过程中, 让 ϵ \epsilon ϵ 逐渐衰减, 在几十万步之后衰减到较小的值(比如 ϵ = 0.01 \epsilon=0.01 ϵ=0.01 ), 此后固定住 ϵ = 0.01 \epsilon=0.01 ϵ=0.01

异策略的好处是可以用行为策略收集经验, 把 ( s t , a t , r t , s t + 1 ) \left(s_t, a_t, r_t, s_{t+1}\right) (st,at,rt,st+1) 这样的四元组记录到一个数组里, 在事后反复利用这些经验去更新目标策略。这个数组被称作经验回放数组 (replay buffer), 这种训练方式被称作经验回放 (experience replay)。注意, 经验回放只适用于异策略, 不适用于同策略, 其原因是收集经验时用的行为策略不同于想要训练出的目标策略。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/451024.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java进程CPU高负载排查

Java进程CPU高负载排查步骤_java进程cpu使用率高排查_YouluBank的博客-CSDN博客 【问题定位】使用arthas定位CPU高的问题_arthas cpu高_秋装什么的博客-CSDN博客 CPU飙升可能原因 CPU 上下文切换过多。 对于 CPU 来说,同一时刻下每个 CPU 核心只能运行-个线程&…

深度学习模型部署(六)TensorRT工作流and入门demo

TensorRT工作流程 官方给出的步骤: 总结下来可以分为两大部分: 模型生成:将onnx经过一系列优化,生成tensorrt的engine模型 选择batchsize,选择精度precision,模型转换 模型推理:使用python或…

SpringBoot(容器功能)

文章目录 1.Configuration 添加/注入bean1.注入bean1.编写一个JavaBean,Monster.java2.创建一个config文件夹(名字任意),用于存放配置Bean的类(相当于配置文件)3.BeanConfig.java4.测试使用 MainApp.java2.…

Spring中使用自带@Autowired注解实现策略模式

场景 SpringBoot中策略模式工厂模式业务实例(接口传参-枚举类查询策略映射关系-执行不同策略)规避大量if-else: SpringBoot中策略模式工厂模式业务实例(接口传参-枚举类查询策略映射关系-执行不同策略)规避大量if-else_springboot编写策略工厂-CSDN博客 设计模式…

NASA和IBM联合开发的 2022 年多时相土地分类数据集

简介 美国国家航空航天局(NASA)和国际商业机器公司(IBM)合作,利用大规模卫星和遥感数据,包括大地遥感卫星和哨兵-2 号(HLS)数据,创建了地球观测人工智能基础模型。通过奉…

【Windows】解决Windows磁盘有锁和感叹号方法

文章目录 1、概述2、效果3、解决方案3.1、先看自己电脑环境3.2、查看BitLocker情况3.3、查看设备加密 4、其他方案5、BitLocker5.1、BitLocker 是什么5.2、BitLocker 作用5.3、BitLocker 和 TPM 1、概述 目前在整理自己新电脑的软件,无意间电脑磁盘有锁和感叹号的标…

Dynamic Wallpaper v17.4 mac版 动态视频壁纸 兼容 M1/M2

Dynamic Wallpaper Engine 是一款适用于 Mac 电脑的视频动态壁纸, 告别单调的静态壁纸,拥抱活泼的动态壁纸。内置在线视频素材库,一键下载应用,也可导入本地视频,同时可以将视频设置为您的电脑屏保。 应用介绍 Dynam…

多线程案例及常用模式

一.单例模式——经典的设计模式 什么是单例模式:就是规定一个类只能创建一个对象,也就是保证某个类在程序中只存在唯一一个实例,而不会创建出多个实例 根据对象创建的时机不同,可以分为饿汉模式和懒汉模式 1.饿汉模式 在类加载…

2024.3.12 C++

1、自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height) 定义公有成员函数初始化函数:void init(int w, int h)更改宽度的函数:set w(int w)更改高度的函数:set h(int h)输出该矩形的周长和面积函数:void show() #include <iostream>using nam…

动手学深度学习-注意力机制Transformer

注意力机制 1. 注意力提示 1.1. 生物学中的注意力提示 **自主性提示&#xff08;随意线索&#xff09;&#xff1a;收到认知和意识的控制&#xff0c;有主观意愿的推动。**如下图&#xff0c;所有纸制品都是黑白印刷的&#xff0c;但咖啡杯是红色的。 换句话说&#xff0c;这…

【图像超分】论文复现:Pytorch实现FSRCNN,包含详细实验流程和与SRCNN的比较

文章目录 前言1. FSRCNN网络结构2. 训练FSRCNN3. FSRCNN模型测试4. 训练好的FSRCNN模型超分自己的图像 前言 论文地址&#xff1a;Accelerating the Super-Resolution Convolutional Neural Network 论文精读&#xff1a; 请配合上述论文精读文章使用&#xff0c;效果更佳&…

Python接口自动化核心模块 - 数据库操作和日志

一、Python连接数据库常见模块 MysqlDBpython2时代最火的驱动库。基于C开发&#xff0c;对windows平台不友好。现在已经进入python3时代&#xff0c;基本不再使用MysqlClientmysqldb的衍生版本&#xff0c;完全兼容python3.它是重量级Web开发框架Django中ORM功能依赖工具Pymys…

01_lombok review

文章目录 Lombok父子工程ide中的Maven基础配置前置知识储备 Lombok 怎么引入Lombok依赖&#xff1a; step1&#xff1a;引入Lombok依赖 eg&#xff1a; <dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok<…

9:00面试,9:06就出来了,问的实在是太变态了

我从一家小公司转投到另一家公司&#xff0c;期待着新的工作环境和机会。然而&#xff0c;新公司的加班文化让我有些始料未及。虽然薪资相对较高&#xff0c;但长时间的工作和缺乏休息使我身心俱疲。 就在我逐渐适应这种高强度的工作节奏时&#xff0c;公司突然宣布了一则令人…

GaussianEditor:根据用户指令编辑三维 GS 场景

Paper: Fang J, Wang J, Zhang X, et al. Gaussianeditor: Editing 3d gaussians delicately with text instructions[J]. arXiv preprint arXiv:2311.16037, 2023. Introduction: https://gaussianeditor.github.io/ Code: Unreleased 本篇的 GaussianEditor 和 NTU 的 Gaussi…

《父母的语言:3000万词汇塑造更强大的学习型大脑》早期家庭语言环境的重要性(二)

目录 简介 经典内容摘录 简介 本书作者是美国芝加哥大学妇科及儿科教授达娜萨斯金德博士。作者发起了“3000万词汇倡议”&#xff0c;“3000万词汇倡议”发现了一个秘密&#xff0c;即低收入家庭的孩子为什么“输在起跑线”上。调查显示&#xff0c;低收入家庭…

【零基础学习03】嵌入式linux驱动中自旋锁功能基本实现

大家好,为了进一步提升大家对实验的认识程度,每个控制实验将加入详细控制思路与流程,欢迎交流学习。 今天给大家分享一下,linux系统里面自旋锁操作的具体实现,操作硬件为I.MX6ULL开发板。 第一:自旋锁基本简介 ①、自旋锁保护的临界区要尽可能的短,可以使用一个变量来表…

119.龙芯2k1000-pmon(18)-全自动安装linux系统

经过两天的测试和完善&#xff0c;现在基本已经正常可用了。 &#xff08;全自动是假&#xff0c;接近全自动吧。&#xff09; 需要使用配测电脑的网络功能&#xff0c;windows即可&#xff0c;脱离linux虚拟机。&#xff08;理论上讲u盘也是可以的&#xff09; 测试平台&…

JDBC底层原理

1、什么是JBDC? JBDC&#xff08;Java Database Connectivity&#xff09;&#xff0c;JDBC只是一套规范接口&#xff0c;真正实现的是各数据库厂商驱动。 2、JBDC的底层的主要接口对象是什么&#xff1f; JBDC的底层主要是三个接口对象,Connection、Statement、ResultSet。Co…

C#实现二分查找算法

C#实现二分查找算法 以下是一个使用 C# 实现的二分查找算法示例&#xff1a; using System;class Program {static int BinarySearch(int[] arr, int target){int low 0;int high arr.Length - 1;while (low < high){int mid (low high) / 2;// 如果目标值等于中间元素…