Pytorch深度强化学习2-1:基于价值的强化学习——DQN算法

目录

  • [0 专栏介绍](#0 专栏介绍)
  • [1 基于价值的强化学习](#1 基于价值的强化学习)
  • [2 深度Q网络与Q-learning](#2 深度Q网络与Q-learning)
  • [3 DQN原理分析](#3 DQN原理分析)
  • [4 DQN训练实例](#4 DQN训练实例)

0 专栏介绍

本专栏重点介绍强化学习技术的数学原理,并且采用Pytorch框架对常见的强化学习算法、案例进行实现,帮助读者理解并快速上手开发。同时,辅以各种机器学习、数据处理技术,扩充人工智能的底层知识。

🚀详情:《Pytorch深度强化学习》


1 基于价值的强化学习

根据不动点定理,最优策略和最优价值函数是唯一的(对该经典理论不熟悉的请看Pytorch深度强化学习1-4:策略改进定理与贝尔曼最优方程详细推导),通过优化价值函数间接计算最优策略的方法称为**基于价值的强化学习(value-based)**框架。设状态空间为 n n n维欧式空间 S = R n S=\mathbb{R} ^n S=Rn,每个维度代表状态的一个特征。此时状态-动作值函数记为

Q ( s , a ; θ ) Q\left( \boldsymbol{s},\boldsymbol{a};\boldsymbol{\theta } \right) Q(s,a;θ)

其中 s \boldsymbol{s} s是状态向量, a \boldsymbol{a} a是动作空间中的动作向量, θ \boldsymbol{\theta } θ是神经网络的参数向量。深度学习完成了从输入状态到输出状态-动作价值的映射

s → Q ( s , a ; θ ) Q ( s , a 1 ) Q ( s , a 2 ) ⋯ Q ( s , a m ) T    ( a 1 , a 2 , ⋯   , a m ∈ A ) \boldsymbol{s}\xrightarrow{Q\left( \boldsymbol{s},\boldsymbol{a};\boldsymbol{\theta } \right)}\left \\begin{matrix} Q\\left( \\boldsymbol{s},a_1 \\right)\& Q\\left( \\boldsymbol{s},a_2 \\right)\& \\cdots\& Q\\left( \\boldsymbol{s},a_m \\right)\\\\\\end{matrix} \\right ^T\,\, \left( a_1,a_2,\cdots ,a_m\in A \right) sQ(s,a;θ) Q(s,a1)Q(s,a2)⋯Q(s,am)T(a1,a2,⋯,am∈A)

相当于对无穷维Q-Table的一次隐式查表,对经典Q-learing算法不熟悉的请看Pytorch深度强化学习1-6:详解时序差分强化学习(SARSA、Q-Learning算法)Pytorch深度强化学习案例:基于Q-Learning的机器人走迷宫。设目标价值函数为 Q ∗ Q^* Q∗,若采用最小二乘误差,可得损失函数为

J ( θ ) = E 1 2 ( Q ∗ ( s , a ) − Q ( s , a ; θ ) ) 2 J\left( \boldsymbol{\theta } \right) =\mathbb{E} \left \\frac{1}{2}\\left( Q\^\*\\left( \\boldsymbol{s},\\boldsymbol{a} \\right) -Q\\left( \\boldsymbol{s},\\boldsymbol{a};\\boldsymbol{\\theta } \\right) \\right) \^2 \\right J(θ)=E21(Q∗(s,a)−Q(s,a;θ))2

采用梯度下降得到参数更新公式为

θ ← θ + α ( Q ∗ ( s , a ) − Q ( s , a ; θ ) ) ∂ Q ( s , a ; θ ) ∂ θ \boldsymbol{\theta }\gets \boldsymbol{\theta }+\alpha \left( Q^*\left( \boldsymbol{s},\boldsymbol{a} \right) -Q\left( \boldsymbol{s},\boldsymbol{a};\boldsymbol{\theta } \right) \right) \frac{\partial Q\left( \boldsymbol{s},\boldsymbol{a};\boldsymbol{\theta } \right)}{\partial \boldsymbol{\theta }} θ←θ+α(Q∗(s,a)−Q(s,a;θ))∂θ∂Q(s,a;θ)

随着迭代进行, Q ( s , a ; θ ) Q\left( \boldsymbol{s},\boldsymbol{a};\boldsymbol{\theta } \right) Q(s,a;θ)将不断逼近 Q ∗ Q^* Q∗,由 Q ( s , a ; θ ) Q\left( \boldsymbol{s},\boldsymbol{a};\boldsymbol{\theta } \right) Q(s,a;θ)进行的策略评估和策略改进也将迭代至最优。

2 深度Q网络与Q-learning

Q-learning和**深度Q学习(Deep Q-learning, DQN)**是强化学习领域中两种重要的算法,它们在解决智能体与环境之间的决策问题方面具有相似之处,但也存在一些显著的异同。这里进行简要阐述以加深对二者的理解。

  • Q-learning是一种基于值函数的强化学习算法。它通过使用Q-Table来表示每个状态和动作对的预期回报。Q值函数用于指导智能体在每个时间步选择最优动作。通过不断更新Q值函数来使其逼近最优的Q值函数
  • DQN是对Q-learning的深度网络版本,它将神经网络引入Q-learning中,以处理具有高维状态空间的问题。通过使用深度神经网络作为函数逼近器,DQN可以学习从原始输入数据(如像素值)直接预测每个动作的Q值

3 DQN原理分析

**深度Q网络(Deep Q-Network, DQN)**的核心原理是通过

  • 经验回放池(Experience Replay):考虑到强化学习采样的是连续非静态样本,样本间的相关性导致网络参数并非独立同分布,使训练过程难以收敛,因此设置经验池存储样本,再通过随机采样去除相关性;
  • 目标网络(Target Network):考虑到若目标价值 与当前价值 是同一个网络时会导致优化目标不断变化,产生模型振荡与发散,因此构建与 结构相同但慢于 更新的独立目标网络来评估目标价值,使模型更稳定。

拟合了高维状态空间,是Q-Learning算法的深度学习版本,算法流程如表所示

4 DQN训练实例

最简单的例子是使用全连接网络来构造DQN

python 复制代码
class DQN(nn.Module):
	def __init__(self, input_dim, output_dim):
	    super(DQN, self).__init__()
	    self.input_dim = input_dim
	    self.output_dim = output_dim
	    
	    self.fc = nn.Sequential(
	        nn.Linear(self.input_dim[0], 128),
	        nn.ReLU(),
	        nn.Linear(128, 256),
	        nn.ReLU(),
	        nn.Linear(256, self.output_dim)
	    )
	
	def __str__(self) -> str:
	    return "Fully Connected Deep Q-Value Network, DQN"
	
	def forward(self, state):
	    qvals = self.fc(state)
	    return qvals

基于贝尔曼最优原理的损失计算如下

python 复制代码
def computeLoss(self, batch):
    states, actions, rewards, next_states, dones = batch
    states = torch.FloatTensor(states).to(self.device)
    actions = torch.LongTensor(actions).to(self.device)
    rewards = torch.FloatTensor(rewards).to(self.device)
    next_states = torch.FloatTensor(next_states).to(self.device)
    dones = (1 - torch.FloatTensor(dones)).to(self.device)

    # 根据实际动作提取Q(s,a)值
    curr_Q = self.model(states).gather(1, actions.unsqueeze(1)).squeeze(1)
    next_Q = self.target_model(next_states)
    max_next_Q = torch.max(next_Q, 1)[0]
    expected_Q = rewards.squeeze(1) + self.gamma * max_next_Q * dones

    loss = self.criterion(curr_Q, expected_Q.detach())
    return loss

基于经验回放池和目标网络的参数更新如下

python 复制代码
def update(self, batch_size):
	batch = self.replay_buffer.sample(batch_size)
	loss = self.computeLoss(batch)
	self.optimizer.zero_grad()
	loss.backward()
	self.optimizer.step()
	
	# 更新target网络
	for target_param, param in zip(self.target_model.parameters(), self.model.parameters()):
	    target_param.data.copy_(self.tau * param + (1 - self.tau) * target_param)
	
	# 退火
	self.epsilon = self.epsilon + self.epsilon_delta \
	    if self.epsilon < self.epsilon_max else self.epsilon_max

基于DQN可以实现最基本的智能体,下面给出一些具体案例

完整代码联系下方博主名片获取


🔥 更多精彩专栏

👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇

相关推荐
小小测试开发5 小时前
安装 Python 3.10+
开发语言·人工智能·python
KaMeidebaby5 小时前
卡梅德生物技术快报|PD1 单克隆抗体定制配套 N 糖全谱质控开发
前端·人工智能·算法·数据挖掘·数据分析
我叫唧唧波6 小时前
Python+AI 全栈学习笔记
人工智能·python·学习
哈哈,柳暗花明6 小时前
人工智能专业术语详解(E)
人工智能·专业术语
AI极客菌7 小时前
AI绘画工具中,为什么专业玩家爱用Stable Diffusion,普通玩家却喜欢Midjourney?
大数据·人工智能·ai·ai作画·stable diffusion·aigc·midjourney
人工智能AI技术7 小时前
FLUX.2[klein]开源!小香蕉平替,本地部署AI绘画的极简方案
人工智能·ai作画·aigc
腾视科技AI7 小时前
腾视科技大模型一体机解决方案:低成本私有化落地,重塑行业智能应用新格局
大数据·人工智能·科技·ai·边缘计算·算力·ai算力
pusheng20257 小时前
IFSJ全英文专访:中国创新力量重塑先进气体感知技术,赋能全球关键基础设施安全
前端·网络·人工智能·物联网·安全
魔点科技7 小时前
魔点门禁门常开计划解决早高峰排队、忘落锁、多门手动调模式痛点
人工智能·智能硬件·智能门禁·考勤门禁·魔点科技
程序员大辉7 小时前
ComfyUI整合包V8中文版 | 2026年3月最新版,开箱即用,零门槛跑AI绘画和AI视频,新手进阶都能上手,附整合包
人工智能·ai作画