数学推导、伪代码及 pytorch 实现(更新中)
# 资源推荐
# 相关定义与定理
# 术语
按照个人理解陈述,有误请斧正
- 强化学习 Reinforcement learning: 与监督学习、非监督学习并列,是智能体 (Agent) 以 “试错” 的方式进行学习,通过与环境 (Environment) 进行交互获得的奖赏 (Reward) 指导行为,以使智能体获得最大奖赏的学习方式。
- 环境 Environment: 向智能体提供状态 (State) 及奖励 (Reward),并根据智能体的动作 (Action) 改变自身状态的对象。内含智能体无法准确获知的状态转移函数。
- 智能体 Agent: 与环境交互的对象,训练的主体。
- 状态 State: 环境提供的,智能体观测到的数据。可以是一幅图像、或者几个关键传感器获取的数值列表,如位置、速度等。智能体通过观测状态给出动作,环境通过当前状态及智能体的动作提供下一个状态。分为离散及连续两种类型,且根据状态的类型不同需要使用不同的智能体训练算法。
- 策略 Policy: 智能体内部的,状态到动作的概率映射函数。智能体观测到状态后,通过策略执行动作。
- 动作 Action: 智能体提供的,与环境交互的数据。分为连续和离散两类。若使用神经网络训练智能体,则两类动作所需的网络有所不同。
- 奖励、回报 Reward: 环境根据当前状态及智能体提供的动作,给智能体提供的数据,通常为标量。智能体学习主要参考值。
- 总奖励、总回报 Return: 标志当前状态下执行当前动作所能获得奖励的期望,与策略及状态转移函数均有关。通常训练智能体时需要使用蒙特卡罗方法估计此数据。
- 回合 episode: 一个回合从环境产生初始状态s0 开始,智能体根据st 做出动作at,环境再根据动作产生奖励rt 与下一步的状态st+1,智能体再根据新的状态做出动作at+1,直到环境产生结束信号标志回合结束。
- 轨迹 trajectory: 一个回合内的所有{st,at,rt∣t∈[0,T]} 三元组构成一个轨迹。
- On-Policy 与 Off-Policy: On-Policy 指与环境交互时使用的策略与内部训练的策略相同的训练方式,Off-Policy 指二者不同的训练方式。On-Policy 通常实现及理解更简单,但无法同时兼顾探索新策略与利用原有策略,会导致训练落入局部最优陷阱。而 Off-Policy 的实现可在保持探索的同时,更有可能求得全局最优值。
# 符号及函数
- st: t 时刻环境所产生的状态。
- at: t 时刻智能体根据环境状态st 执行的动作。
- rt: t 时刻环境根据智能体执行的动作at 反馈的奖励。
- ut=∑τ=tTγτ−trτ: 折扣回报,智能体从 t 时刻开始到回合结束可以获得的奖励总和。
- γ: 折扣回报率,用于减弱后续奖励对更新当前动作的影响。
- π(at∣st): 策略函数,表示 t 时刻智能体观测到st 时执行动作at 的概率。
- p(st+1∣st,at): 转移概率函数,表示当前状态为st,执行动作at 时,下一个状态为st+1 的概率。
- ρ0(s0): 初始状态概率函数,表示初始状态为s0 的概率。
- Qπ(st,at)=Est,at[ut]: 策略价值函数,表示当前策略下,在 t 时刻观测到状态st 并执行动作at 所能获取的折扣回报的期望,用于评判状态qt 下动作at 的好坏。
- Q⋆(st,at)=argmaxπ[Qπ(st,at)]: 最优策略价值函数,表示在最优的策略下,在 t 时刻观测到状态st 并执行动作at 所能获取的折扣回报的期望,用于消除策略影响后,评判状态qt 下动作at 的好坏。
- Vπ(st)=Eat∼π[Qπ(st,at)]: 状态价值函数,用于评判当前策略下状态st 的好坏。
- V⋆(st)=argmaxπ[Vπ(st)]: 最优策略状态价值函数,用于评判最优策略下状态st 的好坏。
- Aπ(st,at)=Qπ(st,at)−Vπ(st): 优势函数,衡量当前策略下动作at 相对于其他动作的优劣
- A⋆(st,at)=Q⋆(st,at)−V⋆(st): 最优策略优势函数
上述符号中,st,rt 均是环境提供,p(st+1∣st,at) 为环境内部参数,智能体无法获取其信息。
强化学习根据学习函数为Qπ(st,at) 或者π(at∣st) 可分为基于价值的学习与基于策略的学习两类。
# 相关定理
# 时序差分 (Temporal-Difference)
// TODO: 证明:蒙特卡洛
定义
TD(n)=γnQ(st+n,at+n;ω)+i=t∑t+n−1γi−tri
对于ut 的估计,TD(1)=rt+γQ(st+1,at+1;ω) 比Q(st,at;ω) 更好;当n>m 时,TD(n) 比TD(m) 更好。
但单步 TD target 实现最为简单,故实际应用中需要取舍。
# 基于价值的学习 (Value-based learning)
# 学习算法
# Sarsa
核心公式为
Q(st,at)←Q(st,at)+α⋅δ^t
其中
u^t(TD target)δ^t(TD error)=rt+γQ(st+1,at+1)=u^t−Q(st,at)
动作函数π(at∣st)=argmaxat(Q(st,at))
On-Policy 算法,使用离散的数组储存 Q 值,并用 TD 估测 Return。
适用于离散状态、离散动作模型的价值学习。单步采集的数据有{st,at,rt,st+1,at+1},这也是其名称的由来。
# Q-learning
核心公式为
Q(st,at)←Q(st,at)+α⋅δ^t
其中
u^t(TD target)δ^t(TD error)=rt+γamaxQ(st+1,a)=u^t−Q(st,at)
Off-Policy 算法,SARSA 的变体。单步采集的数据有{st,at,rt,st+1}。
# DQN
使用神经网络替代Q 函数的 Q-learning 算法。
对于网络Qπ(st,at;ω),损失函数为
LDQN(ω)=δ^t
其中
u^t(TD target)δ^t(TD error)=rt+γamaxQ(st+1,a)=u^t−Q(st,at)
该网络及下文所述所有网络,更新方式均为:
ω←ω−α⋅∂ω∂L(ω)
DQN 使用神经网络Qπ(st,at;ω) 拟合函数Qπ(st,at),解决了连续状态下强化学习的问题。
# 基于策略的学习 (Policy-based learning)
# 基础理论推导
基于策略的学习中,需要训练的函数为π(at∣st;θ)。其结构与 DQN 类似,但输出需要增加一层 softmax,保证各个策略的概率和为 1。
Softmax 函数的定义:Softmax(xi)=exi÷∑jexj
为了使策略在调整时变好,需要使Vπ(st) 接近V⋆(st),所以需要做梯度上升:
θ←θ+α∂θ∂Vπ
关于梯度上升的正确性,可以有个直观理解:根据V⋆(st) 的定义,使用随机初始化的策略函数π 得到的Vπ(st) 一定小于等于V⋆(st),仅需其不断上升即可不断逼近V⋆(st)
根据定义,可以推导出
Vπ(st)=Eat∼π[Qπ(st,at)]=⎩⎨⎧a∑∫aπ(a∣st;θ)Qπ(st,a),π(a∣st;θ)Qπ(st,a)da,(a离散)(a连续)
假设Qπ 不依赖于θ,则a 连续时,有
∂θ∂Vπ(st)=∫aπ(a∣st;θ)π(a∣st;θ)∂θ∂π(a∣st;θ)Qπ(st,a)da=∫aπ(a∣st;θ)∂θ∂lnπ(a∣st;θ)Qπ(st,a)da=Ea∼π[∂θ∂lnπ(a∣st;θ)Qπ(st,a)]
离散时结论相同。故做梯度上升时,仅需求出此期望即可。
为便于后续推导,定义
g(a)=∂θ∂lnπ(a∣st;θ)Qπ(st,a)
则有
∂θ∂Vπ(st)=Ea∼π[g(a)]
以下按时间顺序介绍几个经典的 PG 算法。
# REINFORCE
损失函数为:
π(at∣st;θ): L(θ)=−Vπ(st)=−ut⋅lnπ(at∣st;θ)
参考:https://paperexplained.cn/aplayground/iarticle/detail/0454c3b5-be1a-4aff-a146-9c5adaf76600/
朴素的策略学习算法。
使用蒙特卡罗方法,有
- 由 t 时刻获取的st, at 算得的g(at) 是∂θ∂Vπ(st) 的无偏估计
- 由一个回合求得轨迹计算而得的ut 是Qπ(st,at) 的无偏估计
故有
∂θ∂Vπ(st)=Ea∼π[g(a)]≈∂θ∂lnπ(at∣st;θ)Qπ(st,at)≈∂θ∂lnπ(at∣st;θ)ut
# REINFORCE with Baseline
损失函数为:
π(at∣st;θ):V⋆(st;ω):L(θ)L(ω)=−A^t(st,at)=21δt2
其中:
δt=V⋆(st;ω)−ut=−A^t(st,at)
注: 策略网络更新时使用的是梯度下降,但与 without baseline 的方法比较可见含ut 的一项仍为正号
式中的A^t(st,at) 表示在 t 时刻的优势函数At(st,at) 的无偏估计量。
首先证明引理:对于与π 无关的任意变量b,均有
Ea∼π[b⋅∂θ∂lnπ(a∣st;θ)]=0
证明如下:
Ea∼π[b⋅∂θ∂lnπ(a∣st;θ)]=∫ab⋅∂θ∂lnπ(a∣st;θ)⋅π(a∣st;θ)da=∫ab⋅∂θ∂π(a∣st;θ)da=b⋅∂θ∂∫aπ(a∣st;θ)da=b⋅∂θ∂1=b⋅0=0
证毕。
故可以在求解∂θ∂Vπ(st) 时,人为添加一项b,使其变为如下形式而不影响其正确性:
∂θ∂Vπ(st)=Ea∼π[∂θ∂lnπ(a∣st;θ)Qπ(st,a)]=Ea∼π[∂θ∂lnπ(a∣st;θ)[Qπ(st,a)−b]]
在选取合适的b 时,不但不会影响其正确性,还可以有效减小蒙特卡罗方法引入的方差,降低训练时的波动(TODO: 证明)
b 的选取有多种方式,一种比较好的选取方式为,使用神经网络拟合优势函数:b=V⋆(st;ω),并使用训练 DQN 的方法训练此网络。本节核心公式中即使用了此方法。带入上式,则有:
∂θ∂Vπ(st)=Ea∼π[∂θ∂lnπ(a∣st;θ)[Qπ(st,a)−V⋆(st;ω)]]
由于梯度上升最终结果为 $V_\pi=V^\star $, $Q_\pi=Q^\star $ ,故部分论文中未严格区分最优策略函数与当前策略下的函数,统一用V 和Q 分别代替两者,故上式改写为
∂θ∂Vπ(st)=Ea∼π[∂θ∂lnπ(a∣st;θ)[Aπ(st,a)]]
带入 REINFORCE 一节的推导,则有:
∂θ∂Vπ(st)≈∂θ∂lnπ(at∣st;θ)[Qπ(st,at)−Vπ(st)]≈∂θ∂lnπ(at∣st;θ)[ut−Vπ(st)]
# Advantage Actor-Critic(A2C)
损失函数为:
π(at∣st;θ):V⋆(st;ω):LA2C(θ)LA2C(ω)=−A^t(st,at)=δt⋅V⋆(st;ω)
其中:
δt=−A^t(st,at)=⎩⎨⎧V⋆(st;ω)−(rt+γ⋅V⋆(st+1;ω)),V⋆(st;ω)−[(i=t∑t+n−1γi−tri)+γn⋅V⋆(st+n;ω)],(TD(1))(TD(n))=V⋆(st;ω)−R−γdiscount∗V⋆(snext;ω)
使用 TD target 代替上一节公式中的ut 即为 A2C:
# 优化方法
# 训练时优化方法
通过在训练时增设环节以达到比简单训练方式收敛速度更快、或实现更容易的优化方法。大部分方法都可混合使用。
# 经验回放 Replay buffer
Off-Policy 使用的优化方式。由于 Off-Policy 的数据生成与训练使用的不同的 agent,
咕
# Target network
缓解 DQN 的高估问题
咕
# Multi-step TD target
在使用 TD target 的算法中,将TD(1) 更换为TD(n),以更多地使用与环境交互获得的奖励,降低更新时网络本身的权重。由此可使算法更快地收敛。
# Double DQN
另一种方式缓解高估问题。
咕
# Target network
进一步缓解高估问题。
咕
# TRPO
参考:arXiv:1502.05477
Off-Policy。
使用 Target network 改进 REINFORCE。
原理较为复杂,并且 lr 难以选取。
下一节的 PPO 是其简化版本。
# PPO
参考:arXiv:1707.06347
使用不同的网络进行数据生成和训练,并定时将训练网络的参数同步至数据生成网络。
文章中提出了两种损失函数的设计方式,均已列在下方。
训练伪代码如下:
损失函数为:
orLtCLIP(θ)LKLPEN(θ)=Ea∼π[min(rt(θ)A^t,clip(rt(θ),1−ϵ,1+ϵ)A^t)]=Ea∼π[rt(θ)A^t−βKL[πθold(⋅∣st),πθ(⋅∣st)]]
式中有概率比函数rt(θ)、裁剪函数clip(x,B,C) 以及 KL 散度KL(p(x),q(x)):
rt(θ)clip(x,B,C) (B<C)KL(p(x),q(x))=πθ(at∣st)πθold(at∣st),=⎩⎨⎧B,x,C,x<BB<x<Cx>C=⎩⎨⎧∫xp(x)lnq(x)p(x)dxx∑p(x)lnq(x)p(x)for continuous xfor discrete x
以及超参数ϵ、β。
若使用LKLPEN(θ) 作为参数,则需引入额外超参数dtarg,并在进行梯度下降时按如下规则更新β:
- 计算 d=Ea∼π[KL[πθold(⋅∣st),πθ(⋅∣st)]]
- 做如下判断:
- 如果d<dtarg/1.5, β←β/2
- 如果d>dtarg×1.5, β←β×2
根据原文所述,1.5 和 2 是启发性地选取的,但算法对它们并不敏感。β 的初始值虽然也需要设置,但其并不重要,因为在更新时β 的值会迅速调整。
# 结构优化方法
# Dueling Network
适用于 DQN 的强化学习。
为方便叙述,定义动作总数为n。
使用优势函数,将 DQN 的输出层的n 维向量Y 调整为n+1 维(新增一个代表V(st) 的数据),并额外增设一层Y→X,满足如下规则:
X=Y[n−1]+Y[0:n−1]−mean(Y[0:n−1])X=Y[n−1]+Y[0:n−1]−max(Y[0:n−1])or
虽然按照理论推导,使用max 函数才具有实际意义,但实践中使用mean 得到的效果更好。
理论推导如下:
咕。