强化学习基本方法(二)
来源:互联网 发布:单片机智能车 编辑:程序博客网 时间:2024/05/17 02:27
2.2.状态-动作收益评价函数
之前的讨论里面只提到了状态的转化,然而实际情况可能更加复杂,第一:应用在状态上的不同动作其价值本来就是不同的,这也值得我们加入考虑的范围。比如花枯萎的时候,我得去挑水来浇花,这时候我要付出劳动力的,这个动作的收益可以设置为-100,我也可以选择不管,虽然花会死,但是“不管”这个动作的收益可是0,要是花不怎么值钱,我还是任由它死掉算了嘿嘿嘿。第二:不同的动作也会影响状态转移的概率分布,拿前面的例子来说,浇水总比不管让花活下来的几率更大的。
我们还是先不加解释的抛出动作-累计奖励函数的Bellman方程:
这个式子和之前的状态收益函数其实非常像,唯一的区别就在于转换概率加了一个动作,并且一阶收益期望也被动作价值所影响了。
很重要的一点在于,在强化学习的框架里面,动作价值和达到某状态带来的价值是可以直接叠加的!这样做的目的是为了让整个价值评价体系统一,不必费心去分辨这是动作带来的价值收益还是状态带来的价值收益。
还是之前的那个例子:
这次我们把每移动一步的动作也加上一个-1的价值,很简答的推算可以得知:
继续进行迭代:
依次类推,直到最终状态收敛
3.最优化策略
3.1.动态规划
现在收益能够量化了,我们需要做的就是根据这两个式子找到策略使得式子所得的收益最大化。这样,整个问题就转变为了一个动态规划问题。优化目标为:
此时所得到的策略被称为最佳策略
从而可以导出Bellman最优性方程:
这里其实是存在一个小技巧的,因为如果将
基于这个原则,我们在每一步累计奖励方程选择合适的动作,使其满足最优。由于在每次选择时都有多个动作可以选择,此时,累计奖励方程:
这样,在全知的条件下,我们可以提出下面的算法思路:
- 1.随机初始化一个策略π
- 2.估算这个策略下每个状态的收益
- 3.尝试更改这个策略,如果更改使得结点收益上升,则接受这个更改
那么,首先我们需要做的就好杀死初始化策略并且估计这个策略下的状态收益。
在既定策略估计每一个状态收益的算法流程如下:
Input πfor all s in S v(s) = 0while true Δ ← 0 for each s in S temp = v(s) v(s) = Vπ(s) Δ = max(Δ,|temp-v(s)|) if Δ < θ break
在这个算法中,我们直接使用了每一步更新出来的新值作为当前状态的估计收益,而不是在一遍完整的遍历之后将取出其迭代结果再进行迭代。这样其实是有助于迭代收敛的。
那下一步就是改进我们的策略使其达到(接近)最优了。也就是说,在之后的迭代中,我们只需要修改策略并比较这个策略是不是比原来的策略好,如果更好,就接受这个策略,如果不好,就丢弃掉。这样理解的话,整个问题突然就转回一个动态规划的问题上面来了。这样,我们的整体优化思路就是如下:
- 1.随机初始化一个策略π
- 2.估算这个策略下每个状态的收益
- 3.使用动态规划算法,得到新状态下的收益
- 4.如果规划稳定 则停止,否则,跳转回2
这时候,我们发现,在每一次优化以后都必须估算这个策略下面每个状态的收益,这一步其实需要大量的迭代步骤,非常耗时,然而这一步是必要的吗?
在改进的策略里面,我们可以直接将每一步获取的最新值作为当前结点收益的更新值,以只更新当前结点的方法来更新全局收益。
这样做的理由是我们在每一个结点的迭代结束之后,再进行全局估计其实是为了预防当前的策略改变没有立即得到收益反馈的影响。但是另一方面来看,由于整个算法是在不断迭代的过程中完成的,所以只要我们这个新的接不小于原来的解(单调递增),其一定是可以收敛到最优极限的。所以,我们可以使用这样的策略来更新
- 强化学习基本方法(二)
- 强化学习基本方法(一)
- 强化学习基本方法(三)
- 强化学习(二)
- 强化学习基础(二)
- 深度强化学习系列(二):强化学习基础
- Janki学习和强化记忆的方法
- 强化学习基础 第三讲 蒙特卡罗方法
- 强化学习基础 第三讲 蒙特卡罗方法
- 强化学习调参方法/DeepRLHacks中文版
- .强化学习
- 强化学习
- 强化学习
- 强化学习
- 强化学习
- 强化学习
- 强化学习
- 强化学习
- oc 中代码块中局部变量与全局变量、全局静态变量
- HTTP Status 500 - Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.J
- hdu 2354 Integer Intervals【Bfs+暴力】
- scrapy提取wikipedia实践1
- 在Mac的terminal下连接 SMB 共享的三种方法
- 强化学习基本方法(二)
- 如何在代码中减少if else语句的使用
- ubuntu 默认防火墙安装、启用、查看状态
- 继承+super+final的例子
- Android开发-ArrayAdapter
- java 发送http json请求
- iOS 之 arc4random() 和 arc4random_uniform()的区别
- JavaScript:样式
- Servlet与JSP九大内置对象的关系