当前位置: 首页 > news >正文

深度强化学习算法(四)(附带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博客

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于imx6ull平台opencv的图像采集和显示屏LCD显示功能(不带Qt界面)
  • CMake Error at CMakeLists.txt (find_package)幕后真凶
  • Linux之ip命令详解
  • Dockerfile+私有仓库
  • 创新互动体验RAG:利用角色化AI技术增强影视评论的沉浸感
  • [mysql]mysql的演示使用
  • linux下使用xargs批量操作
  • 数据结构与算法的代码实现(C++版)
  • 设计模式 代理模式(Proxy Pattern)
  • 一个简单的CRM客户信息管理系统,提供客户,线索,公海,联系人,跟进信息和数据统计功能(附源码)
  • Maven学习(零基础到面试)
  • 【Qt窗口】—— 浮动窗口
  • DARKTIMES集成到Sui,带来中世纪格斗大逃杀游戏体验
  • 【教程】实测np.fromiter 和 np.array 的性能
  • GCViT实战:使用GCViT实现图像分类任务(一)
  • Android交互
  • Computed property XXX was assigned to but it has no setter
  • Median of Two Sorted Arrays
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Node + FFmpeg 实现Canvas动画导出视频
  • select2 取值 遍历 设置默认值
  • Sequelize 中文文档 v4 - Getting started - 入门
  • SQL 难点解决:记录的引用
  • SwizzleMethod 黑魔法
  • VUE es6技巧写法(持续更新中~~~)
  • Vue UI框架库开发介绍
  • 解析 Webpack中import、require、按需加载的执行过程
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 区块链将重新定义世界
  • 如何在GitHub上创建个人博客
  • 入门到放弃node系列之Hello Word篇
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • #70结构体案例1(导师,学生,成绩)
  • #java学习笔记(面向对象)----(未完结)
  • #QT(串口助手-界面)
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • %check_box% in rails :coditions={:has_many , :through}
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (day 12)JavaScript学习笔记(数组3)
  • (八)c52学习之旅-中断实验
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (二)hibernate配置管理
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (回溯) LeetCode 40. 组合总和II
  • (一) 初入MySQL 【认识和部署】
  • .net 4.0发布后不能正常显示图片问题
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET 命令行参数包含应用程序路径吗?
  • .NET 某和OA办公系统全局绕过漏洞分析