【强化学习】《动手学强化学习》动态规划算法

本文介绍了强化学习中的动态规划算法,包括策略迭代和价值迭代。在策略迭代中,详细阐述了策略评估和策略提升的过程,以及在悬崖漫步环境下的应用。价值迭代则通过直接更新状态价值函数来寻找最优策略,简化了策略迭代的计算复杂度。
摘要由CSDN通过智能技术生成

一、基本思想

  • 动态规划算法在计算机专业课中是特别重要的思想,将待求问题分解成若干个子问题,先求解子问题,然后利用子问题的解得到目标问题的解。贝尔曼方程将当前阶段的最优决策问题转化为下一阶段的最优决策问题,从而初始状态的最优决策可以由终状态的最优决策(一般易解)问题逐步迭代求解。
  • 本篇文章介绍如何用动态规划的思想来求解马尔可夫决策过程中的最优策略。基于动态规划的强化学习算法主要有两种:策略迭代价值迭代。策略迭代由两部分组成:策略评估与策略提升。策略评估使用贝尔曼期望方程来得到一个策略的状态价值函数;价值迭代直接使用贝尔曼最优方程来进行动态规划。
  • 所有的动态规划强化学习算法必须要求都是基于模型的(model-based),即知道完整的MDP信息才能够使用贝尔曼方程进行迭代更新。如果无法得知完整MDP信息,就只能通过和环境进行交互采样。

二、悬崖漫步环境

  • 4行12列的网格地图,左下角是起点,右下角是终点,最下方一行除了起点和终点以外都是悬崖。智能体的位置便是状态,在每个状态都可以执行上、下、左、右四个动作,如果触碰到边界则状态不变。终结状态是最下方一行除了起点以外的所有格子。智能体每走一步奖励-1,掉入悬崖奖励-100,在此激励下智能体想要用最短的步数到达终点。示意图如下
    在这里插入图片描述
class CliffWalkingEnv:
    """ 悬崖漫步环境"""
    def __init__(self, ncol=12, nrow=4):
        self.ncol = ncol  # 定义网格世界的列
        self.nrow = nrow  # 定义网格世界的行
        # 转移矩阵P[state][action] = [(p, next_state, reward, done)]包含下一个状态和奖励
        # P含有48个list,每个list包含4个list,每个list包含一个四元组(p,next_state,reward,done)
        self.P = self.createP()

    def createP(self):
        # 初始化
        P = [[[] for j in range(4)] for i in range(self.nrow * self.ncol)]

        # 4种动作, change[0]:上,change[1]:下, change[2]:左, change[3]:右。坐标系原点(0,0)定义在左上角
        change = [[0, -1], [0, 1], [-1, 0], [1, 0]]
        for i in range(self.nrow):
            for j in range(self.ncol):
                # 遍历每个位置,即每个状态
                for a in range(4):
                    # 遍历每个状态的4个动作
                    # 位置在悬崖或者目标状态,因为无法继续交互,任何动作奖励都为0
                    if i == self.nrow - 1 and j > 0:
                        P[i * self.ncol + j][a] = [(1, i * self.ncol + j, 0, True)]
                        continue
                    # 其他位置
                    # 与0取max是判断是否触碰左边界,与self.ncol-1取min是判断是否触碰右边界。
                    next_x = min(self.ncol - 1, max(0, j + change[a][0]))
                    # 与0取max是判断是否触碰上边界,与self.nrow-1取min是判断是否触碰下边界。
                    next_y = min(self.nrow - 1, max(0, i + change[a][1]))
                    next_state = next_y * self.ncol + next_x
                    reward = -1
                    done = False
                    # 下一个位置在悬崖或者终点
                    if next_y == self.nrow - 1 and next_x > 0:
                        done = True
                        if next_x != self.ncol - 1:  # 下一个位置在悬崖
                            reward = -100
                    P[i * self.ncol + j][a] = [(1, next_state, reward, done)]
        return P
  • 上述环境代码的编写核心在于状态转移矩阵的编写。转移矩阵 P P P共有48个(4x12)个list,每个list包含4个list对应4个动作,每个list包含一个4元组(转移概率,下一状态,奖励,是否终结)。

三、策略迭代算法

  • 策略迭代是策略评估和策略提升不断循环交替,直至最后得到最优策略的过程。策略评估是计算一个状态价值函数的过程;策略提升是优化当前策略的过程。如果策略提升之后的策略与之前相同说明此时策略迭代算法已达到了收敛状态,此时的策略即为最优策略。
3.1 策略评估
  • 策略评估说白了就是计算当前策略下的状态价值函数。
  • 首先来看一下之前提及的贝尔曼期望方程:
    V π ( s ) = ∑ a ∈ A π ( a ∣ s ) ( r ( s , a ) + γ ∑ s ′ ∈ S P ( s ′ ∣ s , a ) V π ( s ′ ) ) V^{\pi}(s)=\sum_{a\in A}\pi(a|s)(r(s,a)+\gamma\sum_{s'\in S}P(s'|s,a)V^{\pi}(s')) Vπ(s)=aAπ(as)(r(s,a)+γsSP(ss,a)Vπ(s))
    其中 π ( a ∣ s ) \pi(a|s) π(as)由策略决定, r ( s , a ) , P ( s ′ ∣ s , a ) r(s,a),P(s'|s,a) r(s,a),P(ss,a)由MDP决定。因此上述贝尔曼期望方程可以看作,在策略确定以及MDP确定的情况下,利用状态 s s s可转移到的所有周边状态 s ′ s' s的价值函数来计算 s s s的价值函数。
  • 策略评估是一个循环迭代的过程,第k+1轮中状态 s s s的价值函数使用第k轮中与之相关的状态 s ′ s' s的价值函数来求解。当迭代轮次最够多时,认为当前价值函数逼近或者就是真正的价值函数。实际应用中策略评估使用贝尔曼期望函数进行迭代使用大量计算资源,无须迭代无限轮次,只需要某次迭代更新的幅度非常小时算法即可停止。
3.2 策略提升
  • 策略评估之后,我们获得了在当前策略下所有状态的价值函数,也就是得到了在当前策略下每个状态出发到达终结状态的期望回报。得到了状态价值函数,也就相当于得到了动作价值函数。我们便可以在当前策略的基础上每个状态都贪心地选择最优的动作 a a a以最大化 Q π ( s , a ) Q^{\pi}(s,a) Qπ(s,a),从而实现策略提升。
    π ′ ( s ) = arg ⁡ max ⁡ a Q π ( s , a ) = arg ⁡
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值