0 引言
一开始读 DBC 的论文感觉很多都不懂,于是就想着先从强化学习对应部分 (TD 算法部分) 进行学习,然后再回过头来看论文。但是读完论文后仍发现有很多的基础概念不懂,一开始只是去搜集自己不懂的地方,找了好几篇文章读了半天发现还是晕头转向,回过头来发现自己对于强化学习的基础概念还是欠缺较多 (感觉强化学习中的概念都很绕,尤其像 Actor-Critic 这种集大成者)。然后发现其实之前自己按照动手学习强化学习教程里写的也比较片面,所以又看了很多课程 (特别感谢王树森老师的课程,链接就不给了,在油管上,b 站上面也有但不是2k的)。前前后后这篇文章也是一边看一边想然后又有点推倒重来那个感觉 ,像极了在智慧的水潭中搞不明白撒泼打滚的自己。
1 Siamese Network
Siamese Network 直观翻译是暹罗网络,其实可以理解为 “孪生神经网络” (Siamese 在英语中是 “孪生” 的意思)。其示意图如下所示。而其 “孪生” 则在于两个子网络的结构完全一样,且共享权值 W,这些子网络被称为 “分支” (Branch)。分支的网络结构可以是神经网络 (CNN)、循环神经网络 (RNN) 或全连接神经网络等,具体取决于任务的特点。
而对于暹罗网络的机制与原理,则有以下解释 (感觉这个结构很有对比学习那味) :
- 共享参数的结构 : 暹罗神经网络通过共享参数的子网络,使得两个或多个输入样本可以共享相同的特征提取和编码过程。这种共享参数的结构可以减少网络的参数量,提高模型的模型效率和泛化能力。同时,它还可以使网络更容易训练,减少过拟合的风险。
- 学习表征的能力 : 暹罗神经网络通过将输入样本映射到低维特征空间,学习到了具有良好区分性的特征表示。这些特征表示能够捕捉到输入样本的关键信息,使得不同类别的样本在特征空间中学习到的表征能力使得暹罗神经网络在相似性比较和学习任务中表现出色。
- 对比损失函数的优化 : 暹罗神经网络通常使用对比损失函数进行训练,该损失函数能够有效地鼓励相同类别的样本在特征空间中更加接近,不同类别的样本则更加分散。这种方式有助由于增强模型的区分性,使得模型能够更好地区分不同类别的样本,并具有更好的泛化能力。
除了纯粹的暹罗网络,还衍生出了伪暹罗网络 (Pseudo-Siamese Network),不同于暹罗网络的是,其两边的分支网络不共享参数。这种网络结构的好处是可以学习到两个样本的特征表示,但是其缺点是参数量会比较大,同时也会增加网络的训练难度。
以及除了两个分支网络之外,还更有多个分支网络的暹罗网络。这种网络结构的好处是可以学习到多个样本的特征表示,但是其缺点是参数量会比较大,同时也会增加网络的训练难度。
2 value-based 和 policy-based 强化学习方法
2.0 回顾强化学习中的基本概念
- 主体 (Agent) : 在嵌入环境中采取行动来改变环境状态的系统。比如室内机器人、超级马里奥中的马里奥。
- 状态 (State S) : 状态可以被看作是决定其未来演变的制度历史的总结。状态空间 S 是包含所有可能状态的集合。在第 t 步中,我们可以观察到过去的状态的值 : s1,…,st,而未来状态 St+1,St+2,… 是不可观测的随机变量。
- 动作 (Action A) : 代理的决策基于状态和其他考虑。操作空间 A 是包含所有动作的集合,其可以是离散集,如 {"向左", "向右", "向上"},也可以是连续集,如 [0,1]×[−90,90]。在第 t 步中,可以观察到过去的状态的值 : a1,…,at,而未来状态 At+1,At+2,… 是不可观测的随机变量。
- 奖励 (Reward R) : 奖励是主体从环境中获得的价值,是对主体行为的直接回应。在第 t 步中,可以观察到过去的状态的值 : r1,…,rt。然而,未来的奖励 Ri (对于 i>t) 是不可观察的,它取决于随机变量 St+1 和 At+1。因此在第 t 步中,未来奖励 Rt+1,Rt+2,… 是随机变量。
- 策略函数 (π) : 主体的决策功能。策略是概率密度函数 (PDF) : π(a∣s)=P(A=a∣S=s),策略函数将观测到的状态 S=s 映射为集合 A 中所有动作的概率分布。因为 π 是一个概率密度函数,所以 ∑a∈Aπ(a∣s)=1。对于所有 a∈A,主体将以概率 π(a∣s) 执行动作 a。
- 状态转移 (p) : 给定当前状态 S=s,主体的动作 A=a 将导致环境到达的新状态 S′。状态转移函数是概率密度函数(PDF) p(s′∣s,a)=P(S′=s′∣S=s,A=a)。环境决定了 st 这个新状态下的状态转移概率 p(s′∣s,a),对于所有 s∈S。
- 轨迹 (Trajectory) : 主体与环境的交互产生一系列 (状态、行动、奖励) 三元组
- 回报 (Return U) : 回报综合了现在能立即获得的奖励和未来能获得的奖励。很明显,未来获得的奖励是不如立即可以获得的奖励更有价值的 (可以通俗理解为其具有更多的风险),因此在计算未来的奖励时我们引入折扣因子 γ∈(0,1) 来进行平衡 :
Ut=Rt+γ⋅Rt+1+γ2⋅Rt+2+γ3⋅Rt+3+⋯
以上先介绍下强化学习的基础知识,之后不同两种形式的方法会引入不同的想法与知识。
2.1 value-based 强化学习
value-based (价值引导的) 强化学习希望对于特定的状态与特定的动作,得到一个最大的返回值 (即最优),因此引入以下两个概念 :
- 动作价值函数 (Qπ) : 动作值函数 Qπ(st,at) 衡量给定状态 st 和策略 π 下动作 at 的好坏。形式化表示如下 :
Qπ(st,at)=E[Ut∣St=st,At=at]
即对于固定状态 st 与动作 at,计算在策略 π 下 Ut 的期望值。
- 最优动作值函数 (Q∗) : 最优动作值函数 Q⋆(st,at) 衡量状态 st 下动作 at 的好坏。形式化表示如下 :
Q⋆(s,a)=πmaxQπ(s,a).
其中 Q⋆(s,a) 与策略函数 π 无关。
通俗而言,我们可以理解为 value-based 强化学习希望学习到一个稳定且强大的 Q 函数 : 像是找到一个先知,然后在当前状态下进行特定动作时先知会对我们进行一定的指引,比如先知告诉我们在马里奥游戏中现在 “往上跳” 比起 “往右跑” 会获得更好的收益。所以关键就在于如何学习这样的一个先知 (可以看出来 value-based 强化学习对于策略函数 π 的依存是不强的,虽然之前学习的方法中会防止搜索空间有限引入一定的随机参数,但是这个打分明显是不需要学习 π 的)。
我们引入神经网络来对 Q 函数进行学习,其对应参数为 w。这样的情况下,在第 t 步我们采取的动作为 :
at=a∈AargmaxQ⋆(st,a)=aargmaxQ(st,a;w)
这就和我们之前时序差分 (temporal different, TD) 的那一部分对上了,结合回报 Ut 的计算性质 Ut=Rt+γ⋅Ut+1 (不难推导在此不多赘述),可以得到 :
Qπ(st,at)=E[Ut∣st,at]=E[Rt+γ⋅Ut+1∣st,at]=E[Rt+γ⋅Qπ(St+1,At+1)∣st,at]
结合 Q(st,at;w)≈maxπE[Ut∣st,at],可以得到 :
Q(st,at;w)≈rt+γ⋅Q(st+1,at+1;w)
结合时序差分的优化目标
L=N1i∑(yi−Q(st,at;w))2
即可完成对于神经网络参数 w 的优化,逐步训练就能更好地刻画这么一个先知 Q。
2.2 policy-based 强化学习
policy-based (策略引导的) 强化学习希望对于特定的状态,策略函数 π 能够对于不同的操作给出合理的概率 (与 value-based 强化学习的区别是其操作从根本上就是不确定的),补充以下两个概念 :
- 状态价值函数 (Vπ) : 状态值函数 Vπ(st) 在表示给定策略 π 下,当衡量前状态 st 的好坏。具体表述如下 :
Vπ(st)=EA∼π(⋅∣st)[Qπ(st,A)]=∫Aπ(a∣st)⋅Qπ(st,a)da
其中动作 A 被视为随机变量并参与积分。
- 最优状态价值函数 (V∗) : 最优状态值函数 V⋆(st) 衡量当前状态 st 下的好坏。正式表述为 :
V⋆(s)=πmaxVπ(s)
注意 V∗ 与策略函数 π 无关。
可以看出来,policy-based 强化学习和 value-based 强化学习训练的目标不同,policy-based 虽然也是训练出一个先知,但是这个先知和奇异博士有点相似,给的指示并不明确,比如先知告诉我们在马里奥游戏中现在建议采取 0.7 的概率选取 “向上跳” 这一动作、采取 0.2 的概率选取 “往右跑” 这一动作、 采取 0.1 的概率选取 “往左跑” 这一动作。你只能说它更建议你 “往上跳”,但是不能说它要求你不要 “往左跑” 或者 “往左跑” 一定是不好的 (感觉某种程度上是用概率来对于确定估值进行一定化简,有更大的搜索空间与合理性)。我们训练的目标等于是让先知给的策略函数即概率采用更为合理。回顾 Vπ(s) 的定义 :
Vπ(s)=a∈A∑π(a∣s)⋅Qπ(s,a)
一样的,遇事不决我们便使用神经网络对其进行拟合,拟合策略函数 π(a∣s) 网络的参数为 θ。基于对策略函数的估计,Vπ(s) 可以表示为 :
V(s;θ)=a∈A∑π(a∣s;θ)⋅Qπ(s,a)
接着我们对于参数 θ 求导得到优化方向 :
∂θ∂V(s;θ)=∂θ∂∑a∈Aπ(a∣s;θ)⋅Qπ(s,a)=a∈A∑∂θ∂π(a∣s;θ)⋅Qπ(s,a)
到此为止其实 Qπ(s,a) 其实是和 θ 有关系的,毕竟 θ 是 π(a∣s) 的参数,但是按照王老师给的 “无伤大雅” 的处理 (确实最后不影响结果),我们可以认为其与 θ 没有关系,因此可以得到 :
a∈A∑∂θ∂π(a∣s;θ)⋅Qπ(s,a)≈a∈A∑Qπ(s,a)⋅∂θ∂π(a∣s;θ)=a∈A∑Qπ(s,a)⋅π(a∣s;θ)⋅∂θ∂logπ(a∣s;θ).
第三行的形式其实并不好直接从第二行得到,但是可以轻易验算出其和第二行的等价性。因此上面的方程可以等价地写成 :
∂θ∂V(s;θ)=EA∼π(⋅∣s,θ)[Qπ(s,a)⋅∂θ∂logπ(A∣s;θ)]
对于这一计算结果,不同的实现有不同的处理。
3 Actor-critic
演员-评论家算法 (Actor-Critic) 可以理解为将 value-based 和 policy-based 两种方法进行了结合,其有两个神经网络 :
- 一个是策略网络 π(a∣s;θ),称为演员 (actor),类似于策略函数 π(a∣s)。
- 价值网络 q(s,a;w) 近似动作值函数 Qπ(a,s)。
这样,状态价值函数 Vπ(s) 近似为 :
V(s;w,θ)=EA∼π(⋅∣s;θ)[q(s,A;w)]=a∈A∑π(a∣s;θ)⋅q(s,a;w)
其对应的策略梯度为
∂θ∂V(s;w,θ)=EA∼π(⋅∣s,θ)[q(s,A;w)⋅∂θ∂logπ(A∣s;θ)]
策略网络将使用 (随机) 策略梯度上升来更新。价值网络可以通过时序差分方法 (temporal different, TD) 学习进行更新。下面总结了该算法的一次迭代 :
- 观察状态 st,然后随机抽样动作 at∼π(⋅∣st;θt)。
- 主体执行动作 at,并观察奖励 rt 和新状态 st+1。
- 随机抽样动作 at+1∼π(⋅∣st+1;θt)。(主体并不执行动作 at+1)
- 使用价值网络进行评估,得到 qt=q(st,at;wt) 和 qt+1=q(st+1,at+1;wt)。
- 计算时序差分损失值 : δt=qt−(rt+γ⋅qt+1)。
- 更新价值网络 : wt+1⟵wt−α⋅δt⋅∂w∂Q(st,at;w)∣∣w=wt。
- 更新策略网络 : θt+1⟵θt+β⋅qt⋅∂θ∂logπ(at∣st;θ)∣∣θ=θt
3.1 Deterministic Policy Gradient
DPG 是一种确定性的策略梯度算法 (policy gradient)。策略梯度算法的基本思想是 : 用一个参数化的概率分布 πθ(a∣s)=P[a∣s;θ] 来表示策略,并且由于策略是一个概率分布,则其所采取的行动 a 就是随机选取的,也就是所谓的随机策略梯度算法 (Stochastic Policy Gradient)。
而 DPG 则摒弃了用概率分布表示策略的方法,转而用一个确定性的函数 a=μθ(s) 表示策略。也就是说,给定当前的状态 s,选取的行动 a 就是确定的。而这样将随机转化为固定的方式也有着其对应的优缺点 :
- 优点 : 从理论上可以证明,确定性策略的梯度就是 Q 函数梯度的期望,这使得确定性方法在计算上比随机性方法更高效。
- 缺点 : 对于固定的状态只有固定的行动,和之前博客中所提到的类似于 ϵ− 贪婪策略的原因 : 如果一直使用确定性策略,可能会导致某些状态动作对 (s,a) 在序列中永远不会出现,从而无法估计其动作价值,也无法保证提升后的策略比原策略更好。
为了一定程度解决对应的缺点,DPG 采用了离线策略的方法。即采样的策略和待优化的策略是不同的 : 其中采样的策略是随机的,而待优化的策略是确定的。采样策略的随机性保证了状态对 (s,a) 的遍历性。
而关键结论则沿用参考资料中的总结 :
∇θμJ≈Est∼ρβ[∇θμQ(s,a∣θQ)∣s=st,a=μ(st∣θμ)]=Est∼ρβ[∇aQ(s,a∣θQ)∣s=st,a=μ(st)∇θμμ(s∣θμ)∣s=st]
其中各个符号的含义为 :
- s 和 a 分别是状态和动作。
- Q 为 Q 函数,即动作价值 (action value) 函数, θQ 为其参数。
- J 表示的是初始状态分布下的期望回报,也就是给定初始状态的概率分布,期望能够获得的总回报 (可能要考虑折扣因子 γ ),我们的目标就是使得 J 越大越好。
- st 表示在 t 时刻的状态,而 ρβ 则表示在随机采样策略 β 之下,每个状态被访问的概率分布;
- μ 表示待优化的确定性算法,θμ 是它的参数。
下面给出公式的更直观的认知 :
-
公式中的第一行可以理解为 : 期望回报对待优化的策略 μ 的梯度 (∇θμJ),可以近似为在随机采样策略 β 的状态访问的概率分布下 (st∼ρβ) , Q 函数对 μ 的梯度 (∇θμQ(s,a∣θQ)∣∣s=st,a=μ(st∣θμ)) 的期望 (E)。
-
然后对 ∇θμQ(s,a∣θQ)∣∣s=st,a=μ(st∣θμ) 使用链式法则,即 Q 函数对 μ 的梯度,等于 Q 函数对行动 a 的梯度乘以行动 a 对 μ 的梯度,就得到了上述公式的第二行。
-
∇θμJ 就是DPG的策略梯度,用这个策略梯度做梯度上升算法,即可优化策略 μ ,使得期望回报最大化。
3.2 Deep Deterministic Policy Gradient
DDPG 是基于 DPG (Deterministic Policy Gradient) 实现的深度强化学习算法。
3.2.1 from DPG to DDPG
回顾 DQN 的损失函数 :
ℓ=2N1i=1∑N[Qω(si,ai)−(ri+γa′maxQω(si′,a′))]2
有一个求最大值的行动的操作。如果行动域非常大,甚至是连续的 (之前举例的非离散情况),那么这个求最大的操作是不可能完成的。即使是将连续的空间离散化,也会导致非常低的算法效率。而 DPG 的策略梯度则没有上述的寻找最大化的操作,回顾如下 :
∇θμJ≈Est∼ρβ[∇θμQ(s,a∣θQ)∣s=st,a=μ(st∣θμ)]=Est∼ρβ[∇aQ(s,a∣θQ)∣s=st,a=μ(st)∇θμμ(s∣θμ)∣s=st]
而 DDPG 所做的事情,就是将 DQN 中的神经网络用于拟合 Q 函数的两个子方法用到了 DPG 中,即将 DPG 中的 Q 函数也变成了一个神经网络。下面给出 DDPG 的完整算法 :
Algorithm : DDPG algorithm
- Initialize critic network Q(s,a∣θQ) and actor μ(s∣θμ) with weights θQ and θμ.
- Initialize target network Q′ and μ′ with weights θQ′←θQ,θμ′←θμ.
- Initialize replay buffer R
- for episode =1,M do
- Initialize a random process N for action exploration.
- Receive initial observation state s1.
- for t=1,T do
- Select action at=μ(st∣θμ)+Nt according to the current policy and exploration noise
- Execute action at and observe reward rt and observe new state st+1
- Store transition (st,at,rt,st+1) in R
- Sample a random minibatch of N transitions (si,ai,ri,si+1) from R
- Set yi=ri+γQ′(si+1,μ′(si+1∣θμ′)∣θQ′)
- Update critic by minimizing the loss: L=N1∑i(yi−Q(si,ai∣θQ))2
- Update the actor policy using the sampled policy gradient :
∇θμJ≈N1i∑∇aQ(s,a∣θQ)∣∣s=si,a=μ(si)∇θμμ(s∣θμ)∣∣si
- Update the target networks :
θQ′θμ′←τθQ+(1−τ)θQ′←τθμ+(1−τ)θμ′
- end for
- end for
此外,DDPG 还有一个另外的优点,就是可以直接从原生数据 (例如 Atari 游戏的图片中) 学习,也就是所谓的端到端。
3.3 Soft Actor-Critic
SAC (Soft Actor-Critic) 是基于最大熵 (maximum entropy) 这一思想发展的强化学习算法,其采用与 PPO 类似的随机分布式策略函数 (Stochastic Policy),并且是一个采用离线策略,actor-critic 架构的算法,与其他强化学习算法最为不同的地方在于,SAC在优化策略以获取更高累计收益的同时,也会最大化策略的熵。
将熵引入强化学习算法的好处为,可以让策略尽可能随机,主体可以更充分地探索状态空间,避免策略早早地落入局部最优点,并且可以探索到多个可行方案来完成指定任务,提高抗干扰能力。(怎么看着这么像神经网络里面的熵正则项呢?)
- 熵的计算 : 熵是用于衡量随机变量的随机性,实际计算时直接考虑其服从的随机分布。现在要计算变量 x 的熵值,而 x 服从分布 P,则 x 的熵 H(P) 为 :
H(P)=x∼PE[−logP(x)]
- 标准强化学习算法的目标,是找到能收集最多累计收益的策略,表达式为 :
πstd∗=argπmaxt∑E(st,at)∼ρπ[r(st,at)]
- 引入了熵最大化的强化学习算法的目标策略 (其实就是用了下拉格朗日乘子法,信息熵越大越均匀,因此是加而不是乘负数再加):
πMaxEnt ∗=argπmaxt∑E(st,at)∼ρπ[r(st,at)+αH(π(⋅∣st))]
因此,其与正常的 Actor-Critic 算法对应的 Q 和 V 函数也有所区别,是 soft Q 函数和 soft V 函数 :
Qsoftπ(s,a)Vsoftπ(s)=a′∼πs′∼p(s′∣s,a)E[r(s,a)+γ(Qsoftπ(s′,a′)+αH(π(⋅∣s′)))]=s′∼p(s′∣s,a)E[r(s,a)+γVsoftπ(s′)]=a∼πE[Qsoftπ(s,a)−αlog π(a∣s)]
- 基于能量的策略模型 (Energy Based Policy, EBP) : 回顾熵最大化的强化学习算法的目标策略 (Max Entropy Reinforcement Learning, MERL) :
πMaxEnt ∗=argπmaxt∑E(st,at)∼ρπ[r(st,at)+αH(π(⋅∣st))]
为了适应更复杂的任务,MERL 中的策略不再是以往的高斯分布形式,而是用基于能量的模型 (energy-based model) 来表示策略 :
π(at∣st)∝exp(−E(st,at))
其中 E 为能量函数,可以用神经网络进行拟合。MERL中,为了让基于能量的策略 (energy-based policy, EBP) 与值函数联系起来,设定 :
E(st,at)=−α1Qsoft(st,at)
于是可以得到 π(at∣st)∝exp(α1Qsoft(st,at))
- SAC (Soft Actor-Critic) 中的理想策略依然是上面的 EBP 形式,不过由于 EBP 无法采样的问题依然存在,所以只能用一个高斯分布 π 来代替 EBP 与环境交互,随后在策略优化时,让这个高斯分布 π 尽可能向 EBP 靠近。π 与 EBP 的距离用 KL-三度来衡量。策略优化公式为 (即目标为让 π 更接近 EBP) :
πnew=argπ∈ΠminDKL⎝⎛π(⋅∣st)∥Zsoftπold(st)exp(α1Qsoftπold(st,⋅))⎠⎞
- 根据 Qsoftπ(s,a) 可以得到 Q 函数训练时的损失函数为 :
JQ(θ)=at+1∼πϕ(st,at,st+1)∼DE[21(Qθ(st,at)−(r(st,at)+γ(Qθ(st+1,at+1)−αlog(πϕ(at+1∣st+1)))))2]
与之前一致的是,(st,at) 是主体从环境中交互产生的数据,at+1 则是根据策略 πϕ 选出来的,可以得到训练 πϕ 时的损失函数为 :
Jπ(ϕ)=DKL(πϕ(⋅∣st)∥exp(α1Qθ(st,⋅)−logZ(st)))=Est∼D,at∼πϕ[log(exp(α1Qθ(st,at)−logZ(st))πϕ(at∣st))]=Est∼D,at∼πϕ[logπϕ(at∣st)−α1Qθ(st,at)+logZ(st)]
这里不一样的时 st 仍是主体从环境中交互产生的数据,at 则是从当前策略 πϕ 中采样得到的。所以有 :
at=fϕ(εt;st)=fϕμ(st)+εt⊙fϕσ(st)
\同时,由于在对策略的参数求导时,Z 不受策略参数 ϕ 影响,所以直接将其忽略,即可得到 :
Jπ(ϕ)=Est∼D,ε∼N[αlogπϕ(fϕ(εt;st)∣st)−Qθ(st,fϕ(εt;st))]
为什么没有了 V 函数 ? 在初版的 SAC 中,作者表示同时维持两个值函数可以使训练更加稳定,不过在第二版中,作者引入了自动调整温度系数 α 的方法,使得 SAC 更加稳定,于是就只保留了 Q 函数。
参考资料 (References)