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

【强化学习04】Q学习时序差分法

贝尔曼方程在强化学习中是用来更新Q值(动作价值)的一个重要工具。下面用小白能理解的方式解释贝尔曼方程是如何更新Q值的:

什么是Q值?

在强化学习中,Q值是用来评估在某个状态(state)下执行某个动作(action)所能获得的长期回报(reward)的一个数值。Q值越高,意味着在这个状态下执行这个动作越好。

贝尔曼方程的基本思想

贝尔曼方程的核心思想是当前的Q值等于当前的即时奖励加上未来所有可能状态的Q值的折现和。简单来说,就是你现在得到的奖励,加上未来可能得到的所有奖励的预期值。

贝尔曼方程公式

贝尔曼方程的具体形式如下:

Q ( s , a ) = r + γ max ⁡ a ′ Q ( s ′ , a ′ ) Q(s, a) = r + \gamma \max_{a'} Q(s', a') Q(s,a)=r+γmaxaQ(s,a)

其中:

  • Q ( s , a ) Q(s, a) Q(s,a)是在状态 s s s下执行动作 a a a的Q值。
  • r r r是执行动作 a a a后得到的即时奖励。
  • γ \gamma γ是折现因子,用来衡量未来奖励的重要性,取值范围是 0 到 1。
  • s ′ s' s是执行动作 a a a后转移到的下一个状态。
  • max ⁡ a ′ Q ( s ′ , a ′ ) \max_{a'} Q(s', a') maxaQ(s,a)表示在下一个状态 s ′ s' s中,选择使Q值最大的那个动作 a ′ a' a的Q值。

贝尔曼方程如何更新Q值?

在实际操作中,我们通过以下步骤来更新Q值:

  1. 初始化Q值:开始时,所有的Q值可以设为0,或者随机设定一个值。
  2. 观察当前状态和动作:在当前状态 s s s下,选择一个动作 a a a
  3. 执行动作,获得奖励和下一状态:执行动作 a a a后,观察得到的即时奖励 r r r和转移到的下一个状态 s ′ s' s
  4. 计算未来最优Q值:在状态 s ′ s' s下,找出所有可能动作中Q值最大的那个,记为 max ⁡ a ′ Q ( s ′ , a ′ ) \max_{a'} Q(s', a') maxaQ(s,a)
  5. 更新当前Q值:使用贝尔曼方程更新当前Q值:
    Q ( s , a ) ← r + γ max ⁡ a ′ Q ( s ′ , a ′ ) Q(s, a) \leftarrow r + \gamma \max_{a'} Q(s', a') Q(s,a)r+γamaxQ(s,a)

举个例子

假设你在一个迷宫游戏中,当前在位置 s s s,你决定向右走(动作 a a a),向右走之后你得到一个奖励 r r r,并且移动到了下一个位置 s ′ s' s。这个时候,你会观察在位置 s ′ s' s上所有可能的动作的Q值,找出最大的那个,然后用贝尔曼方程更新你在位置 s s s上向右走这个动作的Q值。

关键点总结

  • 即时奖励 r r r:你当前动作带来的直接收益。
  • 未来奖励的预期 γ max ⁡ a ′ Q ( s ′ , a ′ ) \gamma \max_{a'} Q(s', a') γmaxaQ(s,a):考虑到未来所有可能的状态和动作后的最大收益,但需要折现因子 γ \gamma γ来平衡现在和未来的收益。
  • Q值更新:通过即时奖励和未来奖励的结合,不断迭代更新Q值,使其逐步逼近真实的动作价值。

理解了贝尔曼方程是如何更新Q值的以后,进一步我们可以引入时序差分方法。

时序差分方法

时序差分是一种结合蒙特卡罗方法(利用完整的回报序列进行更新)和动态规划(利用当前估计值进行更新)的方法。它通过将当前估计的Q值和下一步的Q值进行比较来更新Q值。

TD(0) 更新公式

TD(0) 是时序差分方法中最基本的一种形式,其更新公式如下:

Q ( s , a ) ← Q ( s , a ) + α [ r + γ max ⁡ a ′ Q ( s ′ , a ′ ) − Q ( s , a ) ] Q(s, a) \leftarrow Q(s, a) + \alpha \left[ r + \gamma \max_{a'} Q(s', a') - Q(s, a) \right] Q(s,a)Q(s,a)+α[r+γmaxaQ(s,a)Q(s,a)]

其中:

  • Q ( s , a ) Q(s, a) Q(s,a)是在状态 s s s下执行动作 a a a的Q值。
  • r r r是执行动作 a a a后得到的即时奖励。
  • γ \gamma γ是折现因子。
  • s ′ s' s是执行动作 a a a后转移到的下一个状态。
  • max ⁡ a ′ Q ( s ′ , a ′ ) \max_{a'} Q(s', a') maxaQ(s,a)是在状态 s ′ s' s中所有可能动作中Q值最大的那个。
  • α \alpha α是学习率,用于控制Q值更新的步长。

时序差分更新的底层原理

时序差分更新的核心思想是通过当前的估计值和下一步的估计值之间的差异来调整Q值。这种差异被称为“TD误差”,计算公式为:

δ = r + γ max ⁡ a ′ Q ( s ′ , a ′ ) − Q ( s , a ) \delta = r + \gamma \max_{a'} Q(s', a') - Q(s, a) δ=r+γmaxaQ(s,a)Q(s,a)

更新公式则可以写成:

Q ( s , a ) ← Q ( s , a ) + α δ Q(s, a) \leftarrow Q(s, a) + \alpha \delta Q(s,a)Q(s,a)+αδ

具体步骤

  1. 初始化Q值:开始时,所有的Q值设为0或随机设定一个值。
  2. 选择动作:在当前状态 s s s下,根据某种策略(如 ε-greedy 策略)选择一个动作 a a a
  3. 执行动作:执行动作 a a a后,观察即时奖励 r r r和转移到的下一个状态 s ′ s' s
  4. 计算TD误差:计算 r + γ max ⁡ a ′ Q ( s ′ , a ′ ) r + \gamma \max_{a'} Q(s', a') r+γmaxaQ(s,a)与当前Q值 Q ( s , a ) Q(s, a) Q(s,a)之间的差异,即TD误差 δ \delta δ
  5. 更新Q值:用TD误差 δ \delta δ来更新Q值:
    Q ( s , a ) ← Q ( s , a ) + α δ Q(s, a) \leftarrow Q(s, a) + \alpha \delta Q(s,a)Q(s,a)+αδ

举个例子

假设你在一个迷宫游戏中,当前在位置 s s s,你决定向右走(动作 a a a),向右走之后你得到一个奖励 r r r,并且移动到了下一个位置 s ′ s' s。这个时候,你会观察在位置 s ′ s' s上所有可能的动作的Q值,找出最大的那个,计算出TD误差,然后用这个误差更新你在位置 s s s上向右走这个动作的Q值。

具体来说:

  1. 初始Q值:假设 Q ( s , a ) = 2 Q(s, a) = 2 Q(s,a)=2
  2. 即时奖励 r = 3 r = 3 r=3
  3. 未来Q值的最大值:假设在状态 s ′ s' s下最大Q值为 max ⁡ a ′ Q ( s ′ , a ′ ) = 5 \max_{a'} Q(s', a') = 5 maxaQ(s,a)=5
  4. 折现因子 γ = 0.9 \gamma = 0.9 γ=0.9
  5. 计算TD误差 δ = 3 + 0.9 × 5 − 2 = 3.5 \delta = 3 + 0.9 \times 5 - 2 = 3.5 δ=3+0.9×52=3.5
  6. 学习率 α = 0.1 \alpha = 0.1 α=0.1
  7. 更新Q值: Q ( s , a ) ← 2 + 0.1 × 3.5 = 2.35 Q(s, a) \leftarrow 2 + 0.1 \times 3.5 = 2.35 Q(s,a)2+0.1×3.5=2.35

关键点总结

  • TD误差:利用当前奖励和未来预期奖励之间的差异来调整当前Q值。
  • 逐步逼近真实值:通过反复更新,Q值逐步逼近真实的动作价值。
  • 实时更新:TD方法不需要等待一个完整的回报序列,可以在每一步进行更新,适合在线学习。

我们可以用学习骑自行车的过程来比喻为什么利用当前奖励和未来预期奖励之间的差异来调整当前Q值是能够奏效的。

比喻:学习骑自行车

假设你是一个小孩,正在学习如何骑自行车。为了学会骑自行车,你需要反复练习,不断调整自己的平衡和操控技巧。在这个过程中,你会经历许多次尝试和失败,每一次尝试都会给你提供一些反馈(奖励),告诉你是否做得正确。

当前奖励

当前奖励就像是你在骑自行车过程中立刻得到的反馈。例如,当你保持平衡并且没有摔倒时,你会感到高兴和满意,这就是一种正面的即时奖励。当你摔倒时,你可能会感到疼痛或失望,这就是一种负面的即时奖励。

未来预期奖励

未来预期奖励就像是你对于未来骑自行车成功的信心和期望。例如,当你在某一次尝试中保持了更长时间的平衡,你会预期自己未来能够更好地掌握这项技能,从而更加有信心。这种信心和期望就是一种未来预期奖励。

利用差异调整Q值

在学习骑自行车的过程中,你会不断根据当前的反馈和未来的预期来调整自己的行为:

  1. 当前反馈:如果你在某一次尝试中保持了很好的平衡,你会立即感到满意,这是你的当前奖励。
  2. 未来预期:你预期如果继续保持这种技巧,将来会更加熟练和稳定,这是你的未来预期奖励。
  3. 调整行为:你会根据当前的满意感(当前奖励)和未来的期望(未来预期奖励)之间的差异来调整自己的平衡和操控技巧。如果当前奖励和未来预期奖励之间的差异很大(例如,你预期将来会很成功,但目前还不太稳定),你会更加努力练习和平衡自己,直到两者趋于一致。

在这个过程中,你通过不断调整行为,使得当前的表现(即时反馈)和未来的期望(预期奖励)更加接近。最终,你会逐渐学会如何保持平衡,熟练地骑自行车。

关键点总结

  • 即时反馈(当前奖励):告诉你当前的尝试是否正确。
  • 未来预期(未来奖励):你对未来成功的信心和期望。
  • 差异调整:利用当前的反馈和未来的期望之间的差异,来不断调整自己的行为,逐步学会骑自行车。

在强化学习中,TD方法利用当前奖励和未来预期奖励之间的差异来调整Q值,就像你在学习骑自行车时利用即时反馈和未来期望之间的差异来调整行为一样。通过这种不断的调整和优化,Q值最终能够逼近真实的动作价值,使得你在各种状态下选择的动作越来越好。

相关文章:

  • 操作系统 - 输入/输出(I/O)管理
  • 【PHP小课堂】学习了解PHP中Memcached扩展的使用
  • 26计算机操作系统408考研--操作系统处理机调度篇章(五)
  • 每天一个数据分析题(三百三十五)
  • 【软件工程】【23.04】p1
  • 关于我转生从零开始学C++这件事:升级Lv.25
  • 【MySQL精通之路】SQL优化(1)-查询优化(9)-外部联接优化
  • 深入Java:JSON解析与操作的艺术
  • Ubuntu安装IPOPT和Casadi
  • 打印机里失败的任务删不掉的解决办法 斑马打印机更新电脑驱动和升级打印机固件 提示ribbon out 并黄状态亮+黄供应闪
  • python列表底层原理
  • 视图【mysql数据库】
  • 百度智能云千帆AppBuilder升级!开放多源模型接入,思考模型再次加速!
  • CentOS 7 安装 Minio
  • 【晚风摇叶之其他】抖音直播弹幕解析,连接websocket解析弹幕内容
  • 【刷算法】从上往下打印二叉树
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • java 多线程基础, 我觉得还是有必要看看的
  • Lucene解析 - 基本概念
  • maven工程打包jar以及java jar命令的classpath使用
  • Octave 入门
  • Spring Cloud Feign的两种使用姿势
  • Vue 动态创建 component
  • Yeoman_Bower_Grunt
  • 不上全站https的网站你们就等着被恶心死吧
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 软件开发学习的5大技巧,你知道吗?
  • 使用Gradle第一次构建Java程序
  • 与 ConTeXt MkIV 官方文档的接驳
  • 组复制官方翻译九、Group Replication Technical Details
  • ​Python 3 新特性:类型注解
  • ###STL(标准模板库)
  • (zhuan) 一些RL的文献(及笔记)
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (强烈推荐)移动端音视频从零到上手(上)
  • (十三)Flink SQL
  • (五)关系数据库标准语言SQL
  • (转载)深入super,看Python如何解决钻石继承难题
  • **CI中自动类加载的用法总结
  • .config、Kconfig、***_defconfig之间的关系和工作原理
  • .NET 4.0中的泛型协变和反变
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .net core 连接数据库,通过数据库生成Modell
  • .NET 表达式计算:Expression Evaluator
  • .Net 基于.Net8开发的一个Asp.Net Core Webapi小型易用框架
  • .net反编译的九款神器
  • .net中我喜欢的两种验证码
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • @NestedConfigurationProperty 注解用法
  • [BUAA软工]第一次博客作业---阅读《构建之法》
  • [C\C++]读入优化【技巧】
  • [C++] vector list 等容器的迭代器失效问题
  • [C++11 多线程同步] --- 条件变量的那些坑【条件变量信号丢失和条件变量虚假唤醒(spurious wakeup)】