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

【强化学习系列】Q-learning——从贝尔曼最优方程谈起

引言

上一篇贝尔曼最优方程中我们已经推导出动作价值形式的贝尔曼最优方程:
q π ∗ ( s , a ) = ∑ s ′ ∈ S ∑ r ∈ R p ( s ′ , r ∣ s , a ) [ r + γ max ⁡ a ′ q π ∗ ( s ′ , a ′ ) ] \begin{equation}q_{\pi^*}(s,a)=\sum_{s'\in S}\sum_{r\in R}p(s',r|s,a)[r+\gamma \max_{a'}q_{\pi^*}(s',a')]\end{equation} qπ(s,a)=sSrRp(s,rs,a)[r+γamaxqπ(s,a)]
这里的 q π ∗ ( s , a ) q_{\pi^*}(s,a) qπ(s,a)是最优动作价值的真实值,它是一个期望值,需要对所有可能的 s ′ s' s r r r依概率 p ( s ′ , r ∣ s , a ) p(s',r|s,a) p(s,rs,a)进行加权求和,然而这在实际中很难做到。因为环境的模型,即概率 p ( s ′ , r ∣ s , a ) p(s',r|s,a) p(s,rs,a)通常是很难知道的。因此需要一种免模型的方法,Q-learning就是免模型的方法。

原理

根据公式(1),我们采用一种迭代计算的方式来估计最优动作价值 q π ∗ ( s , a ) q_{\pi^*}(s,a) qπ(s,a),由于是估计值,我们用大写的Q与真实值作区分,记作Q(s,a)。

假设我们已经有了Q(s,a)的初始值,在与环境交互时,我们遇到了状态s,并采取了动作a,获得了奖励r,并进入了下一个状态s’。我们可以仅用这一条数据(s,a,r,s’)来更新最优动作价值的估计Q(s,a),根据公式(1),这时我们就不再对所有的r和s’依概率进行加权求和了,而只用这一条数据,所以可以把 r + γ max ⁡ a ′ Q ( s ′ , a ′ ) r+\gamma \max_{a'}Q(s',a') r+γmaxaQ(s,a)作为最优动作价值的估计。

但是,只用一条数据进行估计会有很大的误差,更好的方式是采用迭代计算的方式更新动作价值的估计值,即每次以一定的步长 α \alpha α用目标值 r + γ max ⁡ a ′ Q ( s ′ , a ′ ) r+\gamma \max_{a'}Q(s',a') r+γmaxaQ(s,a)来更新原有的估计值,即:
Q t + 1 ( s t , a t ) = Q t ( s t , a t ) − α t ( s t , a t ) [ Q t ( s t , a t ) − [ r t + 1 + γ max ⁡ a Q t ( s t + 1 , a ) ] ] Q_{t+1}(s_t,a_t)=Q_t(s_t,a_t)-\alpha_t(s_t,a_t)\left[Q_t(s_t,a_t)-[r_{t+1}+\gamma \max_{a}Q_t(s_{t+1},a)]\right] Qt+1(st,at)=Qt(st,at)αt(st,at)[Qt(st,at)[rt+1+γamaxQt(st+1,a)]]
至于为什么可以这样迭代计算,证明比较复杂,不展开赘述

为什么说Q-learning是off-policy的

行动策略:用来产生观测数据的策略,它决定了在 s t s_t st时选择哪个动作 a t a_t at
目标策略:最终需要学习的、正在优化的策略,也是在更新目标中使用的策略

在状态 s t s_t st时采取的动作 a t a_t at是是由行动策略决定的,为了保持对环境的探索,通常使用 ϵ \epsilon ϵ-greedy策略。而更新目标 r t + 1 + γ max ⁡ a Q t ( s t + 1 , a ) r_{t+1}+\gamma \max_{a}Q_t(s_{t+1},a) rt+1+γmaxaQt(st+1,a)可以改写成 r t + 1 + γ Q t ( s t + 1 , a ∗ ) r_{t+1}+\gamma Q_t(s_{t+1},a^*) rt+1+γQt(st+1,a),即在 s t + 1 s_{t+1} st+1时采取最优动作 a ∗ a^* a,说明我们的目标策略是一个贪心策略,它与行动策略是不同的。所以Q-learning是off-policy的。

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

相关文章:

  • IDEA专业版 Springboot连接MySQL保姆级教程 2025
  • hutools工具类中isNotEmpty与isNotBlank区分
  • 【和春笋一起学C++】函数——C++的编程模块
  • 从拒绝采样到强化学习,大语言模型推理极简新路径!
  • JDK 8 函数式接口全集
  • Electron读取本地文件
  • 客户案例分享|运营商数智化经典案例 — XX运营商
  • TRAE历史版本下载参考
  • JavaScript性能优化实战:从基础到高级的全面指南
  • 精益数据分析(32/126):电商指标优化与搜索策略解析
  • 工业声纹采集设备的市场需求趋势简析
  • 好未来golang后端开发
  • iOS - 音频: Core Audio - 播放
  • 【阿里云大模型高级工程师ACP习题集】2.7 通过微调增强模型能力 (上篇)(⭐️⭐️⭐️ 重点章节!!!)
  • 【Luogu】动态规划七
  • 3D Gaussian Splatting部分原理介绍和CUDA代码解读
  • 实验六 文件操作实验
  • 计算机视觉与深度学习 | 双目立体匹配算法理论+Opencv实践+matlab实践
  • 20250429-李彦宏口中的MCP:AI时代的“万能接口“
  • hover加图层图放大
  • 多块盘创建RAID5以及后增加空间
  • shell(4)
  • UBUS 通信接口的使用——添加一个object对象(ubus call)
  • 开放平台架构方案- GraphQL 详细解释
  • 2025年- H13-Lc120-189.轮转数组(普通数组)---java版
  • Cliosoft安装
  • 【AI学习】李宏毅新课《DeepSeek-R1 这类大语言模型是如何进行「深度思考」(Reasoning)的?》的部分纪要
  • 大屏 UI 设计:解锁视觉盛宴的奥秘
  • Microsoft .NET Framework 3.5 离线安装包 下载
  • python celery框架结合django的使用