DQN的总结

部署运行你感兴趣的模型镜像

转载一篇关于DQN解释非常好的文章
转载自:https://zhuanlan.zhihu.com/p/46852675
本人做了一些细微的改动,方便个人理解,原文请点这里

DQN的由来和解释

Q-Learning可以很好的解决迷宫问题,但这终究是个小问题,它的状态空间和动作空间都很小。而在实际的情况下,大部分问题都有巨大的状态空间或动作空间,建立Q表,内存是不允许的,而且数据量和时间开销也是个问题。

我们可以使用神经网络来表示我们的 Q 函数,每层网络的权重就是对应的值函数,取 4 四帧游戏图像作为 state,输出每个 action 对应的 Q 值。如果我们想要执行 Q 值的更新,或者选择具有最高 Q 值的对应的 action,我们只需经过整个网络一次就能立刻获得任意动作对应的 Q 值。DQN的原始输入为连续的4帧图像,不只使用一帧画面是为了感知环境的动态性。

在这里插入图片描述

左图:简单的DQN模型,右图:DeepMind改进的DQN模型

假设一帧图像有84个像素点,那么四帧图像就有84*84*4个像素。每一个像素点的取值是0-255可能,所有的可能性就有256^(84*84*4)。

在这里插入图片描述
DeepMind使用的网络结构如下:
在这里插入图片描述

这是一个经典的带有三层卷积层的卷积神经网络,后面跟两个全连接层。注意:这里没有池化层,池化层会让你获得平移不变性,即网络对图像中对象的位置变得不敏感。这对于 ImageNet 这样的分类任务来说是有意义的,但游戏中位置对潜在的奖励至关重要,我们不希望丢失这些信息。

这个网络的输入是4个84 x 84 的灰度游戏屏幕,输出是每个可能的动作对应的 Q 值 (DeepMind 实验玩的游戏是 Atari,对应有 18 种动作)。这成为一个回归任务,可以用简单的平方误差损失进行优化:
L = 1 2 [ r + max ⁡ a ′ Q ( s ′ , a ′ ) − Q ( s , a ) ] 2 L=\frac{1}{2}[r + \max _{a'} {\mathcal {Q}}(s',a') - \mathcal {Q}(s,a) ]^{2} L=21[r+amaxQ(s,a)Q(s,a)]2

对于给定的<s, a, r, s'>,前一算法的 Q表的更新规则应该做如下修改:

1.对当前状态 s 进行一次前馈,获得所有 action 预测的 Q 值。;

2.对下一个状态 s’ 进行一次前馈,计算整个网络最大的输出值 max ⁡ a ′ Q ( s ′ , a ′ ) \max _{a'} {\mathcal {Q}}(s',a') maxaQ(s,a)

3.为动作设置目标Q值 r + max ⁡ a ′ Q ( s ′ , a ′ ) r+\max _{a'} {\mathcal {Q}}(s',a') r+maxaQ(s,a)

4.通过反向传播更新权重。

DQN对Q-Learning的修改主要体现在三个方面:

(1)DQN利用深度卷积神经网络逼近值函数;

(2)DQN利用经验回放(experience replay)训练强化学习的学习过程;

(3)DQN独立设置了目标网络来单独处理时间差分算法中的TD偏差。

下面具体介绍:

(1)DQN利用深度卷积神经网络逼近值函数。此处的值函数对应着一组参数,在神经网络里参数是每层网络的权重,用θ表示,用公式表示的值函数Q(s,a;θ)。此时更新值函数时其实是更新参数θ,当神经网络确定时,θ就表示值函数。

在这里插入图片描述

第一个DQN模型

(2)经验回放的动机是:①深度神经网络作为有监督学习模型,要求数据满足独立同分布;②通过强化学习采集的数据之间存在着关联性,利用这些数据进行顺序训练,神经网络表现不稳定,而经验回放可以打破数据间的关联。

在强化学习过程中,智能体将数据存储到一个数据库中,再利用均匀随机采样的方法从数据库中抽取数据,然后利用抽取的数据训练神经网络(13年的NIPS中已提出)。

在这里插入图片描述

经验回放

(3)利用神经网络对值函数进行逼近时,值函数的更新步更新的是参数θ,更新方法是梯度下降法。因此值函数更新实际上变成了监督学习的一次更新过程,其梯度下降法为:
θ t + 1 = θ t + α [ r + γ max ⁡ a ′ Q ( s ′ , a ′ ; θ ) − Q ( s , a , θ ) ] ∇ Q ( s , a ; θ ) \theta_{t+1}=\theta_t+\alpha\big[r+\gamma\max _{a'} {\mathcal {Q}}(s',a';\theta)- \mathcal {Q}(s,a,\theta)\big]\nabla \mathcal {Q}(s,a;\theta) θt+1=θt+α[r+γamaxQ(s,a;θ)Q(s,a,θ)]Q(s,a;θ)
r + γ max ⁡ a ′ Q ( s ′ , a ′ ; θ ) r+\gamma\max _{a'} {\mathcal {Q}}(s',a';\theta) r+γmaxaQ(s,a;θ)为TD目标,在计算 max ⁡ a ′ Q ( s ′ , a ′ ; θ ) \max _{a'} {\mathcal {Q}}(s',a';\theta) maxaQ(s,a;θ) 值时用到的网络参数为 θ \theta θ

在这里插入图片描述

我们称计算TD目标时所用的网络为TD网络。以往的神经网络逼近值函数时,计算TD目标的动作值函数所用的网络参数 θ \theta θ ,与梯度计算中要逼近的值函数所用的网络参数相同,这样就容易使得数据间存在关联性,训练不稳定。为了解决这个问题,DeepMind提出计算TD目标的网络参数表示为 θ − \theta^{-} θ ;计算值函数逼近的网络参数表示为 θ \theta θ;用于动作值函数逼近的网络每一步都更新,而用于计算TD目标的网络每个固定的步数更新一次。

计算TD目标的网络就是TargetNet
计算值函数逼近的就是MainNet

因此值函数的更新变为: θ t + 1 = θ t + α [ r + γ max ⁡ a ′ Q ( s ′ , a ′ ; θ − ) − Q ( s , a , θ ) ] ∇ Q ( s , a ; θ ) \theta_{t+1}=\theta_t+\alpha\big[r+\gamma\max _{a'} {\mathcal {Q}}(s',a';\theta^-)- \mathcal {Q}(s,a,\theta)\big]\nabla \mathcal {Q}(s,a;\theta) θt+1=θt+α[r+γmaxaQ(s,a;θ)Q(s,a,θ)]Q(s,a;θ)

DQN的伪代码

在这里插入图片描述

DQN伪代码

第[1]行,初始化回放记忆D,可容纳的数据条数为N

第[2]行,利用随机权值 θ \theta θ 来初始化动作-行为值函数Q

第[3]行,令 θ − = θ \theta^-=\theta θ=θ 初始化用来计算TD目标的动作行为值Q

第[4]行,循环每次事件

第[5]行,初始化事件的第一个状态s1 ,预处理得到状态对应的特征输入

第[6]行,循环每个事件的每一步

第[7]行,利用概率 ε \varepsilon ε 选一个随机动作 a t a_t at

第[8]行,如果小概率事件没发生,则用贪婪策略选择当前值函数最大的那个动作:
a t = a r g max ⁡ a Q ( ϕ ( s t ) , a , θ ) a_t=arg\max_aQ(\phi \left( s_t \right),a,\theta) at=argamaxQ(ϕ(st),a,θ)

注意,这里选最大动作时用到的值函数网络与逼近值函数所用的网络是一个网络,都对应着 θ \theta θ

注意:第[7]行和第[8]行是行动策略,即 ε − g r e e d y \varepsilon -greedy εgreedy策略。

第[9]行,在仿真器中执行动作 a t a_t at ,观测回报 r t r_t rt以及图像 x t + 1 x_{t+1} xt+1.

第[10]行,更新 s t + 1 = s t s_{t+1}=s_t st+1=st,设置 a t , x t + 1 a_t,x_{t+1} at,xt+1,预处理 ϕ t + 1 = ϕ ( s t + 1 ) \phi _{t+1}=\phi (s_{t+1}) ϕt+1=ϕ(st+1)

第[11]行,将转换结果 ( ϕ t , a t , r t , ϕ t + 1 ) (\phi _{t},a_t,r_t,\phi_{t+1}) (ϕt,at,rt,ϕt+1) 储存在回放记忆D中

第[12]行,从回放记忆D中均匀随机采样一个转换样本数据,用 ( ϕ j , a j , r j , ϕ j + 1 ) (\phi _{j},a_j,r_j,\phi_{j+1}) (ϕj,aj,rj,ϕj+1) 来表示。

第[13]行,判断是否是一个事件的终止状态,若是终止状态则TD的回报reward r j r_j rj ,否则利用TD目标网络参数 θ − \theta^- θ 计算TD回报(reward): r + γ max ⁡ a ′ Q ( s ′ , a ′ ; θ − ) r+\gamma\max _{a'} {\mathcal {Q}}(s',a';\theta^-) r+γmaxaQ(s,a;θ)

第[14]行,执行一次梯度下降算法:
Δ θ = α [ r + γ max ⁡ a ′ Q ( s ′ , a ′ ; θ − ) − Q ( s , a , θ ) ] ∇ Q ( s , a ; θ ) \varDelta\theta=\alpha\big[r+\gamma\max _{a'} {\mathcal {Q}}(s',a';\theta^-)- \mathcal {Q}(s,a,\theta)\big]\nabla \mathcal {Q}(s,a;\theta) Δθ=α[r+γamaxQ(s,a;θ)Q(s,a,θ)]Q(s,a;θ)

第[15]行,更新动作值函数逼近的网络参数 θ = θ + Δ θ \theta=\theta+\varDelta\theta θ=θ+Δθ

第[16]行,每隔C步更新一次TD目标网络权值即令 θ − = θ \theta^-=\theta θ=θ

第[17]行,结束每次事件内循环

第[18]行,结束事件间的循环

我们可以看到,在第[12]行,利用了经验回放;在[13]行利用了独立的目标网络 θ − \theta^- θ;第[15]行,更新动作值函数逼近网络参数;第[17]行更新目标网络参数.

参考:

1.揭秘深度强化学习神经网络(DQN)

2.天津包子馅儿:深度强化学习系列 第一讲 DQN

您可能感兴趣的与本文相关的镜像

Qwen3-8B

Qwen3-8B

文本生成
Qwen3

Qwen3 是 Qwen 系列中的最新一代大型语言模型,提供了一整套密集型和专家混合(MoE)模型。基于广泛的训练,Qwen3 在推理、指令执行、代理能力和多语言支持方面取得了突破性进展

### 关于深度Q网络(DQN)的实现案例与示例教程 #### DQN 的基本原理 深度Q网络 (Deep Q-Network, DQN) 是一种结合了深度学习和强化学习的技术,用于解决高维状态空间中的决策问题。它通过使用深度神经网络来近似 Q 函数 \( Q(s, a; \theta) \),从而能够处理复杂的环境输入[^1]。 #### Flappy Bird 游戏中的 DQN 实现 在实际应用中,DQN 被广泛应用于游戏 AI 领域。例如,在经典的 Flappy Bird 游戏中,可以通过构建一个基于 TensorFlow 或 PyTorch 的 DQN 模型来训练智能体完成自动飞行的任务。以下是该场景下的核心代码片段: ```python import tensorflow as tf # 定义卷积层权重初始化 W_conv1 = tf.Variable(tf.truncated_normal([8, 8, 4, 32], stddev=0.01)) b_conv1 = tf.Variable(tf.constant(0.01, shape=[32])) # 卷积操作定义 def conv2d(x, W, stride): return tf.nn.conv2d(x, W, strides=[1, stride, stride, 1], padding="SAME") # 构建隐藏层 h_conv1 = tf.nn.relu(conv2d(state_input, W_conv1, 4) + b_conv1) h_pool1 = tf.nn.max_pool(h_conv1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') ``` 上述代码展示了如何利用卷积神经网络提取图像特征并将其作为后续全连接层的输入[^2]。 #### 使用 OpenAI Gym 和 Keras 进行 DQN 训练 除了自定义框架外,还可以借助开源工具库简化开发流程。比如,OpenAI Gym 提供了许多标准测试环境,而 Keras 则提供了简洁易用的 API 接口。下面是一个简单的例子说明如何设置这些组件: ```python from keras.models import Sequential from keras.layers import Dense, Flatten from rl.agents.dqn import DQNAgent from rl.policy import EpsGreedyQPolicy from rl.memory import SequentialMemory model = Sequential() model.add(Flatten(input_shape=(WINDOW_LENGTH,) + env.observation_space.shape)) model.add(Dense(512, activation='relu')) model.add(Dense(nb_actions, activation='linear')) memory = SequentialMemory(limit=50000, window_length=WINDOW_LENGTH) policy = EpsGreedyQPolicy() dqn = DQNAgent(model=model, nb_actions=nb_actions, memory=memory, target_model_update=1e-2, policy=policy) dqn.compile(optimizer=tf.keras.optimizers.Adam(lr=1e-3), metrics=['mae']) history = dqn.fit(env, nb_steps=50000, visualize=False, verbose=2) ``` 此部分代码实现了模型搭建、记忆存储以及策略选择等功能模块,并最终完成了整个系统的编译与训练过程。 #### 总结 以上分别介绍了两种不同方式下有关 Deep Q Network(DQN)的具体实践方法论及其对应源码展示。无论是针对特定应用场景还是通用平台支持都给出了详尽指导方案。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值