文章目录
一、强化概念
强化学习是一类算法, 是让计算机实现从一开始什么都不懂, 脑袋里没有一点想法, 通过不断地尝试, 从错误中学习, 最后找到规律, 学会了达到目的的方法. 这就是一个完整的强化学习过程. 实际中的强化学习例子有很多. 比如近期最有名的 Alpha go, 机器头一次在围棋场上战胜人类高手, 让计算机自己学着玩经典游戏 Atari, 这些都是让计算机在不断的尝试中更新自己的行为准则, 从而一步步学会如何下好围棋, 如何操控游戏得到高分. 既然要让计算机自己学, 那计算机通过什么来学习呢?
二、状态价值迭代
原来计算机也需要一位虚拟的老师, 这个老师比较吝啬, 他不会告诉你如何移动, 如何做决定, 他为你做的事只有给你的行为打分, 那我们应该以什么形式学习这些现有的资源, 或者说怎么样只从分数中学习到我应该怎样做决定呢? 很简单, 我只需要记住那些高分, 低分对应的行为, 下次用同样的行为拿高分, 并避免低分的行为.
比如老师会根据我的开心程度来打分, 我开心时, 可以得到高分, 我不开心时得到低分. 有了这些被打分的经验, 我就能判断为了拿到高分, 我应该选择一张开心的脸, 避免选到伤心的脸. 这也是强化学习的核心思想. 可以看出在强化学习中, 一种行为的分数是十分重要的. 所以强化学习具有分数导向性. 我们换一个角度来思考.这种分数导向性好比我们在监督学习中的正确标签.
三、Temporal Difference 时序差分(TD单步更新)
1.什么是时序差分?
时序差分法和蒙特卡罗法类似,都是不基于模型的强化学习问题求解方法。
预测问题: 即给定强化学习的 5 个要素: 状态集 S S S, 动作集 A A A, 即时奖励 R R R, 亨减因子 γ \gamma γ ,给定策略 π \pi π ,求解该策略的状态价值函数 v ( π ) v(\pi) v(π) 控制问题: 也就是求解最优的价值函数和策略。给定强化学习的 5 个要素: 状态集 S S S, 动作集 A A A, 即时奖励 R R R, 亨椷因子 γ \gamma γ, 探索率 ϵ \epsilon ϵ, 求解最优的动作价值 函数 q ∗ q_{*} q∗ 和最优策略 π ∗ \pi_{*} π∗
回顾蒙特卡罗法中计算状态收获的方法是:
G t = R t + 1 + γ R t + 2 + γ 2 R t + 3 + … γ T − t − 1 R T G_{t}=R_{t+1}+\gamma R_{t+2}+\gamma^{2} R_{t+3}+\ldots \gamma^{T-t-1} R_{T} Gt=Rt+1+γRt+2+γ2Rt+3+…γT−t−1RT
而对于时序差分法来说,我们没有完整的状态序列,只有部分的状态序列,那么如何可以近似求出某个状态的收获呢?回顾强化学习(二)马尔科夫决策过程(MDP)中的贝尔曼方程:
v π ( s ) = E π ( R t + 1 + γ v π ( S t + 1 ) ∣ S t = s ) v_{\pi}(s)=\mathbb{E}_{\pi}\left(R_{t+1}+\gamma v_{\pi}\left(S_{t+1}\right) \mid S_{t}=s\right) vπ(s)=Eπ(Rt+1+γvπ(St+1)∣St=s)
这启发我们可以用 R t + 1 + γ v ( S t + 1 ) R_{t+1}+\gamma v\left(S_{t+1}\right) Rt+1+γv(St+1) 来近似的代苩收获 G t G_{t} Gt 一般我们把 R t + 1 + γ V ( S t + 1 ) R_{t+1}+\gamma V\left(S_{t+1}\right) Rt+1+γV(St+1) 称为 T D \mathrm{TD} TD 目标值。 R t + 1 + γ V ( S t + 1 ) − V ( S t ) R_{t+1}+\gamma V\left(S_{t+1}\right)-V\left(S_{t}\right) Rt+1+γV(St+1)−V(St) 称为 T D \mathrm{TD} TD 误 差, 将用TD目标值近似代替收获 G ( t ) G(t) G(t) 的过程称为引导(bootstrapping)。这样峨们只需要两个连续的状态与对应的奖励,就可以尝试求解强化学习问题了。
现在我们有了自己的近似收获 G t G_{t} Gt 的表达式,那么就可以去求解时序差分的预测问题和控制问题了。
2.时序差分的预测问题求解
时序差分的预测问题求解和蒙特卡罗法类似,但是主要有两个不同点。 − - − 是收获 G t G_{t} Gt 的表达式不同,时序差分 G ( t ) \mathrm{G}(\mathrm{t}) G(t) 的表达式为:
G ( t ) = R t + 1 + γ V ( S t + 1 ) G(t)=R_{t+1}+\gamma V\left(S_{t+1}\right) G(t)=Rt+1+γV(St+1)
二是迭代的式子系数稍有不同,回顾蒙特卡罗法的迭代式子是:
V ( S t ) = V ( S t ) + 1 N ( S t ) ( G t − V ( S t ) ) V\left(S_{t}\right)=V\left(S_{t}\right)+\frac{1}{N\left(S_{t}\right)}\left(G_{t}-V\left(S_{t}\right)\right) V(St)=V(St)+N(St)1(Gt−V(St))
由于在时序差分我们没有完整的序列,也就没有对应的次数 N ( S t ) N\left(S_{t}\right) N(St) ,一般就用一个 [ 0 , 1 ] [0,1] [0,1] 的系数 α \alpha α 代替。这样时序差分的价值函数迭代式子是:
V ( S t ) = V ( S t ) + α ( G t − V ( S t ) ) Q ( S t , A t ) = Q ( S t , A t ) + α ( G t − Q ( S t , A t ) ) \begin{gathered} V\left(S_{t}\right)=V\left(S_{t}\right)+\alpha\left(G_{t}-V\left(S_{t}\right)\right) \\ Q\left(S_{t}, A_{t}\right)=Q\left(S_{t}, A_{t}\right)+\alpha\left(G_{t}-Q\left(S_{t}, A_{t}\right)\right) \end{gathered} V(St)=V(St)+α(Gt−V(St))Q(St,At)=Q(St,At)+α(Gt−Q(St,At))
这里用一个简单的例子来看看蒙特卡罗法和时序差分法求解预测问题的不同。
假设我们的强化学习问题有A,B两个状态,模型未知,不涉及策略和行为。只涉及状态转化和即时奖励。一共有8个完整的状态序列如下:
(1) A , 0 , B , 0 A, 0, B, 0 A,0,B,0 (2) B , 1 B, 1 B,1 (3) B , 1 B, 1 B,1 (4) B , 1 B, 1 B,1 (5) B , 1 B, 1 B,1 (6) B , 1 B, 1 B,1 (จ) B , 1 B, 1 B,1 (8) B , 0 B, 0 B,0
只有第一个状态序列是有状态转移的,其余 7 个只有一个状态。设置衰减因子 γ = 1 \gamma=1 γ=1 。
首先按蒙特卡罗法来求解预测问题。由于只有第一个序列中包含状恋A,因此A的价值仅能通过第一个序列来计算,也就等同于计算该序列中状态A 的收获:
V ( A ) = G ( A ) = R A + γ R B = 0 V(A)=G(A)=R_{A}+\gamma R_{B}=0 V(A)=G(A)=RA+γRB=0
对于 B \mathrm{B} B ,则需要对其在 8 个序列中的收获值来平均,其结果是 6 / 8 6 / 8 6/8 。
再来看看时序差分法求解的过程。其收获是在计算状态序列中某状态价值时是应用其后续状态的预估价值来计算的,对于 B \mathrm{B} B 来说,已总是终止状态,没有 后续状态,因此它的价值直接用其在 8 个序列中的收获值来平均,其结果是 6 / 8 6 / 8 6/8 。
对于 A A A ,只在第一个序列出现,已的价值为:
V ( A ) = R A + γ V ( B ) = 6 8 V(A)=R_{A}+\gamma V(B)=\frac{6}{8} V(A)=RA+γV(B)=86
从上面的例子我们也可以香到蒙特卡罗法和时序差分法求解预测问题的区别:
- 一、时序差分法在知道结果之前就可以学习,也可以在没有结果时学习,还可以在持续进行的环境中学习,而蒙特卡罗法则要等到最后结果才能学习, 时序差分法可以更快速灵活的更新状态的价值估计,这在某些情况下有着非常重要的实际意义
- 二、时序差分法在更新状态价值时使用的是TD 目标值,即基于即时奖励和下一状恋的预估价值来替代当前状恋在状恋序列结束时可能得到的收获,是当 前状誋价值的有偏估计,而蒙特卡罗法则使用实际的收获来更新状恋价值,是某一策略下状态价值的无偏估计,这一点蒙特卡罗法占优。
- 三、虽然时序差分法得到的价值是有偏估计,但是其方差却比蒙特卡罗法得到的方差要低,且对初始值敏感,通常比蒙特卡罗法更加高效。 从上面的描述可以㺺出时序差分法的优势比较大,因此现在主流的强化学习求解方法都是基于时序差分的。后面的文章也会主要基于时序差分法来扩展 讨论。
3.什么是单步更新?什么是回合更新?
虽然我们每一步都在更新, 但是在没有获取宝藏的时候, 我们现在站着的这一步也没有得到任何更新, 也就是直到获取宝藏时, 我们才为获取到宝藏的上一步更新为: 这一步很好, 和获取宝藏是有关联的, 而之前为了获取宝藏所走的所有步都被认为和获取宝藏没关系. 回合更新虽然我要等到这回合结束, 才开始对本回合所经历的所有步都添加更新, 但是这所有的步都是和宝藏有关系的, 都是为了得到宝藏需要学习的步, 所以每一个脚印在下回合被选则的几率又高了一些. 在这种角度来看, 回合更新似乎会有效率一些.
四、与环境交互
五、Sarsa引入
Sarsa 的决策部分和 Q learning 一模一样, 因为我们使用的是 Q 表的形式决策, 所以我们会在 Q 表中挑选值较大的动作值施加在环境中来换取奖惩. 但是不同的地方在于 Sarsa 的更新方式是不一样的.
同样, 我们会经历正在写作业的状态 s1, 然后再挑选一个带来最大潜在奖励的动作 a2, 这样我们就到达了 继续写作业状态 s2, 而在这一步, 如果你用的是 Q learning, 你会观看一下在 s2 上选取哪一个动作会带来最大的奖励, 但是在真正要做决定时, 却不一定会选取到那个带来最大奖励的动作, Q-learning 在这一步只是估计了一下接下来的动作值. 而 Sarsa 是实践派, 他说到做到, 在 s2 这一步估算的动作也是接下来要做的动作. 所以 Q(s1, a2) 现实的计算值, 我们也会稍稍改动, 去掉maxQ, 取而代之的是在 s2 上我们实实在在选取的 a2 的 Q 值. 最后像 Q learning 一样, 求出现实和估计的差距 并更新 Q 表里的 Q(s1, a2).
六、对比Saras和Q-Learning
从算法来看, 这就是他们两最大的不同之处了. 因为 Sarsa 是说到做到型, 所以我们也叫他 on-policy, 在线学习, 学着自己在做的事情. 而 Q learning 是说到但并不一定做到, 所以它也叫作 Off-policy, 离线学习. 而因为有了 maxQ, Q-learning 也是一个特别勇敢的算法.
整个算法还是一直不断更新 Q table 里的值, 然后再根据新的值来判断要在某个 state 采取怎样的 action. 不过于 Qlearning 不同之处:
他在当前 state 已经想好了 state 对应的 action, 而且想好了 下一个 state_ 和下一个 action_ (Qlearning 还没有想好下一个 action_)
更新 Q(s,a) 的时候基于的是下一个 Q(s_, a_) (Qlearning 是基于 maxQ(s_))
这种不同之处使得 Sarsa 相对于 Qlearning, 更加的胆小. 因为 Qlearning 永远都是想着 maxQ 最大化, 因为这个 maxQ 而变得贪婪, 不考虑其他非 maxQ 的结果. 我们可以理解成 Qlearning 是一种贪婪, 大胆, 勇敢的算法, 对于错误, 死亡并不在乎. 而 Sarsa 是一种保守的算法, 他在乎每一步决策, 对于错误和死亡比较敏感. 这一点我们会在可视化的部分看出他们的不同. 两种算法都有他们的好处, 比如在实际中, 你比较在乎机器的损害, 用一种保守的算法, 在训练时就能减少损坏的次数.