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

强化学习入门-免模型预测

文章目录

  • 基本概念
  • 蒙特卡洛估计
  • 时序差分估计
    • 核心思路:结合两种“学习套路”
    • 单步时序差分:走一步看一步的更新
    • 时序差分误差:判断“预估”和“实际”的差距
    • 特殊情况:遇到“终点”怎么办?


基本概念

  • 有模型与免模型的区别:
    前者:状态转移概率是已知的(动态规划、世界模型)
    后者:环境未知 (基本的强化学习方法)
  • 预测与控制:
    预测:主要目的是估计或计算环境中的某种期望值
    控制:如何选择动作以达到最高得分

蒙特卡洛估计

个人认为,蒙特卡洛算法的核心思想就是利用抽样获得的大量数据来估计总体
蒙特卡洛算法主要分成两类:
蒙特卡洛方法主要分成两种算法,一种是首次访问蒙特卡洛方法,另外一种是每次访问蒙特卡洛方法。
区别:
前者:对于每个状态,只记录在回合中第一次出现时的回报,忽略后续再次访问同一状态的回报

伪代码

for each episode:generate trajectory S₀, A₀, R₁, S₁, A₁, R₂, ..., S_TG = 0for t from T-1 downto 0:G = γG + R_{t+1}  # 计算回报if S_t not in S₀, S₁, ..., S_{t-1}:  # 首次访问N(S_t) += 1V(S_t) += (G - V(S_t)) / N(S_t)  # 增量式更新

伪代码

for each episode:generate trajectory S₀, A₀, R₁, S₁, A₁, R₂, ..., S_TG = 0for t from T-1 downto 0:G = γG + R_{t+1}N(S_t) += 1  # 每次访问都计数V(S_t) += (G - V(S_t)) / N(S_t)

后者:记录每次访问状态时的回报,计算所有访问的回报平均值

时序差分估计

可以把时序差分估计方法理解成一种“边体验边学习”的智能算法。

核心思路:结合两种“学习套路”

  • 它学了蒙特卡洛方法的“从实际经历中学习”:就像你做完一件事,会根据当下得到的反馈(比如奖励)和接下来可能遇到的情况来调整对这件事的判断。
  • 又学了动态规划的“用已有经验推新经验”:比如你知道下一步怎么做更划算,就会用这个判断来优化当前的选择,不用等整件事完全结束再总结。

单步时序差分:走一步看一步的更新

最简单的单步时序差分,就像下棋时走一步后就立刻调整策略:

  • 你走了一步(当前状态),得到了一些奖励(比如吃了对方一个子),然后看对方可能怎么应对(下一状态)。

  • 不用等这盘棋下完,你马上根据“当前奖励(V(St)V(S_{t})V(St))+对下一步的判断(rt+1+γV(st+1)r_{t+1}+\gamma V(s_{t+1})rt+1+γV(st+1)),更新对“刚才那步棋”的评价。
    V(st)←V(st)+α[rt+1+γV(st+1)−V(st)]V(s_t) \leftarrow V(s_t) + \alpha [r_{t+1} + \gamma V(s_{t+1}) - V(s_t)]V(st)V(st)+α[rt+1+γV(st+1)V(st)]

  • 这里的“对下一步的判断”其实是还没完全验证的估计值,用这个估计值来更新当前的判断,就叫“自举”——相当于用自己现有的经验(哪怕不完美)来完善自己,不用等所有信息都齐了。

时序差分误差:判断“预估”和“实际”的差距

咱们做判断时,经常会发现“预想的”和“实际发生的”有差距。比如你以为走一步能得10分,结果只得了8分,还差2分,这个差距就是“时序差分误差”。算法会根据这个误差来调整后续的判断,让预估越来越准。公式如下:δ=rt+1+γV(st+1)−V(st)\delta = r_{t+1} + \gamma V(s_{t+1}) - V(s_t)δ=rt+1+γV(st+1)V(st)

特殊情况:遇到“终点”怎么办?

如果走到了游戏结束、任务完成的“终止状态”(比如棋下完了,或者到达目的地了),就没有“下一步”了。这时候算法会直接把“下一步的估计值”设为0,只根据当前的奖励来更新对最后一步的评价——就像考试结束了,不用想“接下来考什么”,直接根据这次的得分总结就好。

总的来说,时序差分的核心就是“不等结束,边做边改,用现有估计不断优化”,既比等全部结束再总结(蒙特卡洛)更灵活,又比完全依赖已有固定经验(动态规划)更贴近实际变化。

注:部分信息来自AI
原文:免模型预测

http://www.xdnf.cn/news/1152325.html

相关文章:

  • Django母婴商城项目实践(十一)- 用户信息模块之用户登录注册
  • [每日随题11] 贪心 - 数学 - 区间DP
  • 让Logo/文字“自己画自己”!✨
  • Linux某个进程CPU占用率高原因定位手段
  • 从零手写红黑树(C++实现详解)
  • 142. 环形链表 II
  • FPGA自学——整体设计思路
  • Python Pandas读取Excel表格中数据并根据时间字段筛选数据
  • 使用 validation 框架生成一个校验参数是否在枚举内的校验器
  • 结合python面向对象编程,阐述面向对象三大特征
  • 【RK3576】【Android14】调试方法
  • 【理财】为什么要进行资金预留
  • QT动态加载动态库 QLibrary
  • 基于dcmtk的dicom工具 第六章 StoreSCU 图像发送
  • C语言:20250719笔记
  • docker|Linux|以centos基础镜像为基础制作nmap专用镜像(镜像瘦身计划)
  • 物联网系统中-告警配置功能的定义
  • MyBatis动态SQL全解析:五大核心标签实战指南
  • 加线机 和 胶带机
  • MyBatis之缓存机制详解
  • Go-Redis × RediSearch 全流程实践
  • #Datawhale组队学习#7月-强化学习Task2
  • 板子 5.29--7.19
  • Git仓库使用
  • Python关于numpy的基础知识
  • 若依部署项目到服务器
  • 深入排查:编译环境(JDK)与运行环境(JRE/JDK)不一致时的常见 Java 错误及解决方案
  • 【Linux】如何理解 “一切皆文件”
  • 黑马点评系列问题之p70postman报错“服务器异常”
  • LeetCode中等题--167.两数之和II-输入有序数组