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

news2024/12/23 3:46:24

深度强化学习(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)
  • 概念:结合了策略优化(演员)和价值函数(评论家)的方法。
  • 特点:演员负责更新策略,而评论家负责估计价值函数,用于指导演员更新策略。

二、 优先经验回放(Prioritized Experience Replay)算法推导

优先经验回放(Prioritized Experience Replay, PER)是一种用于强化学习中经验回放的技术,旨在改进Q-learning或深度Q网络(DQN)的学习效率。PER的核心思想是根据经验的“重要性”来优先选择回放中的经验,从而加速学习过程并提高学习效率。以下是PER的算法推导过程:

2.1经验回放基础

在经典的经验回放(Experience Replay)中,智能体将经历过的转移(状态、动作、奖励、下一个状态)存储在经验池中,然后从中随机抽取一小批样本来更新Q值。随机抽样的主要目的是打破经验之间的相关性,以提高学习的稳定性。

2.2经验的优先级

在PER中,不同的经验在回放时的重要性是不同的。优先级较高的经验通常能提供更多的学习信号,从而能更快地改进策略。为了实现这种优先级的排序,我们需要定义经验的优先级。

2.3优先级的定义

PER使用一个优先级函数来评估每条经验的重要性。一般而言,优先级可以通过经验的“TD误差”(Temporal Difference Error)来衡量。TD误差反映了当前Q值估计与实际回报之间的差异。公式如下:

TD Error=\left | r+\gamma max_{​{a}'} Q\left ( {s}' ,{a}'\right )-Q\left ( s,a \right )\right |

其中:

  • r是即时奖励。
  • \gamma是折扣因子。
  • Q\left ( {s}',{a}' \right )是下一个状态-动作对的Q值。
  • Q\left ( s,a \right )是当前状态-动作对的Q值。
2.4经验优先级的计算

经验的优先级通常与TD误差成正比。为了避免TD误差为零导致的优先级为零的情况,通常对TD误差进行平滑处理:
p_{i}=\left | \delta _{i} \right |+\varepsilon

其中:

  • \delta _{i}是第 i个经验的TD误差。
  • \varepsilon 是一个小常数,用于保证每个经验都有一定的优先级。
2.5优先级经验回放机制

为了高效地实现优先级经验回放,使用了一个优先级队列或树状数据结构来维护经验的优先级。常用的数据结构是优先级队列(Priority Queue)Segment Tree(段树)

2.5.1Segment Tree 实现

使用Segment Tree可以高效地管理和查询优先级。Segment Tree 的叶子节点存储每条经验的优先级,内部节点存储子节点的优先级之和。这样可以快速更新优先级和采样经验。

2.5.2采样和更新

采样时,根据优先级分布来选择经验。在每次更新时,利用当前的TD误差来更新经验的优先级。

2.6重要性采样(Importance Sampling)

由于采用了优先级采样,样本的分布和实际的经验池分布可能会有所不同。为了纠正这种偏差,PER引入了重要性采样(Importance Sampling)权重。具体来说,对于每条经验 iii,计算其重要性采样权重:

\omega _{i}=\left (\frac{1}{N\cdot p_{i}} \right )^{\beta }

其中:

  • N是经验池的总大小。
  • \beta是重要性采样的调整参数,用于平衡偏差和方差,通常在训练过程中逐渐增加。
2.7算法流程整理

      (1)存储经验:将每个经验存储到经验池中,并根据其TD误差计算优先级

      (2)采样经验:根据优先级分布采样经验。

      (3)更新Q值:使用采样的经验更新Q值,并计算新的TD误差。

      (4)更新优先级:根据新的TD误差更新每条经验的优先级。

      (5)调整重要性采样权重:更新重要性采样权重 wiw_iwi​。

三、MATLAB程序仿真

编写优先经验回放(Prioritized Experience Replay, PER)算法的 MATLAB 仿真程序涉及几个主要步骤:构建经验池、维护优先级队列、采样经验、更新优先级和训练模型。以下是一个 MATLAB 仿真程序的示例,它实现了 PER 算法的基本功能。

3.1数据结构与初始化

首先,我们需要定义用于存储经验和优先级的结构。这里,我们使用一个简单的优先级队列来存储经验。

3.1.1优先级队列类
classdef PriorityQueue < handle
    properties
        tree
        capacity
        size
        data
    end
    
    methods
        function obj = PriorityQueue(capacity)
            obj.capacity = capacity;
            obj.tree = zeros(2 * capacity - 1, 1);
            obj.size = 0;
            obj.data = cell(capacity, 1);
        end
        
        function index = add(obj, experience, priority)
            index = mod(obj.size, obj.capacity) + 1;
            obj.data{index} = experience;
            obj.update(index, priority);
            obj.size = obj.size + 1;
        end
        
        function update(obj, index, priority)
            treeIndex = index + obj.capacity - 1;
            obj.tree(treeIndex) = priority;
            while treeIndex > 1
                treeIndex = floor(treeIndex / 2);
                obj.tree(treeIndex) = max(obj.tree(2 * treeIndex), obj.tree(2 * treeIndex + 1));
            end
        end
        
        function [experience, priority] = sample(obj, beta)
            [priority, index] = obj.sampleTree();
            experienceIndex = mod(index, obj.capacity) + 1;
            experience = obj.data{experienceIndex};
            priorityWeight = (1 / (obj.capacity * priority)) ^ beta;
        end
        
        function [priority, index] = sampleTree(obj)
            treeIndex = 1;
            while treeIndex < obj.capacity
                leftChild = 2 * treeIndex;
                rightChild = 2 * treeIndex + 1;
                if rand < obj.tree(leftChild) / (obj.tree(leftChild) + obj.tree(rightChild))
                    treeIndex = leftChild;
                else
                    treeIndex = rightChild;
                end
            end
            index = treeIndex - obj.capacity + 1;
            priority = obj.tree(treeIndex);
        end
    end
end
3.1.2初始化优先级队列
capacity = 10000; % 经验池的容量
alpha = 0.6; % 优先级的功率因子
beta = 0.4; % 重要性采样的权重
priorityQueue = PriorityQueue(capacity);
3.2存储和更新经验

存储经验和更新优先级的函数:

function storeExperience(priorityQueue, experience, priority)
    priorityQueue.add(experience, priority);
end

function updateExperience(priorityQueue, index, priority)
    priorityQueue.update(index, priority);
end
3.3采样经验

采样经验并计算重要性采样权重的函数:

function [batch, idxs, weights] = sampleExperience(priorityQueue, batchSize, beta)
    batch = cell(batchSize, 1);
    idxs = zeros(batchSize, 1);
    weights = zeros(batchSize, 1);
    for i = 1:batchSize
        [experience, priority] = priorityQueue.sample(beta);
        idxs(i) = experience{end}; % 这里假设经验的最后一个元素是索引
        batch{i} = experience;
        weights(i) = (1 / (priority * batchSize)) ^ beta;
    end
end
3.4更新模型
function updateModel(batch, weights, model)
    % 使用 batch 和 weights 更新模型
    % 这是一个简化的占位符,需要根据具体的模型实现进行更新
end
3.5主循环

最后,整合这些功能来进行训练:

numEpisodes = 1000; % 总的训练回合数
batchSize = 32; % 批量大小
for episode = 1:numEpisodes
    % 交互与存储经验的过程
    % experience = [s, a, r, s']
    % priority = abs(TD_error) + epsilon
    % storeExperience(priorityQueue, experience, priority);

    if priorityQueue.size >= batchSize
        [batch, idxs, weights] = sampleExperience(priorityQueue, batchSize, beta);
        % TD误差计算和优先级更新
        % 更新模型
        % updateModel(batch, weights, model);
    end
end

四、总结

优先级经验回放通过根据经验的重要性调整采样概率,能够提高学习效率和训练速度。通过优先级的动态调整和重要性采样的补偿,PER使得学习过程更加有效,并能更快地收敛到优良策略。

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

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

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

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

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

相关文章

光性能 -- 光功率平坦度

什么是光功率平坦度? 光功率平坦度指的是&#xff0c;光放各单波功率值与所有波平均值的功率差。 通过MCA&#xff08;多通道光谱分析单元&#xff09;扫描OMS&#xff08;光复用段&#xff09;上的所有单波光功率&#xff0c;计算经过光放的所有波长的功率平均值&#xff0…

OHIF viewers

OHIF Viewer 是一个开源的 DICOM&#xff08;数字成像和通信医学&#xff09;图像查看器&#xff0c;旨在为医疗影像学提供一个灵活且功能强大的解决方案。以下是 OHIF Viewer 的详细介绍&#xff0c;包括发展史、特点、优势、应用及目的等方面的信息。 1. 介绍 OHIF Viewer 是…

一个初始化的服务器,需要配置的相关软件以及环境(cuda、torch、conda)

文章目录 一个刚初始化的服务器需要下载的应用google chromeghelp 解压安装包解压大型zip文件 更新nvidia的驱动pycharm设置conda相关下载condaconda换源 torch相关安装torch包&#xff0c;浏览器下载包安装pytorch常用包安装 导包的方法 一个刚初始化的服务器需要下载的应用 …

【AI】:探索在图像领域的无限可能

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 图像识别与分类的飞跃图像生成与创造的艺术图像增强与修复的神奇图像搜索与理解的智能图像分析与挖掘的洞察图形生成技术1. 生成对抗网络&#xff08;GANs&#xff09;2. 卷积神经网络&#xff08;CN…

Jenkins+Docker | K8S虚拟化实现网站自动部署 简单流程 未完待续,,

目录 大纲 1.Jenkins 的设置与 Docker、Kubernetes 集成指南 1. 创建新的Pipeline项目或Freestyle项目 1.1 创建Pipeline项目 1.2 创建Freestyle项目 2. 配置源代码管理 2.1 配置Git作为源代码管理工具 3. 配置构建触发器 4. 配置构建步骤 4.1 对于Pipeline项目 4.2…

Threadlocal+拦截器+JWT实现登录

很多数据库表都会有创建时间和修改时间&#xff0c;这个可以用mp的自动填充来实现。 也有修改人和更新人的字段&#xff0c;用户登录进来后&#xff0c;修改数据如何拿到修改人呢&#xff1f;每次操作不能把操作人的信息都携带者&#xff0c;那么如何拿到修改人的数据&#xf…

数学建模赛前备赛——模拟退火算法

一.什么是智能优化算法 智能优化算法本质上是一个优化算法,它通过不断优化模型的参数,使得系统表现达到最优&#xff0c;常见的只能优化算法有很多&#xff0c;比如说蚁群算法,遗传算法以及我们今天的主角——模拟退火算法。 二.模拟算法的前身——爬山算法 爬山算法是一种简…

【Python入门】第1节 基础语法

&#x1f4d6;第1节 基础语法 ✅字面量✅注释✅变量✅数据类型&#x1f9ca;数据类型转换 ✅标识符✅运算符✅字符串扩展&#x1f9ca;字符串的三种定义方式&#x1f9ca;字符串拼接&#x1f9ca;字符串格式化&#x1f9ca;格式化的精度控制&#x1f9ca;字符串格式化方式2&…

equals与== 区别,全面总结如何使用(Java)

先理解JVM内存模型 虚拟机栈&#xff1a;JVM 运行过程中存储当前线程运行方法所需的数据&#xff0c; 指令、 返回地址本地方法栈&#xff1a;Java程序自动调用底层C/C函数库程序计数器&#xff1a;当前线程执行的字节码的行号指示器堆&#xff1a;存放我们申请的对象&#xff…

【Python 千题 —— 基础篇】入门异常处理

Python 千题持续更新中 …… 脑图地址 👉:⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目描述 题目描述 编写一个程序,要求在处理用户输入时捕获各种异常情况,并为每种异常提供相应的处理方式。具体要求如下: 定义一个函数 divide_numbers(),它接…

php mail函数配置SMTP服务器发邮件的指南!

php mail函数安全性考虑&#xff1f;PHP mail()函数漏洞利用技巧&#xff1f; 在使用PHP进行开发时&#xff0c;发送邮件是一个常见的需求。使用php mail函数配置SMTP服务器发邮件&#xff0c;则是实现这一需求的有效途径。AokSend将详细探讨如何通过php mail函数来配置SMTP服…

Density-invariant Features for Distant Point Cloud Registration 论文解读

目录 一、导言 二、先导知识 1、FCGF 三、相关工作 1、深度学习的点云配准 2、对抗密度变化的方法 3、对比学习 四、GCL方法 1、U型曲线假设 一、导言 该论文来自于ICCV2023&#xff0c;上海交通大学提出的基于组对比学习的方案&#xff0c;来提取密度不变的几何特征&…

【终端IDPS】开源安全平台Wazuh之Wazuh Server

引言 Wazuh是一个开源的、免费的企业级安全监控解决方案&#xff0c;专注于威胁检测、完整性监控、事件响应和合规性。它由部署在受监控系统的端点安全代理和管理服务器组成&#xff0c;服务器收集并分析代理收集的数据。Wazuh支持多平台&#xff0c;包括Windows、Linux、macOS…

Linux学习笔记4 重点!网络排障命令

网络排障命令 命令行下载工具wget wget https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.20.17.tar.gz wget https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.20.17.tar.gz 限速下载 wget --limit-rate1M https://mirrors.edge.kernel.or…

【已解决】Vue Duplicate keys detected: ‘[object Object]’

【已解决】Vue Duplicate keys detected: ‘[object Object]’ 在Vue项目开发过程中&#xff0c;我们可能会遇到这样的报错&#xff1a;“Duplicate keys detected: ‘[object Object]’. This may cause an update error.”。这个错误通常发生在Vue的虚拟DOM进行渲染更新时&a…

上书房信息咨询:医疗满意度调研

随着人们生活水平的不断提高&#xff0c;医疗服务的需求日益增长。近期&#xff0c;上书房信息咨询受托完成了某市医疗市场的满意度调研&#xff0c;旨在深入了解市民对医疗服务的评价和需求&#xff0c;为提升医疗服务质量提供有力支持。 近年来&#xff0c;某市致力于推进医…

鸿蒙ArkTS语言学习(五):扩展(函数)@Extend@Styles@Builder

如何实现结构、样式复用呢&#xff1f; Extend&#xff1a;扩展组件&#xff08;样式、事件&#xff09; 作用&#xff1a;将相同组件复用的属性结构抽取封装&#xff0c;将不同的结构通过传入参数进行修改。 1. 定义语法 Extend(组件名) function 函数名{ ... } 2. 调用 组件…

一起学习LeetCode热题100道(60/100)

60.单词搜索(学习) 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那…

selenium消除启动特征避免被反爬-使用已经打开的浏览器

selenium消除启动特征避免被反爬 启动特征很多&#xff0c;如何消除selenium启动特征呢&#xff1f;这个也是因站而异&#xff0c;如果规避常规的检测&#xff0c;做到以下2点就可以。 1 是消除window.navigator.webdriver的值&#xff1b; 2 是修改chromedriver.exe的源码…

鸿蒙开发 数组改变,ui渲染没有刷新

问题描述&#xff1a; 数组push, 数组长度改变&#xff0c;ui也没有刷新 打印出了数组 console.log(this.toDoData.map(item > ${item.name}).join(, ), this.toDoData.length) 原代码&#xff1a; Text().fontSize(36).margin({ right: 40 }).onClick(() > {TextPicker…