【深度强化学习】(1) DQN 模型解析,附Pytorch完整代码

本文介绍了深度强化学习中的DQN算法,结合OpenAIGym环境训练模型完成小游戏。DQN是深度神经网络与Q-Learning的结合,通过Q网络预测Q值。经验回放机制用于打破序列依赖,增加训练数据的多样性,确保网络稳定学习。文中还提供了DQN模型的实现代码,并展示了在CartPole-v1环境中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大家好,今天和各位讲解一下深度强化学习中的基础模型 DQN,配合 OpenAI 的 gym 环境,训练模型完成一个小游戏,完整代码可以从我的 GitHub 中获得:

https://github.com/LiSir-HIT/Reinforcement-Learning/tree/main/Model


1. 算法原理

1.1 基本原理

DQN(Deep Q Network)算法由 DeepMind 团队提出,是深度神经网络和 Q-Learning 算法相结合的一种基于价值的深度强化学习算法

Q-Learning 算法构建了一个状态-动作值的 Q 表,其维度为 (s,a),其中 s 是状态的数量,a 是动作的数量,根本上是 Q 表将状态和动作映射到 Q 值此算法适用于状态数量能够计算的场景。但是在实际场景中,状态的数量可能很大,这使得构建 Q 表难以解决。为破除这一限制,我们使用 Q 函数来代替 Q 表的作用,后者将状态和动作映射到 Q 值的结果相同。

由于神经网络擅长对复杂函数进行建模,因此我们用其当作函数近似器来估计此 Q 函数,这就是 Deep Q Networks。此网络将状态映射到可从该状态执行的所有动作的 Q 值。即只要输入一个状态,网络就会输出当前可执行的所有动作分别对应的 Q 值。如下图所示,它学习网络的权重,以此输出最佳 Q 值。


1.2 模型结构

DQN 体系结构主要包含:Q 网络、目标网络,以及经验回放组件。.Q 网络是经过训练以生成最佳状态-动作值的 agent。经验回放单元的作用是与环境交互,生成数据以训练 Q 网络。目标网络与 Q 网络在初始时是完全相同的。DQN 工作流程图如下


1.2.1  经验回放

经验回放从当前状态中以贪婪策略 \varepsilon -greedy 选择一个动作,执行后从环境中获得奖励和下一步的状态,如下图所示。

然后将此观测值另存为用于训练数据的样本,如下图所示。

03-08
### DQN深度强化学习算法介绍 #### 一. 概念概述 DQN (Deep Q-Network) 是一种结合了深度神经网络与Q-Learning的方法,用于解决高维状态空间下的决策问题。传统Q-Learning通过查找表的形式存储每一个状态下采取不同行动所获得的价值量(Q值),然而这种方法面对复杂环境时效率极低甚至不可行,因为随着状态数目的增加,所需内存呈指数级增长[^1]。 为了克服这一挑战,研究人员提出了利用深层卷积神经网络作为函数逼近器的思想,使得模型可以直接从原始像素输入中提取特征并预测相应的Q值,而无需显式构建庞大的查表结构。此外,该框架还融入了两项关键技术——经验重放缓冲池(experience replay buffer)以及固定的目标Q网络(target network)[^3]。 #### 二. 关键技术解析 ##### 经验重放缓冲池(Experience Replay Buffer) 此机制允许代理将经历过的交互事件(即<state, action, reward, next_state>四元组)存入一个队列式的记忆库内,在训练过程中随机抽取样本批次来进行更新操作。这样做不仅打破了数据之间的关联性,提高了泛化能力;而且有助于稳定梯度下降过程中的参数调整方向。 ##### 固定目标Q网络(Target Network) 为了避免频繁变动的学习目标造成优化困难的情况发生,DQN采用双网路架构:一个是不断迭代改进的工作网络(evaluation network), 另外则是定期同步权重给前者的影子副本—目标网络。后者仅用来计算TD误差而不参与反向传播环节,从而确保每次估计都相对平稳可靠。 #### 三. 实现案例展示 下面给出一段简化版的Python代码片段,展示了如何使用TensorFlow/Keras搭建一个基本形式的DQN: ```python import numpy as np from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense from collections import deque class SimpleDQN: def __init__(self, state_size, action_size): self.state_size = state_size self.action_size = action_size self.memory = deque(maxlen=2000) self.gamma = 0.95 # 折扣因子 self.epsilon = 1.0 # 探索率初始值 self.epsilon_min = 0.01 self.epsilon_decay = 0.995 self.learning_rate = 0.001 self.model = self._build_model() def _build_model(self): model = Sequential() model.add(Dense(24, input_dim=self.state_size, activation='relu')) model.add(Dense(24, activation='relu')) model.add(Dense(self.action_size, activation='linear')) model.compile(loss="mse", optimizer="adam") return model def remember(self, state, action, reward, next_state, done): self.memory.append((state, action, reward, next_state, done)) def act(self, state): if np.random.rand() <= self.epsilon: return np.random.choice(self.action_size) act_values = self.model.predict(state) return np.argmax(act_values[0]) def train(self, batch_size=32): minibatch = random.sample(self.memory, batch_size) for state, action, reward, next_state, done in minibatch: target = reward if not done: target = (reward + self.gamma * np.amax(self.model.predict(next_state)[0])) target_f = self.model.predict(state) target_f[0][action] = target self.model.fit(state, target_f, epochs=1, verbose=0) if self.epsilon > self.epsilon_min: self.epsilon *= self.epsilon_decay ``` 上述代码定义了一个简单的DQN类`SimpleDQN`,其中包含了创建两层全连接隐藏层组成的评估网络(`_build_model`)、保存历史轨迹(`remember`)、依据当前策略选取行为(`act`)以及基于采样得到的小批量数据执行一次完整的训练循环(`train`)等功能模块。 对于更具体的应用场景比如路径规划,则可以参照MATLAB环境下实现的具体实例[^2]。
评论 62
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

立Sir

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

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

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

打赏作者

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

抵扣说明:

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

余额充值