深度强化学习算法(四)(附带MATLAB程序)

深度强化学习(Deep Reinforcement Learning, DRL)结合了深度学习和强化学习的优点,能够处理具有高维状态和动作空间的复杂任务。它的核心思想是利用深度神经网络来逼近强化学习中的策略函数和价值函数,从而提高学习能力和决策效率。

一、关键算法分类

1.1 深度 Q 网络(Deep Q-Network, DQN)
  • 概念:将 Q 学习(一个值函数方法)与深度神经网络结合,用于近似 Q 值函数。
  • 特点:使用经验回放和固定 Q 目标网络来稳定训练过程。
  • 应用:成功应用于 Atari 游戏等环境。
 1.2 双重 Q 学习(Double Q-Learning)
  • 概念:解决 DQN 中 Q 值过估计的问题,通过引入两个 Q 网络来减少过估计。
  • 特点:使用两个独立的 Q 网络交替更新,以减少 Q 值的过高估计。
1.3 优先经验回放(Prioritized Experience Replay)
  • 概念:对经验回放进行优先级排序,以更频繁地训练那些“重要”的样本。
  • 特点:提高了训练的效率和稳定性。
1.4 深度确定性策略梯度(Deep Deterministic Policy Gradient, DDPG)
  • 概念:适用于连续动作空间的策略梯度算法。
  • 特点:使用策略网络和价值网络来逼近策略和价值函数,并利用经验回放和目标网络来稳定训练。
1.5策略梯度方法(Policy Gradient Methods)
  • 概念:直接优化策略函数,通过梯度上升来最大化预期累积回报。
  • 特点:适合处理大规模或连续动作空间。
1.6近端策略优化(Proximal Policy Optimization, PPO)
  • 概念:通过引入一个“剪切”操作来限制每次策略更新的幅度,确保训练稳定。
  • 特点:简单且有效,广泛应用于各种任务。
1.7演员-评论家方法(Actor-Critic Methods)
  • 概念:结合了策略优化(演员)和价值函数(评论家)的方法。
  • 特点:演员负责更新策略,而评论家负责估计价值函数,用于指导演员更新策略。

二、深度确定性策略梯度(Deep Deterministic Policy Gradient, DDPG)算法推导

深度确定性策略梯度(DDPG, Deep Deterministic Policy Gradient)是一种用于处理连续动作空间的强化学习算法。它结合了确定性策略梯度(Deterministic Policy Gradient, DPG)和深度学习技术,用于解决高维状态和动作空间的强化学习问题。下面是 DDPG 算法的详细推导过程。

2.1强化学习背景

在强化学习中,智能体通过与环境交互来学习一个策略,以最大化累计的奖励。对于连续动作空间的问题,策略是一个从状态到动作的映射 \pi \left ( s,\theta \right ),其中\theta 是策略网络的参数。

2.2确定性策略梯度

确定性策略梯度(DPG)算法的核心思想是计算策略函数 \pi \left ( s \right ) 的梯度,并利用这个梯度来更新策略。DPG 的关键是利用策略梯度定理来计算确定性策略的梯度。

策略梯度定理: 对于确定性策略 \pi,其梯度可以表示为:

其中:

  • J\left ( \theta \right )是我们要最大化的期望累计奖励。
  • \rho _{\pi }\left ( s\right )是在策略 \pi下状态的分布。
  • Q^{\pi }\left ( s,a \right ) 是在策略 \pi下,给定状态s 和动作 a 的动作-价值函数。
 2.3DDPG 算法概述

DDPG 将 DPG 的思想与深度学习相结合,使用神经网络来近似策略和价值函数。算法主要包括以下几个组成部分:

  1. 策略网络(Actor Network):用于生成动作\mu \left ( s|\theta ^{\mu } \right )
  2. 价值网络(Critic Network):用于评估动作的价值 Q\left ( s,a|\theta ^{Q} \right )
  3. 目标网络(Target Networks):策略和价值网络的延迟副本,用于稳定训练过程。
 2.3.1策略网络(Actor)

策略网络 \mu \left ( s|\theta ^{\mu } \right )生成给定状态 s 下的动作。策略网络通过最大化期望累计奖励来进行更新,其目标函数为:

J_{actor}\left ( \theta ^{\mu } \right )=IE\left [ Q\left ( s,\mu \left ( s| \theta ^{\mu }\right ) |\theta ^{Q}\right ) \right ]

2.3.2价值网络(Critic)

价值网络 Q\left ( s,a|\theta ^{Q} \right )评估动作的价值。通过最小化均方误差来更新:

 

其中:

  • D 是经验回放池。
  • {Q}'\left ( {s}',{a}' |\theta ^{​{Q}'}\right )是目标价值网络的输出。
  • {\mu }'\left ( {s}' |\theta ^{​{\mu}' }\right ) 是目标策略网络的输出。
2.3.3更新策略网络

通过确定性策略梯度来更新策略网络:

2.3.4目标网络更新

为了提高训练稳定性,使用软更新方法来更新目标网络:

 

 其中 \tau是一个很小的常数(如 0.001)。

2.4 算法流程
  • 初始化策略网络 \mu\left ( s|\theta ^{\mu }\right )和价值网络 Q\left (s ,a |\theta ^{Q}\right )的参数。
  • 初始化目标网络{\mu }'\left ( s|\theta ^{​{\mu}' }\right )和 {Q}'\left (s ,a |\theta ^{​{Q}'}\right )的参数。
  • 初始化经验回放池 D
  • 在每个训练步骤中:
    • 根据当前策略网络生成动作。
    • 执行动作并将经验存储在回放池中。
    • 从回放池中抽取一批经验。
    • 更新价值网络。
    • 更新策略网络。
    • 软更新目标网络。

三、MATLAB仿真程序

以下是一个简单的 MATLAB 程序实现 Deep Deterministic Policy Gradient (DDPG) 算法的示例。这个示例包括了策略网络(Actor Network)、价值网络(Critic Network)、目标网络的创建、经验回放、训练过程等。请注意,这只是一个简化的实现,具体应用可能需要根据问题调整网络架构和参数设置。以下是 DDPG 算法的 MATLAB 实现,包括了策略网络、价值网络、训练循环等。

3.1初始化和参数设置
% 设定超参数
numStates = 3; % 状态空间维度
numActions = 1; % 动作空间维度
actorHiddenLayer = 64; % Actor 网络隐藏层神经元数目
criticHiddenLayer = 64; % Critic 网络隐藏层神经元数目
gamma = 0.99; % 折扣因子
tau = 0.001; % 目标网络软更新因子
alpha = 0.001; % Actor 网络学习率
beta = 0.002; % Critic 网络学习率
batchSize = 64; % 批量大小
bufferSize = 1000000; % 经验回放池大小% 创建 Actor 和 Critic 网络
actorNetwork = createActorNetwork(numStates, numActions, actorHiddenLayer);
criticNetwork = createCriticNetwork(numStates, numActions, criticHiddenLayer);% 创建目标网络
targetActorNetwork = cloneNetwork(actorNetwork);
targetCriticNetwork = cloneNetwork(criticNetwork);% 创建经验回放池
replayBuffer = ReplayBuffer(bufferSize);% 训练循环参数
maxEpisodes = 1000;
maxStepsPerEpisode = 200;
3.2网络创建函数
function actorNetwork = createActorNetwork(numStates, numActions, hiddenLayerSize)actorLayers = [featureInputLayer(numStates, 'Normalization', 'none', 'Name', 'state')fullyConnectedLayer(hiddenLayerSize, 'Name', 'fc1')reluLayer('Name', 'relu1')fullyConnectedLayer(hiddenLayerSize, 'Name', 'fc2')reluLayer('Name', 'relu2')fullyConnectedLayer(numActions, 'Name', 'fc3')tanhLayer('Name', 'tanh') % 输出动作范围 -1 到 1];actorOptions = trainingOptions('adam', 'InitialLearnRate', 1e-4, 'Plots', 'none');actorNetwork = dlnetwork(layerGraph(actorLayers));
endfunction criticNetwork = createCriticNetwork(numStates, numActions, hiddenLayerSize)statePath = [featureInputLayer(numStates, 'Normalization', 'none', 'Name', 'state')fullyConnectedLayer(hiddenLayerSize, 'Name', 'fc1')reluLayer('Name', 'relu1')];actionPath = [featureInputLayer(numActions, 'Normalization', 'none', 'Name', 'action')fullyConnectedLayer(hiddenLayerSize, 'Name', 'fc2')reluLayer('Name', 'relu2')];combinedPath = [concatenationLayer(1, 2, 'Name', 'concat')fullyConnectedLayer(1, 'Name', 'fc3') % 价值函数输出];criticLayers = [statePathactionPathcombinedPath];criticOptions = trainingOptions('adam', 'InitialLearnRate', 1e-3, 'Plots', 'none');criticNetwork = dlnetwork(layerGraph(criticLayers));
end
3.3经验回放池实现
classdef ReplayBuffer < handlepropertiesbuffersizecapacityidxendmethodsfunction obj = ReplayBuffer(capacity)obj.capacity = capacity;obj.size = 0;obj.idx = 1;obj.buffer.states = [];obj.buffer.actions = [];obj.buffer.rewards = [];obj.buffer.nextStates = [];obj.buffer.dones = [];endfunction add(obj, state, action, reward, nextState, done)if obj.size < obj.capacityobj.size = obj.size + 1;endobj.buffer.states(:, obj.idx) = state;obj.buffer.actions(:, obj.idx) = action;obj.buffer.rewards(:, obj.idx) = reward;obj.buffer.nextStates(:, obj.idx) = nextState;obj.buffer.dones(:, obj.idx) = done;obj.idx = mod(obj.idx, obj.capacity) + 1;endfunction [states, actions, rewards, nextStates, dones] = sample(obj, batchSize)idx = randperm(obj.size, batchSize);states = obj.buffer.states(:, idx);actions = obj.buffer.actions(:, idx);rewards = obj.buffer.rewards(:, idx);nextStates = obj.buffer.nextStates(:, idx);dones = obj.buffer.dones(:, idx);endend
end
3.4训练循环
for episode = 1:maxEpisodesstate = env.reset(); % 环境重置episodeReward = 0;for step = 1:maxStepsPerEpisode% 根据当前策略选择动作action = predict(actorNetwork, state);action = action + 0.1 * randn(size(action)); % 添加噪声以探索% 执行动作并获得新状态和奖励[nextState, reward, done] = env.step(action);% 存储经验到回放池replayBuffer.add(state, action, reward, nextState, done);% 从回放池中抽取一批经验[states, actions, rewards, nextStates, dones] = replayBuffer.sample(batchSize);% 更新 Critic 网络targetActions = predict(targetActorNetwork, nextStates);targetQValues = predict(targetCriticNetwork, [nextStates, targetActions]);targetQValues = rewards + gamma * (1 - dones) .* targetQValues;criticLoss = mean((predict(criticNetwork, [states, actions]) - targetQValues).^2);criticNetwork = train(criticNetwork, states, actions, criticLoss, beta);% 更新 Actor 网络actions = predict(actorNetwork, states);actorLoss = -mean(predict(criticNetwork, [states, actions]));actorNetwork = train(actorNetwork, states, actorLoss, alpha);% 软更新目标网络targetActorNetwork = updateTargetNetwork(targetActorNetwork, actorNetwork, tau);targetCriticNetwork = updateTargetNetwork(targetCriticNetwork, criticNetwork, tau);episodeReward = episodeReward + reward;state = nextState;if donebreak;endendfprintf('Episode: %d, Reward: %.2f\n', episode, episodeReward);
end
3.5辅助函数
function network = updateTargetNetwork(targetNetwork, sourceNetwork, tau)targetWeights = targetNetwork.Layers(1:end-1).Weights;sourceWeights = sourceNetwork.Layers(1:end-1).Weights;targetNetwork.Layers(1:end-1).Weights = tau * sourceWeights + (1 - tau) * targetWeights;
endfunction trainedNetwork = train(network, states, actions, loss, learningRate)% 训练函数的实现取决于具体的优化方法% 在实际应用中,通常会使用自动微分工具来计算梯度并更新网络% 这里仅提供伪代码grads = dlgradient(loss, network.Learnables);trainedNetwork = adamupdate(network, grads, learningRate);
end

说明

  1. 网络创建createActorNetworkcreateCriticNetwork 用于创建 Actor 和 Critic 网络。
  2. 经验回放池ReplayBuffer 类用于存储和抽取经验。
  3. 训练循环:在每个训练步骤中,智能体与环境交互,存储经验,更新网络,软更新目标网络。

注意事项

  • 以上代码是一个简化的示例,实际应用中可能需要更多的调整和优化。
  • 训练过程中的网络更新和目标网络的软更新方法需要根据具体情况进行优化。
  • 确保你有一个合适的环境接口(env),以便与环境进行交互。

根据实际需求,你可以进一步调整网络结构、超参数等,以获得更好的训练效果。

四、总结

DDPG 通过使用确定性策略梯度和深度神经网络,能够有效地处理高维连续动作空间的强化学习任务。它结合了价值函数和策略函数的深度学习方法,以及稳定训练的目标网络和经验回放机制,为连续控制问题提供了一个强大的解决方案。

 注意:回顾以往算法可以从以下链接进入:

1、深度 Q 网络(Deep Q-Network, DQN):深度强化学习算法(一)(附带MATLAB程序)-CSDN博客

2、双重 Q 学习(Double Q-Learning):深度强化学习算法(二)(附带MATLAB程序)-CSDN博客

3.优先经验回放(Prioritized Experience Replay):

深度强化学习算法(三)(附带MATLAB程序)-CSDN博客

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

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

相关文章

鸿誉移民:定制化移民服务,吹响全球高效率移民的嘹亮号角!

鸿誉移民&#xff1a;定制化移民服务&#xff0c;吹响全球高效率移民的嘹亮号角&#xff01; 作为国内知名海外移民服务机构&#xff0c;鸿誉移民历经多年行业沉淀&#xff0c;拥有着极其丰富的移民咨询以及移民办理经验&#xff0c;并以咨询及时精准&#xff0c;签证快捷、通…

【数据结构】Map的使用与注意事项

文章目录 概念模型Map 的使用put() 和 get()getOrDefault()remove()keySet()entrySet() 注意事项 概念 Map 和 set 是一种专门用来进行搜索的容器或者数据结构&#xff0c;其搜索的效率与其具体的实例化子类有关。 以前常见的搜索方式有&#xff1a; 直接遍历&#xff0c;时间…

URP简洁的instance的写法

材质还是要开启enable instance&#xff0c;这是上一次的写法 https://dbbh666.blog.csdn.net/article/details/136644181 最近发现更适合我个人的习惯的写法 就是代码控制这个整个过程 C#代码是这样的&#xff0c;获取一个mesh&#xff0c;获取每个mesh的transform&#xff0c…

常见的性能测试方法!

前言 性能测试划分有很多种&#xff0c;测试方法也有很多种&#xff0c;更确切的说是由于测试方法的不同决定了测试划分的情况&#xff0c;但在测试过程中性能测试的划分没有绝对的界限&#xff0c;常用的有压力测试、负载测试和并发用户测试等。 性能测试的方法主要包括以下…

stm32之硬件I2C读写MPU6050陀螺仪、加速度传感器应用案例

系列文章目录 1. stm32之I2C通信协议 2. stm32之软件I2C读写MPU6050陀螺仪、加速度传感器应用案例 3. stm32之I2C通信外设 文章目录 系列文章目录前言一、电路接线图二、应用案例代码三、应用案例分析3.1 基本思路3.2 相关库函数介绍3.3 MPU6050模块3.1.1 模块初始化3.1.2 指定…

52 mysql 启动过程中常见的相关报错信息

前言 我们这里主要是看一下 service mysql start, service mysql stop 的过程中的一些常见的错误问题 这些 也是之前经常碰到, 但是 每次都是 去搜索, 尝试 1, 2, 3, 4 去解决问题 但是 从来未曾思考过 这个问题到底是 怎么造成的 The server quit without updating PID fil…

vrrp协议,主备路由器的选举

当VRRP备份组中的所有备份路由器&#xff08;BACKUP&#xff09;具有相同的优先级时&#xff0c;选举新的主路由器&#xff08;MASTER&#xff09;的过程将基于以下规则&#xff1a; IP地址优先&#xff1a;如果备份路由器的优先级相同&#xff0c;那么具有最高IP地址的路由器…

我的sql我做主!Mysql 的集群架构详解之组从复制、半同步模式、MGR、Mysql路由和MHA管理集群组

目录 Mysql 集群技术一、Mysql 在服务器中的部署方法1.1 在Linux下部署mysql1.1.1 安装依赖性&#xff1a;1.1.2 下载并解压源码包1.1.3 源码编译安装mysql1.1.4 部署mysql 二、Mysql的组从复制2.1 配置mastesr2.2 配置salve2.3 当有数据时添加slave22.4 延迟复制2.5 慢查询日志…

Python爬虫02

xml 和html 区别 jsonpath模块 场景 多层嵌套的复杂字典直接提取数据 安装 pip install jsonpath使用 from jsonpath import jsonpathret jsonpath(dict, jaonpath语法规则字符串)语法规则 eg: lxml模块&xpath语法 谷歌浏览器 xpath helper 插件 作用对当前页面…

HIS系统|HIS系统开发源码

在数字医疗时代&#xff0c;医院信息系统&#xff08;HIS&#xff09;的开发至关重要。本文将深入探讨在开发HIS系统时需要关注的主要事项&#xff0c;从系统架构到数据安全&#xff0c;为医疗机构提供实用的开发指南。 1、需求分析与系统规划 在开发HIS系统的初期&#xff0c…

HTML5手机端通用网站模板源码

文章目录 1.设计来源1.1 主界面1.2 文章信息界面1.3 文章列表界面1.4 双列文章列表界面1.5 通用标签界面1.6 联系我界面1.7 折叠框标签界面1.8 相关界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作…

UE 【材质编辑】自定义ShadingMode

【UE 4.27.2】 在UE中提供了多种多样的ShadingMode&#xff0c;相当于一种风格化的处理方案(整体全面的流程调整)&#xff0c;切换ShadingMode可以看到不同的显示效果&#xff1a; 通过简单的拓展&#xff0c;我们可以实现自定义的ShadingMode&#xff0c;使得我们切换到自己的…

DevOps学习笔记

记录以下DevOps学习笔记&#xff0c;这里是笔记的入口汇总&#xff0c;可以直观的看到所有的笔记&#xff0c;还没有入口的部分&#xff0c;在下正在努力编写中。 gitlab jenkins docker docker安装 artifactory 1.artifactory安装 2.artifactory使用 计算机网络 1.dn…

MySQL:约束

目录 一、概述二、创建测试三、外键约束3.1 数据准备3.2 添加外键3.3 删除外键3.4 增加外键约束 一、概述 约束主要用于作用在表中字段上的规则&#xff0c;用于限制存储在表中的数据。 保证数据库中数据的正确性、有效性和完整性。 约束描述关键字主键约束非空并且唯一PRIMARY…

【Vue】Echart渲染数据时页面不显示内容

背景 做的一个对话交互的功能&#xff0c;根据后台返回的数据&#xff0c;渲染成Echart图表展示因为图表种类多&#xff0c;因此根据不同图表单独做了一个个vue组件&#xff0c;将数据根据展示类型传到这些子组件中进行渲染无论哪种图表&#xff0c;第一次展示时都能正常展示&…

【Threejs学习】材质灯光投影

一、光源分类 环境光(AmbientLight)&#xff1a;会均匀的照亮场景中的所有物体。无方向&#xff0c;不能投射阴影。平行光(DirectionalLight)&#xff1a;沿特定方向散发的光&#xff0c;发出的光线都是平行的。例如太阳光&#xff0c;可投射阴影。点光源(PointLight)&#xf…

基础闯关5

一、XTuner简介 XTuner 是一个高效、灵活、全能的轻量化大模型微调工具库。 高效 支持大语言模型 LLM、多模态图文模型 VLM 的预训练及轻量级微调。XTuner 支持在 8GB 显存下微调 7B 模型&#xff0c;同时也支持多节点跨设备微调更大尺度模型&#xff08;70B&#xff09;。自…

足球大小球预测及足球大数据之机器学习预测大小球

足球运动是当今世界上开展最广、影响最大、最具魅力、拥有球迷数最多的体育项目之一&#xff0c;尤其是欧洲足球&#xff0c;每年赛事除了五大联赛&#xff08;英超、西甲、德甲、法甲、意甲&#xff09;之外&#xff0c;还会有欧冠&#xff08;欧洲冠军联赛&#xff09;&#…

chapter10-OOP高级部分——(静态内部类)——day14

422-静态内部类1 423-静态内部类2 424-内部类测试 输出两个5 我亦无他&#xff0c;唯手熟尔

mfc140u.dll丢失的解决方法都有哪些?有效的将丢失的mfc140u.dll恢复

在使用基于Windows系统的电脑运行某些应用程序时&#xff0c;可能会遇到一个提示错误&#xff1a;“mfc140u.dll文件丢失”。这通常意味着你的系统缺少某个必要的动态链接库&#xff08;DLL&#xff09;文件&#xff0c;这可能会阻止程序正常运行。本文将向你介绍一系列有效的解…