Reinforcement Learning强化学习--李宏毅机器学习笔记

个人学习笔记,如有错误欢迎指正,也欢迎交流,其他笔记见个人空间  

强化学习 vs 监督学习

  • 监督学习(Supervised Learning):你有输入和明确的输出标签,例如图像分类。

  • 强化学习(Reinforcement Learning):你不知道输出的“最佳答案”,只能通过与环境互动、收集奖励(Reward)来学习策略。

举例:

  • 围棋:每一步的“最优落子”可能连人类都不知道

  • 电子游戏:通过游戏画面(Observation)作出动作(Action),根据得分获得奖励

强化学习的核心结构

环境(Environment)与智能体(Actor):

  1. Observation:环境给智能体的输入

  2. Action:智能体输出的行为

  3. Reward:环境给予智能体的反馈

智能体的目标:最大化总奖励(Total Reward)

 强化学习的核心步骤和深度学习其实基本一样

Step 1:定义一个有未知参数的Function(通常称为Policy Network)

Step 2:定义Loss(负的Total Reward)

Step 3:优化参数以最大化Reward(Optimization)

第一步: 定义一个有未知参数的函数,也就是策略函数(Policy),通常用神经网络来表示。

希望找到一个策略函数 (policy):

  • 输入:当前环境的观测(observation)

  • 输出:某个动作(action)或一组动作的概率

这个函数内部有很多未知参数(θ),通过训练来确定这些参数,从而让策略越来越聪明。例如用CNN处理图像输入,用MLP处理数值输入,RNN / Transformer处理历史轨迹,生成不同action的概率后,通常根据这个分布 进行采样(sampling) 来选择动作,而不是直接选择最大值(argmax),这是为了增加策略的探索性

第二步: 定义Loss

在强化学习中,我们没有 Ground Truth 标签,但依然需要定义一个目标 ——即使不能说“动作a对还是错”,但我们知道做完这个动作之后是否有奖励(Reward)

与环境交互(Episode):

  • 一个智能体从初始状态开始,连续做出动作(Action)

  • 每个动作会得到一个即时奖励(Reward),如 r1,r2,...,rT

  • 所有奖励累加得到:R=r1​+r2​+⋯+rT​这个 R 又被称为 ReturnTotal Reward

目标(Objective):

  • 我们希望找到策略参数 θ,使得这个总奖励 R越大越好

转换为损失函数:

  • 强化学习中不像监督学习有明确的 Loss

  • 所以我们把“最大化奖励”变成“最小化负的奖励”:Loss=−R

第三步:优化参数 

Optimization 就是 去找一个 Network,Learn 出一组参数 这一组参数放在 Actor 的裡面 它可以让这个 R 的数值最大

问题是则不是一个一般的优化问题,难点:

1、Actor输出是随机采样的 

2、Environment是不可导黑盒子,不能反向传播

3、Reward是延迟的,无法直接分配“哪个动作贡献了多少”

Policy Gradient

一种解决RL优化问题的经典方法,核心思想如下:

  • 把Actor当作一个分类器

  • 用类似Cross-entropy的Loss定义行为偏好(a和\hat{a}的交叉熵作为loss,希望采取\hat{a}时就令L=e,再令e最小,a就会趋向于\hat{a}。不希望时L=-e,a也就不趋向于采取\hat{a},再取L最小)

         如下希望看到 s 时采取\hat{a},看到 s' 时不采取 \hat{a}‘,则L=e1-e2。

                                                         (需要收集大量s,a的一对一对的数据)

  • 设定希望Actor采取or避免的行为,并赋予不同权重(An),代表采取/避免某行动的“意愿”有多强。

  • 再用梯度下降去优化Actor网络参数,使行为更符合期望

现在的问题在于怎么定义a的好坏

初级的思路就是直接用当前时间步的 Reward来评估当前 Action 的好坏,如果r>0就认为 Action 是好的,问题是忽视了当前动作对未来的长期影响,导致“短视近利”的策略

由此产生第二个版本的想法:a有多好取决于a之后收到的所有Reward,通通加起来得到一个累计奖励G(Total Future Reward)。

优点:考虑到动作的长期影响

问题:游戏太长时,早期动作对后期奖励影响不明显,不一定是这一步的动作导致后面好的结果,导致归因失真

 由此产生第三个版本的想法:引入折扣因子(Discount Factor)

距离 at 越远的 r 对于 at 就越“不重要”,因为 γ 指数项会变大。

优点:距离当前动作越近的奖励权重越高;解决远期奖励归因问题

第四个版本:如果所有 Gt′​ 都是正的,即使有些表现差的动作也被当作“ 好 ”进一步,因此需要做标准化, 引入基线(Baseline) b,将 Gt′−b 作为最终评价量 At。

  • 目的是让评价结果“有正有负”,使训练更稳定、更有区分度

  • b 可设为均值、滑动平均、甚至预测的值(将引出 Critic

Policy Gradient 实际操作流程 

  • 初始化策略网络(Actor)参数 θ

  • 收集数据:用当前策略与环境交互,采样出多个 (state, action) 对

  • 评估每个动作的好坏:计算 At,可以是版本 1~4 中任一种

  • 定义 Loss:例如交叉熵加权 At

  • 梯度上升更新Actor参数

  • 重新收集数据:由于策略已改变,必须用新的策略重新采样(On-policy),重新收集数据

On-policy vs Off-policy

刚才说的 要被训练的 Actor, 跟要拿来采样,跟环境互动的 Actor   是同一个的时候 这种叫做 On-policy Learning。如果它们不一样就是Off-policy

Off-policy 的代表方法:PPO(Proximal Policy Optimization),PPO 允许一定程度上“借用”旧策略的数据,同时控制策略变化幅度 

听起来有点晕,李老师在课上也没有细说,查资料后我的理解Off-policy 强化学习的本质是:
“我(要训练的策略)不是亲自去做,而是看别人做,再从别人的经验中学习。”

类比总结和On-policy的区别就是:

  • On-policy:每更新一次策略,就必须重新采数据,慢又贵。

  • Off-policy:每次都用别人的策略来采集数据,然后训练你的模型(比如别人开车时采集的数据记录),但是你不能完全照搬别人的操作(因为别人的车可能技术更好),所以你要用算法纠正行为差异 。

这里有一些疑问需要解答,先了解两个概念:

行为策略:用来与环境交互、采集数据,不一定更新(通常固定)

目标策略:是你真正想要训练的策略,不断更新

疑问:如果行为策略不更新,那它的采样是不是就会重复、没有意义?为什么还能学?

答案是:不会。

即使行为策略是“固定的”,你从它那里采样的经验轨迹每次也会不同,原因有两个:1. 环境是动态的 / 有随机性,行为策略+环境共同决定采样轨迹,所以轨迹是多样的;2.行为策略本身是“随机策略”,行为策略即便固定,也有采样上的随机性

 

Critic

Critic 的概念

Critic 的作用是评估当前策略(Actor)的好坏,即预测在某个状态下,采用该 Actor 后可能获得的累积回报(Discounted Cumulative Reward,注意是个期望值,因为actor本身是有随机性

Critic 形式之一是 Value Function,在下图中用 表示 它的能力就是它要未卜先知 未看先猜 游戏还没有玩完 只光看到 S 就要预 测这个 Actor, 它可以得到什么样的表现

如何训练 Value Function(Critic)

蒙特卡洛Monte-Carlo(MC)方法:

  • 完整地让 Actor 玩一整局游戏,记录每个状态对应最终获得的 G 值(实际累积回报),然后训练 Critic 预测这些 G。

  • 优点:简单直观。

  • 缺点:需要完整回合,游戏太长或无终点时不适用。

时序差分Temporal-Difference(TD)方法:

  • 使用部分轨迹更新估值。核心思想是:在不知道最终结果的情况下,通过当前奖励和下一步的估计结果来更新当前估计值

  • 优点:无需完整回合,适合长或无限游戏。

  • 缺点:更新可能有偏差。

MCvsTD

  • MC 使用真实累积奖励训练,更新慢但准确。

  • TD 使用估计值更新,快速但可能偏差。

  • 没有绝对对错,取决于假设和实际需求。

举例:观察某一个 Actor跟环境互动玩了某一个游戏八次,当然这边为了简化计算我们假设这些游戏都非常简单都一个回合就到两个回合就结束了。从下图V(sa)的算法就可以看出MC和TD的区别

Critic 如何帮助训练 Actor

前面提到需要做标准化, 引入基线(Baseline) b,让评价结果“有正有负”,将 Gt′−b 作为最终评价量 At。这里b取多少本来是不知道的,现在可以确定了,b就是Critic估计的Actor后可能获得的累积回报V,注意这个只是一个期望值,因为Actor本身是有随机性的

 这样得到的At,如果大于0说明实际执行的动作 At 得到的结果好于平均值,是一个“好的动作",小于,说明该动作表现差于平均,是个“坏动作”。

但是这种思路也不是完全没问题,用某个状态下的G减去平均值有可能会有极端情况,还有一种思路的用平均值减去平均值,就是:

  • 用即时奖励r_t 加上下一个状态的估值  V^\theta(s_{t+1})来代替G'_t

  • 这是对未来奖励的一步估计,更快、更稳定。

 

小技巧:Actor-Critic 网络共享结构

  • Actor 和 Critic 可以共享网络的前几层(例如 CNN 提取特征),仅在输出结构上有所区分:

    • Actor 输出 action 的概率分布。

    • Critic 输出一个标量的估值。

Deep Q Network (DQN):

  • Deep Q Network(DQN)是另一类强化学习方法,主要使用 Critic(Q function)来直接选动作。

  • DQN 有许多变形,如 Rainbow(融合多个改进技巧)。

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

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

相关文章

Windows VsCode Terminal窗口使用Linux命令

背景描述: 平时开发环境以Linux系统为主,有时又需要使用Windows系统下开发环境,为了能像Linux系统那样用Windows VsCode,Terminal命令行是必不可少内容。 注:Windows11 VsCode 1.99.2 下面介绍,如何在V…

软件测试之测试数据生成(Excel版)

这是Excel生成测试数据的函数使用 1.时间 1.1.时间 例生成2022-05-01之前一年内任意时间点: =TEXT("2022-05-01"-RAND()-RANDBETWEEN(1,365),"yyyy-mm-dd hh:mm:ss")1.2.年月日 yyyy-mm-dd 以当前时间生成10年的日期 =TEXT(NOW()-RAND()-RANDBETWE…

libwebsocket建立服务器需要编写LWS_CALLBACK_ADD_HEADERS事件处理

最近在使用libwebsocket,感觉它搭建Http与websocket服务器比较简单,不像poco库那么庞大,但当我使用它建立websocket服务器后,发现websocket客户端连接一直没有连接成功,不知道什么原因,经过一天的调试&…

从 PyTorch 到 ONNX:深度学习模型导出全解析

在模型训练完毕后,我们通常希望将其部署到推理平台中,比如 TensorRT、ONNX Runtime 或移动端框架。而 ONNX(Open Neural Network Exchange)正是 PyTorch 与这些平台之间的桥梁。 本文将以一个图像去噪模型 SimpleDenoiser 为例&a…

Hadoop集群部署教程-P6

Hadoop集群部署教程-P6 Hadoop集群部署教程(续) 第二十一章:监控与告警系统集成 21.1 Prometheus监控体系搭建 Exporter部署: # 部署HDFS Exporter wget https://github.com/prometheus/hdfs_exporter/releases/download/v1.1.…

【Altium】AD-生成PDF文件图纸包含太多的空白怎么解决

1、 文档目标 AD设计文件导出PDF时,图纸模板方向设置问题 2、 问题场景 AD使用Smart PDF导出PDF时,不管你怎么设置页面尺寸,只要从横向转为纵向输出,输出的始终是横向纸张(中间保留纵向图纸,两边大量留白…

大厂面试:六大排序

前言 本篇博客集中了冒泡,选择,二分插入,快排,归并,堆排,六大排序算法 如果觉得对你有帮助,可以点点关注,点点赞,谢谢你! 1.冒泡排序 //冒泡排序&#xff…

大模型开发:源码分析 Qwen 2.5-VL 视频抽帧模块(附加FFmpeg 性能对比测试)

目录 qwen 视频理解能力 messages 构建 demo qwen 抽帧代码分析 验证两个实际 case 官网介绍图 性能对比:ffmpeg 抽帧、decord 库抽帧 介绍 联系 对比 测试结果 测试明细 ffmpeg 100 qps 测试(CPU) decord 100 qps 测试&#x…

git的上传流程

好久没使用git 命令上传远程仓库了。。。。。温习了一遍; 几个注意点--单个文件大小不能超过100M~~~ 一步步运行下面的命令: 进入要上传的文件夹内,点击git bash 最终 hbu的小伙伴~有需要nndl实验的可以自形下载哦

驱动学习专栏--字符设备驱动篇--2_字符设备注册与注销

对于字符设备驱动而言,当驱动模块加载成功以后需要注册字符设备,同样,卸载驱动模 块的时候也需要注销掉字符设备。字符设备的注册和注销函数原型如下所示 : static inline int register_chrdev(unsigned int major, const char *name, const…

redis 放置序列化的对象,如果修改对象,需要修改版本号吗?

在 Redis 中存储序列化对象时,如果修改了对象的类结构(例如增删字段、修改字段类型或顺序),是否需要修改版本号取决于序列化协议的兼容性策略和业务场景的容错需求。以下是详细分析: 1. 为什么需要考虑版本号? 序列化兼容性问题: 当对象的类结构发生变化时,旧版本的序列…

WPF ObjectDataProvider

在 WPF(Windows Presentation Foundation)中,ObjectDataProvider 是一个非常有用的类,用于将非 UI 数据对象(如业务逻辑类或服务类)与 XAML 绑定集成。它允许在 XAML 中直接调用方法、访问属性或实例化对象,而无需编写额外的代码。以下是关于 ObjectDataProvider 的详细…

深度学习-损失函数 python opencv源码(史上最全)

目录 定义 种类 如何选择损失函数? 平方(均方)损失函数(Mean Squared Error, MSE) 均方根误差 交叉熵 对数损失 笔记回馈 逻辑回归中一些注意事项: 定义 损失函数又叫误差函数、成本函数、代价函数…

poll为什么使用poll_list链表结构而不是数组 - 深入内核源码分析

一:引言 在Linux内核中,poll机制是一个非常重要的I/O多路复用机制。它允许进程监视多个文件描述符,等待其中任何一个进入就绪状态。poll的内部实现使用了poll_list链表结构而不是数组,这个设计选择背后有其深层的技术考量。本文将从内核源码层面深入分析这个设计决…

使用 Azure AKS 保护 Kubernetes 部署的综合指南

企业不断寻求增强其软件开发和部署流程的方法。DevOps 一直是这一转型的基石,弥合了开发与运营之间的差距。然而,随着安全威胁日益复杂,将安全性集成到 DevOps 流水线(通常称为 DevSecOps)已变得势在必行。本指南深入探讨了如何使用 Azure Kubernetes 服务 (AKS) 来利用 D…

2025年常见渗透测试面试题-webshell免杀思路(题目+回答)

网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 webshell免杀思路 PHP免杀原理 webshell免杀测试: webshell免杀绕过方法: 编…

访问不到服务器上启动的llamafactory-cli webui

采用SSH端口转发有效,在Windows上面进行访问 在服务器上启动 llamafactory-cli webui 后,访问方式需根据服务器类型和网络环境选择以下方案: 一、本地服务器(物理机/虚拟机) 1. 直接访问 若服务器与操作设备处于同一…

基于 LSTM 的多特征序列预测-SHAP可视化!

往期精彩内容: 单步预测-风速预测模型代码全家桶-CSDN博客 半天入门!锂电池剩余寿命预测(Python)-CSDN博客 超强预测模型:二次分解-组合预测-CSDN博客 VMD CEEMDAN 二次分解,BiLSTM-Attention预测模型…

C++ 编程指南35 - 为保持ABI稳定,应避免模板接口

一:概述 模板在 C 中是编译期展开的,不同模板参数会生成不同的代码,这使得模板类/函数天然不具备 ABI 稳定性。为了保持ABI稳定,接口不要直接用模板,先用普通类打个底,模板只是“外壳”,这样 AB…

【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数(二)

自动引用计数 前言ARC规则所有权修饰符**__strong修饰符**__weak修饰符__unsafe_unretained修饰符__autoreleasing修饰符 规则属性数组 前言 上一篇我们主要学习了一些引用计数方法的内部实现,现在我们学习ARC规则。 ARC规则 所有权修饰符 OC中,为了处…