Reinforce Learning,简称RL。RL是利用奖励(reward)驱动代理(agent)在获取环境(env)的状态(state/obs)后做出一些列行动(action),导致环境到达下一个状态并给出这次行动的奖励,以驱动代理进行下一次决策。
下面结合具体的例子分析一下:王者峡谷开局(env)会呈现给机器人(agent)一些初始画面 s 0 s_0 s0(state),然后agent和env进行交互,并做出一些行动 a 0 a_0 a0(action),比如典韦作为打野上路开蓝,假设得到环境给与的奖励为 r 0 r_0 r0(reward,注意这里只是假设,事实上王者并没有这种立即奖励,而是等最终游戏胜负后反向溯源来根据每个action的奖励);在蓝血量只有10%时发现敌方辅助来干扰,因此在该帧状态 s 1 s_1 s1的情况下决定使用“惩戒”技能抢夺野怪,即 a 1 a_1 a1,并获得奖励 r 1 r_1 r1;然后看到上单被抓的状态 s 2 s_2 s2,迅速支援并使用一技能+二技能击杀对方英雄,即 a 2 a_2 a2,获得奖励 r 2 r_2 r2;…;最后直到游戏结束,摧毁敌方水晶获得奖励 r T r_T rT。这样一局游戏叫做一个episode。值得注意的是,王者由于只有等到 r T r_T rT时才会获得真正的环境奖励,而之前的 r 0 , . . . , r T − 1 r_0,...,r_{T-1} r0,...,rT−1都是假设的,因此获得 r T r_T rT后会溯源并更新达到最终状态的每一步的奖励,当然每步奖励的更新幅度会有不同,比如开局开蓝离得太远可能就更新得较少,而中期开团导致对方团灭更新幅度可能更大,而后期开风暴龙王直接导致一波对面导致奖励更新更大。
[1] A2C / A3C (Asynchronous Advantage Actor-Critic): Mnih et al, 2016
[2] PPO (Proximal Policy Optimization): Schulman et al, 2017
[3] TRPO (Trust Region Policy Optimization): Schulman et al, 2015
[4] DDPG (Deep Deterministic Policy Gradient): Lillicrap et al, 2015
[5] TD3 (Twin Delayed DDPG): Fujimoto et al, 2018
[6] SAC (Soft Actor-Critic): Haarnoja et al, 2018
[7] DQN (Deep Q-Networks): Mnih et al, 2013
[8] C51 (Categorical 51-Atom DQN): Bellemare et al, 2017
[9] QR-DQN (Quantile Regression DQN): Dabney et al, 2017
[10] HER (Hindsight Experience Replay): Andrychowicz et al, 2017
[11] World Models: Ha and Schmidhuber, 2018
[12] I2A (Imagination-Augmented Agents): Weber et al, 2017
[13] MBMF (Model-Based RL with Model-Free Fine-Tuning): Nagabandi et al, 2017
[14] MBVE (Model-Based Value Expansion): Feinberg et al, 2018
[15] AlphaZero: Silver et al, 2017
off-policy算法
行为准则:我们做事情都会有一个自己的行为准则, 比如小时候爸妈常说”不写完作业就不准看电视”. 所以我们在 写作业的这种状态下, 好的行为就是继续写作业, 直到写完它, 我们还可以得到奖励, 不好的行为 就是没写完就跑去看电视了, 被爸妈发现, 后果很严重. 小时候这种事情做多了, 也就变成我们不可磨灭的记忆. 这和我们要提到的 Q learning 有什么关系呢? 原来 Q learning 也是一个决策过程, 和小时候的这种情况差不多. 我们举例说明:假设现在我们处于写作业的状态而且我们以前并没有尝试过写作业时看电视, 所以现在我们有两种选择 , 1, 继续写作业, 2, 跑去看电视. 因为以前没有被罚过, 所以我选看电视, 然后现在的状态变成了看电视, 我又选了继续看电视, 接着我还是看电视, 最后爸妈回家, 发现我没写完作业就去看电视了, 狠狠地惩罚了我一次, 我也深刻地记下了这一次经历, 并在我的脑海中将 “没写完作业就看电视” 这种行为更改为负面行为, 我们在看看 Q learning 根据很多这样的经历是如何来决策的吧.
QLearning 决策:假设我们的行为准则已经学习好了, 现在我们处于状态s1, 我在写作业, 我有两个行为 a1, a2, 分别是看电视和写作业, 根据我的经验, 在这种 s1 状态下, a2 写作业 带来的潜在奖励要比 a1 看电视高, 这里的潜在奖励我们可以用一个有关于 s 和 a 的 Q 表格代替, 在我的记忆Q表格中, Q(s1, a1)=-2 要小于 Q(s1, a2)=1, 所以我们判断要选择 a2 作为下一个行为. 现在我们的状态更新成 s2 , 我们还是有两个同样的选择, 重复上面的过程, 在行为准则Q 表中寻找 Q(s2, a1) Q(s2, a2) 的值, 并比较他们的大小, 选取较大的一个. 接着根据 a2 我们到达 s3 并在此重复上面的决策过程. Q learning 的方法也就是这样决策的. 看完决策, 我看在来研究一下这张行为准则 Q 表是通过什么样的方式更改, 提升的.
QLearning 更新:所以我们回到之前的流程, 根据 Q 表的估计, 因为在 s1 中, a2 的值比较大, 通过之前的决策方法, 我们在 s1 采取了 a2, 并到达 s2, 这时我们开始更新用于决策的 Q 表, 接着我们并没有在实际中采取任何行为, 而是再想象自己在 s2 上采取了每种行为, 分别看看两种行为哪一个的 Q 值大, 比如说 Q(s2, a2) 的值比 Q(s2, a1) 的大, 所以我们把大的 Q(s2, a2) 乘上一个衰减值 gamma (比如是0.9) 并加上到达s2时所获取的奖励 R (这里还没有获取到我们的棒棒糖, 所以奖励为 0), 因为会获取实实在在的奖励 R , 我们将这个作为我现实中 Q(s1, a2) 的值, 但是我们之前是根据 Q 表估计 Q(s1, a2) 的值. 所以有了现实和估计值, 我们就能更新Q(s1, a2) , 根据 估计与现实的差距, 将这个差距乘以一个学习效率 alpha 累加上老的 Q(s1, a2) 的值 变成新的值. 但时刻记住, 我们虽然用 maxQ(s2) 估算了一下 s2 状态, 但还没有在 s2 做出任何的行为, s2 的行为决策要等到更新完了以后再重新另外做. 这就是 off-policy 的 Q learning 是如何决策和学习优化决策的过程.
QLearning 整体算法:这一张图概括了我们之前所有的内容. 这也是 Q learning 的算法, 每次更新我们都用到了 Q 现实和 Q 估计, 而且 Q learning 的迷人之处就是 在 Q(s1, a2) 现实 中, 也包含了一个 Q(s2) 的最大估计值, 将对下一步的衰减的最大估计和当前所得到的奖励当成这一步的现实, 很奇妙吧. 最后我们来说说这套算法中一些参数的意义. Epsilon greedy 是用在决策上的一种策略, 比如 epsilon = 0.9 时, 就说明有90% 的情况我会按照 Q 表的最优值选择行为, 10% 的时间使用随机选行为. alpha是学习率, 来决定这次的误差有多少是要被学习的, alpha是一个小于1 的数. gamma 是对未来 reward 的衰减值.
整个算法就是一直不断更新 Q table 里的值, 然后再根据新的值来判断要在某个 state 采取怎样的 action. Qlearning 是一个 off-policy 的算法,且是单步更新的 因为里面的 max action 让 Q table 的更新可以不基于正在经历的经验(可以是现在学习着很久以前的经验,甚至是学习他人的经验).
QLearning 中的 γ \gamma γ:我们重写一下 Q(s1) 的公式, 将 Q(s2) 拆开, 因为Q(s2)可以像 Q(s1)一样,是关于Q(s3) 的, 所以可以写成这样, 然后以此类推, 不停地这样写下去, 最后就能写成这样, 可以看出Q(s1) 是有关于之后所有的奖励, 但这些奖励正在衰减, 离 s1 越远的状态衰减越严重. 不好理解? 行, 我们想象 Qlearning 的机器人天生近视眼, gamma = 1 时, 机器人有了一副合适的眼镜, 在 s1 看到的 Q 是未来没有任何衰变的奖励, 也就是机器人能清清楚楚地看到之后所有步的全部价值, 但是当 gamma =0, 近视机器人没了眼镜, 只能摸到眼前的 reward, 同样也就只在乎最近的大奖励, 如果 gamma 从 0 变到 1, 眼镜的度数由浅变深, 对远处的价值看得越清楚, 所以机器人渐渐变得有远见, 不仅仅只看眼前的利益, 也为自己的未来着想.
过程推导:博客
表示t时刻的Q现实=t时刻的reward+ γ \gamma γ*(t+1)时刻的Q现实。而:
- Q-learning每次使用 ϵ \epsilon ϵ-greedy的方法(1- ϵ \epsilon ϵ的概率按Q值选, ϵ \epsilon ϵ的概率随机选)选择当前状态的action,而在更新Q(state, action)的时候,是使用Q(next_state, next_acion),其中next_action是使Q(next_state, next_acion)最大的动作。然后state=next_state,动作再重新选择,next_acion值用于更新Q值。
- Sarsa则不同。使用epsilon-greedy选择next_state的next_action,然后用Q(next_state, next_acion)来更新Q(state, action),更新的时候:state=next_state, action=next_action
"""
1. Making the Policy Network.
"""
# make core of policy network
logits_net = mlp(sizes=[obs_dim]+hidden_sizes+[n_acts])
# make function to compute action distribution
def get_policy(obs):
logits = logits_net(obs)
return Categorical(logits=logits)
# make action selection function (outputs int actions, sampled from policy)
def get_action(obs):
return get_policy(obs).sample().item()
"""
2. Making the Loss Function.
"""
# make loss function whose gradient, for the right data, is policy gradient
def compute_loss(obs, act, weights):
logp = get_policy(obs).log_prob(act)
return -(logp * weights).mean()
"""
3. Running One Epoch of Training.
"""
# for training policy
def train_one_epoch():
# make some empty lists for logging.
batch_obs = [] # for observations
batch_acts = [] # for actions
batch_weights = [] # for R(tau) weighting in policy gradient
batch_rets = [] # for measuring episode returns
batch_lens = [] # for measuring episode lengths
# reset episode-specific variables
obs = env.reset() # first obs comes from starting distribution
done = False # signal from environment that episode is over
ep_rews = [] # list for rewards accrued throughout ep
# render first episode of each epoch
finished_rendering_this_epoch = False
# collect experience by acting in the environment with current policy
while True:
# rendering
if (not finished_rendering_this_epoch) and render:
env.render()
# save obs
batch_obs.append(obs.copy())
# act in the environment
act = get_action(torch.as_tensor(obs, dtype=torch.float32))
obs, rew, done, _ = env.step(act)
# save action, reward
batch_acts.append(act)
ep_rews.append(rew)
if done:
# if episode is over, record info about episode
ep_ret, ep_len = sum(ep_rews), len(ep_rews) # ep_ret即整个episode的reward之和,回合更新(一个episode之后才更新policy)
batch_rets.append(ep_ret)
batch_lens.append(ep_len)
# the weight for each logprob(a|s) is R(tau)
batch_weights += [ep_ret] * ep_len
# reset episode-specific variables
obs, done, ep_rews = env.reset(), False, []
# won't render again this epoch
finished_rendering_this_epoch = True
# end experience loop if we have enough of it
if len(batch_obs) > batch_size:
break
# take a single policy gradient update step
optimizer.zero_grad()
batch_loss = compute_loss(obs=torch.as_tensor(batch_obs, dtype=torch.float32),
act=torch.as_tensor(batch_acts, dtype=torch.int32),
weights=torch.as_tensor(batch_weights, dtype=torch.float32)
)
batch_loss.backward()
optimizer.step()
return batch_loss, batch_rets, batch_lens
Taking a step with this gradient pushes up the log-probabilities of each action in proportion to R(\tau), the sum of all rewards ever obtained. But this doesn’t make much sense. Agents should really only reinforce actions on the basis of their consequences. Rewards obtained before taking an action have no bearing on how good that action was: only rewards that come after.
,也就是说,没必要算整个episode的reward,每个action都会获得一个reward,而采取这个action a t a_t at之前的reward采取现在这个action a t a_t at的好坏无关,而之后的reward都与这个action a t a_t at有关(直到这个episode截止),于是修改上式为:# 增加
def reward_to_go(rews):
n = len(rews)
rtgs = np.zeros_like(rews)
for i in reversed(range(n)):
# 现在只计算t时刻之后的reward之和给a_t进行加权了
rtgs[i] = rews[i] + (rtgs[i+1] if i+1 < n else 0)
return rtgs
# 上面代码块中68-69行的:
"""
# the weight for each logprob(a|s) is R(tau)
batch_weights += [ep_ret] * ep_len
"""
# 替换为:
# the weight for each logprob(a_t|s_t) is reward-to-go from t
batch_weights += list(reward_to_go(ep_rews))
信任区域策略优化算法
TRPO是on-policy算法,支持离散和连续的动作空间
而根据贝尔曼方程,其实 J ( π ) J(\pi) J(π)可以等价下面的几个替代,即 V π ( s ) V^\pi(s) Vπ(s)、 Q π ( s , a ) Q^\pi(s,a) Qπ(s,a)和 A π ( s , a ) A^\pi(s,a) Aπ(s,a)之一均可:
L ( θ k , θ ) L(\theta_k, \theta) L(θk,θ)叫做surrogate advantage(替代优势函数),而 π θ k \pi_{\theta_k} πθk和 π θ \pi_\theta πθ分别表示老的policy和当前policy,而 δ \delta δ是很小的一个数。
Why可以替换成这样?
因为在 D K L ( θ ∣ ∣ θ k ) D_{KL}(\theta||\theta_k) DKL(θ∣∣θk)很小的情况下,表示 π θ k \pi_{\theta_k} πθk和 π θ \pi_\theta πθ网络的输出结果分布近似相同,即 π θ k \pi_{\theta_k} πθk和 π θ \pi_\theta πθ近似相同,因此:
即正常形式。因此可以做之前TRPO那样的近似。
推导过程为:
其中, θ ′ \theta' θ′就是先前的 θ k \theta_k θk,它们具有相近似的表现形式,即 D K L ( θ ∣ ∣ θ k ) D_{KL}(\theta||\theta_k) DKL(θ∣∣θk)很小。
因此,能直接将 A θ ( s t , a t ) A^{\theta}(s_t,a_t) Aθ(st,at)替换为 A θ ′ ( s t , a t ) A^{\theta'}(s_t,a_t) Aθ′(st,at);而 P θ ( s t , a t ) = P θ ( a t ∣ s t ) ∗ p θ ( s t ) P_{\theta}(s_t,a_t)=P_{\theta}(a_t|s_t)*p_\theta{(s_t)} Pθ(st,at)=Pθ(at∣st)∗pθ(st)是条件概率公式展开得到的, P θ ′ ( s t , a t ) = P θ ′ ( a t ∣ s t ) ∗ p θ ′ ( s t ) P_{\theta'}(s_t,a_t)=P_{\theta'}(a_t|s_t)*p_\theta'{(s_t)} Pθ′(st,at)=Pθ′(at∣st)∗pθ′(st)同理。而能将 p θ ( s t ) p θ ′ ( s t ) \frac{p_\theta(s_t)}{p_\theta'{(s_t)}} pθ′(st)pθ(st)去掉是因为下面几条:
而将 A θ ( s t , a t ) A^{\theta}(s_t,a_t) Aθ(st,at)替换为 A θ ′ ( s t , a t ) A^{\theta'}(s_t,a_t) Aθ′(st,at)就表示现在度量用的老的policy θ ′ \theta' θ′了,即和环境交互的policy,而更新的是policy θ \theta θ,也就是说和环境交互的policy和用于更新的policy不是同一个,也就说明从on-policy变成了off-policy。即:
不过,由于 θ ′ \theta' θ′和 θ \theta θ都是同一个网络在不同step的参数,差距也不大,近似认为是on-policy也是合理的。
从最终梯度结果,再根据 ▽ f ( x ) = f ( x ) ▽ l o g f ( x ) \triangledown{f(x)}=f(x)\triangledown{logf(x)} ▽f(x)=f(x)▽logf(x),我们可以反推原目标函数为:
其中: p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) \frac{p_\theta(a_t|s_t)}{p_{\theta'}(a_t|s_t)} pθ′(at∣st)pθ(at∣st)也就是所谓的Importance Sampling的weight。即非要用策略P抽样出来的数据,来更新策略Q也不是不可以,乘以一个重要性权重即可。
因此,也就导出了最开始的那个式子。
而不要忘记了这一切是有条件的,即 D K L ( θ ∣ ∣ θ k ) D_{KL}(\theta||\theta_k) DKL(θ∣∣θk)很小。
注意: D K L ( θ ∣ ∣ θ k ) D_{KL}(\theta||\theta_k) DKL(θ∣∣θk)是通过计算两个policy的表现来衡量的,而不是真的把参数拉出来算KL散度,也就是:
即:
那现在很明朗了,所谓信任区域策略优化
中信任区域
也就是满足 D K L ( θ ∣ ∣ θ k ) D_{KL}(\theta||\theta_k) DKL(θ∣∣θk)的区域了。
那有什么优势呢?
当然是比VPG更好的效果,更快的收敛啦!
其中 g g g是surrogate advantage函数 L ( θ k , θ ) L(\theta_k,\theta) L(θk,θ)对于 θ \theta θ的导数,而 H H H是样本平均KL散度的Hessian值。于是得到:
上面结果存在一定误差,可以引入线性回溯搜索(a backtracking line search)来修正,得到:
其中 α ∈ ( 0 , 1 ) \alpha \in (0,1) α∈(0,1)是回溯系数,而 j j j是使得 π θ k + 1 \pi_{\theta_{k+1}} πθk+1满足KL约束且surrogate advantage函数 L ( θ k , θ ) L(\theta_k,\theta) L(θk,θ)为正的最小非负整数。而由于计算和存储 H − 1 H^{-1} H−1很难,因此可以转换为存储 H x Hx Hx即 g g g,也就是 H x = g Hx=g Hx=g,即:
Penalty
算法,一般叫PPO
,而PPO还有一个改进版本PPO-clip
,或者叫PPO2
:github仓库
github文档
CSDN博客
代码实现请参考:spining up RL 或 openai RL baseline 或 仓库1 或 仓库2 或 博客
深度确定性策略优化算法
DDPG 是一种off-policy算法, 只能用于具有连续动作空间的环境,可以被认为是针对连续动作空间的deep Q-Learning。
拆分细讲:它吸收了 Actor-Critic 让 Policy gradient 单步更新的精华, 而且还吸收让计算机学会玩游戏的 DQN 的精华, 合并成了一种新算法, 叫做 Deep Deterministic Policy Gradient. 那 DDPG 到底是什么样的算法呢, 我们就拆开来分析, 我们将 DDPG 分成 ‘Deep’ 和 ‘Deterministic Policy Gradient’, 然后 ‘Deterministic Policy Gradient’ 又能被细分为 ‘Deterministic’ 和 ‘Policy Gradient’, 而Deterministic是value-based, Policy Gradient这是policy-based,因此本质是改进的Actor-Critic。接下来, 我们就开始一个个分析啦.
Deep 和 DQN:Deep 顾名思义, 就是走向更深层次, 我们在 DQN 的影片当中提到过, 使用一个记忆库和两套结构相同, 但参数更新频率不同的神经网络能有效促进学习. 那我们也把这种思想运用到 DDPG 当中, 使 DDPG 也具备这种优良形式. 但是 DDPG 的神经网络形式却比 DQN 的要复杂一点点.
Deterministic Policy Gradient:Policy gradient 我们也在之前的短片中提到过, 相比其他的强化学习方法, 它能被用来在连续动作上进行动作的筛选 . 而且筛选的时候是根据所学习到的动作分布随机进行筛选, 而 Deterministic 有点看不下去, Deterministic 说: 我说兄弟, 你其实在做动作的时候没必要那么不确定, 那么犹豫嘛, 反正你最终都只是要输出一个动作值, 干嘛要随机, 铁定一点, 有什么不好(确定性策略是和随机策略相对而言的,对于某一些动作集合来说,它可能是连续值,或者非常高维的离散值,这样动作的空间维度极大。如果我们使用随机策略,即像DQN一样研究它所有的可能动作的概率,并计算各个可能的动作的价值的话,那需要的样本量是非常大才可行的[每个动作的value要送给critic去算,概率分布上每一点要送给critic算一次,计算量当然大]。于是有人就想出使用确定性策略来简化这个问题。作为随机策略,在相同的策略,在同一个状态处,采用的动作是基于一个概率分布的,即是不确定的。而确定性策略则决定简单点,虽然在同一个状态处,采用的动作概率不同,但是最大概率只有一个,如果我们只取最大概率的动作,去掉这个概率分布,那么就简单多了。即作为确定性策略,相同的策略,在同一个状态处,动作是唯一确定的)。 所以 Deterministic 就改变了输出动作的过程, 斩钉截铁的只在连续动作上输出一个动作值。
DDPG 神经网络:现在我们来说说 DDPG 中所用到的神经网络. 它其实和我们之前提到的 Actor-Critic 形式差不多, 也需要有基于 策略 Policy 的神经网络 和基于 价值 Value 的神经网络, 但是为了体现 DQN 的思想, 每种神经网络我们都需要再细分为两个, Policy Gradient 这边, 我们有估计网络和现实网络, 估计网络用来输出实时的动作, 供 actor 在现实中实行. 而现实网络则是用来更新价值网络系统的. 所以我们再来看看价值系统这边, 我们也有现实网络和估计网络, 他们都在输出这个状态的价值, 而输入端却有不同, 状态现实网络这边会拿着从动作现实网络来的动作加上状态的观测值加以分析, 而状态估计网络则是拿着当时 Actor 施加的动作当做输入.在实际运用中, DDPG 的这种做法的确带来了更有效的学习过程.
一句话概括 DDPG:Google DeepMind 提出的一种使用 Actor Critic 结构, 但是输出的不是行为的概率, 而是具体的行为, 用于连续动作 (continuous action) 的预测. DDPG 结合了之前获得成功的 DQN 结构, 提高了 Actor Critic 的稳定性和收敛性.
关于 Actor 部分, 他的参数更新同样会涉及到 Critic。它的前半部分 grad[Q] 是从 Critic 来的, 这是在说: 这次 Actor 的动作要怎么移动, 才能获得更大的 Q, 而后半部分 grad[u] 是从 Actor 来的, 这是在说: Actor 要怎么样修改自身参数, 使得 Actor 更有可能做这个动作. 所以两者合起来就是在说: Actor 要朝着更有可能获取大 Q 的方向修改动作参数了.
它借鉴了 DQN 和 Double Q learning 的方式, 有两个计算 Q 的神经网络, Q_target 中依据下一状态, 用 Actor 来选择动作, 而这时的 Actor 也是一个 Actor_target (有着 Actor 很久之前的参数). 使用这种方法获得的 Q_target 能像 DQN 那样切断相关性, 提高收敛性.
其中,如果s’是终止状态(episode结束),则d=1,否则d=0;
然后由于DDPG包含DQN,因此还可以直接使用DQN 的两大利器,Experience replay 和 fixed Q-targets。对于后者,就可以得到:
其中: μ θ t a r g \mu_{\theta_{targ}} μθtarg就是target policy。
双延迟DDPG算法。
TD3 是一种off-policy算法,只能用于具有连续动作空间的环境。
由于DDPG本质是DQN+Policy Gradient,所以DQN的缺点特也有,啥缺点呢?过估计,即 Qmax 会导致 Q现实 当中的过估计 (overestimate)。而之前Value-Based方法中是将DDPG改进为 Double DQN 来解决的。这里不例外,包括了三个trick:
第一个trick便是Clipped Double-Q Learning。本质就是Double DQN解决的问题,不过注意,做法不一样。而是学习两个 Q 函数,也就是Twin
,他们都学习一个目标,即两者Q值之间的较小者计算得到:
第二个trick是 “Delayed” Policy Updates:TD3更新policy(和目标网络)的频率低于Q函数。原文建议每更新Q函数两次才更新一次policy(即actor)。
第三个trick是Target Policy Smoothing:TD3给目标动作增加了噪声,使策略更难通过平滑动作变化来利用Q函数的误差信息。具体地如下:
Target Policy Smoothing本质上是起到正则的作用。它解决了 DDPG 中可能发生的特定故障模式:如果 Q 函数逼近器针对某些操作产生了不正确的尖峰,则policy将快速利用该尖峰,然后出现脆弱或不正确的行为。Target Policy Smoothing则是通过在动作上平滑 Q 函数来避免这个问题。
这三个技巧大大提高了 DDPG 的性能,结果远高于DDPG baseline。
Entropy-Regularized Reinforcement Learning
, 然后在原本求Return期望max的基础上多引入熵这一项,得到:异步优势AC算法
今天我们会来说说强化学习中的一种有效利用计算资源, 并且能提升训练效用的算法, Asynchronous Advantage Actor-Critic, 简称 A3C.
平行宇宙:想像现在有三个平行宇宙, 那么就意味着这3个平行宇宙上存在3个你, 而你可能在电脑前呆了很久, 被催促起来做运动,这3个你都开始活动筋骨啦. 假设3个你都能互相通信, 告诉对方, “我这个动作可以有效缓解我的颈椎病”, “我做那个动作后, 腰就不痛了 “, “我活动了手臂, 肩膀就不痛了”. 这样你是不是就同时学到了对身体好的三招. 这样是不是感觉特别有效率. 让你看看更有效率的, 那就想想3个你同时在写作业, 一共3题, 每人做一题, 只用了1/3 的时间就把作业做完了. 感觉棒棒的. 如果把这种方法用到强化学习, 岂不是效率贼高.
平行训练:这就是传说中的 A3C. A3C 其实只是这种平行方式的一种而已, 它采用的是我们之前提到的 Actor-Critic 的形式. 为了训练一对 Actor 和 Critic, 我们将它复制多份红色的, 然后同时放在不同的平行宇宙当中, 让他们各自玩各的. 然后每个红色副本都悄悄告诉黑色的 Actor-Critic 自己在那边的世界玩得怎么样, 有哪些经验值得分享. 然后还能从黑色的 Actor-Critic 这边再次获取综合考量所有副本经验后的通关秘籍. 这样一来一回, 形成了一种有效率的强化学习方式.
多核训练:我们知道目前的计算机多半是有双核, 4核, 甚至 6核, 8核. 一般的学习方法, 我们只能让机器人在一个核上面玩耍. 但是如果使用 A3C 的方法, 我们可以给他们安排去不同的核, 并行运算. 实验结果就是, 这样的计算方式往往比传统的方式快上好多倍. 那我们也多用用这样的红利吧.
一句话概括 A3C: Google DeepMind 提出的一种解决 Actor-Critic 不收敛问题的算法. 它会创建多个并行的环境, 让多个拥有副结构的 agent 同时在这些并行环境上更新主结构中的参数. 并行中的 agent 们互不干扰, 而主结构的参数更新受到副结构提交更新的不连续性干扰, 所以更新的相关性被降低, 收敛性提高.
模仿学习指的是从给定的展示中进行学习。机器在这个过程中,也和环境进行交互,但是,并没有显示的得到 reward。在某些任务上,也很难定义 reward。如:自动驾驶,撞死一人,reward为多少,撞到一辆车,reward 为多少,撞到小动物,reward 为多少,撞到 X,reward 又是多少,诸如此类。。。而某些人类所定义的 reward,可能会造成不可控制的行为,如:我们想让 agent 去考试,目标是让其考 100,那么,这个 agent 则可能会为了考 100,而采取作弊的方式,那么,这个就比较尴尬了,是吧 ?我们当然想让 agent 在学习到某些本领的同时,能遵守一定的规则。给他们展示怎么做,然后让其自己去学习,会是一个比较好的方式。
本文所涉及的三种方法:1. 行为克隆,2. 逆强化学习,3. GAN 的方法。
这里以自动驾驶为例,首先我们要收集一堆数据,就是 demo,然后人类做什么,就让机器做什么。其实就是监督学习(supervised learning),让 agent 选择的动作和 给定的动作是一致的。。。
但是,这个方法是有问题的,因为 你给定的 data,是有限的,而且是有限制的。那么,在其他数据上进行测试,则可能不会很好。因此,要么你增加 training data,加入平常 agent 没有看到过的数据,即:dataset aggregation 。
通过不断地增加数据,那么,就可以很好的改进 agent 的策略。有些场景下,也许适应这种方法。。。
而且,你的观测数据 和 策略是有联系的。因为在监督学习当中,我们需要 training data 和 test data 独立同分布。但是,有时候,这两者是不同的(比如跨域ReID等跨域问题,就要做域适应/迁移学习了),那么,就惨了。。。
于是,另一类方法,出现了,即:Inverse Reinforcement Learning (也称为:Inverse Optimal Control,Inverse Optimal Planning)。
顾名思义,IRL 是 反过来的 RL,RL 是根据 reward 进行参数的调整,然后得到一个 policy。大致流程应该是这个样子:
但是, IRL 就不同了,因为他没有显示的 reward,只能根据 人类行为,进行 reward的估计(反推 reward 的函数)。
在得到 reward 函数估计出来之后,再进行 策略函数的估计。。。
原本的 RL,就是给定一个 reward function R(t)(奖励的加和,即回报),然后,这里我们回顾一下 RL 的大致过程(这里以 policy gradient 方法为例)
而 Inverse Reinforcement Learning 这是下面的这个思路:
逆强化学习 则是在给定一个专家之后(expert policy),通过不断地寻找 reward function 来满足给定的 statement(即,解释专家的行为,explaining expert behavior)。。。专家的这个回报是最大的,英雄级别的,比任何其他的 actor 得到的都多。。。
那么如何用 GAN 来做这个事情呢?对应到这件事情上,我们知道,我们想得到的 轨迹 是属于某一个高维的空间中,而 expert 给定的那些轨迹,我们假设是属于一个 distribution,我们想让我们的 model,也去 predict 一个分布出来,然后使得这两者之间尽可能的接近。从而完成 actor 的训练过程,示意图如下所示:
算法流程如下:
Discriminator:尽可能的区分轨迹是由expert生成还是Generator生成。
Generator(Actor):产生出一个轨迹,使其与专家轨迹尽可能相近,使Discriminator无法区分轨迹是expert生成的还是Generator生成的。
其算法可以写为:
GAIL能够直接从专家轨迹中学得策略,绕过很多IRL的中间步骤。
参考博客:模仿学习
参考博客:GANIL