前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >强化学习(十一) Prioritized Replay DQN

强化学习(十一) Prioritized Replay DQN

作者头像
刘建平Pinard
发布于 2018-10-22 07:28:09
发布于 2018-10-22 07:28:09
1K00
代码可运行
举报
运行总次数:0
代码可运行

强化学习(十)Double DQN (DDQN)中,我们讲到了DDQN使用两个Q网络,用当前Q网络计算最大Q值对应的动作,用目标Q网络计算这个最大动作对应的目标Q值,进而消除贪婪法带来的偏差。今天我们在DDQN的基础上,对经验回放部分的逻辑做优化。对应的算法是Prioritized Replay DQN。

    本章内容主要参考了ICML 2016的deep RL tutorial和Prioritized Replay DQN的论文<Prioritized Experience Replay>(ICLR 2016)。

1. Prioritized Replay DQN之前算法的问题

    在Prioritized Replay DQN之前,我们已经讨论了很多种DQN,比如Nature DQN, DDQN等,他们都是通过经验回放来采样,进而做目标Q值的计算的。在采样的时候,我们是一视同仁,在经验回放池里面的所有的样本都有相同的被采样到的概率。

    但是注意到在经验回放池里面的不同的样本由于TD误差的不同,对我们反向传播的作用是不一样的。TD误差越大,那么对我们反向传播的作用越大。而TD误差小的样本,由于TD误差小,对反向梯度的计算影响不大。在Q网络中,TD误差就是目标Q网络计算的目标Q值和当前Q网络计算的Q值之间的差距。

    这样如果TD误差的绝对值$|\delta(t)|$较大的样本更容易被采样,则我们的算法会比较容易收敛。下面我们看看Prioritized Replay DQN的算法思路。

2.  Prioritized Replay DQN算法的建模

    Prioritized Replay DQN根据每个样本的TD误差绝对值$|\delta(t)|$,给定该样本的优先级正比于$|\delta(t)|$,将这个优先级的值存入经验回放池。回忆下之前的DQN算法,我们仅仅只保存和环境交互得到的样本状态,动作,奖励等数据,没有优先级这个说法。

    由于引入了经验回放的优先级,那么Prioritized Replay DQN的经验回放池和之前的其他DQN算法的经验回放池就不一样了。因为这个优先级大小会影响它被采样的概率。在实际使用中,我们通常使用SumTree这样的二叉树结构来做我们的带优先级的经验回放池样本的存储。

    具体的SumTree树结构如下图:

    所有的经验回放样本只保存在最下面的叶子节点上面,一个节点一个样本。内部节点不保存样本数据。而叶子节点除了保存数据以外,还要保存该样本的优先级,就是图中的显示的数字。对于内部节点每个节点只保存自己的儿子节点的优先级值之和,如图中内部节点上显示的数字。

    这样保存有什么好处呢?主要是方便采样。以上面的树结构为例,根节点是42,如果要采样一个样本,那么我们可以在0,42之间做均匀采样,采样到哪个区间,就是哪个样本。比如我们采样到了26, 在(25-29)这个区间,那么就是第四个叶子节点被采样到。而注意到第三个叶子节点优先级最高,是12,它的区间13-25也是最长的,会比其他节点更容易被采样到。

    如果要采样两个样本,我们可以在0,21,21,42两个区间做均匀采样,方法和上面采样一个样本类似。

    类似的采样算法思想我们在word2vec原理(三) 基于Negative Sampling的模型第四节中也有讲到。

    除了经验回放池,现在我们的Q网络的算法损失函数也有优化,之前我们的损失函数是:$$\frac{1}{m}\sum\limits_{j=1}^m(y_j-Q(\phi(S_j),A_j,w))^2$$

    现在我们新的考虑了样本优先级的损失函数是$$\frac{1}{m}\sum\limits_{j=1}^mw_j(y_j-Q(\phi(S_j),A_j,w))^2$$

    其中$w_j$是第j个样本的优先级权重,由TD误差$|\delta(t)|$归一化得到。

    第三个要注意的点就是当我们对Q网络参数进行了梯度更新后,需要重新计算TD误差,并将TD误差更新到SunTree上面。

    除了以上三个部分,Prioritized Replay DQN和DDQN的算法流程相同。

3. Prioritized Replay DQN算法流程

    下面我们总结下Prioritized Replay DQN的算法流程,基于上一节的DDQN,因此这个算法我们应该叫做Prioritized Replay DDQN。主流程参考论文<Prioritized Experience Replay>(ICLR 2016)。

    算法输入:迭代轮数$T$,状态特征维度$n$, 动作集$A$, 步长$\alpha$,采样权重系数$\beta$,衰减因子$\gamma$, 探索率$\epsilon$, 当前Q网络$Q$,目标Q网络$Q'$, 批量梯度下降的样本数$m$,目标Q网络参数更新频率$C$, SumTree的叶子节点数$S$。

    输出:Q网络参数。

    1. 随机初始化所有的状态和动作对应的价值$Q$.  随机初始化当前Q网络的所有参数$w$,初始化目标Q网络$Q'$的参数$w' = w$。初始化经验回放SumTree的默认数据结构,所有SumTree的S个叶子节点的优先级$p_j$为1。

    2. for i from 1 to T,进行迭代。

      a) 初始化S为当前状态序列的第一个状态, 拿到其特征向量$\phi(S)$

      b) 在Q网络中使用$\phi(S)$作为输入,得到Q网络的所有动作对应的Q值输出。用$\epsilon-$贪婪法在当前Q值输出中选择对应的动作$A$

      c) 在状态$S$执行当前动作$A$,得到新状态$S'$对应的特征向量$\phi(S')$和奖励$R$,是否终止状态is_end

      d) 将${\phi(S),A,R,\phi(S'),is\_end}$这个五元组存入SumTree

      e) $S=S'$

      f)  从SumTree中采样$m$个样本${\phi(S_j),A_j,R_j,\phi(S'_j),is\_end_j}, j=1,2.,,,m$,每个样本被采样的概率基于$P(j) = \frac{p_j}{\sum\limits_i(p_i)}$,损失函数权重$w_j = (N*P(j))^{-\beta}/\max_i(w_i)$,计算当前目标Q值$y_j$:$$y_j= \begin{cases} R_j& {is\_end_j\; is \;true}\ R_j + \gamma Q'(\phi(S'_j),\arg\max_{a'}Q(\phi(S'_j),a,w),w')& {is\_end_j\; is \;false} \end{cases}$$

      g)  使用均方差损失函数$\frac{1}{m}\sum\limits_{j=1}^mw_j(y_j-Q(\phi(S_j),A_j,w))^2$,通过神经网络的梯度反向传播来更新Q网络的所有参数$w$

      h) 重新计算所有样本的TD误差$\delta_j = y_j- Q(\phi(S_j),A_j,w)$,更新SumTree中所有节点的优先级$p_j = |\delta_j|$

      i) 如果T%C=1,则更新目标Q网络参数$w'=w$

      j) 如果$S'$是终止状态,当前轮迭代完毕,否则转到步骤b)

      注意,上述第二步的f步和g步的Q值计算也都需要通过Q网络计算得到。另外,实际应用中,为了算法较好的收敛,探索率$\epsilon$需要随着迭代的进行而变小。

4. Prioritized Replay DDQN算法流程

    下面我们给出Prioritized Replay DDQN算法的实例代码。仍然使用了OpenAI Gym中的CartPole-v0游戏来作为我们算法应用。CartPole-v0游戏的介绍参见这里。它比较简单,基本要求就是控制下面的cart移动使连接在上面的pole保持垂直不倒。这个任务只有两个离散动作,要么向左用力,要么向右用力。而state状态就是这个cart的位置和速度, pole的角度和角速度,4维的特征。坚持到200分的奖励则为过关。

    完整的代码参见我的github: https://github.com/ljpzzz/machinelearning/blob/master/reinforcement-learning/ddqn_prioritised_replay.py, 代码中的SumTree的结构和经验回放池的结构参考了morvanzhou的github代码

    这里重点讲下和第三节中算法描述不同的地方,主要是$w_j$的计算。注意到:$$w_j = \frac{ (N*P(j))^{-\beta}}{\max_i(w_i)} =  \frac{ (N*P(j))^{-\beta}}{\max_i(N*P(i))^{-\beta})} =  \frac{ (P(j))^{-\beta}}{\max_i(P(i))^{-\beta})} =( \frac{p_j}{\min_iP(i)})^{-\beta}$$

    因此代码里面$w_j$,即ISWeights的计算代码是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    def sample(self, n):
        b_idx, b_memory, ISWeights = np.empty((n,), dtype=np.int32), np.empty((n, self.tree.data[0].size)), np.empty((n, 1))
        pri_seg = self.tree.total_p / n       # priority segment
        self.beta = np.min([1., self.beta + self.beta_increment_per_sampling])  # max = 1

        min_prob = np.min(self.tree.tree[-self.tree.capacity:]) / self.tree.total_p     # for later calculate ISweight
        if min_prob == 0:
            min_prob = 0.00001
        for i in range(n):
            a, b = pri_seg * i, pri_seg * (i + 1)
            v = np.random.uniform(a, b)
            idx, p, data = self.tree.get_leaf(v)
            prob = p / self.tree.total_p
            ISWeights[i, 0] = np.power(prob/min_prob, -self.beta)
            b_idx[i], b_memory[i, :] = idx, data
        return b_idx, b_memory, ISWeights

    上述代码的采样在第二节已经讲到。根据树的优先级的和total_p和采样数n,将要采样的区间划分为n段,每段来进行均匀采样,根据采样到的值落到的区间,决定被采样到的叶子节点。当我们拿到第i段的均匀采样值v以后,就可以去SumTree中找对应的叶子节点拿样本数据,样本叶子节点序号以及样本优先级了。代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    def get_leaf(self, v):
        """
        Tree structure and array storage:
        Tree index:
             0         -> storing priority sum
            / \
          1     2
         / \   / \
        3   4 5   6    -> storing priority for transitions
        Array type for storing:
        [0,1,2,3,4,5,6]
        """
        parent_idx = 0
        while True:     # the while loop is faster than the method in the reference code
            cl_idx = 2 * parent_idx + 1         # this leaf's left and right kids
            cr_idx = cl_idx + 1
            if cl_idx >= len(self.tree):        # reach bottom, end search
                leaf_idx = parent_idx
                break
            else:       # downward search, always search for a higher priority node
                if v <= self.tree[cl_idx]:
                    parent_idx = cl_idx
                else:
                    v -= self.tree[cl_idx]
                    parent_idx = cr_idx

        data_idx = leaf_idx - self.capacity + 1
        return leaf_idx, self.tree[leaf_idx], self.data[data_idx]

    除了采样部分,要注意的就是当梯度更新完毕后,我们要去更新SumTree的权重,代码如下,注意叶子节点的权重更新后,要向上回溯,更新所有祖先节点的权重。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    self.memory.batch_update(tree_idx, abs_errors)  # update priority
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    def batch_update(self, tree_idx, abs_errors):
        abs_errors += self.epsilon  # convert to abs and avoid 0
        clipped_errors = np.minimum(abs_errors, self.abs_err_upper)
        ps = np.power(clipped_errors, self.alpha)
        for ti, p in zip(tree_idx, ps):
            self.tree.update(ti, p)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    def update(self, tree_idx, p):
        change = p - self.tree[tree_idx]
        self.tree[tree_idx] = p
        # then propagate the change through tree
        while tree_idx != 0:    # this method is faster than the recursive loop in the reference code
            tree_idx = (tree_idx - 1) // 2
            self.tree[tree_idx] += change

    除了上面这部分的区别,和DDQN比,TensorFlow的网络结构流程中多了一个TD误差的计算节点,以及损失函数多了一个ISWeights系数。此外,区别不大。

5. Prioritized Replay DQN小结

    Prioritized Replay DQN和DDQN相比,收敛速度有了很大的提高,避免了一些没有价值的迭代,因此是一个不错的优化点。同时它也可以直接集成DDQN算法,所以是一个比较常用的DQN算法。

    下一篇我们讨论DQN家族的另一个优化算法Duel DQN,它将价值Q分解为两部分,第一部分是仅仅受状态但不受动作影响的部分,第二部分才是同时受状态和动作影响的部分,算法的效果也很好。

(欢迎转载,转载请注明出处。欢迎沟通交流: liujianping-ok@163.com)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-10-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
DQN三大改进(二)-Prioritised replay
Prioritised replay原文:https://arxiv.org/pdf/1511.05952.pdf 代码地址:https://github.com/princewen/tensorflow_practice/tree/master/Prioritized_Replay_DQN_demo 如果大家觉得代码排版较乱,可以参考原文:https://www.jianshu.com/p/db14fdc67d2c 1、背景 这篇文章我们会默认大家已经了解了DQN的相关知识,如果大家对于DQN还不是很了解
石晓文
2018/04/11
2.9K0
DQN三大改进(二)-Prioritised replay
强化学习(十)Double DQN (DDQN)
    在强化学习(九)Deep Q-Learning进阶之Nature DQN中,我们讨论了Nature DQN的算法流程,它通过使用两个相同的神经网络,以解决数据样本和网络训练之前的相关性。但是还是有其他值得优化的点,文本就关注于Nature DQN的一个改进版本: Double DQN算法(以下简称DDQN)。
刘建平Pinard
2018/10/15
3.1K0
Prioritized Experience Replay (DQN)——让DQN变得更会学习
1.前言2.算法2.1 SumTree有效抽样2.2 Memory类2.3 更新方法对比结果
CristianoC
2020/05/31
1.8K0
强化学习(十二) Dueling DQN
    在强化学习(十一) Prioritized Replay DQN中,我们讨论了对DQN的经验回放池按权重采样来优化DQN算法的方法,本文讨论另一种优化方法,Dueling DQN。本章内容主要参考了ICML 2016的deep RL tutorial和Dueling DQN的论文<Dueling Network Architectures for Deep Reinforcement Learning>(ICML 2016)。
刘建平Pinard
2018/12/10
1.3K0
强化学习(十二) Dueling DQN
强化学习(十六) 深度确定性策略梯度(DDPG)
    在强化学习(十五) A3C中,我们讨论了使用多线程的方法来解决Actor-Critic难收敛的问题,今天我们不使用多线程,而是使用和DDQN类似的方法:即经验回放和双网络的方法来改进Actor-Critic难收敛的问题,这个算法就是是深度确定性策略梯度(Deep Deterministic Policy Gradient,以下简称DDPG)。
刘建平Pinard
2019/03/05
5.7K0
Rainbow:整合DQN六种改进的深度强化学习方法!
在2013年DQN首次被提出后,学者们对其进行了多方面的改进,其中最主要的有六个,分别是: Double-DQN:将动作选择和价值估计分开,避免价值过高估计 Dueling-DQN:将Q值分解为状态价值和优势函数,得到更多有用信息 Prioritized Replay Buffer:将经验池中的经验按照优先级进行采样 Multi-Step Learning:使得目标价值估计更为准确 Distributional DQN(Categorical DQN):得到价值分布 NoisyNet:增强模型的探索能力
石晓文
2019/01/02
3.6K0
强化学习待解决问题和主流Trick整理
【产生原因】序贯探索决策中有些动作频繁被执行,而有些动作几乎从不会被采样。由于训练分布完全依赖于序贯决策样本,导致训练出的数据分布局部化,即与完整状态-动作空间分布不同
SL_World
2021/09/18
1.4K0
强化学习(八)价值函数的近似表示与Deep Q-Learning
    在强化学习系列的前七篇里,我们主要讨论的都是规模比较小的强化学习问题求解算法。今天开始我们步入深度强化学习。这一篇关注于价值函数的近似表示和Deep Q-Learning算法。
刘建平Pinard
2018/10/11
1.4K0
强化学习(八)价值函数的近似表示与Deep Q-Learning
强化学习(九)Deep Q-Learning进阶之Nature DQN
    在强化学习(八)价值函数的近似表示与Deep Q-Learning中,我们讲到了Deep Q-Learning(NIPS 2013)的算法和代码,在这个算法基础上,有很多Deep Q-Learning(以下简称DQN)的改进版,今天我们来讨论DQN的第一个改进版Nature DQN(NIPS 2015)。
刘建平Pinard
2018/10/11
1.2K0
强化学习系列之九:Deep Q Network (DQN)
本文介绍了强化学习中的马尔科夫决策过程、模型相关的强化学习、模型无关的策略评价、模型无关的策略学习和价值函数近似等概念。作者通过举例来说明这些概念在强化学习中的应用,并提出了针对这些概念的相关算法。最后,作者对强化学习未来的研究方向进行了展望,包括深度强化学习和策略搜索算法等。
AlgorithmDog
2017/12/29
2.4K0
强化学习系列之九:Deep Q Network (DQN)
【强化学习】DQN 的各种改进
DQN 发表于 NIPS 2013,在此之后 DeepMind 不断对 DQN 进行改进,首先在 2015 年初发布了 Nature 文章,提出了 Nature 版本的 DQN,然后接下来在 2015 年一年内提出了 Double DQN,Prioritied Replay,还有 Dueling Network 三种主要方法,又极大的提升了 DQN 的性能,目前的改进型 DQN 算法在 Atari 游戏的平均得分是 Nature 版 DQN 的三倍之多。因此,在本文中,我们将介绍一下各个改进的方法,并在最后给出用 Nature-DQN 的实现方法。
阿泽 Crz
2020/11/17
3.5K0
【强化学习】DQN 的各种改进
强化学习算法总结(一)——从零到DQN变体
中对应价值最大的动作的Q值进行更新,注意这里只是更新,并不会真的执行这个价值最大的动作。这里的更新策略(评估策略)与我们的行为策略(
CristianoC
2021/04/16
2.7K0
强化学习算法总结(一)——从零到DQN变体
Deep Q learning: DQN及其改进
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
Steve Wang
2019/11/18
7840
深度强化学习综述(上)
人工智能中的很多应用问题需要算法在每个时刻做出决策并执行动作。对于围棋,每一步需要决定在棋盘的哪个位置放置棋子,以最大可能的战胜对手;对于自动驾驶算法,需要根据路况来确定当前的行驶策略以保证安全的行驶到目的地;对于机械手,要驱动手臂运动以抓取到设定的目标物体。这类问题有一个共同的特点:要根据当前的条件作出决策和动作,以达到某一预期目标。解决这类问题的机器学习算法称为强化学习(reinforcement learning,RL)。虽然传统的强化学习理论在过去几十年中得到了不断的完善,但还是难以解决现实世界中的复杂问题。
SIGAI学习与实践平台
2018/12/10
1.2K0
深度强化学习综述(上)
强化学习算法解析:深度 Q 网络(Deep Q - Network,DQN)
强化学习(Reinforcement Learning, RL)是机器学习领域的重要分支,它研究如何让智能体(Agent)通过与环境的交互来学习最优的行为策略。在强化学习中,智能体的目标是最大化长期累积奖励,而环境则根据智能体的行为给出反馈。Q-learning 是强化学习中一种经典的算法,它通过学习状态 - 行动对(State-Action Pair)的 Q 值来指导智能体的行为。然而,传统的 Q-learning 算法在面对状态空间巨大的场景时(如游戏、机器人控制等)存在明显的局限性,因为直接存储和更新所有状态 - 行动对的 Q 值在计算和存储上是不可行的。
jack.yang
2025/04/17
1.1K0
强化学习算法解析:深度 Q 网络(Deep Q - Network,DQN)
强化学习从基础到进阶-案例与实践[4]:深度Q网络-DQN、double DQN、经验回放、rainbow、分布式DQN
,但是这样的方法存在很大的局限性。例如,现实中的强化学习任务所面临的状态空间往往是连续的,存在无穷多个状态,在这种情况下,就不能再使用表格对价值函数进行存储。价值函数近似利用函数直接拟合状态价值函数或动作价值函数,降低了对存储空间的要求,有效地解决了这个问题。
汀丶人工智能
2023/10/11
9750
强化学习从基础到进阶-案例与实践[4]:深度Q网络-DQN、double DQN、经验回放、rainbow、分布式DQN
【RL Base】强化学习核心算法:深度Q网络(DQN)算法
深度Q网络(DQN)是深度强化学习的核心算法之一,由Google DeepMind在2015年的论文《Playing Atari with Deep Reinforcement Learning》中提出。DQN通过结合深度学习和强化学习,利用神经网络近似Q值函数,在高维、连续状态空间的环境中表现出了强大的能力。
不去幼儿园
2024/12/03
4510
【RL Base】强化学习核心算法:深度Q网络(DQN)算法
强化学习基础篇3:DQN、Actor-Critic详细讲解
在之前的内容中,我们讲解了Q-learning和Sarsa算法。在这两个算法中,需要用一个Q表格来记录不同状态动作对应的价值,即一个大小为 $状态个数,动作个数$ 的二维数组。在一些简单的强化学习环境中,比如迷宫游戏中(图1a),迷宫大小为4*4,因此该游戏存在16个state;而悬崖问题(图1b)的地图大小为 4*12,因此在该问题中状态数量为48,这些都属于数量较少的状态,所以可以用Q表格来记录对应的状态动作价值。但当我们需要应用强化学习来解决实际问题时,比如解决国际象棋问题或围棋问题,那么环境中就会包含 $10^{47}$ 个state或 $10^{170}$ 个state,如此庞大的状态数量已经很难用Q表格来进行存储,更不要说在3D仿真环境中,机器人手脚弯曲的状态是完全不可数的。由此可以看到Q表格在大状态问题和不可数状态问题时的局限性。同时,在一个强化学习环境中,不是所有的状态都会被经常访问,其中有些状态的访问次数很少或几乎为零,这就会导致价值估计并不可靠。
汀丶人工智能
2023/06/03
2.5K0
强化学习基础篇3:DQN、Actor-Critic详细讲解
强化学习(十四) Actor-Critic
    在强化学习(十三) 策略梯度(Policy Gradient)中,我们讲到了基于策略(Policy Based)的强化学习方法的基本思路,并讨论了蒙特卡罗策略梯度reinforce算法。但是由于该算法需要完整的状态序列,同时单独对策略函数进行迭代更新,不太容易收敛。
刘建平Pinard
2019/02/22
1.1K0
【强化学习】Double DQN(Double Deep Q-Network)算法
强化学习中的深度Q网络(DQN)是一种将深度学习与Q学习结合的算法,它通过神经网络逼近Q函数以解决复杂的高维状态问题。然而,DQN存在过估计问题(Overestimation Bias),即在更新Q值时,由于同时使用同一个网络选择动作和计算目标Q值,可能导致Q值的估计偏高。
不去幼儿园
2025/01/08
2.1K0
【强化学习】Double DQN(Double Deep Q-Network)算法
推荐阅读
相关推荐
DQN三大改进(二)-Prioritised replay
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验