草庐IT

强化学习-学习笔记10 | 经验回放

Clivia Du 2023-03-28 原文

Experience Replay 经验回放。价值学习高级技巧第一篇。

之前讲解的 价值学习的方法 都很简单,所以实现效果并不优秀。接下来会介绍一些高级的技巧,可以大幅度提高 DQN 的表现。Experience Replay 是最重要的技巧。

10. 经验回放

10.1 DQN / Deep Q Network

DQN 是用神经网络 \(Q(s,a;w)\) 来近似 Q-star 函数。通常用 TD 算法训练 DQN。TD算法思路如下:

  • agent 观察当前状态 \(s_t\) 并执行动作 \(a_t\)

  • 环境给出新的状态 \(s_{t+1}\) ,返回奖励 \(r_t\)

  • TD target: \(y_t = r_t + \gamma \cdot {\mathop{max}\limits_{a}Q^*(s_{t+1},a;w)}\)

  • TD error:\(\delta_t = q_t - y_t; \ \ 其中q_t=Q(s_t,a_t;w)\)

    \(q_t\) 完全是猜测的,\(y_t\) 有一部分真实值。

  • 我们的目标是让 \(q_t\) 接近 \(y_t\),所以最小化 \(\delta^2\),即:

  • \(\delta_t\)的均值记为:\(L(w)=\frac{1}{T}\sum_{t=1}^{T}\frac{\delta^2_t}{2}\),通过调整 w ,使得 L(w) 尽量小。

  • 之前是使用在线梯度下降来更新 w:

    • 得到 transition \((s_t,a_t,r_t,s_{t+1})\),计算 \(\delta_t\)
    • 计算梯度 \(g_t = \frac{\partial \ \delta^2_t}{\partial \ w} = \delta_t \cdot \frac{\partial \ Q(s_t,a_t;w)}{\partial \ w}\)
    • 梯度下降更新 w:\(w \leftarrow w-\alpha\cdot g_t\)
    • 接着是之前忽略掉的一点,在更新完 w 之后,我们丢弃了这次使用的 transition。

10.2 DQN的不足之处

a. 经验浪费

这里的经验(包括经验回放)是指 从开始到结束所有的 transitions,刚才回顾的TD算法在使用了一次 transition 后就将它丢弃,这就造成了经验的浪费。

b. 相关更新

另外一个不足的原因是,前后两个 transition 之间存在很强的关联。实践证明这种相关性是 有害的。如果能够把 这些 transition 打散,更有利于训练 DQN。

经验回放就可以很好克服以上两个缺点。

10.3 经验回放原理

一个 transition 相当于一条训练数据,为了重复使用之前的 transition,可以把 最近的 transition 存入一个队列(Replay Buffer),容量为 n,n 是一个超参数。

经验回放 的使用方法:

  • 我们的目标是 将\(L(w)=\frac{1}{T}\sum_{t=1}^{T}\frac{\delta^2_t}{2}\)最小化

  • 使用随机梯度下降改进 L(w);

    • 每次从 Replay Buffer中随机均匀抽样一个 transition \((s_i,a_i,r_i,s_{i+1})\)

      注意这里可以随机抽取多个 transition

    • 计算 TD error \(\delta_i\)

    • 计算随机梯度:\(g_i = \frac{\partial \ \delta^2_i/2}{\partial w}=\delta_i \cdot \frac{\partial \ Q(s_i,a_i;w)}{\partial \ w}\)

    • 随机梯度下降:\(w \leftarrow w-\alpha\cdot g_i\)

经验回放的好处就是;

  1. 打破 transition 之间的相关性;
  2. 重复使用之前的经验。

10.4 经验回放改进

经验回放以改进效果明显而被广泛使用,也有了很多对经验回放的改进。下面介绍一种:优先经验回放 / Prioritized Experience Reply。

改进之处在于使用非均匀抽样来选择 transitions。

优先经验回放的想法如下:

  • 队列里存了很多 transitions,但是它们的重要性并不一样;

  • 我们可以通过 TD error 来判断 transitions 的重要性,绝对值越大,就说明越重要。

  • 原因是,这里的优先级是指,我们要优先训练 难以训练的、训练样本少的、训练效果不好的这些场景,给与这些 transition 更大的重视(权重)

    (就好像要多看看自己的错题,而不是自己很容易做对的题)

    而 TD error 大的 transition,实际意义是与实际值偏离大,说明对于场景不熟悉。

抽样方法介绍两种:

  1. 使抽样概率与 TD-error 线性相关:\(p_t\propto|\gamma_t|+\epsilon\)

    \(\epsilon\) 是一个很小的数,避免 \(p_t\) 为 0 ;

  2. \(|\delta_t|\) 作排序,rank(t)是其序号,大的靠前,小的靠后:\(p_t\propto \frac{1}{rank(t)}\),这样就让排在前面的更容易被抽到。

调整学习率矫正偏差:

因为不同的 transition 被人为附上了不同的概率,成为了非均匀抽样,这样会造成 DQN预测有偏差,通过调整学习率来矫正:

当所有 transition 的概率都一样,那么所有的 transition 的学习率一样。如果非均匀抽样,需要根据不同的 transition 概率来调整学习率。

  • 如果 transition 的抽样概率较大,应当调小它的学习率;
  • 具体操作是用\((n \cdot p_t)^{-\beta},\beta\in(0,1)\) 乘以 学习率 α,n 是队列容量,β 是一个0~1之间的数,是超参数,论文中一般从很小增长到1。

下面再考虑一个事情:

即,在优先经验回放中,我们需要把 TD-error 跟 transtions 放在一起,而刚放入队列的 transition 还没有进行训练 DQN,不知道 TD-error,这时直接把它的 \(\delta\) 设为最大值,给他最高的权重;

每次我们使用了 transition 之后,重新计算 它的 \(\delta_t\),更新 transition 的权重。

x. 参考教程

有关强化学习-学习笔记10 | 经验回放的更多相关文章

  1. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  2. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  3. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  4. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  5. 由于 libgmp.10.dylib 的问题,Ruby 2.2.0 无法运行 - 2

    我刚刚安装了带有RVM的Ruby2.2.0,并尝试使用它得到了这个:$rvmuse2.2.0--defaultUsing/Users/brandon/.rvm/gems/ruby-2.2.0dyld:Librarynotloaded:/usr/local/lib/libgmp.10.dylibReferencedfrom:/Users/brandon/.rvm/rubies/ruby-2.2.0/bin/rubyReason:Incompatiblelibraryversion:rubyrequiresversion13.0.0orlater,butlibgmp.10.dylibpro

  6. ruby - ri 有空文件 – Ubuntu 11.10, Ruby 1.9 - 2

    我正在运行Ubuntu11.10并像这样安装Ruby1.9:$sudoapt-getinstallruby1.9rubygems一切都运行良好,但ri似乎有空文档。ri告诉我文档是空的,我必须安装它们。我执行此操作是因为我读到它会有所帮助:$rdoc--all--ri现在,当我尝试打开任何文档时:$riArrayNothingknownaboutArray我搜索的其他所有内容都是一样的。 最佳答案 这个呢?apt-getinstallri1.8编辑或者试试这个:(非rvm)geminstallrdocrdoc-datardoc-da

  7. ruby-on-rails - gem install rmagick -v 2.13.1 错误 Failed to build gem native extension on Mac OS 10.9.1 - 2

    我已经通过提供MagickWand.h的路径尝试了一切,我安装了命令工具。谁能帮帮我?$geminstallrmagick-v2.13.1Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingrmagick:ERROR:Failedtobuildgemnativeextension./Users/ghazanfarali/.rvm/rubies/ruby-1.8.7-p357/bin/rubyextconf.rbcheckingforRubyversion>=1.8.5...yescheckingfor/

  8. ruby - 我如何学习 ruby​​ 的正则表达式? - 2

    如何学习ruby​​的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby​​的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/

  9. ruby - 安装 tiny_tds 在 mac os 10.10.5 上出现错误 - 2

    我正在使用macos,我想使用ruby​​驱动程序连接到sqlserver。我想使用tiny_tds,但它给出了缺少free_tds的错误,但它已经安装了。怎么能过这个?~brewinstallfreetdsWarning:freetds-0.91.112alreadyinstalled~sudogeminstalltiny_tdsBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtiny_tds:ERROR:Failedtobuildgemnativeextension.完整日志如下:/System

  10. ruby - rails 3.2.2(或 3.2.1)+ Postgresql 9.1.3 + Ubuntu 11.10 连接错误 - 2

    我正在使用PostgreSQL9.1.3(x86_64-pc-linux-gnu上的PostgreSQL9.1.3,由gcc-4.6.real(Ubuntu/Linaro4.6.1-9ubuntu3)4.6.1,64位编译)和在ubuntu11.10上运行3.2.2或3.2.1。现在,我可以使用以下命令连接PostgreSQLsupostgres输入密码我可以看到postgres=#我将以下详细信息放在我的config/database.yml中并执行“railsdb”,它工作正常。开发:adapter:postgresqlencoding:utf8reconnect:falsedat

随机推荐