草庐IT

强化学习-学习笔记2 | 价值学习

Clivia Du 2023-03-28 原文

Value-Based Reinforcement Learning : 价值学习

2. 价值学习

2.1 Deep Q-Network DQN

其实就是用一个神经网络来近似 \(Q*\) 函数。

agent 的目标是打赢游戏,如果用强化学习的语言来讲,就是在游戏结束的时候拿到的奖励总和 Rewards 越大越好。

a. Q-star Function

问题:假设知道了 \(Q^*(s,a)\) 函数,哪个是最好的动作?

显然,最好的动作是\(a^* = \mathop{argmax}\limits_{a}Q^*(s,a)\)

\(Q^*(s,a)\)可以给每个动作打分,就像一个先知,能告诉你每个动作带来的平均回报,选平均回报最高的那个动作。

但事实是,每个人都无法预测未来,我们并不知道\(Q^*(s,a)\)。而价值学习就在于学习出一个函数来近似\(Q^*(s,a)\) 作决策。

  • 解决:Deep Q-network(DQN),即用一个神经网络 \(Q(s,a;w)\)来近似 \(Q^*(s,a)\) 函数。
  • 神经网络参数是 w ,输入是状态 s,输出是对所有可能动作的打分,每一个动作对应一个分数。
  • 通过奖励来学习这个神经网络,这个网络给动作的打分就会逐渐改进,越来越精准
  • 玩上几百万次超级玛丽,就能训练出一个先知。

b. Example

对于不同的案例,DQN 的结构会不一样。

如果是玩超级玛丽

  • 屏幕画面作为输入
  • 用一个卷积层把图片变成特征向量
  • 最后用几个全连接层把特征映射到一个输出的向量
  • 输出的向量就是对动作的打分,向量每一个元素对应一个动作的分值,agent 会选择分值最大的方向进行动作。

c. 用 DQN 打游戏

DQN 的具体执行过程如下:

分步解释:

  • $ s_t \rightarrow a_t$:当前观测到状态 \(s_t\),用公式 $ a_t=\mathop{argmax}\limits_{a}Q^*(s,a)$ 把 \(s_t\) 作为输入,给所有动作打分,选出分数最高的动作 \(a_t\)
  • agent 执行 \(a_t\) 这个动作后,环境会改变状态,用状态转移函数 \(p(\cdot|s_t,a_t)\) 随机抽样得出一个新状态 \(s_{t+1}\)
  • 环境还会告诉这一步的奖励 \(r_t\)奖励就是强化学习中的监督信号,DQN靠这些奖励来训练。
  • 有了新的状态 \(s_{t+1}\),DQN 继续对所有动作打分,agent 选择分数最高动作 \(a_{t+1}\)
  • 执行 \(a_{t+1}\) 后,环境会再更新一个状态 \(s_{t+2}\),给出一个奖励 \(r_{t+1}\)
  • 然后不断循环往复,直到游戏结束

2.2 TD 学习

如何训练 DQN ?最常使用的是 Temporal Difference Learning。TD学习的原理可以用下面这个例子来展示:

a. 案例分析

要开车从纽约到亚特兰大,有一个模型\(Q(w)\)预测出开车出行的开销是1000分钟。这个预测可能不准,需要更多的人提供数据来训练模型使得预测更准。

  1. 问题:需要怎样的数据?如何更新模型。
  • 出发之前让模型做一个预测,记作\(q\)\(q=Q(w)\),比如\(q=1000\)。到了目的地,发现其实只用了860分钟,获取真实值 \(y=860\)

  • 实际值\(y\)与预测值\(q\)有偏差,这就造成了 loss 损失

  • loss 定义为实际值与预测值的平方差\(L=\frac{1}{2}(q-y)^2\)

  • 对损失 \(L\)关于参数\(w\)求导并用链式法则展开:

    \(\frac{\partial L}{\partial w} = \frac{\partial q}{\partial w} \cdot \frac{\partial L}{\partial q} =(q-y)\cdot\frac{\partial Q(w)}{\partial w}\)

  • 梯度求出来了,可以用梯度下降来更新模型参数 w :\(w_{t+1} = w_t - \alpha \cdot \frac{\partial L}{\partial w} \vert _{w=w_t}\)

缺点:这种算法比较 naive,因为要完成整个旅程才能完成对模型做一次更新。

那么问题来了:假如不完成整个旅行,能否完成对模型的更新?

可以用 TD 的思想来考虑这件事情。比如我们中途路过 DC 不走了,没去亚特兰大,可以用 TD 算法完成对模型的更新,即

  • 出发前预测:NYC -> Atlanta 要花1000分钟,这是预测值

    到了 DC 时,发现用了 300 分钟,这是真实观测值,尽管它是针对于部分的。

  • 模型这时候又告知,DC -> Atlanta 要花 600 分钟。

  • 模型原本预测:$Q(w) = 1000 $,而到 DC 的新预测:300 + 600 = 900,这个新的 900 估值就叫 TD target

    这些名词要记住,后面会反复使用,TD target 是使用了 TD算法的道德整体预测值。

  • TD target \(y=900\)虽然也是个估计预测值,但是比最初的 1000 分钟更可靠,因为有事实成分。

  • 把 TD target \(y\)当作真实值:\(L = \frac{1}{2}(Q(w)-y)^2\), 其中$Q(w) - y $称为TD error。

  • 求导:\(\frac{\partial L}{\partial w} =(1000-900)\cdot\frac{\partial Q(w)}{\partial w}\)

  • 梯度下降更新模型参数 w :\(w_{t+1} = w_t - \alpha \cdot \frac{\partial L}{\partial w} \vert _{w=w_t}\)

b. 算法原理

换个角度来想,TD 的过程就是这样子的:

模型预测 NYC -> Atlanta = 1000, DC -> Atlanta = 600,两者差为400,也就是NYC -> DC = 400,但实际只花了300分钟预计时间与真实时间之间的差就是TD error:\(\delta = 400-300 = 100\)

TD 算法目标在于让 TD error 尽量接近 0 。

即我们用部分的真实 修改 部分的预测,而使得整体的预测更加接近真实。我们可以通过反复校准 可知的这部分真实 来接近我们的理想情况。

c. 用于 DQN

(1) 公式引入

上述例子中有这样一个公式:$T_{NYC\rightarrow ATL} \approx T_{NYC\rightarrow DC} + T_{DC\rightarrow ATL} $

想要用 TD 算法,就必须要用类似这样的公式,等式左边有一项,右边有两项,其中有一项是真实观测到的。

而在此之前,在深度强化学习中也有一个这样的公式:\(Q(s_t,a_t;w)=r_t+\gamma \cdot Q(s_{t+1},a_{t+1};w)\)

公式解释:

  1. 左边是 DQN 在 t 时刻做的估计,这是未来奖励总和的期望,相当于 NYC 到 ATL 的预估总时间。
  2. 右边 \(r_t\)是真实观测到的奖励,相当于 NYC 到 DC 。
  3. \(Q(s_{t+1},a_{t+1};w)\) 是 DQN 在 t+1 时刻做的估计,相当于 DC 到 ATL 的预估时间。
(2) 公式推导

为什么会有一个这样的公式?

回顾 Discounted return: \(U_t=R_t+\gamma R_{t+1}+\gamma^2 R_{t+2}+\gamma^3 R_{t+3}+\cdots\)

提出 \(\gamma\) 就得到 $ = R_t + \gamma(R_{t+1}+ \gamma R_{t+2}+ \gamma^2 R_{t+3}+\cdots) $

后面这些项就可以写成\(U_{t+1}\),即 \(=R_t+\gamma U_{t+1}\)

这样就得到:\(U_t = R_t + \gamma \cdot U_{t+1}\)

直观上讲,这就是相邻两个折扣算法的数学关系。

(3) 应用过程

现在要把 TD 算法用到 DQN 上

  • t 时刻 DQN 输出的值 \(Q(s_t,a_t; w)\) 是对 \(U_t\) 作出的估计 \(\mathbb{E}[U_t]\),类似于 NYC 到 ATL 的预估总时间。
  • 下一时刻 DQN 输出的值 \(Q(s_{t+1},a_{t+1}; w)\) 是对 \(U_{t+1}\) 作出的估计 \(\mathbb{E}[U_{t+1}]\),类似于 DC 到 ATL 的第二段预估时间。
  • 由于 \(U_t = R_t + \gamma \cdot U_{t+1}\)
  • 所以 \(\underbrace{Q(s_t,a_t; w) }_{\approx\mathbb{E}[U_t]}\approx \mathbb{E}[R_t+\gamma \cdot \underbrace{Q(s_{t+1},a_{t+1}; w)}_{\approx\mathbb{E}[U_{t+1}]}]\)
  • \(\underbrace{Q(s_t,a_t;w)}_{prediction}=\underbrace{r_t+\gamma \cdot Q(s_{t+1},a_{t+1};w)}_{TD\ \ target}\)

有了 prediction 和 TD target ,就可以更新 DQN 的模型参数了。

  • t 时刻模型做出预测 \(Q(s_t,a_t;w_t)\)

  • 到了 t+1时刻,观测到了真实奖励 \(r_t\) 以及新的状态 \(s_{t+1}\),然后算出新的动作 \(a_{t+1}\)

  • 这时候可以计算 TD target 记作 \(y_t\),其中\(y_t=r_t+\gamma \cdot Q(s_{t+1},a_{t+1};w)\)

  • t+1 时刻的动作 \(a_{t+1}\)怎么算的?DQN 要对每个动作打分,取分最高的,所以等于Q 函数关于a求最大化:$ y_t = r_t + \gamma \cdot \mathop{max}\limits_{a} Q(s_{t+1},a;w_t)$

  • 我们希望预测\(Q(s_{t},a_{t};w)\)尽可能接近 TD target \(y_t\) ,所以我们把两者之差作为 Loss :

    \(L_t=\frac{1}{2}[Q(s_{t},a_{t};w)-y_t]^2\)

  • 做梯度下降:\(w_{t+1} = w_t - \alpha \cdot \frac{\partial L}{\partial w} \vert _{w=w_t}\)更新模型参数 w,来让 Loss 更小

2.3 总结

  1. 价值学习(本讲是DQN)基于最优动作价值函数 Q-star :

    \(Q^*(s_t,a_t) = \mathbb{E}[U_t|S_t=s_t,A_t=a_t]\)

    \(U_t\) 求期望,能对每个动作打分,反映每个动作好坏程度,用这个函数来控制agent。

  2. DQN 就是用一个神经网络\(Q(s,a;w)\)来近似$Q^*(s,a) $

    1. 神经网络参数是 w ,输入是 agent 的状态 s
    2. 输出是对所有可能动作 $ a \in A$ 的打分
  3. TD 算法过程

    1. 观测当前状态 $S_t = s_t $ 和已经执行的动作 \(A_t = a_t\)

    2. 用 DQN 做一次计算,输入是状态 \(s_t\),输出是对动作 \(a_t\) 的打分

      记作\(q_t\)\(q_t = Q(s_t,a_t;w)\)

    3. 反向传播对 DQN 求导:\(d_t = \frac{\partial Q(s_t,a_t;w)}{\partial w} |_{ w=w_t}\)

    4. 由于执行了动作 \(a_t\),环境会更新状态为 \(s_{t+1}\),并给出奖励\(r_t\)

    5. 求出TD target:\(y_t = r_t + \gamma \cdot \mathop{max}\limits_{a} Q(s_{t+1},a_t;w)\)

    6. 做一次梯度下降更新参数 w , \(w_{t+1} = w_t - \alpha \cdot (q_t-y_t) \cdot d_t\)

    7. 更新迭代...

x. 参考教程

有关强化学习-学习笔记2 | 价值学习的更多相关文章

  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. ruby - 我如何学习 ruby​​ 的正则表达式? - 2

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

  6. 深度学习12. CNN经典网络 VGG16 - 2

    深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG

  7. 机器学习——时间序列ARIMA模型(四):自相关函数ACF和偏自相关函数PACF用于判断ARIMA模型中p、q参数取值 - 2

    文章目录1、自相关函数ACF2、偏自相关函数PACF3、ARIMA(p,d,q)的阶数判断4、代码实现1、引入所需依赖2、数据读取与处理3、一阶差分与绘图4、ACF5、PACF1、自相关函数ACF自相关函数反映了同一序列在不同时序的取值之间的相关性。公式:ACF(k)=ρk=Cov(yt,yt−k)Var(yt)ACF(k)=\rho_{k}=\frac{Cov(y_{t},y_{t-k})}{Var(y_{t})}ACF(k)=ρk​=Var(yt​)Cov(yt​,yt−k​)​其中分子用于求协方差矩阵,分母用于计算样本方差。求出的ACF值为[-1,1]。但对于一个平稳的AR模型,求出其滞

  8. Unity Shader 学习笔记(5)Shader变体、Shader属性定义技巧、自定义材质面板 - 2

    写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c

  9. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

  10. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

随机推荐