[Reinforcement Learning] Value Function Approximation
为什么需要值函数近似?
之前我们提到过各种计算值函数的方法,比如对于 MDP 已知的问题可以使用 Bellman 期望方程求得值函数;对于 MDP 未知的情况,可以通过 MC 以及 TD 方法来获得值函数,为什么需要再进行值函数近似呢?
其实到目前为止,我们介绍的值函数计算方法都是通过查表的方式获取的:
- 表中每一个状态 均对应一个
- 或者每一个状态-动作 <>
但是对于大型 MDP 问题,上述方法会遇到瓶颈:
- 太多的 MDP 状态、动作需要存储
- 单独计算每一个状态的价值都非常的耗时
因此我们需要有一种能够适用于解决大型 MDP 问题的通用方法,这就是本文介绍的值函数近似方法。即:
那么为什么值函数近似的方法可以求解大型 MDP 问题?
对于大型 MDP 问题而言,我们可以近似认为其所有的状态和动作都被采样和计算是不现实的,那么我们一旦获取了近似的值函数,我们就可以对于那些在历史经验或者采样中没有出现过的状态和动作进行泛化(generalize)。
进行值函数近似的训练方法有很多,比如:
- 线性回归
- 神经网络
- 决策树
- ...
此外,针对 MDP 问题的特点,训练函数必须可以适用于非静态、非独立同分布(non-i.i.d)的数据。
增量方法
梯度下降
梯度下降不再赘述,感兴趣的可以参考之前的博文《梯度下降法的三种形式BGD、SGD以及MBGD》
通过随机梯度下降进行值函数近似
我们优化的目标函数是找到一组参数 来最小化最小平方误差(MSE),即:
通过梯度下降方法来寻优:
对于随机梯度下降(Stochastic Gradient Descent,SGD),对应的梯度:
值函数近似
上述公式中需要真实的策略价值函数 作为学习的目标(supervisor),但是在RL中没有真实的策略价值函数,只有rewards。在实际应用中,我们用target来代替 :
- 对于MC,target 为 return :
- 对于TD(0),target 为TD target :
- 对于TD(λ),target 为 TD λ-return :
在获取了值函数近似后就可以进行控制了,具体示意图如下:
动作价值函数近似
动作价值函数近似:
优化目标:最小化MSE
使用SGD寻优:
收敛性分析
略,感兴趣的可以参考David的课件。
批量方法
随机梯度下降SGD简单,但是批量的方法可以根据agent的经验来更好的拟合价值函数。
值函数近似
优化目标:批量方法解决的问题同样是
经验集合 包含了一系列的 <state, value> pair:
根据最小化平方误差之和来拟合 和 ,即:
经验回放(Experience Replay):
给定经验集合:
Repeat:
- 从经验集合中采样状态和价值:
- 使用SGD进行更新:
通过上述经验回放,获得最小化平方误差的参数值:
我们经常听到的 DQN 算法就使用了经验回放的手段,这个后续会在《深度强化学习》中整理。
通过上述经验回放和不断的迭代可以获取最小平方误差的参数值,然后就可以通过 greedy 的策略进行策略提升,具体如下图所示:
动作价值函数近似
同样的套路:
- 优化目标:
- 采取包含 <state, action, value> 的经验集合
- 通过最小化平方误差来拟合
对于控制环节,我们采取与Q-Learning一样的思路:
- 利用之前策略的经验
- 但是考虑另一个后继动作
- 朝着另一个后继动作的方向去更新 ,即
- 梯度:线性拟合情况,
收敛性分析
略,感兴趣的可以参考David的课件。
Reference
[1] Reinforcement Learning: An Introduction, Richard S. Sutton and Andrew G. Barto, 2018
[2] David Silver's Homepage
作者:Poll的笔记
博客出处:http://www.cnblogs.com/maybe2030/
本文版权归作者和博客园所有,欢迎转载,转载请标明出处。
<如果你觉得本文还不错,对你的学习带来了些许帮助,请帮忙点击右下角的推荐>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!