强化学习三、策略迭代与值迭代

本文参考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π[GtSt=s]展开为

Vπ(s)=aπ(as)sP(ss,a)(R(s,a,s)+γVπ(s))

其中π(as)为在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,rs,a)(r+γVπ(s))

改进策略

π(s)=argmaxaQπ(s,a)

改进策略后更新状态值

Vπ(s)=maxas,rP(s,rs,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

策略迭代算法的伪代码如下所示:

强化学习三、策略迭代与值迭代_第1张图片

 

三、价值迭代VALUE ITERATION

价值迭代算法主要流程如下。

1、初始化Value Function,即对每个状态的价值都赋一个初始值,一般是0

2、计算每一个状态-动作pair 的值,也就是Q(s,a)

3、 每一个状态st​下都有一个动作空间at​∈A,maxat​​Q(st​,at​),即最大的Q值作为当前状态的价值,更新Value Function

4、返回第2步,直至Value Function收敛。

迭代公式如下:

Vt+1(s)=maxs,rP(s,rs,a)(r+γVt(s))

值迭代的伪代码如下:

强化学习三、策略迭代与值迭代_第2张图片

值迭代的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. 他们都是基于模型的方法,也就是说都需要知道环境的状态转移概率P;
  2. 都需要通过bellman方程来更新状态值函数

不同点:

强化学习三、策略迭代与值迭代_第3张图片

强化学习三、策略迭代与值迭代_第4张图片

1、策略迭代在价值评估阶段,每迭代一次都需要保证每个状态的值函数收敛,这是非常耗时的;而值迭代是采用动态规划的思想来收敛每个状态的值函数的。

2、策略迭代的第二步policy evaluation与值迭代的第二步finding optimal value function十分相似,除了后者用了max操作,前者没有max.因此后者可以得出optimal value function, 而前者不能得到optimal function.

3、策略迭代的收敛速度更快一些,在状态空间较小时,最好选用策略迭代方法。当状态空间较大时,值迭代的计算量更小一些。

4*****、侧重点不同:策略迭代最后是策略收敛,而值迭代是值函数收敛;收敛的方式也不同,策略迭代是argmax,而值函数是max

 

你可能感兴趣的:(笔记)