一、基本概念

1.1 专业术语

(1)状态(State):状态可以被理解为当前环境的情况。

(2)动作(Action):动作是智能体(agent)采取的行为。

(3)策略(Policy):策略是用于在给定观测状态下做出决策的函数,通常表示为 π(as)\pi(a|s),其中 aa 是动作,ss 是状态。强化学习的目标是学习策略函数,通常以概率密度函数的形式表示。

(4)奖励(Reward):奖励定义了奖励的方式,对强化学习的结果产生重要影响。

(5)状态转移(State Transition):状态转移表示在当前状态下,当智能体执行一个动作后,环境可能随机转移到的下一个状态的概率,通常表示为 P(SS,A)P(S'|S, A)

(6)回报(Return):回报又被称为未来奖励的累积,通常表示为 Ut=Rt+Rt+1+Rt+2+U_t = R_t + R_{t+1} + R_{t+2} + \ldots

(7)折扣回报(Discounted Return):折扣回报考虑未来奖励的折扣效应,用折扣率 γ\gamma 表示,通常表示为 Ut=Rt+γRt+1+γ2Rt+2+U_t = R_t + \gamma R_{t+1} + \gamma^2 R_{t+2} + \ldots

(8)动作价值函数(Action-Value Function):动作价值函数表示在给定状态和动作下,智能体可以获得的期望回报,通常表示为 Qπ(st,at)=E[UtSt=st,At=at]Q_\pi(s_t, a_t) = E[U_t | S_t=s_t, A_t=a_t]。最优策略下的动作价值函数被表示为 Q(st,at)=maxπQπ(st,at)Q^*(s_t, a_t) = \max_\pi Q_\pi(s_t, a_t),使用动作价值函数可以评估当前动作的质量。

(9)状态价值函数(State-Value Function):状态价值函数表示在给定状态下,按照策略函数的预期回报,通常表示为 Vπ(st)=EA[Qπ(st,A)]V_\pi(s_t) = E_A[Q_\pi(s_t, A)]。状态价值函数可以告诉我们当前状态的好坏程度。

(10)交叉熵(Cross Entropy):交叉熵用于度量两个概率分布之间的差异,通常表示为 H(p,q)=j=1mpjlog(qj)H(\textbf p, \textbf q) = -\sum^m_{j=1}p_j\cdot \log(q_j)。当两个概率分布相同时,交叉熵达到最小值。

1.2 强化学习的随机性

(1)Action动作的随机性

因为动作是根据策略函数随机抽样得到的,因此agent有可能做策略中的任何一种动作,虽然这些动作的概率有大有小,但是动作本身是随机的。

(2)State transitions状态转移的随机性

假定agent作出了一个动作,环境会用概率随机抽样,给出下一个状态。

1.3 强化学习如何控制agent

(1)如果有策略函数 π(as)\pi(a|s)

  1. 给定一个观测状态 sts_t
  2. 利用策略函数从所有可能的动作中随机采样 at π(st)a_t~\pi(\cdot|s_t)

(2)如果有最优的动作价值函数 Q(s,a)Q^*(s,a)*

  1. 给定一个观测状态 sts_t
  2. 最大化 at=argmaxaQ(st,a)a_t=argmax_a Q^*(s_t,a) 来选择动作

二、价值学习 Deep Q-Network(DQN)

UtU_t 反映未来奖励的总和,因此我们要知道 UtU_t 的大小,由于其是一个随机变量,我们可以对 UtU_t 求期望,只留下 sts_tata_t 两个变量。

Qπ(st,at)=E[UtSt=st,At=at]Q_\pi(s_t,a_t)=E[U_t|S_t=s_t,A_t=a_t]

要想进一步消除策略函数 π\pi,可以对 QπQ_\pi 关于 π\pi 球最大化,记为 QQ^*

Q(st,at)=maxπQπ(st,at)Q^*(s_t,a_t)=max_\pi Q_\pi(s_t,a_t)

这个参数告诉我们不管在什么情况 sts_t 下做动作 ata_t,那么期望顶多就是 Q(st,at)Q^*(s_t,a_t)

目标:完成任务(最大化总回报)
问题:如果已知 Q(s,a)Q^*(s,a),那么最好的动作就是 a=argmaxaQ(s,a)a^*=argmax_a Q^*(s,a),因为 QQ^* 指示了该agent在s状态下选择a动作的好坏程度
挑战:我们不知道 Q(s,a)Q^*(s,a)

(1)什么是 DQN

我们使用神经网络 Q(s,a;w)Q(s,a;w) 来近似 Q(s,a)Q^*(s,a),其中 w 是要近似的参数,s 是输入,a 是输出是对所有动作的打分。

image.png

当前观测到状态 sts_t,用DQN把 sts_t 作为输入,为所有动作打分,选出分数最高的动作作为 ata_t

agent 作出动作 ata_t 后,环境会改变,用状态转移函数 pp 随机抽取一个新的状态 st+1s_{t+1},环境还会告诉我们一个回报 rtr_t,这个 rtr_t 就是训练DQN的关键。

(2)如何训练 DQN

常规的网络训练过程如下:

  1. 首先对任务结果做一个预测 q=Q(w)q=Q(w)
  2. 完成任务后获得目标 yy
  3. 计算损失 L=12(qy)2L=\frac{1}{2}(q-y)^2
  4. 计算梯度 Lw=Lqqw\frac{\partial L}{\partial w}=\frac{\partial L}{\partial q}\cdot \frac{\partial q}{\partial w}
  5. 更新参数 wt+1=wtαLww=wtw_{t+1}=w_t-\alpha \cdot\frac{\partial L}{\partial w}|_{w=w_t}

但这种方式需要完整完成一次任务后才能更新参数,而能否执行一部分任务后就开始更新参数,因此有了 Temporal Difference Learning (TD算法),过程如下:

  1. 首先对任务结果做一个预测 q=Q(w)q=Q(w)
  2. 执行一部分任务后,对任务结果再进行预测 yy,此时的 yy 包括已经完成的部分和对剩下部分的预测,因此比 qq 更可靠
  3. 计算损失 L=12(qy)2L=\frac{1}{2}(q-y)^2
  4. 计算梯度 Lw=Lqqw\frac{\partial L}{\partial w}=\frac{\partial L}{\partial q}\cdot \frac{\partial q}{\partial w}
  5. 更新参数 wt+1=wtαLww=wtw_{t+1}=w_t-\alpha \cdot\frac{\partial L}{\partial w}|_{w=w_t}

在深度强化学习中,也就是下面这个公式

Q(st,at;w)rt+γQ(st+1,at+1;w)Q(s_t,a_t;w)\approx r_t+\gamma\cdot Q(s_{t+1},a_{t+1};w)

对未来奖励总和的期望,就是真实已经观测到的奖励,加在t+1时刻对未来奖励的期望。

  1. 首先进行预测 Q(st,at;wt)Q(s_t,a_t;w_t)
  2. 获得TD目标 yt=rt+γQ(st+1,at+1;wt)=rt+γmaxaQ(st+1,a;wt)y_t=r_t+\gamma\cdot Q(s_{t+1},a_{t+1};w_t)=r_t+\gamma\cdot max_a Q(s_{t+1},a;w_t)
  3. 计算损失 Lt=12[Q(st,at;w)yt]2L_t=\frac{1}{2}[Q(s_t,a_t;w)-y_t]^2
  4. 进行剃度下降 wt+q=wtαLtww=wtw_{t+q}=w_t-\alpha\cdot\frac{\partial L_t}{\partial w}|_{w=w_t}

image.png

(3)经验回放

之前我们使用在线梯度下降来更新 ww,以此来减小TD errer δt=qttt\delta_t=q_t-t_t

我们定义一个经验transition为(st,at,rt,st+1)(s_t,a_t,r_t,s_{t+1}),传统的方法再每使用一个transition后就会丢弃它,这回造成经验的浪费。此外传统的方法还忽略了不同经验之间的相关性。

将最近的n个transition存储进一个replay buffer,当有新的经验进来后,就删除老的transition。

  1. 每次从buffer中随机抽取一个transition
  2. 计算TD error
  3. 极端梯度
  4. 进行随机梯度下降(实际一般使用minibatch SGD,一次取多个transition)

优先经验回放:为了解决数据的不均匀性,可以使用重要性抽样代替平均采样。可以根据TD error抽样,误差越大的,transition被抽样的概率越大。

学习率比例设置:如果一个transition有较大的抽样概率,那么其学习率应该设置的比较小。

更新TD error:如果一个transition没有被用过,那么就设置它的TD error为最大值,在训练DQN的同时,对TD error进行更新。

三、策略学习

策略函数 π(as)\pi(a|s)是一个概率密度函数,对每一个给定的状态 ss,策略函数会抽取一个最优的动作 aa 作为将要执行的动作。

理想情况下,列出所有的状态和动作,计算所有状态和动作之间的概率即可。

但是实际情况下有无数个状态,不可能记录所有的状态对应的动作,因此需要函数近似。一般使用神经网络进行近似,即policy network π(as;θ)\pi(a|s;\theta)

状态价值函数Vπ(st)=EA[Qπ(st,A)]V_\pi(s_t)=E_A[Q_\pi(s_t,A)],状态价值函数可以告诉我们当前的局势好不好。在状态已知时,还可以判断策略好不好,策略越好,VπV_\pi 越大,任务完成成功率越高,VπV_\pi 可以表示为:

Vπ(st)=EA[Qπ(st,A)]=aπ(ast)Qπ(st,a)V_\pi(s_t)=E_A[Q_\pi(s_t,A)]=\sum_a\pi(a|s_t)\cdot Q_\pi(s_t,a)

使用神经网络替换策略函数,因此得到:

Vπ(st;θ)=aπ(ast;θ)Qπ(st,a)V_\pi(s_t;\theta)=\sum_a\pi(a|s_t;\theta)\cdot Q_\pi(s_t,a)

给定状态 ss,策略函数函数越好,价值函数越大。因此可以考虑通过改变神经网络参数 θ\theta,让 V(s;θ)V(s;\theta) 变大,基于这个思想,可以求期望:

J(θ)=Es[V(S;θ)]J(\theta)=E_s[V(S;\theta)]

策略网络越好,J(θ)J(\theta) 就越大,为了改变 θ\theta,我们使用策略梯度算法。

  1. 观测状态 ss
  2. 更新策略 θ=θ+βV(s;θ)θ\theta=\theta+\beta\cdot\frac{\partial V(s;\theta)}{\partial \theta},做梯度上升,因为我们希望价值函数越大越好。

对于离散的动作,使用V(s;θ)θ=aπ(as;θ)θQπ(s,a)\frac{\partial V(s;\theta)}{\partial \theta}=\sum_a \frac{\partial \pi(a|s;\theta)}{\partial \theta}\cdot Q_\pi(s,a)

对于连续的动作,使用V(s;θ)θ=EA π(s;θ)[π(as;θ)θQπ(s,a)]\frac{\partial V(s;\theta)}{\partial \theta}=E_{A~\pi(\cdot|s;\theta)} [\frac{\partial \pi(a|s;\theta)}{\partial \theta}\cdot Q_\pi(s,a)]

image.png

四、Actor-Crictic

状态价值函数的定义如下:

Vπ(st)=aπ(ast)Qπ(st,a)V_\pi(s_t)=\sum_a\pi(a|s_t)\cdot Q_\pi(s_t,a)

策略网络(产生动作):

  • 使用神经网络 π(as;θ)\pi(a|s;\theta) 来近似策略函数 π(as)\pi(a|s)
  • 其中 θ\theta 是训练的参数

价值网络(产生评判标准):

  • 使用神经网络 q(s,a;w)q(s,a;w) 来近似价值函数 Qπ(s,a)Q_\pi(s,a)
  • 其中 ww 是训练的参数

因此状态价值函数可以写成

Vπ(st)=aπ(ast;θ)Qπ(st,a;w)V_\pi(s_t)=\sum_a\pi(a|s_t;\theta)\cdot Q_\pi(s_t,a;w)

同时训练策略网络和价值网络,就称为 Actor-Critic Method,大致步骤如下:

  1. 观测当前状态 sts_t
  2. 根据策略函数 π(st;θt)\pi(\cdot|s_t;\theta_t) 随机采样获得动作 ata_t
  3. 执行动作 ata_t,并观测新的状态 st+1s_{t+1} 和回报 rtr_t
  4. 更新价值网络的参数 ww,使用TD算法
  5. 更新策略网络的参数 θ\theta,使用策略梯度算法

训练过程中需要同时训练策略网络和价值网络,利用价值网络对策略网络进行评分。训练完成后就不需要价值网络了,只需要策略网络生成动作。

五、蒙特卡洛树搜索(Monte Carlo Tree Search)

5.1 基本思想

蒙特卡洛树搜索的思想是人们必须要向前看很多步,看到未来时间内所有可能的情况,挑选最优的执行动作。

  1. 如果我在此时选择执行动作 ata_t
  2. 那么未来一段时间环境的反馈是怎么变化的 st+1s_{t+1}
  3. 基于这种环境变化,我又会执行动作 at+1a_{t+1}
  4. 此时环境又会如何变化

如果一个agent能够穷举所有的可能性直到任务完成,那么这个任务一定有很高的成功率。

5.2 过程

(1)选择

根据分数选择一个动作(假想的动作,实际上并不会执行);

首先对所有可能的动作 aa,计算得分:

score(a)=Q(a)+ηπ(ast;θ)1+N(a)score(a)=Q(a)+\eta\cdot\frac{\pi(a|s_t;\theta)}{1+N(a)}

其中 Q(a)Q(a) 是蒙特卡洛树搜索计算的动作价值
π(ast;θ)\pi(a|s_t;\theta) 是学习好的策略网络,动作越好,策略分数越高
N(a)N(a) 是给定环境状态 sts_t 情况下,目前为止选择动作 aa 的次数,如果同一个动作被探索太多次,该项分母就会变大。

(2)扩展

假想环境更新;

(3)评估

评价状态价值得分 vv 和回报 rr,将动作的分数设为 v+r22\frac{v+r}{22}

(4)备份

用动作的分数 v+r2\frac{v+r}{2} 更新动作价值:

Q(at)=mean(therecordedVs)Q(a_t)=mean(the recorded V's)

将以后所有步的状态价值进行平均。

六、连续控制

在实际进行强化学习时,可能有离散动作空间(例如上下左右控制游戏人物),也可能是连续动作(机械臂关节控制)。

在进行离散控制时,可以直接使用分类的思想,得到一个onehot向量,每个向量元素代表执行该动作的得分,以此来获得应该执行那种动作。而连续控制中动作空间是有无穷维的,因此不能直接使用这种思想实现连续控制。

比较常规的一种解决思路是将动作空间离散化,但这种方式也有问题,例如机械臂的6个自由度,就算每个自由度离散为360个点,那么整个动作空间也有 3606360^6 个点,这会造成维度灾难,在训练时非常困难。

因此有两种方式实现连续控制:

  • 确定性策略网络
  • 随机策略网络

6.1 确定策略梯度(Deterministic Policy Gradient DPG)

考虑一个只有2自由度的机械臂,基座运动范围为(0,180),机械臂运动范围为(0,360),因此机械臂的动作空间是 A=[0,180]×[0,360]A=[0,180]\times[0,360] 的连续集合,动作就是一个二维向量。

DPG 是一种 Actor-Critic 方法

  • 有一个策略网络,控制 agent 运动,它根据状态 s 做出决策 a;
    使用策略网络 a=π(s;θ)a=\pi(s;\theta) 根据输入状态 s,输出一个确定的动作 a,这里的动作 a 就是机器人的二维动作向量。
  • 有一个价值网络,不控制 agent,它根据状态 s,给动作 a 打分,从而指导策略网络做出改进。
    使用价值网络 q(s,a;w)q(s,a;w),输入状态 s 和动作 a,输出一个实数 value 是对动作的评价,动作越好,value 越大。

因此 DPG 的原理就是训练这两个网络。

image.png

(1)价值网络训练

  1. 每次得到一个训练数据 transition (st,at,rt,st+1)(s_t,a_t,r_t,s_{t+1})
  2. 用价值网络预测当前时刻 t 下的动作价值 qt=q(st,at;w)q_t=q(s_t,a_t;w)
  3. 用价值网络预测下一时刻 t+1 的动作价值 qt+1=q(st+1,at+1;w)q_{t+1}=q(s_{t+1},a_{t+1}';w) ,其中 at+1=π(st+1;θ)a_{t+1}'=\pi(s_{t+1};\theta),这个动作并不是 agent 真正执行的动作,at+1a_{t+1}' 只用于更新价值网络。
  4. 计算 TD error:δt=qt(rt+γqt+1)\delta_t=q_t-(r_t+\gamma\cdot q_{t+1}),其中第二项是 TD Target,它一部分是真实观测到的奖励,另一部分是价值网络自己做出的预测。因为我们认为第二项中由于包含本步真实奖励,比单纯的 qtq_t 更接近真实情况,因此要让 qtq_t 与 TD Target 接近,也就是让 TD error 尽可能小。
  5. 进行梯度下降更新 w:w=wαγtq(st,at;w)ww=w-\alpha\cdot\gamma_t\cdot\frac{\partial q(s_t,a_t;w)}{\partial w}

但这其中有一个问题,就是计算 TD error δt=qt(rt+γqt+1)\delta_t=q_t-(r_t+\gamma\cdot q_{t+1}) 这一步时,会出现 bootstrapping 问题,也就是如果初始值高估或者低估,那么 TD target 就会有高估或低估,并传播回价值网络自身,导致高估或低估一直存在,解决方案就是用不同的神经网络计算 TD Target,也就是用 Target Networks。

  1. 每次得到一个训练数据 transition (st,at,rt,st+1)(s_t,a_t,r_t,s_{t+1})
  2. 用价值网络预测当前时刻 t 下的动作价值 qt=q(st,at;w)q_t=q(s_t,a_t;w)
  3. 用价值网络预测下一时刻 t+1 的动作价值 qt+1=q(st+1,at+1;w)q_{t+1}=q(s_{t+1},a_{t+1}';w^-) ,其中 at+1=π(st+1;θ)a_{t+1}'=\pi(s_{t+1};\theta^-)
    π(st+1;θ)\pi(s_{t+1};\theta^-) 是 Target policy network 用来代替策略网络,它的网络结构和策略网络一模一样,但是参数不一样。
    q(st+1,at+1;w)q(s_{t+1},a_{t+1}';w^-) 是 Target value network,它与价值网络结构一样,参数不同。

(2)策略网络训练

训练策略网络,需要靠价值网络评价动作的好坏,从而指导策略网络进行改进。

也就是更新策略网络的参数 θ\theta 让价值网络认为动作 a=π(s;θ)a=\pi(s;\theta) 更好,也就是改进 θ\theta 让价值 q(s,a;w)=q(s,π(s;θ);w)q(s,a;w)=q(s,\pi(s;\theta);w) 尽可能大。

由于给定状态 s,策略网络会输出一个确定的动作 a,而如果价值网络也是确定的,那么输出的价值就是确定的。

因此问题中只需要改变 θ\theta,使得价值 q 变大,也就是计算 q(s,a;w)q(s,a;w)θ\theta 的梯度,然后用梯度上升更新 θ\theta,就可以让 qq 变大,这个梯度就叫确定策略梯度 DPG

g=q(s,π(s;θ);w)θ=aθq(s,a;w)ag=\frac{\partial q(s,\pi(s;\theta);w)}{\partial\theta}=\frac{\partial a}{\partial \theta}\cdot\frac{\partial q(s,a;w)}{\partial a}

其中 a=π(s;θ)a=\pi(s;\theta),然后进行梯度上升 θ=θ+βg\theta=\theta+\beta\cdot g

策略网络和价值网络联合具体步骤如下:

  1. 策略网络做一个决策:a=π(s;θ)a=\pi(s;\theta)
  2. 计算价值网络的输出:qt=q(s,a;w)q_t=q(s,a;w)
  3. 用 DPG 更新策略网络: θ=θ+βaθq(s,a;w)a\theta=\theta+\beta\cdot \frac{\partial a}{\partial \theta}\cdot\frac{\partial q(s,a;w)}{\partial a}
  4. 利用 Target networks π(s;θ)\pi(s;\theta^-)q(s,a;w)q(s,a;w^-) 计算 qt+1q_{t+1}
  5. 计算 TD error:δt=qt(rt+γqt+1)\delta_t=q_t-(r_t+\gamma\cdot q_{t+1})
  6. 更新价值网络:w=wαγtq(st,at;w)ww=w-\alpha\cdot\gamma_t\cdot\frac{\partial q(s_t,a_t;w)}{\partial w}
  7. 更新 Target networks 的参数:w=τw+(1τ)ww^-=\tau\cdot w+(1-\tau)\cdot w^-θ=τθ+(1τ)θ\theta^-=\tau\cdot \theta+(1-\tau)\cdot \theta^-,其中 τ\tau 是超参数

6.2 随机策略用于连续控制

首先考虑自由度等于 1 的随机策略连续控制,也就是动作都是实数。

μ\mu 代表均值,和 σ\sigma 代表标准差,都是状态 s 的函数。

用正态分布的概率密度函数作为策略函数:

π(as)=16.28σexp((aμ)22σ2)\pi(a|s)=\frac{1}{\sqrt{6.28}\sigma}\cdot exp(-\frac{(a-\mu)^2}{2\sigma^2})

对于 d 维情况一样,动作是 d 维向量。

设向量 μ\mu 代表均值,和向量 σ\sigma 代表标准差,都是状态 s 的函数。

使用特殊正态分布作为策略函数:

π(as)=i=1d16.28σiexp((aiμi)22σi2)\pi(a|s)=\prod_{i=1}^d\frac{1}{\sqrt{6.28}\sigma_i}\cdot exp(-\frac{(a_i-\mu_i)^2}{2\sigma^2_i})

但这里我们不知道 μ\muσ\sigma,也就不知道策略函数。

因此可以用神经网络来近似 μ(s;θμ)\mu(s;\theta^{\mu})ρ(s;θρ)\rho(s;\theta{\rho}),其中 ρi=lnσi2\rho_i=ln\sigma_i^2

将策略函数进行取对数,将连乘变成连加,得到辅助神经网络 f(s,a;θ)=i=1d[ρi2(aiμi)22exp(ρi)]f(s,a;\theta)=\sum^d_{i=1}[-\frac{\rho_i}{2}-\frac{(a_i-\mu_i)^2}{2\cdot exp(\rho_i)}],计算 f 关于其中卷积层和全连接层的参数的梯度,进而实现反向传播更新参数。

image.png

参考:

  1. 王树森. 强化学习课程(Youtube)