Skip to content

Dynamic programming, 动态规划

以下属于 Model-based 算法,其中 Model 指某个状态下执行某个行为后,获得的奖励概率 p(r|s,a) 和转移到其他状态的概率 p(s|s,a),Model-based 说明是在已知这些信息的条件下求解。

Value iteration

vk+1=maxπ(rπ+γPπvk),k=0,1,2

WARNING

这里的 v 并不表示价值,而只是一个普通的向量或数值。因为迭代算法的目的是求解贝尔曼最优公式,即找到一个最优的策略和其对应的价值,所以在迭代收敛前 v 都不能赋予价值的含义。

  1. 初始化 v0 向量,其表示每个状态的值
  2. 计算 vk 对应的最优策略 πk+1
    对于每个状态 s
    1. 计算每个行为的值 qk(s,a)
    2. 选取 qk 最大的行为 a(s)
    3. 得到该状态下的最优策略 πk+1(s)={1a=a(s)0aa(s)
  3. 通过 vkπk+1 计算新值 vk+1。因为使用贪婪策略,所以新值等于各状态下最大的 qk
  4. 如果 |vkvk1| 低于设定阈值, 则表示收敛

Policy iteration

  1. 初始化策略 π0
  2. Policy evaluation, PE
    已知策略 πk,代入贝尔曼方程,求解价值向量 vπk
    • 矩阵求解: vπk=(IγPπk)1rπk (计算开销大)
    • 迭代求解: 先假定一个 vπkj, 再通过贝尔曼方程算出 vπkj+1, 如此迭代直至收敛
  3. Policy improvement, PI
    计算 vπk 对应的最优策略 πk+1,同值迭代

Truncated policy iteration

对比 2 种迭代算法:

值迭代: v0π1v1π2

策略迭代: π0vπ0π1vπ1

其中 vπ 的步骤是一样的,关键区别在于 πv 的步骤。 其中值迭代只进行一次计算: vk,πk+1vk+1, 而策略迭代进行多次计算: vπkj,πkvπkj+1

所以我们可以把 πv 变成更一般化的形式,即用参数 j 表示在求 v 过程中的迭代次数。当 j=1 就是值迭代,当 j= 就是策略迭代。

这个算法和策略迭代几乎一样,除了在 πv 步骤中的迭代终止条件由是否收敛变成了是否达到迭代次数 j

Monte Carlo, 蒙特卡洛

本节及其后均属于 Model-free 算法,即在不知道 Model 的情况下进行求解。

MC Basic

Model-free 的主要思想是把策略迭代中关于 Model 的部分移除。 在 vπ 步骤中,原本需要通过 Model 计算 qk,现在直接用 N 次采样得到的数据估计 qk:

qk(s,a)1Ni=1Ngki(s,a)

采样表示让智能体与环境进行一次交互。在状态 s 采用行为 a 后,每次到达一个新状态都随机选择一个行为,形成一条长度为 j 的路径 sas1a1aj1sj,则第 i 次交互得到路径对应的奖励总和为:

gki(s,a)=r(s,a)+γr(s1,a1)++γj1r(sj1,aj1)

每次交互可以看作一次探索,而 j 表示探索步数。探索步数需要足够长,才能保证可以从每个初始状态到达目标状态,否则有些初始状态将无法达到目标状态。

Exploring Starts

考虑从 s1,a1 开始交互得到的某条路径: s1a1s2a2s3a3,这条路径同时也包含了从 s2,a2 开始的路径:s2a2s3a3,同时也包含了从 s3,a3 开始的路径:s3a3,以此类推。 这意味着,仅计算这一条路径就可以同时估计 q(s1,a1),q(s2,a2),q(s3,a3),。对于每条路径,有两种使用方法:

  • first-visit: 仅在第一次遇到 si,ai 时估计
  • every-visit: 每次遇到相同的 si,ai 时估计

在每次迭代中,对 qk 的估计也分为两类方法:

  • 对于每个 si,ai,多次采样取均值,见 MC Basic
  • 对于每个 si,ai,只采样一次,但控制探索步数

由于使用贪婪策略,使得每次 πv 步骤只会选取一个行为,则无法保证每次交互能够达到所有 s,a,所以这种算法需要满足 exploring starts 条件,即对每个 s,a 从头开始探索。

epsilon-Greedy

为了突破 exploring starts 条件,可以采用 ε-贪婪策略:

π(a|s)={1ε|A(s)|(|A(s)|1)a=aε|A(s)|aa

其中 ε[0,1], |A(s)| 表示状态 s 下的行为数量,通过这种方法平衡了探索(exploration)和利用(exploitation)。当 ε=0 时,变成贪婪策略,表示对数据的充分利用;当 ε=1 时,变成随机策略,表示不依赖数据的完全探索。

这样可以保证在一次交互中,只要探索步数足够长,智能体就可以达到所有的 s,a

INFO

这里实际上将求解贝尔曼最优公式的目的从“从所有可能的策略中找到最优策略”变成“从所有可能的 ε-贪婪策略中找到最优策略”,即找到最优 ε。这样牺牲了求解出策略的最优性,最优策略应该是贪婪策略,所以可以在迭代过程中使 ε0

Temporal-Difference, TD, 时序差分

所有 TD 算法都可以看作使用 随机近似 算法求解贝尔曼方程或贝尔曼最优方程,它们的更新公式都可以表示为:

vt+1=vtαt[vtv¯t]

其中 vt 表示在时间步 t 下的状态价值或行为价值,v¯t 是 TD 目标,vtv¯t 是 TD 误差。不同算法的区别在于 TD 目标不同。

通过不断迭代更新,vt 将逐渐逼近 TD 目标vt+1=vtαt[vtv¯t]vt+1v¯t=vtv¯tαt[vtv¯t]vt+1v¯t=[1αt][vtv¯t]0<vt+1v¯tvtv¯t=1αt<1

可以发现,随着时间步 t 的增大,vtv¯t 的距离逐渐缩小。

TD, 估计状态价值

该算法用于求解在给定策略 π 下的 vπ。由于不知道 Model 信息,所以考虑贝尔曼期望方程:

vπ(s)=E[R+γvπ(S)|S=s],sS

使用 RM 算法逼近 vπ

g(v(s))=v(s)vπ(s)g~(v(s))=g(v(s))+η=v(s)vπ(s)+vπ(s)[r+γvπ(s)]=v(s)[r+γvπ(s)]vk+1(s)=vk(s)αk[vk(s)[r+γvπ(s)]],k=1,2,3,

从公式中可看出,要想对价值估计值 v 进行一次更新,至少需要 3 个信息:

  • 当前状态 s
  • 及时奖励 r
  • 下一个状态 s

于是通过采样得到 (s0,r1,s1,,st,rt+1,st+1,),这些数据以 (st,rt+1,st+1) 为一组,每组仅能用于更新该组初始状态的价值估计:

vt+1(st)=vt(st)αt(st)[vt(st)[rt+1+γvt(st+1)]]

由于 vπ 未知,所以这里使用 vt 估计 vπ

Sarsa, 估计行为价值

该算法用于求解在给定策略 π 下的 qπ,将贝尔曼期望方程改写成 qπ 形式:

qπ(s,a)=E[R+γqπ(S,A)|S=s,A=a],sS,aA(s)

TD 一样,使用 RM 算法逼近 qπ。要想进行一次价值估计的更新,则需要 (st,at,rt+1,st+1,at+1)

qt+1(st,at)=qt(st,at)αt(st,at)[qt(st,at)[rt+1+γqt(st+1,at+1)]]

这种算法在 πv 步骤中只进行一次 q(s,a) 更新,接着在 vπ 步骤使用 ε-greedy

Expected Sarsa

该算法对应的贝尔曼期望方程为:

qπ(s,a)=E[R+γvπ(S)|S=s,A=a],sS,aA(s)=E[R+γE[qπ(S,A)]|S=s,A=a]

更新需要 (st,at,rt+1,st+1)。由于 vπ 未知,所以使用 q 估计 vπ

qt+1(st,at)=qt(st,at)αt(st,at)[qt(st,at)[rt+1+γvt(st+1)]]vt(st+1)=aπt(a|st+1)qt(st+1,a)

n-step Sarsa

该算法对应的贝尔曼期望方程为:

qπ(s,a)=E[G|S=s,A=a],sS,aA(s)

其中 G 表示从 s,a 开始的累积奖励:

Gt(n)=Rt+1+γRt+2++γnqπ(St+n,At+n)

其中 n 表示表达式的展开步数,无论 n 取值多少,这些表达式都等价。对应的迭代更新公式为:

qt+1(st,at)=qt(st,at)αt(st,at)[qt(st,at)gt(n)]gt(n)=rt+1+γrt+2++γnqπ(st+n,at+n)

由公式可知,当 n=1 时,得到 Sarsa;当 n=αt=1 时,得到 Monte Carlo

INFO

这里的 n 表示更新价值估计所需的步数。n=1 说明在每次采样中,智能体每走一步就更新一次价值估计和策略,这形成了增量更新。

Q-learning, 估计最优行为价值

该算法并不求解给定策略 π 对应的 vπqπ,而是直接求解最优的 q,表示为贝尔曼最优方程的 q 形式:

q(s,a)=E[R+γmaxaq(S,a)|S=s],sS,aA(s)

更新公式为:

qt+1(st,at)=qt(st,at)αt(st,at)[qt(st,at)[rt+1+γmaxaqt(st+1,a)]]

INFO

RL 中有两种策略:

  • behavior policy:用于从环境中采样数据
  • target policy:被迭代优化的策略

由此分为两大类学习算法:

  • on-policy:behavior policy 与 target policy 相同
    即在每一次迭代中,用优化后的策略进行下一次采样。
  • off-policy:behavior policy 与 target policy 不同
    即用 behavior policy 采样的数据训练 target policy。

Q-learning 可以分为 on-policy 和 off-policy 两种版本。 由于 on-policy 版需要用 target policy 采样数据,要想保证探索性的话,就需要让 target policy 为 ε-greedy。 而 off-policy 版不需要用 target policy 采样数据,所以可以直接使用 greedy。

Value Function Approximation, VFA, 价值函数近似

基于表格的 TD 中,vq 都是离散的,即可以用一个表格来装满所有可能的 vq 值。但对于复杂的现实世界,状态空间或行为空间很可能是无限的,这时候需要使用函数近似来表示 vq。这个函数可以是一个线性的多项式,也可以是非线性的神经网络。

VFA 基本思路

给定一个策略 π,要找到函数 v^(s,w) 使其最接近真值 vπ(s)。也就是找到一个 w 使目标函数 J(w) 达到最小值:

J(w)=E[[v^(S,w)vπ(S)]2]=sSdπ(s)[v^(s,w)vπ(s)]2

由于 J(w) 是一个期望值,即一个无限采样求均值的过程,所以我们需要知道状态 S 的概率分布,也就是在每次采样时出现状态 s 的概率 dπ(s)。由于状态转移的马尔可夫性质,最终的状态概率分布是一种稳态分布,它表示当智能体执行了无数次行为后到达各状态的频率分布:

dπ(s)=limNnπ(s)NPπTdπ=dπ

其中 Pπ 是贝尔曼方程中的状态转移矩阵,dπ 是表示状态概率分布的列向量。

要找到 J(w) 最小值对应的 w,通常使用 梯度下降

wk+1=wkαkwJ(wk)wJ(w)=wE[[v^(S,w)vπ(S)]2]=2E[[v^(S,w)vπ(S)]wv^(S,w)]

由于 J(w) 的梯度是一个期望值,通常使用一次采样估计真实梯度,即 SGD。这里的常数项 2 被并入 αk

wk+1=wkαk[v^(s,w)vπ(s)]wv^(s,w)

这个更新公式中的 vπ 也是未知的,于是进行估计:

  • MC 使用奖励总和 gt 估计
  • TD 使用 TD target 估计

INFO

Sarsa 为例。 不同与传统算法的更新 q(s,a),基于函数近似的算法是更新行为价值函数 q^(s,a,w) 的参数 w,然后再用新参数计算行为价值:

wt+1=wtαt[q^(st,at,wt)[rt+1+γq^(st+1,at+1,wt)]]wq^(st,at,wt)q(st,at)=q^(st,at,wt+1)

Deep Q-learning, DQN

即 Deep Q-network

Q-learning 一样,该算法对最优策略下的行为价值进行估计:

qπ(s,a)=r+γmaxaA(s)q^(s,a,w)

则目标函数或损失函数为:

J(w)=[q^(s,a,w)[r+γmaxaA(s)q^(s,a,wT)]]2

其中包含两个相同的神经网络:main networktarget network,每次迭代都会更新主网络参数 w,迭代一定次数后再将 w 赋给目标网络参数 wT。之所以分成两个网络,是因为计算目标网络参数的梯度过于复杂,于是采取延迟更新的方法。

参考 off-policy 版本的伪代码:

  1. 根据给定策略 π 进行采样,得到以 (s,a,r,s) 为元素的集合 B,其称为 replay buffer
  2. 对目标网络进行迭代训练,每次迭代进行 MBGD
    1. B 中随机均匀地进行一些采样得到小批量样本集,对于每个样本 (s,a,r,s)
      1. 使用目标网络计算 yT=r+γmaxaA(s)q^(s,a,wT)
      2. 使用 (s,yT) 更新主网络参数 w,以最小化损失值 [yTq^(s,a,w)]2
  3. 每迭代 C 次后,更新目标网络权重 wT=w

INFO

基本思路 中提到 J(w) 的理论值是一个包含了状态概率分布信息的期望值,而这里却使用随机均匀抽样从 B 中获取样本集。这是因为我们并不知道最优策略及其对应的状态概率分布,所以需要确保每个状态被探索的概率均等。

另一方面,因为 B 是在给定策略下的采样数据,所以满足该策略下的状态概率分布,而不一定是均匀分布。所以需要打乱样本,以破坏样本间关系。

Policy Gradient, PG, 策略梯度

即 Policy Function Approximation,策略函数近似

VFA 一样,我们也可以用函数表示策略 π(a|s,θ),其中 θ 是策略函数的参数。为了找到最优策略,需要构建一个 metric 函数 J(θ),函数值越大则策略越好。所以问题变成了找一个参数 θ 使 J(θ) 达到最大值,这通常使用梯度上升解决。

Metric

VFA 基本思路 中提到每个策略 π 都对应一个状态概率分布 dπ,一个好的策略应该能够更多地访问高价值的状态,于是用状态价值的加权平均衡量策略的优劣:

v¯π=sSd(s)vπ(s)=dTvπv¯π=E[t=0γtRt+1]

其中 d 表示状态概率向量,是可设置的。通常我们将 d=dπ,表示寻找从任意初始状态出发都能找到最优路径的策略;如果 d=[100]T,则表示只寻找从 s1 出发的最优策略。

也可以使用奖励的加权平均作为优劣指标,它也表示从任意状态出发走无数步后获得的平均奖励:

r¯π=sSdπ(s)rπ(s)rπ(s)=aAπ(a|s)r(s,a)r(s,a)=rp(r|s,a)rr¯π=limn1nE[k=1nRt+k]

γ[0,1),这两个指标是等价的:

r¯π=(1γ)v¯π

Metric 梯度

对于 r¯π, v¯π, 和给定状态概率分布 d 情况下的 v¯π0,其梯度大致满足以下关系:

θJ(θ)=sSη(s)aAθπ(a|s,θ)qπ(s,a)=E[θlnπ(A|S,θ)qπ(S,A)],Sη,Aπ(A|S,θ)
该式在不同指标间存在一些差异

h(s,a)=θπ(a|s,θ)qπ(s,a),则:

θr¯π{sdπ(s)ah(s,a)γ(0,1)=sdπ(s)ah(s,a)γ=1θv¯π=11γθr¯πθv¯π0=sρπ(s)ah(s,a)

把梯度写成期望值的形式,就可以使用 SGD 进行优化。对于这个公式,需要保证 π(a|s,θ)>0 才有意义,所以使用 softmax 进行归一化,也就是让 π(a|s,θ) 满足:

π(a|s,θ)=eh(s,a,θ)aAeh(s,a,θ)

其中 h(s,a,θ) 表示 s,a 的特征函数,通常是一个神经网络。

PG 参数更新

为了找到 J(θ) 最大值对应的 θ,使用随机梯度上升:

θt+1=θt+αθJ(θ)=θt+αE[θlnπ(A|S,θ)qπ(S,A)]θt+αθlnπ(at|st,θt)qπ(st,at)θt+αθlnπ(at|st,θt)qt(st,at)

由于 qπ 未知,所以使用 qt 估计:

无论哪种估计方法,都需要先采样,这就涉及到 S,A 的概率分布问题。理论中 Sη,由于环境信息未知,所以实际中难以满足;Aπ(A|S,θ) 说明每次的行为 at 都应该由 π(θt) 进行采样,因此策略梯度算法是 on-policy 的。

对更新公式进一步转化:

θt+1=θt+αθlnπ(at|st,θt)qt(st,at)=θt+αθπ(at|st,θt)π(at|st,θt)qt(st,at)=θt+αβtθπ(at|st,θt),βt=qt(st,at)π(at|st,θt)

这表明更新公式实际上是在更新 π(at|st,θt),其步长为 αβtβt 越大,则 π(at|st,θt+1) 增大,说明策略 π 将在状态 st 时更倾向选 atβt 也体现了探索和利用的平衡,βtqt 表示利用,βt1π(at|st,θt) 表示探索。

REINFORCE

在每次迭代中:

  1. 选择初始状态 s0,使用 π(θk) 进行采样,对于每个样本 (st,at,rt+1)
    1. 计算 qt(st,at) 为折扣奖励总和
    2. 更新 θt
  2. 将最后一次 θt 赋给 θk

Actor-Critic, AC

Actor 表示通过 PG 进行策略更新,Critic 表示用结合 VFATD 进行价值估计。

Q actor-critic, QAC

使用 Sarsa 进行价值估计。在 Critic 阶段进行价值函数参数更新:

wt+1=wtαt[q(st,at,wt)[rt+1+γq(st+1,at+1,wt)]]wq(st,at,wt)

在 Actor 阶段进行策略函数参数更新:

θt+1=θt+αtθlnπ(at|st,θt)qt(st,at,wt+1)

Advantage actor-critic, A2C

向策略函数参数梯度公式中引入偏置量:

θJ(θ)=E[θlnπ(A|S,θ)[qπ(S,A)b(S)]]

b(S) 不影响采样梯度的期望值,但可以影响方差。所以通过控制 b(S) 使方差最小,以减小对梯度的抽样误差。计算理论最优偏置量 b 过于复杂,通常使用估计值:

b(s)=E[||θlnπ(A|s,θt)||2q(s,A)]E[||θlnπ(A|s,θt)||2],sS,Aπ(A|s)E[q(s,A)]=vπ(s)

代入参数更新公式:

θt+1=θt+αtθlnπ(at|st,θt)A(st,at)A(s,a)=qπ(s,a)vπ(s)

其中 A 称为 advantage function 优势函数,vπ 可以看作 qπ 的均值,则 A 表示某个行为的价值比平均行为价值多出的部分,即该行为的优势。再考虑更新公式中的步长 βt,见 PG 参数更新

βt=A(st,at)π(at|st,θt)

其中分子部分表示对数据的充分利用,相比之前的绝对行为价值 qt(st,at),使用相对行为价值 A(st,at) 能更好地评估行为的优劣。

结合 TD 得到具体更新公式,其中 At 也表示 TD 误差:

At=rt+1+γv(st+1,wt)v(st,wt)wt+1=wtαw(At)wv(st,wt)θt+1=θt+αθAtθlnπ(at|st,θt)

off-policy actor-critic

由于 θJ(θ) 是一个满足 Aπ(A|S,θ) 的期望值,即用于采样的策略同时也是需要进行迭代更新的策略,所以使用 on-policy 算法,见 PG 参数更新。如果我们想利用已有策略的经验训练新策略,则需要使用 off-policy 算法。

由于 behavior policy β 与 target policy π 不同,所以其对应的状态概率分布 dβdπ 不同,那么就需要引入新 metric:

J(θ)=E[vπ(S)],SdβθJ(θ)=E[π(A|S,θ)β(A|S)θlnπ(A|S,θ)qπ(S,A)],Sdβ,Aβ

Importance Sampling

对于 off-policy 算法,需要引入 importance sampling,即在更新参数时,使用旧策略的采样结果来估计新策略的期望。

由此得到 θ 更新公式:

θt+1=θt+αθπ(at|st,θt)β(at|st)θlnπ(at|st,θt)At(st,at)=θt+αθAt(st,at)β(at|st)θπ(at|st,θt)

其中步长的分母 β(at|st) 是一个定值,则表示不进行任何探索,也就是使用已有策略 β 的经验进行更新。

Deterministic actor-critic, DPG

之前选择行为的概率都满足 π(a|s)(0,1),但理论最优策略应该是一个确定性策略,即只选择价值最大的行为。只考虑确定性策略时,a 可以表示成一个连续值,用 SA 的映射表示策略:

a=μ(s,θ)

μ 函数简写为 μ(s),通常是一个神经网络。由此得到 metric 函数:

J(θ)=E[vμ(S)],SdθJ(θ)=E[θμ(S)aqμ(S,a)],a=μ(S),Sρμ

其中 d 是一个可设置的状态概率分布,见 Metricρμ 是另一个由 d 推导出的状态概率分布。代入更新公式:

ηt=rt+1+γq(st+1,μ(st+1,θt),wt)q(st,at,wt)wt+1=wtαw(ηt)wq(st,at,wt)θt+1=θt+αθθμ(st,θt)aq(st,a,wt+1),a=μ(st,θt)

如果要把该算法改成 on-policy,即使用 target policy μ 进行采样,会存在一个问题:μ 是一个确定性策略,即遇到相同的 s 只选相同的 a,所以失去了探索的机会。这时可以向 μ 函数中加入噪声,使其不确定性增加,从而增加探索的机会。

该算法还涉及 q 函数的选取,如果使用神经网络则得到 Deep Deterministic Policy Gradient, DDPG。