动作价值函数(Action-Value Functions)回顾
- R 都是环境给的奖励,每当 agent 做一个动作,环境都会更新状态并且给一个奖励 R。Return UtU_tUt 来源于从 ttt 时刻开始所有的动作和状态

- 未来的动作和状态都是随机变量,而 UtU_tUt 依赖于这些动作和状态,因此 UtU_tUt 也是随机的
- 动作的随机性来自于 Policy 函数 π\piπ,动作是 agent 根据函数 π\piπ 随机抽样得到的
- 状态的随机性来自于状态转移函数 p,新的状态是根据函数 p 随机抽样得到的

- UtU_tUt 的值可以反映出未来奖励的总和,所以我们想要了解 UtU_tUt 的大小,由于 UtU_tUt 是个随机变量,在 ttt 时刻我们并不知道 UtU_tUt 的值,我们可以对 UtU_tUt 求期望,这样我们就可以排除掉 UtU_tUt 中的随机性,这个期望是对于未来所有的动作和状态求的,只留下 sts_tst 和 ata_tat 这两个变量
- 求到 QπQ_{\pi}Qπ 我们叫它动作价值函数,QπQ_{\pi}Qπ 跟策略函数 π\piπ 有关,跟变量 sts_tst 和 ata_tat 也有关,未来的随机性都被期望消除了,QπQ_{\pi}Qπ 只依赖于当前的动作 ata_tat 和状态 sts_tst
- QπQ_{\pi}Qπ 可以反映出当前 sts_tst 下做出 ata_tat 的好坏程度

- 想要进一步消除 π\piπ,我们可以关于 QπQ_{\pi}Qπ 求 π\piπ 的最大化,得到最优动作函数 Q∗Q^*Q∗。它可以告诉我们不管我们用什么样的策略函数 π\piπ,要使当前状态下做动作 ata_tat,回报的期望顶多就是 Qπ(st,at)Q_{\pi}(s_t,a_t)Qπ(st,at),不会更好
- QπQ_{\pi}Qπ 函数和 Policy 函数 π\piπ 无关,只要 agent 现在做了动作 aaa,那么 Qπ(st,at)Q_{\pi}(s_t,a_t)Qπ(st,at) 就是最好的结果了
- QπQ_{\pi}Qπ 可以指导 agent 做决策

Deep Q-Network(DQN)
- 用一个神经网络近似 Q∗Q^*Q∗ 函数
Approximate the Q function
- 目标:游戏中 agent 的目标是打赢游戏,用强化学习的语言来说就是赢得游戏的情况下目标的奖励越大越好
- 问题:如果我们知道 Q∗(s,a)Q^*(s,a)Q∗(s,a),怎么样才是最好的决策
- 显然最好的决策就是 Q∗Q^*Q∗ 最好的那个动作。Q∗Q^*Q∗ 函数就像是个先知,它可以预见未来的结果,比如你问先知现在有 a, b, c 三个股票应该买哪一只,未来是充满随机性的,所以先知没办法告诉你一个准确答案,只能告诉你一个平均值,先知 Q∗Q^*Q∗ 说:从平均值来看,a 股票涨了 10 倍,b 股票涨了 2 倍,c 股票跌了一半,先知还告诉你,实际情况和平均值并不一样,那么你该买哪个股票呢?显然是 a 股票,因为先知告诉你 a 股票的期望是最高的,但是实际情况未必是涨 10 倍,有可能下跌也有可能涨 20 倍,但是从期望来看还是买 a 是最好的
- 回到整体,Q∗Q^*Q∗ 是个先知,它能告诉你每个动作给你带来的平均回报,你该听先知的话,选平均回报最高的那个动作

- 因此我们希望有 Q∗Q^*Q∗ 这个先知,agent 可以通过 Q∗Q^*Q∗ 来做决策,这样 agent 就像开了挂一样,但是我们并没有 Q∗Q^*Q∗ 函数
- 而价值学习就是学习近似 Q∗Q^*Q∗,你觉得有可能近似出来一个先知吗?谁也没开天眼,当然不可能近似出一个万能的先知,谁也没可能预测单只股票的波动,但是像对于超级玛丽这样的游戏,学出来并不难。假如我玩了 10w 次,我也能和先知一样看一眼就能告诉你什么操作是最好的
- DQN 是一种价值学习的方法,它用一个神经网络去近似 Q∗Q^*Q∗ 函数,我们把它记为 Q(s,a;w)Q(s,a;w)Q(s,a;w)。神经网络的参数是 w,神经网络的输入是状态 sss,神经网络的输出是很多数值,这些数值是对所有可能动作的打分,每一个动作对应一个分数。我们通过奖励来学习这个神经网络,这个动作就会通过打分来逐步改进,会越来越准。如果让神经网络玩几百万次超级玛丽,这个神经网络就和先知一样准确了

Deep Q Network(DQN)
- 下面是 DQN 的一个网络,对于不同的问题,DQN 的结构可能不一样
- 我们以超级玛丽为例,可以以屏幕上的图片作为输入,用一个卷积层把图片作为特征向量,最后用全连接层把特征映射到一个输出的向量,这个输出的向量就是对动作的打分,一个元素对应一个动作

- 问题:根据这些预测的分数,哪个应该作为最终的 action

- 显然应该向上跳,因为向上的期望最高
Apply DQN to Play the Game
- 当前观测到状态 sts_tst,用 DQN 把 sts_tst 作为输入给所有的动作打分选出分数最高的动作作为 ata_tat

- agent 执行 ata_tat 这个动作后,环境的状态会改变。用状态转移函数来抽一个新的状态 st+1s_{t+1}st+1,环境还会告诉我们这一步的奖励 rtr_trt(可以为正的,负的或者零)
- 奖励就是强化学习中的监督信号,DQN 要靠这个奖励来训练

- 有了新的状态 st+1s_{t+1}st+1,DQN 再对所有的动作打分,选择分数最高的动作作为 at+1a_{t+1}at+1。agent 执行 at+1a_{t+1}at+1 后,环境会再更新状态并给出奖励

- 一直重复这个过程,直到游戏结束

Temporal Difference (TD) Learning
Example
- 我想要开车从纽约到亚特兰大
- 我有一个模型 Q,参数是 w,它可以预测出开车出行的时间开销。此时我要出发了,我的模型告诉我要开车 1000 分钟才能到。这个模型一开始可能不太准,但是随着更多人的使用,数据会越来越多,模型会越来越准
- 问题:我需要怎么样的数据,有了这些数据我应该怎么更新我的模型
- 最简单的办法:在出发之前做一个预测,记作 q=Q(w)q=Q(w)q=Q(w),模型告诉我需要 1000 分钟,q=1000q=1000q=1000
- 而我实际的时间为 y=860y=860y=860 分钟。模型有偏差,比我实际的 yyy 要多,这就造成了 Loss,我们进行梯度下降

- 假如我不完成旅行,我走到半路就不走了,那我还有没有办法对模型做一个更新呢?

- 我们可以用 TD 算法来做这个事情
- 模型预估从起点到终点为 1000。而我们到中间点的时候,实际花了 300 分钟
- 而此时模型又告诉我们从中间点到重点需要 600 分钟。而此时从起点到重点的 TD target(也是估计,未必是实际情况) 就是 300+600=900 分钟
- 虽然 TD target 有估计,但是它存在事实的成分,当我离终点越近我就约接近真实值
- 用 TD target 我不用跑完整个路程去知道真实的时间开销,我们假设这个 TD target 就是真实观测出来的 target。算 Loss 就是用一开始的预估值和 TD target 去算,我们把它们之间的差叫做 TD error

Why does TD learning work?
- 模型估计从起点到终点要花 1000 分钟,从中间点到终点要花 600 分钟,两者的差等于 400 分钟。所以我们可以任务模型从起点到中间点得花 400 分钟,而我们的实际只走了 300 分钟,比预计的要快
- 而 400-300=100 就是 TD error,这和我们之前算的 TD error 完全相等,TD 算法的目标就是让 TD error 尽量接近 0,TD error 等于 0 就意味着预计时间和实际时间相等,这是最理想的状况。所以 TD 算法要用 TD error 来减小 TD error

TD Learning for DQN
- 刚在的例子里面有这样一个公式:有这样一个公式才能使用 TD 算法。左边是整个的时间,右边是两个分别的时间。理想情况下两个应该相等

- 整个旅途的时间和第二段路程的时间都是模型的估计,而第一段旅途的时间则是真实的观测

- 想要用 TD 算法,必须用这样的公式:等式左边有一项,右边有两项,它们中有一项是真实观测到的
- 下面的公式中,左边的是未来奖励的期望,这相当于上面例子中预估的起点到终点的时间
- 右边第一项 rtr_trt 是真实观测到的奖励,相当于上面例子中从起点到中心点的距离
- 右边第二项是 DQN 在 t+1t+1t+1 时刻做的估计,相当于从中间点到终点的预计时间

- 回顾一下折扣回报

- 我们提出来一个 γ\gammaγ,就能写成和上面一样的形式。即括号里面的内容就是 Ut+1U_{t+1}Ut+1。这个公式反应了相邻两个折扣回报之间的关系

- 现在我们要把 TD 算法用到 DQN 上。在 ttt 时刻,DQN 输出的 Q(st,at;w)Q(s_t,a_t;w)Q(st,at;w) 是对 E[Ut]E[U_t]E[Ut] 做出的估计,这就是我们例子中预估的起点到终点的时间
- 在下一时刻,DQN 输出 Q(st+1,at+1;w)Q(s_{t+1},a_{t+1};w)Q(st+1,at+1;w) 是对 E[Ut+1]E[U_{t+1}]E[Ut+1] 做出的估计,这是我们例子中预估中间点到终点的时间
- 我们利用上面的两个折扣回报之间的关系有:

- 我们把左边作为预测值,右边作为 target

Train DQN using TD learning
- 预测:Q(st,at;wt)Q(s_t,a_t;w_t)Q(st,at;wt),sts_tst 是当前的状态,ata_tat 是实际已经做出的动作,wtw_twt 是模型的参数
- TD target:yt=rt+γ⋅Q(st+1,at+1;wt)y_t=r_t+\gamma·Q(s_{t+1},a_{t+1};w_t)yt=rt+γ⋅Q(st+1,at+1;wt),到了 t+1t+1t+1 时刻,我们观测到了真实的奖励 rtr_trt,还观测到了新的状态 st+1s_{t+1}st+1,有了状态 st+1s_{t+1}st+1,我们就可以用 DQN 算出下一个动作 at+1a_{t+1}at+1 了。在 t+1t+1t+1 时刻,我们知道了 rtr_trt,st+1s_{t+1}st+1 还有 at+1a_{t+1}at+1 的值,这时候我们就可以计算 TD target,记作 yty_tyt
- 而 t+1t+1t+1 时刻的动作,是通过 DQN 对所有动作打分,最高的哪个就被选出来作为动作

- 计算 loss 和梯度下降:来让两者尽量接近

Summary
Value-Based Reinforcement Learning
- 我们首先用到了动作价值函数:首先对回报 UtU_tUt 求期望,把除了 sts_tst 和 ata_tat 之外的用期望给去掉,然后再关于策略函数 π\piπ 求一个最大化,去掉了 π\piπ,得到的函数就和 π\piπ 没关系了
- 只要有了 Q∗Q^*Q∗ 函数就可以用 Q∗Q^*Q∗ 函数来控制 agent 运动

- 然而我们并没有 Q∗Q^*Q∗,而价值学习的目标就是去学出一个 Q∗Q^*Q∗ 函数
- 而 DQN 就是去近似一个 Q∗Q^*Q∗ 函数,把这个 DQN 记作是 Q(s,a;w)Q(s,a;w)Q(s,a;w),这里的 www 是神经网络的参数。DQN 的输入的是观测到的状态 sss,比如超级玛丽的游戏画面。DQN 的输出是对每一个动作的打分,比如超级玛丽中有左右上三个动作,那么就是输出一个三维向量
Temporal Difference (TD) Learning
- 一开始模型的参数都是随机的,agent 回根据 DQN 的指导不断的尝试,有时获得正奖励,有时获得负奖励,强化学习就是通过奖励来更新模型参数让模型越来越好
- 这节课讲了 TD 算法来通过奖励更新模型参数,TD 是学习 DQN 最常用的算法,TD算法不断重复这个过程:
- 观测到状态 sts_tst 和已经执行的动作 ata_tat
- 用 DQN 做一次计算,输入是状态 sts_tst,输出是对动作的打分,把预估的值记作 qtq_tqt
- 用反向传播对 DQN 求导,得到梯度
- 由于执行了动作 ata_tat,环境会更新状态 sts_tst 并返回奖励 rtr_trt
- 有了 rtr_trt,和公式我们就可以求出 TD target
- 梯度下降

- agent 在多次迭代后学到了连消技巧,这个就是通过奖励实现的,因为连消分数高


354

被折叠的 条评论
为什么被折叠?



