强化学习经典算法笔记——推导贝尔曼方程
在写强化学习经典算法笔记(一):价值迭代算法Value Iteration和强化学习经典算法笔记(二):策略迭代算法Policy Iteration的时候,感觉关键的部分——为什么要这样进行值(策略)迭代,没有讲清楚,概念有点模糊,所以感觉有必要重新关注一下Bellman Equation的来龙去脉,也是加强自己对这一块内容的理解。
相关概念
在介绍贝尔曼方程之前,必须对几个概念有所了解,下面我们一一介绍。
- 策略函数,Policy Function
- 状态价值函数,State Value Function
- 状态动作价值函数,State-action Value Function
策略函数 Policy Function
策略常表示为π(s): S→A,函数的输入是一个状态s,输出状态s下应该采取的动作 a 。策略函数的最优化是强化学习算法的核心任务。
状态价值函数 State Value Function
策略π(s)的优劣可以用状态价值函数来评价。常简称为Value Function,即价值函数。
Value Function的意义是,当处于状态st时,从下一个状态st+1开始,直至一个Episode结束,都按照策略π(s)与env进行交互,将从st+1到s∞过程中得到的reward累加起来,取其期望值作为状态st的价值。即
Vπ(s)=Eπ[Rt ∣ st=s]
因为Rt=∑k=0∞γk rt+k+1 ,其中rt+1表示从st转移到st+1时的回报。
Vπ(s)=Eπ[k=0∑∞γk rt+k+1 ∣ st=s]
直观来看,一个状态的价值是从这个状态开始,依照某种策略,继续与环境进行交互而得到的总的回报。因此可以说Value Function受两个变量的控制,一个是状态s,从不同的状态出发,得到的分数有可能一样,有可能不一样。另一个就是策略函数Policy Function,Value Function一定是建立在某个策略上做出的评价,处于同一个状态s时,依照策略π1(s)玩下去的得分高于π2(s),我们就可以说,π1优于π2。
另外需要注意,Value的定义是取累计回报的期望值,因为环境的不确定,进行N个episode的实验,得到N个st+1到s∞的累计汇报Rt,这N个值不可能完全一样,因此可以将Rt建模为一个随机变量,并取E[Rt]作为状态st的比较可靠的评价。
状态动作价值函数 State-action Value Function
状态动作价值函数一般称为Q值函数——Q Function。相比于Value Function是对状态的评估,Q Function是对(状态-动作对) 的评估。
Q值的定义是,给定一个状态st,采取动作at后,按照某一策略π(s)与环境继续进行交互,得到的累计汇报的期望值。
Qπ(s,a)=Eπ[Rt ∣ st=s,at=a]
即
Qπ(s,a)=Eπ[k=0∑∞γk rt+k+1 ∣ st=s,at=a]
Q函数对状态的评价更细化,精确到了每一个动作上。通过Q函数,可以确定在每个状态时应该采取什么动作。
Bellman Equation
贝尔曼方程用于求解MDP问题,也就是找到最优策略及其对应的价值函数。最优价值函数是在每一个状态上,其值 ≥ 其他价值函数在该状态的值 的价值函数。
V∗(s)=maxπVπ(s)
从另一个角度看,在状态s取最优的价值V∗(s),也就意味着,在状态s,依照最优Q函数,采取最优的动作a,得到的价值Q∗(s,a)
V∗(s)=maxaQ∗(s,a)
我们先给出价值函数的贝尔曼方程,它表示的是当前状态和下一个状态之间的递归关系。
Vπ(s)=a∑π(s,a)s′∑pss′a[Rss′a+γVπ(s′)]
相应地,我们给出基于Q函数的贝尔曼方程。
Qπ(s,a)=s′∑Pss′a[Rss′a+γa′∑Qπ(s′,a′)]
其中,Pss′a是前后状态之间的转移概率,Rss′a是采取动作a,从s转移到s′,环境反馈的reward。
利用上面的V和Q的关系,得到
V∗(s)=maxas′∑Pss′a[Rss′a+γa′∑Qπ(s′,a′)]
上式称为Bellman最优性方程,通过解这个方程,可以得到最优策略。而强化学习经典算法笔记(一):价值迭代算法Value Iteration和强化学习经典算法笔记(二):策略迭代算法Policy Iteration中的关键一步,正是上面这个式子的实现(只缺了max)。
for next_sr in env.P[state][action]:
# 在当前state和action的情况下,把可能转移的状态遍历一遍
# next_sr = (0.3333333333333333, 8, 0.0 , False)
# next_sr = (状态转移概率, 下一个状态,得到reward的概率,游戏是否结束)
trans_prob, next_state, reward_prob, _ = next_sr
# 下一状态t的动作状态价值 = 转移到t状态的概率 × ( env反馈的reward + γ × t状态的当前价值 )
next_states_rewards.append((trans_prob * (reward_prob + gamma * updated_value_table[next_state])))
贝尔曼方程的推导
先前定义的转移概率Pss′a可以展开写成一个条件概率
Pss′a=P(st+1=s′ ∣ st=s,at=a)①
再看Rss′a,Rss′a是从st状态转移到st+1状态的回报概率。(应该是一个介于0和1之间的值)
Rss′a=E(Rt+1 ∣ st=s,st+1=s′,at=a)②
即
Rss′a=γEπ[k=0∑∞γkrt+k+2 ∣ st+1=s′]③
但是从②式推导③式的过程我不是很理解。因为Rt=rt+1+γrt+2+γ2rt+3+⋯,所以
Rt+1=rt+2+γrt+3+γ2rt+4+⋯=∑k=0∞γkrt+k+2,将这个式子带入②式,和③式之间还是差着γ倍。
我们再来看状态函数的定义:
Vπ(s)=Eπ[Rt∣st=s]
Vπ(s)=Eπ[rt+1+γrt+2+γ2rt+3+⋯∣st=s]
把第一项提出来,之后的项写成求和的形式,就可以看成是前后两项求期望。一项是从st跳转到st+1,得到当前回报 rt+1;第二项是按照策略π(s)继续走下去得到的累计回报∑k=0∞γkrt+k+2。
Vπ(s)=Eπ[rt+1+γk=0∑∞γkrt+k+2∣st=s]④
把第一项拿出来,因为我们知道从st跳转到st+1,有多个可能的动作以及对应的转移概率和回报概率,将其展开,就是下式,式中的s′表示下一状态,∑s′表示遍历状态s的所有可能的下一状态。
Eπ[rt+1∣st=s]=a∑π(s,a)s′∑Pss′aRss′a⑤
把②式带入⑤式右边,得
a∑π(s,a)s′∑pss′aγEπ[k=0∑∞γkrt+k+2 ∣ st+1=s′]⑥
再看第二项 Eπ[γ∑k=0∞γkrt+k+2∣st=s],表示状态st的后2个状态(st+2)开始的累计回报,所以应该遍历各个可能的st+1状态。
Eπ[γk=0∑∞γkrt+k+2∣st=s]=a∑π(s,a)s′∑Pss′aγEπ[k=0∑∞γkrt+k+2∣st+1=s′]⑦
把上面⑥⑦两式加起来,
Vπ(s)=a∑π(s,a)s′∑Pss′a[Rss′a+γEπ[k=0∑∞γkrt+k+2∣st+1=s′]]⑧
把Eπ[∑k=0∞γkrt+k+2∣st+1=s′]写成Vπ(s′),即下一状态的价值函数,则上式化简为Value函数的贝尔曼方程
Vπ(s)=a∑π(s,a)s′∑Pss′a[Rss′a+γVπ(s′)]⑨
类似的,可以推出Q函数的贝尔曼方程
Qπ(s,a)=s′∑Pss′a[Rss′a+γa′∑Qπ(s′,a′)]⑩