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

news2024/9/22 17:37:29

深度强化学习(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));
end

function 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 = [
        statePath
        actionPath
        combinedPath
        ];
    criticOptions = trainingOptions('adam', 'InitialLearnRate', 1e-3, 'Plots', 'none');
    criticNetwork = dlnetwork(layerGraph(criticLayers));
end
3.3经验回放池实现
classdef ReplayBuffer < handle
    properties
        buffer
        size
        capacity
        idx
    end
    methods
        function 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 = [];
        end
        
        function add(obj, state, action, reward, nextState, done)
            if obj.size < obj.capacity
                obj.size = obj.size + 1;
            end
            
            obj.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;
        end
        
        function [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);
        end
    end
end
3.4训练循环
for episode = 1:maxEpisodes
    state = 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 done
            break;
        end
    end
    
    fprintf('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;
end

function 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.coloradmin.cn/o/2086143.html

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

相关文章

【项目日记】高并发内存池---实现线程缓存

比起那些用大嗓门企图压制世界的人&#xff0c; 让全世界都安静下来听你小声说话的人更可畏。 --- 韩寒 《告白与告别》--- 高并发内存池项目---实现线程缓存 1 框架设计2 自由链表类和哈希规则2.1 自由链表类2.2 映射规则 3 实现线程缓存3.1 申请内存3.2 释放内存 4 多线程…

day-43 盛最多水的容器

思路 双指针&#xff1a;首先令i0,jheight.length-1,选取短板&#xff08;即Math.min(height[i],height[j])&#xff09;,然后将短板向内移动&#xff0c;直达i>j即可得到答案。 解题过程 短板向内移动&#xff1a;水的容量可能增大 长板向内移动&#xff1a;水的容量不可能…

树莓派5安装系统并配置SSH与VNC权限实现Windows设备远程连接

文章目录 前言1. 使用 Raspberry Pi Imager 安装 Raspberry Pi OS2. Windows安装VNC远程树莓派3. 使用VNC Viewer公网远程访问树莓派3.1 安装Cpolar步骤3.2 配置固定的公网地址3.3 VNC远程连接测试 4. 固定远程连接公网地址4.1 固定TCP地址测试 前言 本文主要介绍如何在树莓派…

数字化转型升级探索(一)

在数字化转型升级的探索中&#xff0c;我们将通过实施综合数字化战略&#xff0c;涵盖从前端用户体验优化到后端系统集成的全方位提升&#xff0c;利用大数据、人工智能、云计算等先进技术对业务流程进行智能化改造&#xff0c;推进自动化和数据驱动决策&#xff0c;推动业务模…

VMware安装Ubuntu 23.10.1系统图文版

文章目录 Ubuntu系统介绍引言Ubuntu系统的特点1. 开源免费2. 易用性3. 稳定性与安全性4. 强大的社区支持 安装与初步设置下载ISO镜像安装1.新建虚拟机2.选择“自定义(高级)”&#xff0c;并点击【下一步】3.选择虚拟机硬件兼容性(默认就好)&#xff0c;并点击【下一步】4.选择“…

爆改yolov8|利用BSAM改进YOLOv8,高效涨点

1&#xff0c;本文介绍 BSAM基于CBAM进行改进&#xff0c;经实测在多个数据集上都有涨点。 BSAM&#xff08;BiLevel Spatial Attention Module&#xff09;是一个用于提升深度学习模型在空间特征处理中的能力的模块。它主要通过双层注意力机制来增强模型对重要空间信息的关注…

一款支持固定区域,固定尺寸大小重复截图的软件

WinSnap是一款功能强大的屏幕截图软件&#xff0c;可以实现对固定区域&#xff0c;固定尺寸大小区域重复截图&#xff0c;适用于日常截图需求和专业用户进行屏幕截图和图像编辑。通过设置快捷键&#xff0c;方便快速重复截图固定区域固定大小。它支持捕捉整个屏幕、活动窗口、选…

H264码流结构讲解

所谓的码流结构就是指&#xff1a;视频经过编码之后所得到的数据是怎样排列的&#xff0c;换句话说&#xff0c;就是编码后的码流我们该如何将一帧一帧的数据分离开来&#xff0c;哪一块数据是一帧图像&#xff0c;哪一块是另外一帧图像&#xff0c;只要了解了这个&#xff0c;…

UE开发中的设计模式(四) —— 组合模式

面试中被面试官问到组合模式和继承有什么区别&#xff0c;给我问懵了&#xff0c;今天又仔细看了下&#xff0c;这不就是UE里的组件吗 >_< 文章目录 问题提出概述问题解决总结组合模式的优缺点继承的优缺点 问题提出 考虑这样一个场景&#xff0c;我们有一个敌人的基类&…

【读书笔记-《30天自制操作系统》-10】Day11

本篇内容继续围绕显示展开。首先对鼠标显示做了些优化&#xff0c;鼠标箭头在到达画面边缘时能够实现部分隐藏&#xff1b;接下来制作了窗口&#xff0c;实现了窗口显示&#xff1b;最后还在窗口的基础上实现了计数器&#xff0c;显示计数的变化并消除闪烁的问题。 1. 画面边…

Java 6.3 - 定时任务

为什么需要定时任务&#xff1f; 常见业务场景&#xff1a; 1、支付10min失效 2、某系统凌晨进行数据备份 3、视频网站定时发布视频 4、媒体聚合平台每10min抓取某网站数据为己用 …… 这些场景需要我们在某个特定时间去做某些事情。 单机定时任务技术有哪些&#xff1f…

form-data和x-www-form-urlencoded的区别

form-data和x-www-form-urlencoded区别 form-data 和 x-www-form-urlencoded 都是表单请求的一种格式&#xff0c;主要区别有两点。 编码方式不同 我们先说x-www-form-urlencoded&#xff0c;它的编码方式就隐藏在名字里&#xff1a;urlencoded。看到这个关键词&#xff0c;…

Gradle下载失败或者慢怎么办

在Android Studio开发过程中&#xff0c;经常需要下载Gradle构建工具来构建项目。然而&#xff0c;由于网络限制或国际镜像服务器响应慢&#xff0c;Gradle的下载过程可能会非常缓慢甚至失败。为了优化这一过程&#xff0c;我们可以采用国内的Gradle镜像来加速下载。同时&#…

期权的交易时间是什么时候?期权具体交易时间分享!

今天带你了解期权的交易时间是什么时候&#xff1f;期权具体交易时间分享&#xff01;期权交易时间与股票市场同步&#xff0c;每个交易日的上午9:15至11:30和下午13:00至15:00为主要的交易时间。 50ETF期权交易时间 1.50ETF期权交割日&#xff1a; 固定的规则&#xff1a; …

FLUX 1 将像 Stable Diffusion 一样完整支持ControlNet组件

之前 InstantX 团队做的多合一的 Flux ControlNet 现在开始和 ShakkerAI 合作并推出了&#xff1a;Shakker-Labs/FLUX.1-dev-ControlNet-Union-Pro 该模型支持 7 种控制模式&#xff0c;包括 canny (0), tile (1), depth (2), blur (3), pose (4), gray (5) 和 low quality (6)…

Priority_Queue 的使用和模拟

目录 一基本的介绍 优先队列是一种容器适配器&#xff1b;他的第一个元素总是他包含所有元素里面最大的一个。 他的底层容器可以是任何标准容器类模板&#xff0c;也可以是其他特定设计的容器类。 这个底层容器应该可以通过随机访问迭 代器&#xff0c;并支持以下操作&#x…

【LINUX】ifconfig -a查看到的发送、接收包数和字数字节数在驱动层代码大概位置

先看结果 ifconfig -a查看到发送的信息&#xff1a; 从上图可以看出来网卡驱动代码的目录是在drivers/net/ethernet/intel/e1000/e1000_main.c 下图是接收到的信息&#xff1a; 不过这些数据是在虚拟机看到的&#xff0c;如果有条件可以在实际的物理网卡测试看看效果。 下边这…

IO进程线程 0828作业

作业 有名管道&#xff0c;创建两个发送接收端&#xff0c;父进程写入管道1和管道2&#xff0c;子进程读取管道2和管道1 mkfifo1.c代码 #include <myhead.h> int main(int argc, const char *argv[]) {if(mkfifo("./my_fifo1",0664) -1){perror("mkfi…

轻量级数据库

在计算机编程中&#xff0c;句柄&#xff08;Handle&#xff09;是一种用于标识和引用系统内部对象的标识符。句柄通常是一个不透明的指针或整数值&#xff0c;它代表了一个系统资源&#xff0c;如文件、窗口、进程、线程、内存映射文件等。句柄的主要作用是在程序中引用这些资…