本文参考http://www0.cs.ucl.ac.uk/staff/D.Silver/web/Teaching.html
上一次已经分享了强化学习的概念以及基本的MDP,本节将分享基于Bellman方程和动态规划的策略迭代和值迭代,对于Bellman方程,大家都比较清楚了,那么我们先介绍一下动态规划算法的基本原理
一、动态规划
这里面我要简单介绍一下动态规划,因为严格来说,值迭代与策略迭代是用来解决动态规划问题的两种规划方法。而强化学习又有另外一个昵称——就是拟动态规划。说白了强化学习就是模拟动态规划算法。
用一句话来总结动态规划就是,对一个复杂问题给出一个一般性的解决办法。它主要由两个性质:
1、最优子结构:最优解法能被分解到多个子问题中
2、重叠子问题:子问题能重复多次且解法能被重复利用
马尔科夫决策过程(MDP)满足以上两个性质,所以任何MDP都可以用动态规划来解。动态规划与强化学习的区别就是动态规划假设MDP模型是全知的(即参数可知) 而强化学习可以使MDP未知。
MDP需要解决的问题有两种,第一种是prediction,它已知MDP的S,A,P,R,γ以及policy,目标是算出在每个状态下的value function(值函数其实就是问题的目标,一般都是跟reward有关的函数,例如Atari小游戏,一般值函数就是累计的得分的期望。目标一般就是最大化这个值函数。而第二种是control,它已知MDP的S,A,P,R,γ但是policy未知(即动作action未知),因此它的目标不仅是计算出最优的value function而且要给出最优的Policy。
二、策略迭代POLICY ITERATION
策略迭代就是在policy未知的情况下,根据每次的reward学到最优policy。策略迭代每次先初始化每个状态的值函数v(s)和一个策略,然后根据这个策略计算值函数v(s), 通过这个值函数来根据贪心策略更新策略,不断迭代直到策略收敛,下面是算法的流程:
1、initialization
初始化所有状态的v(s)以及π(s)(初始化为随机策略)
2、poicy evaluation
用当前的v(s)对当前策略进行评估,计算出每一个状态的v(s),直到v(s)收敛,才算训练好了这个状态价值函数V(s)
3、policy improvement
既然上一步已经得到了当前策略的评估函数V(s),那么就可以利用这个评估函数进行策略改进啦。
在每个状态s时,对每个可能的动作a,都计算一下采取这个动作后到达的下一个状态的期望价值。看看哪个动作可以到达的状态的期望价值函数最大,就选取这个动作。以此更新了π(s)
然后再次循环上述2、3步骤,直到V(s)与π(s)都收敛。
下面总结一下Policy evaluation和Policy improvement这两个阶段:
2.1策略评估Policy evaluation
策略评估就是在任意策略下,计算每个状态的值函数vπ,我们也把它称为预测问题。由值函数的定义Vπ(s)=Eπ[Gt∣St=s]展开为
Vπ(s)=∑aπ(a∣s)∑s′P(s′∣s,a)(R(s,a,s′)+γVπ(s′))
其中π(a∣s)为在s状态下执行动作a的概率,
下面是策略评估的python代码
def policy_evaluation(self, agent, max_iter=-1):
iteration = 0
# iterative eval
while True:
# one iteration
iteration += 1
new_value_pi = agent.value_pi.copy()
for i in range(1, agent.s_len): # for each state
value_sas = []
ac = agent.pi[i]
transition = agent.p[ac, i, :]
value_sa = np.dot(transition, agent.r + agent.gamma * agent.value_pi)
new_value_pi[i] = value_sa # value_sas[agent.policy[i]]
diff = np.sqrt(np.sum(np.power(agent.value_pi - new_value_pi, 2)))
# print 'diff={}'.format(diff)
if diff < 1e-6:
break
else:
agent.value_pi = new_value_pi
if iteration == max_iter:
break
2.2策略改进Policy improvement
策略改进是Greedy policy,它寻找每个状态下得到最大值函数vπ的策略π,也就是说,采取哪个动作可以达到下一个状态的最大值,那么就选择这个动作为最优策略
计算期望值
Qπ(s,a)=∑s′,rP(s′,r∣s,a)(r+γVπ(s′))
改进策略
π′(s)=argmaxaQπ(s,a)
改进策略后更新状态值
Vπ′(s)=maxa∑s′,rP(s′,r∣s,a)(r+γVπ′(s′))
策略改进的python代码如下:
def policy_improvement(self, agent):
new_policy = np.zeros_like(agent.pi)
for i in range(1, agent.s_len):
for j in range(0, agent.a_len):
agent.value_q[i, j] = np.dot(agent.p[j, i, :], agent.r + agent.gamma * agent.value_pi)
max_act = np.argmax(agent.value_q[i, :])
new_policy[i] = max_act
if np.all(np.equal(new_policy, agent.pi)):
return False
else:
agent.pi = new_policy
return True
策略迭代算法的伪代码如下所示:
三、价值迭代VALUE ITERATION
价值迭代算法主要流程如下。
1、初始化Value Function,即对每个状态的价值都赋一个初始值,一般是0
2、计算每一个状态-动作pair 的值,也就是Q(s,a)
3、 每一个状态st下都有一个动作空间at∈A,maxatQ(st,at),即最大的Q值作为当前状态的价值,更新Value Function
4、返回第2步,直至Value Function收敛。
迭代公式如下:
Vt+1(s)=max∑s′,rP(s′,r∣s,a)(r+γVt(s′))
值迭代的伪代码如下:
值迭代的python代码如下:
def value_iteration(self, agent, max_iter=-1):
iteration = 0
while True:
iteration += 1
new_value_pi = np.zeros_like(agent.value_pi)
for i in range(1, agent.s_len): # for each state
value_sas = []
for j in range(0, agent.a_len): # for each act
value_sa = np.dot(agent.p[j, i, :], agent.r + agent.gamma * agent.value_pi)
value_sas.append(value_sa)
new_value_pi[i] = max(value_sas)
diff = np.sqrt(np.sum(np.power(agent.value_pi - new_value_pi, 2)))
if diff < 1e-6:
break
else:
agent.value_pi = new_value_pi
if iteration == max_iter:
break
print('Iter {} rounds converge'.format(iteration))
for i in range(1, agent.s_len):
for j in range(0, agent.a_len):
agent.value_q[i, j] = np.dot(agent.p[j, i, :], agent.r + agent.gamma * agent.value_pi)
max_act = np.argmax(agent.value_q[i, :])
agent.pi[i] = max_act
那么策略迭代和值迭代有什么区别和联系呢?
共同点:
不同点:
1、策略迭代在价值评估阶段,每迭代一次都需要保证每个状态的值函数收敛,这是非常耗时的;而值迭代是采用动态规划的思想来收敛每个状态的值函数的。
2、策略迭代的第二步policy evaluation与值迭代的第二步finding optimal value function十分相似,除了后者用了max操作,前者没有max.因此后者可以得出optimal value function, 而前者不能得到optimal function.
3、策略迭代的收敛速度更快一些,在状态空间较小时,最好选用策略迭代方法。当状态空间较大时,值迭代的计算量更小一些。
4*****、侧重点不同:策略迭代最后是策略收敛,而值迭代是值函数收敛;收敛的方式也不同,策略迭代是argmax,而值函数是max