【学习笔记】强化学习

news2024/11/25 14:21:18

李宏毅深度强化学习 笔记

课程主页:NTU-MLDS18

视频:youtube B站

参考资料: 作业代码参考 纯numpy实现非Deep的RL算法 OpenAI tutorial

文章目录

  • 李宏毅深度强化学习 笔记
  • 1. Introduction
  • 2. Policy Gradient
    • 2.1 Origin Policy Gradient
    • 2.2 PPO
  • 3. Q - Learning
    • 3.1 Q-learning
    • 3.2 Tips of Q-learning
    • 3.3 Q-learning in continuous actions
  • 4. Actor Critic
    • 4.1 Advantage Actor-Critic (A2C)
    • 4.2 Asynchronous Advantage Actor-Critic (A3C)
    • 4.3 Pathwise Derivative Policy Gradient (PDPG)
  • 5. Sparse Reward
    • 5.1 Reward Shaping
    • 5.2 Curiosity
    • 5.3 Curriculum Learning
    • 5.4 Hierarchical RL
  • 6. Imitation Learning
    • 6.1 Behavior Cloning
    • 6.2 Inverse RL

1. Introduction

1

这门课的学习路线如上,强化学习是作为单独一个模块介绍。李宏毅老师讲这门课不是从MDP开始讲起,而是从如何获得最大化奖励出发,直接引出Policy Gradient(以及PPO),再讲Q-learning(原始Q-learning,DQN,各种DQN的升级),然后是A2C(以及A3C, DDPG),紧接着介绍了一些Reward Shaping的方法(主要是Curiosity,Curriculum Learning ,Hierarchical RL),最后介绍Imitation Learning (Inverse RL)。比较全面的展现了深度强化学习的核心内容,也比较直观。

image-20191029211249836

首先强化学习是一种解决序列决策问题的方法,他是通过与环境交互进行学习。首先会有一个Env,给agent一个state,agent根据得到的state执行一个action,这个action会改变Env,使自己跳转到下一个state,同时Env会反馈给agent一个reward,agent学习的目标就是通过采取action,使得reward的期望最大化。

image-20191029211454593

在alpha go的例子中,state(又称observation)为所看到的棋盘,action就是落子,reward通过围棋的规则给出,如果最终赢了,得1,输了,得-1。

下面从2个例子中看强化学习与有监督学习的区别。RL不需要给定标签,但需要有reward。

image-20191029211749897

实际上alphgo是从提前收集的数据上进行有监督学习,效果不错后,再去做强化学习,提高水平。

image-20191029211848429

人没有告诉机器人具体哪里说错了,机器需要根据最终的评价自己总结,一般需要对话好多次。所以通常训练对话模型会训练2个agent互相对话

image-20191029212015623

image-20191029212144625

一个难点是怎么判断对话的效果,一般会设置一些预先定义的规则。

image-20191029212313069

强化学习还有很多成功的应用,凡是序列决策问题,大多数可以用RL解决。

2. Policy Gradient

2.1 Origin Policy Gradient

在alpha go场景中,actor决定下哪个位置,env就是你的对手,reward是围棋的规则。强化学习三大基本组件里面,env和reward是事先给定的,我们唯一能做的就是通过调整actor,使得到的累积reward最大化。

一般把actor的策略定义成Policy,数学符号为 π \pi π,参数是 θ \theta θ,本质是一个NN(神经网络)。

那么针对Atari游戏:输入游戏的画面,Policy π \pi π输出各个动作的概率,agent根据这个概率分布采取行动。通过调整 θ \theta θ, 我们就可以调整策略的输出。

_page-0007)

每次采取一个行动会有一个reward

玩一场游戏叫做一个episode,actor存在的目的就是最大化所能得到的return,这个return指的是每一个时间步得到的reward之和。注意我们期望最大化的是return,不是一个时刻的reward。

如果max的目标是当下时刻的reward,那么在Atari游戏中如果agent在某个s下执行开火,得到了较大的reward,那么可能agent就会一直选择开火。并不代表,最终能够取得游戏的胜利。

那么,怎么得到这个actor呢?

先定义玩一次游戏,即一个episode的游戏记录为trajectory τ \tau τ,内容如图所示,是s-a组成的序列对。

假设actor的参数 θ \theta θ已经给定,则可以得到每个 τ \tau τ出现的概率。这个概率取决于两部分, p ( s t + 1 ∣ s t , a t ) p\left(s_{t+1} | s_{t}, a_{t}\right) p(st+1st,at)部分由env的机制决定,actor没法控制,我们能控制的是 p θ ( a t ∣ s t ) p_{\theta}\left(a_{t} | s_{t}\right) pθ(atst) π \pi π的参数 θ \theta θ决定。

定义 R ( τ ) R(\tau) R(τ) 为一个episode的总的reward,即每个时间步下的即时reward相加,我习惯表述为return。

定义 R ˉ θ \bar{R}_{\theta} Rˉθ R ( τ ) R(\tau) R(τ)的期望,等价于将每一个轨迹 τ \tau τ出现的概率乘与其return,再求和。

由于 R ( τ ) R(\tau) R(τ)是一个随机变量,因为actor本身在给定同样的state下会采取什么行为具有随机性,env在给定行为下输出什么state,也是随机的,所以只能算 R ( τ ) R(\tau) R(τ)的期望。

我们的目标就变成了最大化Expected Reward,那么如何最大化?

优化算法是梯度更新,首先我们先计算出 R ˉ θ \bar{R}_{\theta} Rˉθ θ \theta θ的梯度。

从公式中可以看出 R ( τ ) R(\tau) R(τ)可以是不可微的,因为与参数无关,不需要求导。

第一个改写(红色部分):将加权求和写成期望的形式。

第二个近似:实际上没有办法把所有可能的轨迹(游戏记录)都求出来,所以一般是采样N个轨迹

第三个改写:将 p θ ( τ n ) p_{\theta}\left(\tau^{n}\right) pθ(τn)的表达式展开(前2页slide),去掉跟 θ \theta θ无关的项(不需要求导),则可达到最终的简化结果。具体如下:首先用actor采集一个游戏记录

image-20191029215615001

image-20191029220147651

最终得到的公式相当的直觉,在s下采取了a导致最终结果赢了,那么return就是正的,也就是会增加相应的s-a出现的概率P。

上面的公式推导中可能会有疑问,为什么要引入log?再乘一个概率除一个概率?原因非常的直觉,如下:如果动作b本来出现的次数就多,那么在加权平均所有的episode后,参数会偏好执行动作b,而实际上动作b得到的return比a低,所以除掉自身出现的概率,以降低其对训练的影响。

image-20191029220546039

那么,到底是怎么更新参数的呢?

首先会拿agent跟环境互动,收集大量游戏记录,然后把每一个游戏记录拿到右边,计算一个参数theta的更新值,更新参数后,再拿新的actor去收集游戏记录,不断循环。

注意:一般采样的数据只会用一次,用完就丢弃

具体实现:可当成一个分类任务,只是分类的结果不是识别object,是给出actor要执行的动作。

如何构建训练集? 采样得到的a,作为ground truth。然后去最小化loss function。

一般的分类问题loss function是交叉熵,在强化学习里面,只需要在前面乘一个weight,即交叉熵乘一个return。

实现的过程中还有一些tips可以提高效果:

如果 reward都是正的,那么理想的情况下:reward从大到小 b>a>c, 出现次数 b>a>c, 经过训练以后,reward值高的a,c会提高出现的概率,b会降低。但如果a没有采样到,则a出现的概率最终可能会下降,尽管a的reward高。

解决方法:增加一个baseline,用r-b作为新的reward,让其有正有负。最简单的做法是b取所有轨迹的平均回报。

一般r-b叫做优势函数Advantage Functions。我们不需要描述一个行动的绝对好坏,而只需要知道它相对于平均水平的优势。

在这个公式里面,对于一个轨迹,每一个s-a的pair都会乘同一个weight,显然不公平,因为一局游戏里面往往有好的pair,有对结果不好的pair。所以我们希望给每一个pair乘不同的weight。整场游戏结果是好的,不代表每一个pair都是好的。如果sample次数够多,则不存在这个问题。

解决思路:在执行当下action之前的事情跟其没有关系,无论得到多少功劳都跟它没有关系,只考虑在当下执行pair之后的reward,这才是它真正的贡献。把原来的总的return,换成未来的return。

如图:对于第一组数据,在( s a s_a sa, a 1 a_1 a1)时候总的return是+3,那么如果对每一个pair都乘3,则( s b s_b sb, a 2 a_2 a2)会认为是有效的,但如果使用改进的思路,将其乘之后的return,即-2,则能有效抑制该pair对结果的贡献。

再改进:加一个折扣系数,如果时间拖得越长,对于越之后的reward,当下action的功劳越小。

我们将R-b 记为 A,意义就是评价当前s执行动作a,相比于采取其他的a,它有多好。之后我们会用一个critic网络来估计这个评价值。

2.2 PPO

PPO算法是PG算法的变形,目的是把在线的学习变成离线的学习。

核心的idea是对每一条经验(又称轨迹,即一个episode的游戏记录)不止使用一次。

简单理解:在线学习就是一边玩一边学,离线学习就是先看着别人玩进行学习,之后再自己玩

Motivation:每次用 π θ \pi_\theta πθ去采样数据之后, π θ \pi_\theta πθ都会更新,接下来又要采样新的数据。以至于PG算法大部分时间都在采样数据。那么能不能将这些数据保存下来,由另一个 π θ ′ \pi_{\theta'} πθ去更新参数?那么策略 π θ \pi_\theta πθ采样的数据就能被 π θ ′ \pi_{\theta'} πθ多次利用。引入统计学中的经典方法:

重要性采样:如果想求一个函数的期望,但无法积分,则可以通过采样求平均的方法来近似,但是如果p分布不知道(无法采样),我们知道q分布,则如上图通过一个重要性权重,用q分布来替代p分布进行采样。这个重要性权重的作用就是修正两个分布的差异。

存在的问题:如果p跟q的差异比较大,则方差会很大

如果sample的次数不够多,比如按原分布p进行采样,最终f的期望值是负数(大部分概率都在左侧,左侧f是负值),如果按q分布进行sample,只sample到右边,则f就一直是正的,严重偏离原来的分布。当然采样次数够多的时候,q也sample到了左边,则p/q这个负weight非常大,会平衡掉右边的正值,会导致最终计算出的期望值仍然是负值。但实际上采样的次数总是有限的,出现这种问题的概率也很大。

先忽略这个问题,加入重要性采样之后,训练变成了离线的

离线训练的实现:用另一个policy2与环境做互动,采集数据,然后在这个数据上训练policy1。尽管2个采集的数据分布不一样,但加入一个重要性的weights,可以修正其差异。等policy1训练的差不多以后,policy2再去采集数据,不断循环。

由于我们得到的 A θ ( s t , a t ) A^{\theta}\left(s_{t}, a_{t}\right) Aθ(st,at)(执行当下action后得到reward-baseline)是由policy2采集的数据观察得到的,所以 A θ ( s t , a t ) A^{\theta}\left(s_{t}, a_{t}\right) Aθ(st,at)的参数得修正为 θ ′ \theta' θ

根据 ∇ f ( x ) = f ( x ) ∇ log ⁡ f ( x ) \nabla f(x)=f(x) \nabla \log f(x) f(x)=f(x)logf(x)反推目标函数 J J J,注意要优化的参数是 θ \theta θ θ ’ \theta’ θ只负责采集数据。

利用 θ ’ \theta’ θ采集的数据来训练 θ \theta θ,会不会有问题?(虽然有修正,但毕竟还是不同) 答案是我们需要保证他们的差异尽可能的小,那么在刚刚的公式里再加入一些限制保证其差异足够小,则诞生了 PPO算法。

引入函数KL,KL衡量两个分布的距离。注意:不是参数上的距离,是2个 π \pi π给同样的state之后基于各自参数输出的action space的距离

加入KL的公式直觉的理解:如果我们学习出来的 θ \theta θ θ ′ \theta' θ越像,则KL越小,J越大。我们的学习目标还是跟原先的PG算法一样,用梯度上升训练,最大化J。这个操作有点像正则化,用来解决重要性采样存在的问题。

TRPO是PPO是前身,把KL这个限制条件放在优化的目标函数外面。对于梯度上升的优化过程,这种限制比较难处理,使优化变得复杂,一般不用。

实现过程:初始化policy参数,在每一个迭代里面,用 t h e t a k theta^k thetak采集很多数据,同时计算出奖励A值,接着train这个数据,更新 θ \theta θ优化J。由于是离线训练,可以多次更新后,再去采集新的数据。

有一个trick是KL的权重beta也可以调整,使其更加的adaptive。

实际上KL也是比较难计算的,所以有了PPO2算法,不计算KL,通过clip达到同样效果。

clip(a, b, c): if a<b => b If a>c => c If b<a<c => a

看图:绿色:min里面的第一项,蓝色:min里面的第二项,红色 min的输出

这个公式的直觉理解:希望 θ \theta θ θ k \theta^k θk在优化之后不要差距太大。如果A>0,即这个state-action是好的,所以需要增加这个pair出现的几率,所以在max J的过程中会增大 p θ ( a t ∣ s t ) p θ k ( a t ∣ s t ) \frac{p_{\theta}\left(a_{t} | s_{t}\right)}{p_{\theta^{k}}\left(a_{t} | s_{t}\right)} pθk(atst)pθ(atst), 但最大不要超过1+eplison,如果A<0,不断减小,小到1-eplison,始终不会相差太大。

PG算法效果非常不稳定,自从有了PPO,PG的算法可以在很多任务上work。

3. Q - Learning

3.1 Q-learning

在之前的policy-based算法里,我们的目标是learn 一个actor,value-based的强化学习算法目标是learn一个critic。

定义一个Critic,也就是状态值函数 V π ( s ) V^{\pi}(s) Vπ(s),它的值是:当使用策略 π \pi π进行游戏时,在观察到一个state s之后,环境输出的累积的reward值的期望。注意取决于两个值,一个是state s,一个是actor π \pi π

0004

如果是不同的actor,在同样的state下,critic给出的值也是不同的。那么怎么估计出这个函数V呢?

主要有MC和TD的方法,实际上还有DP的方法,但是用DP求解需要整个环境都是已知的。而在强化学习的大部分任务里,都是model-free的,需要agent自己去探索环境。

0005

MC:直接让agent与环境互动,统计计算出在 S a S_a Sa之后直到一个episode结束的累积reward作为 G a G_a Ga

训练的目标就是让 V π ( s ) V^{\pi}(s) Vπ(s)的输出尽可能的接近 G a G_a Ga

0006

MC每次必须把游戏玩到结束,TD不需要把游戏玩到底,只需要玩了一次游戏,有一个状态的变化。

那么训练的目标就是让 V π ( s t ) V^{\pi}(s_t) Vπ(st) V π ( s t + 1 ) V^{\pi}(s_t+1) Vπ(st+1)的差接近 r t r_t rt

0007

MC方差大,因为 r r r是一个随机变量,MC方法中的 G G G r r r之和,而TD方法只有 r r r是随机变量,r的方差比G小。但TD方法的 V π V^{\pi} Vπ有可能估计的不准。

0008

用MC和TD估计的结果不一样

0009

定义另一种Critic,状态-动作值函数 Q π ( s , a ) Q^{\pi}(s,a) Qπ(s,a),有的地方叫做Q-function,输入是一个pair ( s , a ) (s,a) (s,a),意思是用 π \pi π玩游戏时,在s状态下强制执行动作a(策略 π \pi π在s下不一定会执行a),所得到的累积reward。

有两种写法,输入pair,输出Q,此时的Q是一个标量。

另一种是输入s,输出所有可能的action的Q值,此时Q是一个向量。

那么Critic到底怎么用呢?

Q-learning的过程:

初始化一个actor π \pi π去收集数据,然后learn一个基于$ \pi 的 Q − f u n c t i o n ,接着寻找一个新的比原来的 的Q-function,接着寻找一个新的比原来的 Qfunction,接着寻找一个新的比原来的\pi 要好 a c t o r , 找到后更新 要好actor , 找到后更新 要好actor,找到后更新\pi$,再去寻找新的Q-function,不断循环,得到更好的policy。

可见Q-learning的核心思想是先找到最优的Q-function,再通过这个Q-function得出最优策略。而Policy-based的算法是直接去学习策略。这是本质区别。

那么,怎么样才算比原来的好?

0012

定义好的策略:对所有可能的s而言, V π ( s ) V_\pi(s) Vπ(s)一定小于 V π ′ ( s ) V_\pi'(s) Vπ(s),则 V π ′ ( s ) V_\pi'(s) Vπ(s)就是更好的策略。

π ′ ( s ) \pi'(s) π(s)的本质:假设已经学习到了一个actor π \pi π的Q-function,给一个state,把所有可能的action都代入Q,执行那个可以让Q最大的action。

注意:实际上,给定一个s,$ \pi$不一定会执行a,现在的做法是强制执行a,计算执行之后玩下去得到的reward进行比较。

在实现的时候 π ′ \pi' π没有额外的参数,依赖于Q。并且当动作是连续值的时候,无法进行argmax。

那么, 为什么actor π ’ \pi’ π能被找到?

0013

上面是为了证明:只要你估计出了一个actor的Q-function,则一定可以找到一个更好的actor。

核心思想:在一个episode中某一步把 π \pi π换成了$ \pi’$比完全follow $ \pi$,得到的奖励期望值会更大。

注意 r t + 1 r_{t+1} rt+1指的是在执行当下 a t a_t at得到的奖励,有的文献也会写成 r t r_t rt

训练的时候有一些Tips可以提高效率:

0014

Tips 1 引入target网络

训练的时候,每次需要两个Q function(两个的输入不同)一起更新,不稳定。 一般会固定一个Q作为Target,产生回归任务的label,在训练N次之后,再更新target的参数。回归任务的目标,让 Q π ( s t , a t ) Q^\pi(s_t,a_t) Qπ(st,at) Q π ( s t + 1 , π ( s t + 1 ) ) ) + r \mathrm{Q}^{\pi}\left(s_{t+1}, \pi\left(s_{t+1}\right)\right))+r Qπ(st+1,π(st+1)))+r越来越接近,即降低mse。最终希望训练得到的 Q π Q^\pi Qπ能直接估计出这个 ( s t , a t ) (s_t,a_t) (st,at)未来的一个累积奖励。

注意:target网络的参数不需要训练,直接每隔N次复制Q的参数。训练的目标只有一个 Q。

0015

Tips2 改进探索机制

PG算法,每次都会sample新的action,随机性比较大,大概率会尽可能的覆盖所有的动作。而之前的Q-learning,策略的本质是绝对贪婪策略,那么如果有的action没有被sample到,则可能之后再也不会选择这样的action。这种探索的机制(收集数据的方法)不好,所以改进贪心算法,让actor每次会 ε \varepsilon ε的概率执行随机动作。

0016

0017

Tips 3 引入记忆池机制

将采集到的一些数据收集起来,放入replay buffer。好处:

1.可重复使用过去的policy采集的数据,降低agent与环境互动的次数,加快训练效率 。

2.replay buffer里面包含了不同actor采集的数据,这样每次随机抽取一个batch进行训练的时候,每个batch内的数据会有较大的差异(数据更加diverse),有助于训练。

那么,当我们训练的目标是$ \pi 的 Q − f u n c t i o n ,训练数据混杂了 的Q-function,训练数据混杂了 Qfunction,训练数据混杂了\pi’ , , ,\pi’‘ , , ,\pi’’' 采集的数据有没有问题呢?没有,不是因为这些 采集的数据 有没有问题呢?没有,不是因为这些 采集的数据有没有问题呢?没有,不是因为这些 \pi 很像,主要原因是我们采样的不是一个轨迹,只是采样了一笔 e x p e r i e n c e ( 很像,主要原因是我们采样的不是一个轨迹,只是采样了一笔experience( 很像,主要原因是我们采样的不是一个轨迹,只是采样了一笔experience(s_t,a_t,r_t,s_{t+1}$)。这个理论上证明是没有问题的,很难解释…

0018

采用了3个Tips的Q-learning训练过程如图:

注意图中省略了一个循环,即存储了很多笔experience之后才会进行sample。相比于原始的Q-learning,每次sample是从replay buff里面随机抽一个batch,然后计算用绝对贪心策略得到Q-target的值作为label,接着在回归任务中更新Q的参数。每训练多步后,更新Q-target的参数。

3.2 Tips of Q-learning

DQN估计出的值一般都高于实际的值,double DQN估计出的值与实际值比较接近。

0021

Q是一个估计值,被高估的越多,越容易被选择。

0022

Double的思想有点像行政跟立法分权。

用要训练的Q-network去选择动作,用固定不动的target-network去做估计,相比于DQN,只需要改一行代码!

0023

改了network架构,其他没动。每个网络结构的输出是一个标量+一个向量

0024

比如下一时刻,我们需要把3->4, 0->-1,那么Dueling结构里会倾向于不修改A,只调整V来达到目的,这样只需要把V中 0->1, 如果Q中的第三行-2没有被sample到,也进行了更新,提高效率,减少训练次数。

0025

实际实现的时候,通过添加了限制条件,也就是把A normalize,使得其和为0,这样只会更新V。

这种结构让DQN也能处理连续的动作空间。

0028

加入权重的replay buffer

motivation:TD error大的数据应该更可能被采样到

注意论文原文实现的细节里,也修改了参数更新的方法

0029

原来收集一条experience是执行一个step,现在变成执行N个step。相比TD的好处:之前只sample一个 ( s t , a t ) (s_t,a_t) (st,at)pair,现在sample多个才估测Q值,估计的误差会更小。坏处,与MC一样,reward的项数比较多,相加的方差更大。 调N就是一个trade-off的过程。

0030

在Q-function的参数空间上+noise

比较有意思的是,OpenAI DeepMind几乎在同一个时间发布了Noisy Net思想的论文。

0031

在同一个episode里面,在动作空间上加噪声,会导致相同state下执行的action不一样。而在参数空间加噪声,则在相同或者相似的state下,会采取同一个action。 注意加噪声只是为了在不同的episode的里面,train Q的时候不会针对特定的一个state永远只执行一个特定的action。

0033

带分布的Q-function

Motivation:原来计算Q-function的值是通过累积reward的期望,也就是均值,但实际上累积的reward可能在不同的分布下会得到相同的Q值。

注意:每个Q-function的本质都是一个概率分布。

0034

Q π Q^ \pi Qπ直接输出每一个Q-function的分布,但实际上选择action的时候还是会根据mean值大的选。不过拥有了这个分布,可以计算方差,这样如果有的任务需要在追求回报最大的同时降低风险,则可以利用这个分布。

0036

0037

Rainbow:集成了7种升级技术的DQN

上图是一个一个改进拿掉之后的效果,看紫色似乎double 没啥用,实际上是因为有Q-function的分布存在,一般不会过高估计Q值,所以double 意义不大。

直觉的理解:使用分布DQN,即时Q值被高估很多,由于最终只会映射到对应的分布区间,所以最终的输出值也不会过大。

3.3 Q-learning in continuous actions

在出现PPO之前, PG的算法非常不稳定。DQN 比较稳定,也容易train,因为DQN是只要估计出Q-function,就能得到好的policy,而估计Q-function就是一个回归问题,回归问题比较容易判断learn的效果,看mse。问题是Q-learning不太容易处理连续动作空间。比如汽车的速度,是一个连续变量。

0039

当动作值是连续时,怎么解argmax:

  1. 通过映射,强行离散化

  2. 使用梯度上升解这个公式,这相当于每次train完Q后,在选择action的时候又要train一次网络,比较耗时间。

0040

  1. 设计特定的网络,使得输出还是一个标量。

0042

最有效的解决方法是,针对连续动作空间,不要使用Q-learning。使用AC算法!

4. Actor Critic

4.1 Advantage Actor-Critic (A2C)

由于每次在执行PG算法之前,一般只能采样少量的数据,导致对于同一个 ( s t , a t ) (s_t,a_t) (st,at),得到的 G G G的值方差很大,不稳定。那么能不能直接估计出期望值,来替代采样的结果?

AC-4

回顾下Q-learning中的定义,我们发现:

AC-5

PG算法中G的期望的定义恰好也是Q-learning算法中 Q π ( s , a ) Q^\pi(s,a) Qπ(s,a)的定义: 假设现在的policy是$ \pi$的情况下,在某一个s,采取某一个a以后得到的累积reward的期望值。

因此在这里将Q-learning引入到预估reward中,也即policy gradient和q-learning的结合,叫做Actor-Critic。

把原来的reward和baseline分别替换,PG算法中的减法就变成了 Q π θ ( s t n , a t n ) − V π θ ( s t n ) Q^{\pi_{\theta}}\left(s_{t}^{n}, a_{t}^{n}\right)-V^{\pi_{\theta}}\left(s_{t}^{n}\right) Qπθ(stn,atn)Vπθ(stn)。似乎我们需要训练2个网络?

AC-6

实际上Q与V可以互相转化,我们只需要训练V。转化公式中为什么要加期望?在s下执行a得到的$ r_t 和 和 s_{t+1}$是随机的。

实际将Q变成V的操作中,我们会去掉期望,使得只需要训练(估计)状态值函数 V π V^\pi Vπ,这样会导致一点偏差,但比同时估计两个function导致的偏差要好。(A3C原始paper通过实验验证了这一点)。

AC-7

A2C的训练流程:收集数据,估计出状态值函数 V π ( s ) V^\pi(s) Vπ(s),套用公式更新策略 π \pi π,再利用新的 π \pi π与环境互动收集新的数据,不断循环。

AC-8

训练过程中的2个Tips:

  1. Actor与Critic的前几层一般会共用参数,因为输入都是state
  2. 正则化:让采用不同action的概率尽量平均,希望有更大的entropy,这样能够探索更多情况。

4.2 Asynchronous Advantage Actor-Critic (A3C)

AC-9

A3C算法的motivation:开分身学习~

AC-10

训练过程:每个agent复制一份全局参数,然后各自采样数据,计算梯度,更新这份全局参数,然后将结果传回,复制一份新的参数。

注意:

  1. 初始条件会尽量的保证多样性(Diverse),让每个agent探索的情况更加不一样。

  2. 所有的actor都是平行跑的,每个worker把各自的参数传回去然后复制一份新的全局参数。此时可能这份全局参数已经发生了改变,没有关系。

4.3 Pathwise Derivative Policy Gradient (PDPG)

在之前Actor-Critic框架里,Critic的作用是评估agent所执行的action好不好?那么Critic能不能不止给出评价,还给出指导意见呢?即告诉actor要怎样做才能更好?于是有了DPG算法:

AC-12

AC-13

在上面介绍A2C算法的motivation,主要是从改进PG算法引入。那么从Q-learning的角度来看,PDPG相当于learn一个actor,来解决argmax这个优化问题,以处理连续动作空间,直接根据输入的状态输出动作。

AC-14

Actor+Critic连成一个大的网络,训练过程中也会采取TD-target的技巧,固定住Critic π ′ \pi' π,使用梯度上升优化Actor

AC-15

训练过程:Actor会学到策略 π \pi π,使基于策略 π \pi π,输入s可以获得能够最大化Q的action,天然地能够处理continuous的情况。当actor生成的 Q π Q^\pi Qπ效果比较好时,重新采样生成新的Q。有点像GAN中的判别器与生成器。

注意:从算法的流程可知,Actor 网络和 Critic 网络是分开训练的,但是两者的输入输出存在联系,Actor 网络输出的 action 是 Critic 网络的输入,同时 Critic 网络的输出会被用到 Actor 网路进行反向传播。

由于Critic模块是基于Q-learning算法,所以Q learning的技巧,探索机制,回忆缓冲都可以用上。

AC-16

AC-17

与Q-learning相比的改进:

  • 不通过Q-function输出动作,直接用learn一个actor网络输出动作(Policy-based的算法的通用特性)。
  • 对于连续变量,不好解argmax的优化问题,转化成了直接选择 π − t a r g e t \pi-target πtarget 输出的动作,再基于Q-target得出y。
    • 引入 π − t a r g e t \pi-target πtarget,也使得actor网络不会频繁更新,会通过采样一批数据训练好后再更新,提高训练效率。

AC-18

总结下:最基础的 Policy Gradient 是回合更新的,通过引入 Critic 后变成了单步更新,而这种结合了 policy 和 value 的方法也叫 Actor-Critic,Critic 有多种可选的方法。A3C在A2C的基础上引入了多个 agent 对网络进行异步更新。对于输出动作为连续值的情形,原始的输出动作概率分布的PG算法不能解决,同时Q-learning算法也不能处理这类问题,因此提出了 DPG 。

5. Sparse Reward

大多数RL的任务中,是没法得到reward,reward=0,导致reward空间非常的sparse。

比如我们需要赢得一局游戏才能知道胜负得到reward,那么玩这句游戏的很长一段时间内,我们得不到reward。比如如果机器人要将东西放入杯子才能得到一个reward,尝试了很多动作很有可能都是0。

但是人可以在非常sprse的环境下进行学习,所以这一章节提出的很多算法与人的一些学习机制比较类似。

5.1 Reward Shaping

手动设计新的reward,让agent做的更好。但有些比较复杂的任务,需要domain knowledge去设计新的reward。

5.2 Curiosity

好奇心机制非常的直觉,也非常的强大。有个案例:Happy Bird

好奇心也是reward shaping的一种,引入一个新的reward :ICM,同时优化2个reward。如何设计一个ICM模块,使agent拥有好奇心?

单独训练一个状态估计的模型,如果在某个state下采取某个action得到的下一个state难以预测,则鼓励agent进行尝试这个action。 不过有的state很难预测,但不重要。比如说某个游戏里面背景是树叶飘动,很难预测,接下来agent一直不动看着树叶飘动,没有意义。

再设计一个moudle,判断环境中state的重要性:learn一个feature ext的网络,去掉环境中与action关系不大的state。

原理:输入两个处理过的state,预测action,使逼近真实的action。这样使得处理之后的state都是跟agent要采取的action相关的。

5.3 Curriculum Learning

课程学习:为learning做规划,通常由易到难。

设计不同难度的课程,一开始直接把板子放入柱子,则agent只要把板子压下去就能获得reward,接着把板子的初始位置提高一些,agent有可能把板子抽出则无法获得reward,接着更general的情况,把板子放倒柱子外面,再让agent去学习。

生成课程的方法通常如下:从目标反推,越靠近目标的state越简单,不断生成难度更高的state。

5.4 Hierarchical RL

分层学习:把大的任务拆解成小任务

上层的agent给下层的agent提供一个愿景,如果下层的达不到目标,会获得惩罚。如果下层的agent得到的错误的目标,那么它会假设最初的目标也是错的。

6. Imitation Learning

模仿学习,又叫学徒学习,反向强化学习

之前介绍的强化学习都有一个reward function,但生活中大多数任务无法定义reward,或者难以定义。但是这些任务中如果收集很厉害的范例(专家经验)比较简单,则可以用模仿学习解决。

6.1 Behavior Cloning

本质是有监督学习

0004

0005

存在问题:training data里面没有撞墙的case,则agent遇到这种情况不知如何决策

0006

一个直觉的解决方法是数据增强:每次通过牺牲一个专家,学会了一种新的case,策略 π \pi π得到了增强。

行为克隆还存在一个关键问题:agent不知道哪些行为对结局重要,哪些不重要。由于是采样学习,有可能只记住了多余的无用的行为。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

同时也由于RL的训练数据不是独立同分布,当下的action会影响之后的state,所以不能直接套用监督学习的框架。

为了解决这些问题,就有了反向强化学习,现在一般说模仿学习指的就是反向强化学习。

6.2 Inverse RL

0011

之前的强化学习是reard和env通过RL 学到一个最优的actor。

反向强化学习是,假设有一批expert的数据,通过env和IRL推导expert因为什么样子的reward function才会采取这样的行为。

好处:也许expert的行为复杂但reward function很简单。拿到这个reward function后我们就可以训练出好的agent。

0012

IRL的框架:先射箭 再画靶。

具体过程:

Expert先跟环境互动,玩N场游戏,存储记录,我们的actor $ \pi$也去互动,生成N场游戏记录。接下来定义一个reward function R R R,保证expert的 R R R比我们的actor的 R R R大就行。再根据定义的的 R R R用RL的方法去学习一个新的actor ,这个过程也会采集新的游戏记录,等训练好这个actor,也就是当这个actor可以基于 R R R获得高分的时候,重新定义一个新的reward function R ′ R' R,让expert的 R ′ R' R大于agent,不断循环。

0013

IRL与GAN的框架是一样的,学习 一个 reward function相当于学习一个判别器,这个判别器给expert高分,给我们的actor低分。

一个有趣的事实是给不同的expert,我们的agent最终也会学会不同的策略风格。如下蓝色是expert的行为,红色是学习到的actor的行为。

针对训练robot的任务:

IRL有个好处是不需要定义规则让robot执行动作,人给robot示范一下动作即可。但robot学习时候的视野跟它执行该动作时候的视野不一致,怎么把它在第三人称视野学到的策略泛化到第一人称视野呢?

0019

解决思路跟好奇心机制类似,抽出视野中不重要的因素,让第一人称和第三人称视野中的state都是有用的,与action强相关的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2223489.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Matlab 车牌识别技术

1.1设计内容及要求&#xff1a; 课题研究的主要内容是对数码相机拍摄的车牌&#xff0c;进行基于数字图像处理技术的车牌定位技术和车牌字符分割技术的研究与开发&#xff0c;涉及到图像预处理、车牌定位、倾斜校正、字符分割等方面的知识,总流程图如图1-1所示。 图1-1系统总…

【问题解决】Flink在linux上运行成功但是无法访问webUI界面

一&#xff0c;问题 在搭建Flink的时候&#xff0c;已经在linux服务器上运行了./start-cluster.sh&#xff0c; 而且日志显示已经成功了。 服务器上也没有开启防火墙 正常来说应该能通过ip:8081来访问(8081是Flink WebUI的默认端口)&#xff0c;但是访问的时候&#xff0c;显示…

Redis未授权访问及配合SSRF总结

Redis是一个开源的内存数据库&#xff0c;它用于存储数据&#xff0c;并提供高性能、可扩展性和丰富的数据结构支持。 Redis复现文章较全 Redisssrf漏洞利用探测内网 RedisInsight/RedisDesktopManager可视化连接工具 漏洞原理 &#xff08;1&#xff09;redis绑定在 0.0.…

C++类与对象四

C类与对象&#xff08;四&#xff09; 上期我们介绍了构造函数和析构函数&#xff0c;这期我们来介绍拷贝函数和运算符重载 拷贝函数 在现实生活中&#xff0c;可能存在另一个你。 那在C中&#xff0c;我们是否能创建一个与已知对象一样的新对象呢&#xff1f; 拷贝构造函数…

六.python面向对象

学过C或者Java的同学一定了解过面向对象的相关内容&#xff0c;编程语言一般分为两种设计方式&#xff1a;面向对象、面向过程&#xff0c;早期的编程语言多是面向过程的&#xff0c;由多个过程组合在一起&#xff0c;而Python在设计的时候就是一种面向对象的语言&#xff0c;因…

[学习笔记]线段树(全)

线段树是一种可以处理区间问题的优秀数据结构. 线段树是一颗二叉树, 其中的每一个节点都代表了某个区间的信息. 普通线段树 这里默认您已经会了以下操作: 建树(以单点修改的形式)单点修改/查询区间查询 如果不会的话请见OI Wiki 着重讲解区间修改中 tag 的用法 对于区间修…

InternVL-1.1: Enhance Chinese and OCR Capabilities

Blog:https://internvl.github.io/blog/2024-01-24-InternVL-1.1/ 指南:https://internvl.readthedocs.io/en/latest/internvl1.1/introduction.html InternVL-Chat-V1-1 结构类似于 LLaVA,包括一个 ViT、一个 MLP 投影器和一个 LLM。如上图所示,我们通过一个简单的 MLP …

ubuntu服务器离线安装pytorch(cpu版本)

一、查看服务器是否有nvidia显卡&#xff08;无输出则没有nvidia显卡&#xff0c;则不需要安装nvidia驱动、cuda、cudnn&#xff09; lspci | grep -i nvidia 二、本地下载对应版本的torch&#xff08;对应python版本和linux系统&#xff09; 注意&#xff1a;cpu版本&#…

iOS调试真机出现的 “__llvm_profile_initialize“ 错误

一、错误形式&#xff1a; app启动就崩溃&#xff0c;如下&#xff1a; Demo__llvm_profile_initialize:0x1045f7ab0 <0>: stp x20, x19, [sp, #-0x20]!0x1045f7ab4 <4>: stp x29, x30, [sp, #0x10]0x1045f7ab8 <8>: add x29, sp, #0x100x1…

python最新h5st4.9.1调用源码(2025-10-25)

废话不多说&#xff0c;直接上源码&#xff0c;需要技术支持的私。 一、调用js方法&#xff1a; # -*- coding: utf-8 -*- """ -------------------------------------------------Author: byc6352File: jdh5st.pyTime: 2024/10/25 08:03Technical Support:by…

Python 20个必学实例盘点

Python 1. 计算器程序&#xff1a; def add(x, y): return x ydef subtract(x, y): return x - ydef multiply(x, y): return x * ydef divide(x, y): try: return x / y except ZeroDivisionError: print("除数不能…

基于SpringBoot+Vue+uniapp微信小程序的文玩销售小程序的详细设计和实现

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

【网路原理】——HTTP状态码和Postman使用

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 引入&#xff1a; 一&#xff1a;状态码 1&#xff1a;状态码标准 2&#xff1a;常见的状态码 ①2…

依托微信小程序,畅享校园二手交易

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 &#x1f345;获取源码联系方式请查看文末&#x1f345; 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目…

普通数组矩阵

文章目录 普通数组一、最大子数组二、合并区间三、轮转数组四、除自身以外数组的乘积五、缺失的第一个正数 普通数组 一、最大子数组 题目链接 方法一&#xff1a;动态规划 方法二&#xff1a;前缀和&#xff08;有点难理解&#xff09; 二、合并区间 题目链接 三、轮…

Linux中部署Mysql保姆级教程

一、版本说明 本文的版本号是5.7.30,5.6及以上版本的MySQL要求Linux系统虚拟内存不能小于1G,否则MySQL可能无法运行。 二、安装前的准备 2.1查看系统自带的Mariadb rpm -qa|grep mariadb 安装mysql为什么需要卸载mariadb: 以前的Linux系统中数据库大部分是mysql,…

android 利用adb将apk安装到模拟器中的方法

1、安装完成了sdk以后&#xff0c;会有一个工具集&#xff0c;里面有一个adb.exe&#xff0c;这个文件可以查看模拟器列表&#xff0c;及安装apk到模拟器中。 可以将这个目录加到环境变量中&#xff0c;这样就不用定位到目录&#xff0c; 然后使用adb命令了。 2、这里我们先定…

纯血鸿蒙:国产操作系统的崛起与安卓的本质区别

华为正式发布纯血鸿蒙&#xff08;Harmony OS 5.0&#xff09;标志着中国科技产业进入了一个崭新的时代。随着这一操作系统的推出&#xff0c;中国不仅在消费电子领域迎来了一个新的操作系统生态&#xff0c;更是加强了中国在全球科技领域的发言权。本文将深入探讨纯血鸿蒙与安…

win10怎么卸载软件干净?电脑彻底删除软件的方法介绍,一键清理卸载残留!

电脑上经常会下载各种各样的软件来协助我们办公&#xff0c;不同的软件能够满足不同的需求。 但是不少软件可能使用频率没有那么高&#xff0c;甚至完全不使用。这个时候就需要将这些不常用的电脑软件卸载掉了&#xff0c;卸载软件能够释放一定的存储空间&#xff0c;提高电脑…

封装echarts组件,即插即用(附源码)

前言&#xff1a;最近一个项目刚收工&#xff0c;分享一个常用的封装echarts的组件。 一、直接上组件代码 <template><el-card class"echart-card" shadow"hover"><template v-slot:header><div class"card-header">&…