深度Q网络(DQN)算法技术博客

深度Q网络(DQN)是一种将深度学习与强化学习相结合的算法,用于解决高维状态空间的强化学习问题。本文将详细介绍DQN算法的基本原理,关键公式以及具体的代码实现。

一、DQN算法的基本原理

DQN算法是Q学习的一种扩展,利用神经网络来逼近Q值函数。其核心思想是通过不断地与环境交互,从而学习到一个策略,使得在每个状态下的累积奖励最大化。Q值函数的定义如下:

Q(s, a) = \mathbb{E}[r_t + \gamma \max_{a'} Q(s_{t+1}, a') | s_t = s, a_t = a]

其中:

  • s 是状态
  • a 是动作
  • r 是奖励
  • \gammaγ是折扣因子(0 <= \gamma < 1)

DQN通过使用两个神经网络来稳定训练过程:

  1. 策略网络(Policy Network):用来生成动作的Q值。
  2. 目标网络(Target Network):用来生成目标Q值,其参数定期从策略网络复制。

二、DQN算法的关键步骤

  1. 经验回放(Experience Replay):为了打破数据之间的相关性,DQN使用了经验回放技术,将经验存储在一个记忆库中,并从中随机采样一批用于训练。

  2. 目标Q值的计算y_i = r_i + \gamma \max_{a'} Q'(s_{i+1}, a'; \theta^{-})其中 \theta^{-} 是目标网络的参数, \theta 是策略网络的参数。

  3. 损失函数的定义L(\theta) = \mathbb{E}_{(s, a, r, s') \sim D} [(y_i - Q(s, a; \theta))^2]通过最小化上述损失函数,来更新策略网络的参数。

三、DQN算法的代码实现

以下是一个简单的DQN算法在OpenAI Gym的CartPole环境中的实现。

import gym
import numpy as np
import random
import torch
import torch.nn as nn
import torch.optim as optim
from collections import deque# 定义Q网络
class QNetwork(nn.Module):def __init__(self, state_size, action_size):super(QNetwork, self).__init__()self.fc1 = nn.Linear(state_size, 24)self.fc2 = nn.Linear(24, 24)self.fc3 = nn.Linear(24, action_size)def forward(self, x):x = torch.relu(self.fc1(x))x = torch.relu(self.fc2(x))x = self.fc3(x)return x# DQN算法类
class DQNAgent:def __init__(self, state_size, action_size):self.state_size = state_sizeself.action_size = action_sizeself.memory = deque(maxlen=2000)self.gamma = 0.95  # 折扣因子self.epsilon = 1.0  # 探索率self.epsilon_min = 0.01self.epsilon_decay = 0.995self.learning_rate = 0.001self.model = QNetwork(state_size, action_size)self.target_model = QNetwork(state_size, action_size)self.optimizer = optim.Adam(self.model.parameters(), lr=self.learning_rate)self.update_target_model()def update_target_model(self):self.target_model.load_state_dict(self.model.state_dict())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 random.randrange(self.action_size)state = torch.FloatTensor(state)act_values = self.model(state)return np.argmax(act_values.detach().numpy())def replay(self, batch_size):minibatch = random.sample(self.memory, batch_size)for state, action, reward, next_state, done in minibatch:target = self.model(torch.FloatTensor(state)).detach().numpy()if done:target[action] = rewardelse:t = self.target_model(torch.FloatTensor(next_state)).detach().numpy()target[action] = reward + self.gamma * np.amax(t)target_f = self.model(torch.FloatTensor(state))target_f[action] = torch.FloatTensor([target[action]])self.model.zero_grad()loss = nn.MSELoss()(target_f, torch.FloatTensor(target))loss.backward()self.optimizer.step()if self.epsilon > self.epsilon_min:self.epsilon *= self.epsilon_decay# 训练DQN模型
if __name__ == "__main__":env = gym.make("CartPole-v1")state_size = env.observation_space.shape[0]action_size = env.action_space.nagent = DQNAgent(state_size, action_size)episodes = 1000batch_size = 32for e in range(episodes):state = env.reset()state = np.reshape(state, [1, state_size])for time in range(500):action = agent.act(state)next_state, reward, done, _ = env.step(action)reward = reward if not done else -10next_state = np.reshape(next_state, [1, state_size])agent.remember(state, action, reward, next_state, done)state = next_stateif done:agent.update_target_model()print(f"Episode: {e}/{episodes}, Score: {time}, Epsilon: {agent.epsilon:.2}")breakif len(agent.memory) > batch_size:agent.replay(batch_size)

四、总结

DQN算法通过结合Q学习与深度神经网络,解决了高维状态空间下的强化学习问题。本文详细介绍了DQN的基本原理、关键步骤和具体的代码实现,希望能够帮助读者更好地理解和应用这一算法。如果在实际应用中遇到问题,可以参考相关文献和开源代码库,进一步优化和改进。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Prompt的万能公式和优化技巧

文章目录 前言一、万能公式二、优化技巧1.设定角色2.设定目标和动机3.引导主观回答4.预设条件5.做强调6.思维链&#xff08;COT&#xff09;7.巧用定界符 前言 随着LLM的发展&#xff0c;能给我们带来很多方便&#xff0c;但是又引出了一个新的问题就是我们该如何使用他们&…

通过9大步骤,帮助企业在数字化转型中搭建数据分析的报表体系!

引言&#xff1a;在数字化转型中&#xff0c;企业搭建数据分析的报表体系是一个系统性的过程&#xff0c;需要综合考虑业务需求、数据来源、技术平台等多个方面。此外从报表生命周期的角度来说&#xff0c;从产生、使用以及最后消亡退出体系&#xff0c;都需要通盘考虑&#xf…

Linux上快速定位Java代码问题行

生产环境中&#xff0c;经常会遇到CPU持续飙高或内存、IO飙高&#xff0c;如何快速定位问题点是很多新手头疼的问题&#xff0c;只能通过经验和代码推理&#xff0c;其实这里针对Java程序可以通过top和jstack命令&#xff0c;快速定位到问题代码。 Top命令的输出 具体定位之前…

虚拟机与主机的联通

本地光纤分配地址给路由器--》连结路由器是连结局域网--》由路由器分配IP地址 因此在网站上搜索的IP与本机的IP是不一样的 1.windows查看主机IP地址 在终端输入 2.linux虚拟机查看ip 3.主机是否联通虚拟机ping加ip

Hadoop页面报错Permission denied: user=dr.who, access....

1、临时解决 hdfs dfs -chmod -R 777 /这种方法&#xff0c;存在一个不足&#xff0c;就是后面重新创建的文件夹&#xff0c;页面进行删除的时候&#xff0c;依然报这个错。 但是&#xff0c;对于应付紧急客户需求&#xff0c;可以临时用一下。 2、永久解决 查看页面的Owner…

为什么使用StartAI文生图进行AI绘画?

什么是文生图&#xff1f; 文生图是AIGC中一种先进的图像生成技术&#xff0c;它能够根据用户输入的文字描述&#xff0c;智能地生成相应的图像。无论是抽象的概念&#xff0c;还是具体的物体&#xff0c;文生图都能够以惊人的准确性和艺术性呈现出来。 StartAI文生图如何进行…

7 动态规划

下面的例子不错&#xff1a; 对于动态规划&#xff0c;能学到不少东西&#xff1b; 你要清楚每一步都在做什么&#xff0c;划分细致就能够拆解清楚&#xff01; xk. - 力扣&#xff08;LeetCode&#xff09; labuladong的算法笔记-动态规划-CSDN博客 动态规划是一种强大的算法…

Rethinking Federated Learning with Domain Shift: A Prototype View

CVPR2023,针对分布式数据来自不同的域时,私有模型在其他域上表现出退化性能(具有域转移)的问题。提出用于域转移下联邦学习的联邦原型学习(FPL)。核心思想是构建集群原型和无偏原型,提供富有成效的领域知识和公平的收敛目标。将样本嵌入拉近到属于相同语义的集群原型,而…

@react-google-maps/api实现谷歌地图嵌入React项目中,并且做到点击地图任意一处,获得它的经纬度

1.第一步要加入项目package.json中或者直接yarn install它都可以 "react-google-maps/api": "^2.19.3",2.加入项目中 import AMapLoader from amap/amap-jsapi-loader;import React, { PureComponent } from react; import { GoogleMap, LoadScript, Mar…

【有哪些GPU算力租用平台值得推荐】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

徒手绘制 Android 通用进度条

拖动条&#xff08;FlexSeekBar&#xff09;&#xff0c;在Android的各个地方都非常常用&#xff0c;本文旨在自研一套通用的进度条&#xff0c;非常适合车载App使用 样式如下&#xff1a; 使用示例 <!--默认用法--> <com.max.android.ui.seekbar.FlexSeekBarandroi…

【test】小爱同学通过esp32控制电脑开关

文章目录 一、环境准备二、开关机原理数据传输框架 三、环境搭建1.巴法云平台设置2.米家设置3.windows网络唤醒设置4.搭建esp32开发环境并部署&#xff08;1&#xff09;新建项目&#xff08;2&#xff09;导入esp32库&#xff08;3&#xff09; 添加库&#xff08;4&#xff0…

fluwx插件实现微信支付

Flutter开发使用fluwx插件实现微信支付&#xff0c;代码量不多&#xff0c;复杂的是安卓和iOS的各种配置。 在 pubspec.yaml 文件中添加fluwx依赖 fluwx: ^4.5.5 使用方法 通过fluwx注册微信Api await Fluwx().registerApi(appId: wxea7a1c53d9e5849d, universalLink: htt…

基于SpringBoot的大学生租房系统

该系统主要实现了用户和房主通过系统注册用户&#xff0c;登录系统后能够编辑自己的个人信息、查看首页&#xff0c;房屋信息&#xff0c;房屋评价&#xff0c;公告资讯&#xff0c;个人中心&#xff0c;后台管理&#xff0c;意见反馈等&#xff0c;还可以对后台进行操作&#…

2024年显著性检测部分论文及代码汇总(3)

ICML Size-invariance Matters: Rethinking Metrics and Losses for Imbalanced Multi-object Salient Object Detection code Abstacrt&#xff1a;本文探讨了显著性检测中评价指标的尺寸不变性&#xff0c;尤其是当图像中存在多个大小不同的目标时。作者观察到&#xff0c;…

双指针算法:快速排序模拟实现

目录 1.思路解析 2&#xff1a;代码展示 1.思路解析 使用双指针pre和cur 指针cur用于检测符合条件的数据 cur和pre数据发生交换用于将符合条件的数据&#xff08;比key小&#xff09;向左扔 一轮循环结束时&#xff0c;以pre为分界点&#xff0c;除去key&#xff0c;pre左边的…

物联网IOT,讲的什么?

想象一下,当你早晨醒来,智能咖啡机已经根据你的习惯准备好了香浓的咖啡;家中的温度自动调节至最舒适的状态;出门前,智能冰箱提醒你哪些食材需要补充……这些场景不再是科幻电影里的虚构,而是物联网技术为我们带来的现实便利。 物联网的概念与起源 物联网,顾名思义,是指…

1.HI3559AV100 官方开发板sample运行

1.内核、文件系统部分 有关uboot&#xff0c;kernel&#xff0c;rootfs部分就不赘述&#xff0c;直接在SDK提供的镜像文件进行烧录即可。2.编译MPP下的sample运行 实验前准备&#xff1a;通过NFS方式挂载到开发板与主机通信传输文件 驱动和库的部署&#xff1a;把MPP目录下的…

单例模式详解:概念与实用技巧

目录 单例模式单例模式结构单例模式适用场景单例模式优缺点练手题目题目描述输入描述输出描述输入示例输出示例提示信息题解 单例模式 单例模式是一种创建型设计模式&#xff0c; 让你能够保证一个类只有一个实例&#xff0c; 并提供一个访问该实例的全局节点。 只有一个实例的…

震惊!运气竟能如此放大!运气的惊人作用,你了解吗?

芒格&#xff1a;得到你想要的东西&#xff0c;最保险的办法&#xff0c;就是让自己配得上你想要的那个东西。今天仔细想了想这句话&#xff0c;他其实说的是无数成功人士的心声 —— “我配得上&#xff01;” 美剧《绝命毒师》有个导演叫文斯吉里根&#xff08;Vince Gilliga…