从马尔可夫决策到 DQN 算法族(上)

79 阅读3分钟

0 全文目录

1.马尔可夫决策过程 (Markov Decision Process)

1.1 马尔可夫过程的基本概念和性质

1.1.1 随机过程

  概率论的研究对象是静态的随机现象,而随机过程 (stochastic process) 的研究对象是随时间演变的随机现象 (例如天气随时间的变化、城市交通随时间的变化)。在随机过程中,随机现象在某时刻 tt 的取值是一个向量随机变量,用 StS_t 表示,所有可能的状态组成状态集合 S\mathcal{S}。随机现象便是状态的变化过程。在某时刻 tt 的状态 StS_t 通常取决于时刻之前的状态。我们将已知历史信息 (S1,,St)\left(S_1, \ldots, S_t\right) 的下一个时刻状态为 St+1S_{t+1} 的概率表示成 P(St+1S1,,St)P\left(S_{t+1} \mid S_1, \ldots, S_t\right)

1.1.2 马尔可夫性质

  当且仅当某时刻的状态只取决于上一时刻的状态时,一个随机过程被称为具有马尔可夫性质 (Markov property),用公式表示为

P(St+1St)=P(St+1S1,,St)P\left(S_{t+1} \mid S_t\right)=P\left(S_{t+1} \mid S_1, \ldots, S_t\right)

即当前状态是未来的充分统计量,即下一个状态只取决于当前状态,而不会受到过去状态的影响。

  需要明确的是,具有马尔可夫性并不代表这个随机过程就和历史完全没有关系。因为虽然 t+1t+1 时刻的状态只与 tt 时刻的状态有关,但是 tt 时刻的状态其实包含了 t1t-1 时刻的状态的信息,通过这种链式的关系,历史的信息被传递到了现在。但是马尔可夫性质仍使得其可大大简化运算。

1.1.3 马尔可夫过程

  马尔可夫过程 (Markov process) 指具有马尔可夫性质的随机过程,也被称为马尔可夫链 (Markov chain)。我们通常用元组 S,P\langle\mathcal{S}, \mathcal{P}\rangle 描述一个马尔可夫过程,其中 S\mathcal{S} 是有限数量的状态集合,P\mathcal{P} 是状态转移矩阵 (state transition matrix)。假设一共有 nn 个状态,此时。状态转移矩阵 P\mathcal{P} 定义了所有状态对之间的转移概率,即

P=[P(s1s1)P(sns1)P(s1sn)P(snsn)]\mathcal{P}=\left[\begin{array}{ccc} P\left(s_1 \mid s_1\right) & \cdots & P\left(s_n \mid s_1\right) \\ \vdots & \ddots & \vdots \\ P\left(s_1 \mid s_n\right) & \cdots & P\left(s_n \mid s_n\right) \end{array}\right]

矩阵 P\mathcal{P} 中第 ii 行第 jj 列元素 P(sjsi)=P(St+1=sjSt=si)P\left(s_j \mid s_i\right)=P\left(S_{t+1}=s_j \mid S_t=s_i\right) 表示从状态 sis_i 转移到状态 sjs_j 的概率,我们称为状态转移函数。从某个状态出发,到达其他状态的概率和必须为 1,即状态转移矩阵的每一行的和为 1。

1.2 马尔可夫奖励过程 (Markov Reward Process)

  在马尔可夫过程的基础上加入奖励函数 rr 和折扣因子 γ\gamma,就可以得到马尔可夫奖励过程 (Markov reward process)。一个马尔可夫奖励过程由 S,P,r,γ\langle\mathcal{S}, \mathcal{P}, r, \gamma\rangle 构成,各个组成元素的含义如下所示。

  • S\mathcal{S} 是有限状态的集合。
  • P\mathcal{P} 是状态转移矩阵。
  • rr 是奖励函数,某个状态 ss 的奖励 r(s)r(s) 指转移到该状态时可以获得奖励的期望。
  • γ\gamma 是折扣因子 (discount factor),γ\gamma 的取值范围为 (0,1)(0,1)。引入折扣因子的理由为远期利益具有一定不确定性,有时我们更希望能够尽快获得一些奖励,所以我们需要对远期利益打一些折扣。接近 1 的 γ\gamma 更关注长期的累计奖励,接近 0 的 γ\gamma 更考虑短期奖励。

1.2.1 回报函数

  在一个马尔可夫奖励过程中,从第 tt 时刻状态 StS_t 开始,直到终止状态时,所有奖励的衰减之和称为回报 GtG_t (Return),公式如下 :

Gt=Rt+γRt+1+γ2Rt+2+=k=0γkRt+kG_t=R_t+\gamma R_{t+1}+\gamma^2 R_{t+2}+\cdots=\sum_{k=0}^{\infty} \gamma^k R_{t+k}

  其中,RtR_t 表示在 tt 时刻获得的奖励。

1.2.2 价值函数

  在马尔可夫奖励过程中,一个状态的期望回报 (即从这个状态出发的未来累积奖励的期望) 被称为这个状态的价值 (value)。所有状态的价值就组成了价值函数 (value function),价值函数的输入为某个状态,输出为这个状态的价值。我们将价值函数写成 V(s)=E[GtSt=s]V(s)=\mathbb{E}\left[G_t \mid S_t=s\right],展开为 :

V(s)=E[GtSt=s]=E[Rt+γRt+1+γ2Rt+2+St=s]=E[Rt+γ(Rt+1+γRt+2+)St=s]=E[Rt+γGt+1St=s]=E[Rt+γV(St+1)St=s]\begin{aligned} V(s) & =\mathbb{E}\left[G_t \mid S_t=s\right] \\ & =\mathbb{E}\left[R_t+\gamma R_{t+1}+\gamma^2 R_{t+2}+\ldots \mid S_t=s\right] \\ & =\mathbb{E}\left[R_t+\gamma\left(R_{t+1}+\gamma R_{t+2}+\ldots\right) \mid S_t=s\right] \\ & =\mathbb{E}\left[R_t+\gamma G_{t+1} \mid S_t=s\right] \\ & =\mathbb{E}\left[R_t+\gamma V\left(S_{t+1}\right) \mid S_t=s\right] \end{aligned}

在上式的最后一个等号中,一方面,即时奖励的期望正是奖励函数的输出,即 E[RtSt=s]=r(s)\mathbb{E}\left[R_t \mid S_t=s\right]=r(s);另一方面,等式中剩余部分 E[γV(St+1)St=s]\mathbb{E}\left[\gamma V\left(S_{t+1}\right) \mid S_t=s\right] 可以根据从状态 ss 出发的转移概率得到,即可以得到

V(s)=r(s)+γsSp(ss)V(s)V(s)=r(s)+\gamma \sum_{s^{\prime} \in S} p\left(s^{\prime} \mid s\right) V\left(s^{\prime}\right)

  上式就是马尔可夫奖励过程中非常有名的贝尔曼方程 (Bellman equation),对每一个状态都成立。若一个马尔可夫奖励过程一共有 nn 个状态,即 S={s1,s2,,sn}\mathcal{S}=\left\{s_1, s_2, \ldots, s_n\right\},我们将所有状态的价值表示成一个列向量 V=[V(s1),V(s2),,V(sn)]T\mathcal{V}=\left[V\left(s_1\right), V\left(s_2\right), \ldots, V\left(s_n\right)\right]^T,同理,将奖励函数写成一个列向量 R=[r(s1),r(s2),,r(sn)]T\mathcal{R}=\left[r\left(s_1\right), r\left(s_2\right), \ldots, r\left(s_n\right)\right]^T。于是我们可以将贝尔曼方程写成如下矩阵的形式 :

V=R+γPV[V(s1)V(s2)V(sn)]=[r(s1)r(s2)r(sn)]+γ[P(s1s1)p(s2s1)P(sns1)P(s1s2)P(s2s2)P(sns2)P(s1sn)P(s2sn)P(snsn)][V(s1)V(s2)V(sn)]\begin{gathered} \mathcal{V}=\mathcal{R}+\gamma \mathcal{P} \mathcal{V} \\ {\left[\begin{array}{c} V\left(s_1\right) \\ V\left(s_2\right) \\ \ldots \\ V\left(s_n\right) \end{array}\right]=\left[\begin{array}{c} r\left(s_1\right) \\ r\left(s_2\right) \\ \ldots \\ r\left(s_n\right) \end{array}\right]+\gamma\left[\begin{array}{cccc} P\left(s_1 \mid s_1\right) & p\left(s_2 \mid s_1\right) & \ldots & P\left(s_n \mid s_1\right) \\ P\left(s_1 \mid s_2\right) & P\left(s_2 \mid s_2\right) & \ldots & P\left(s_n \mid s_2\right) \\ \ldots & & & \\ P\left(s_1 \mid s_n\right) & P\left(s_2 \mid s_n\right) & \ldots & P\left(s_n \mid s_n\right) \end{array}\right]\left[\begin{array}{c} V\left(s_1\right) \\ V\left(s_2\right) \\ \ldots \\ V\left(s_n\right) \end{array}\right]} \end{gathered}

  因为只是对于时序差分部分进行研究,因此确定奖励的动态规划部分在此不多赘述。

2.时序差分算法 (Temporal Difference Learning)

  动态规划算法适用于已知的马尔可夫决策过程,其中环境与智能体的交互是完全已知的。在这种情况下,智能体可以直接使用动态规划算法求解最优价值或策略,而无需采样数据。但在实际场景中,大多数情况下无法事先知道数据的分布,因此机器学习方法通常根据具体数据点对模型进行更新。在强化学习中,由于马尔可夫决策过程的状态转移概率无法明确给出,智能体只能通过与环境交互并采样数据来进行学习,这就是无模型的强化学习。基于时序差分 (TD) 的算法,下面将介绍两种经典的无模型强化学习算法:Sarsa和Q-learning。

2.1 时序差分算法具体介绍

  时序差分是一种用来估计一个策略的价值函数的方法,它结合了蒙特卡洛和动态规划算法的思想。时序差分方法和蒙特卡洛的相似之处在于可以从样本数据中学习,不需要事先知道环境;和动态规划的相似之处在于根据贝尔曼方程的思想,利用后续状态的价值估计来更新当前状态的价值估计。回顾一下蒙特卡洛方法对价值函数的增量更新方式

V(st)V(st)+α[GtV(st)]V\left(s_t\right) \leftarrow V\left(s_t\right)+\alpha\left[G_t-V\left(s_t\right)\right]

  一般我们将 α\alpha 取为一个常数,同时更新方式不再像蒙特卡洛方法那样严格地取期望。蒙特卡洛方法必须要等整个序列结束之后才能计算得到这一次的回报 GtG_t,而时序差分方法只需要当前步结束即可进行计算。具体来说,时序差分算法用当前获得的奖励加上下一个状态的价值估计来作为在当前状态会获得的回报,即 :

V(st)V(st)+α[rt+γV(st+1)V(st)]V\left(s_t\right) \leftarrow V\left(s_t\right)+\alpha\left[r_t+\gamma V\left(s_{t+1}\right)-V\left(s_t\right)\right]

  可以看出用 rt+γV(st+1)V(st)r_t+\gamma V\left(s_{t+1}\right)-V\left(s_t\right) 代替了蒙特卡洛中的 GtV(st)G_t-V\left(s_t\right),其常被称为时序差分 (temporal difference,TD) 误差 (error),时序差分算法将其与步长的乘积作为状态价值的更新量。可以用 Rt+γV(st+1)R_t+\gamma V\left(s_{t+1}\right) 来代替 GtG_t 的原因是 :

Vπ(s)=Eπ[GtSt=s]=Eπ[k=0γkRt+kSt=s]=Eπ[Rt+γk=0γkRt+k+1St=s]=Eπ[Rt+γVπ(St+1)St=s]\begin{aligned} V_\pi(s) & =\mathbb{E}_\pi\left[G_t \mid S_t=s\right] \\ & =\mathbb{E}_\pi\left[\sum_{k=0}^{\infty} \gamma^k R_{t+k} \mid S_t=s\right] \\ & =\mathbb{E}_\pi\left[R_t+\gamma \sum_{k=0}^{\infty} \gamma^k R_{t+k+1} \mid S_t=s\right] \\ & =\mathbb{E}_\pi\left[R_t+\gamma V_\pi\left(S_{t+1}\right) \mid S_t=s\right] \end{aligned}

  蒙特卡洛方法将上式第一行作为更新的目标,而时序差分算法将上式最后一行作为更新的目标。于是,在用策略和环境交互时,每采样一步,我们就可以用时序差分算法来更新状态价值估计。时序差分算法用到了 V(st+1)V(s_{t+1}) 的估计值,可以证明它最终收敛到策略的价值函数。

2.2 Sarsa 算法

  既然我们可以用时序差分方法来估计价值函数,那一个很自然的问题是,我们能否用类似策略迭代的方法来进行强化学习。策略评估已经可以通过时序差分算法实现,那么在不知道奖励函数和状态转移函数的情况下可以直接用时序差分算法来估计动作价值函数 QQ :

Q(st,at)Q(st,at)+α[rt+γQ(st+1,at+1)Q(st,at)]Q\left(s_t, a_t\right) \leftarrow Q\left(s_t, a_t\right)+\alpha\left[r_t+\gamma Q\left(s_{t+1}, a_{t+1}\right)-Q\left(s_t, a_t\right)\right]

  然后我们用贪婪算法来选取在某个状态下动作价值最大的那个动作,即 arg maxaQ(s,a)\argmax_a Q(s,a)。这样似乎已经形成了一个完整的强化学习算法 : 用贪婪算法根据动作价值选取动作来和环境交互,再根据得到的数据用时序差分算法更新动作价值估计。

  然而,这个简单算法还存在两个问题需要进一步考虑 :

  • 首先,为了准确估计策略的状态价值函数,时序差分算法需要使用大量样本进行更新。但实际上这是可以忽略的,只需用部分样本评估策略即可进行更新。这是因为策略提升可以在策略评估尚未完成时进行,这符合广义策略选代 (generalized policy iteration) 的思想,就像价值迭代中所做的一样。
  • 其次,在策略提升过程中,如果一直使用贪婪算法得到确定性策略,可能会导致某些状态动作对 (s,a)(s, a) 在序列中永远不会出现,从而无法估计其动作价值,也无法保证提升后的策略比原策略更好。对此我们采用 ϵ\epsilon-贪婪策略 : 以 1ϵ1-\epsilon 的概率选择具有最大动作价值的动作,以 ϵ\epsilon 的概率随机选择动作。其公式表示为 :
π(as)={ϵ/A+1ϵ if a=argmaxaQ(s,a)ϵ/A another action \pi(a \mid s)= \begin{cases}\epsilon /|\mathcal{A}|+1-\epsilon & \text { if } a=\arg \max _{a^{\prime}} Q\left(s, a^{\prime}\right) \\ \epsilon /|\mathcal{A}| & \text { another action }\end{cases}

  至此,我们便得到了 Sarsa 强化学习算法,因为它的动作价值更新用到了当前状态 ss、当前动作 aa、获得的奖励 rr、下一个状态 ss' 和下一个动作 aa',将这些符号拼接后就得到了算法名称。Sarsa 的具体算法如下 :


  • 初始化 Q(s,a)Q(s, a)
  • for 序列 e=1Ee=1 \rightarrow E do:
    • 得到初始状态 ss
    • ϵ\epsilon-greedy 策略根据 QQ 选择当前状态 ss 下的动作 aa
    • for 时间步 t=1Tt=1 \rightarrow T do:
      • 得到环境反馈的 r,sr, s^{\prime}
      • ϵ\epsilon-greedy 策略根据 QQ 选择当前状态 ss^{\prime} 下的动作 aa^{\prime}
      • Q(s,a)Q(s,a)+α[r+γQ(s,a)Q(s,a)]Q(s, a) \leftarrow Q(s, a)+\alpha\left[r+\gamma Q\left(s^{\prime}, a^{\prime}\right)-Q(s, a)\right]
      • ss,aas \leftarrow s^{\prime}, a \leftarrow a^{\prime}
    • end for
  • end for

2.3 多步 Sarsa 算法

  蒙特卡洛方法利用每一步的奖励,而时序差分算法则使用一步奖励和下一个状态的价值估计。它们的区别在于蒙特卡洛方法是无偏 (unbiased) 的,但方差较大,因为每一步的状态转移都存在不确定性,而时序差分算法的方差很小,因为只考虑一步状态转移并利用一步奖励,但是它是有偏的,因为使用了下一个状态的价值估计而非真实价值。我们可以使用多步时序差分将两者的优势进行结合。多步时序差分使用多步奖励和后续状态的价值估计。用公式表示,将

Gt=rt+γQ(st+1,at+1)G_t=r_t+\gamma Q\left(s_{t+1}, a_{t+1}\right)

替换为

Gt=rt+γrt+1++γnQ(st+n,at+n)G_t=r_t+\gamma r_{t+1}+\cdots+\gamma^n Q\left(s_{t+n}, a_{t+n}\right)

  对应到 Sarsa 中,即将动作价值函数的更新公式

Q(st,at)Q(st,at)+α[rt+γQ(st+1,at+1)Q(st,at)]Q\left(s_t, a_t\right) \leftarrow Q\left(s_t, a_t\right)+\alpha\left[r_t+\gamma Q\left(s_{t+1}, a_{t+1}\right)-Q\left(s_t, a_t\right)\right]

替换为

Q(st,at)Q(st,at)+α[rt+γrt+1++γnQ(st+n,at+n)Q(st,at)]Q\left(s_t, a_t\right) \leftarrow Q\left(s_t, a_t\right)+\alpha\left[r_t+\gamma r_{t+1}+\cdots+\gamma^n Q\left(s_{t+n}, a_{t+n}\right)-Q\left(s_t, a_t\right)\right]

2.4 Q-learning 算法

  除了 Sarsa,还有一种非常著名的基于时序差分算法的强化学习算法 : Q-learning。Q-learning 和 Sarsa 的最大区别在于 Q-learning 的时序差分更新方式为 :

Q(st,at)Q(st,at)+α[Rt+γmaxaQ(st+1,a)Q(st,at)]Q\left(s_t, a_t\right) \leftarrow Q\left(s_t, a_t\right)+\alpha\left[R_t+\gamma \max _a Q\left(s_{t+1}, a\right)-Q\left(s_t, a_t\right)\right]

  其对应的算法如下 :


  • 初始化 Q(s,a)Q(s, a)
  • for 序列 e=1Ee=1 \rightarrow E do:
    • 得到初始状态 ss
    • for 时间步 t=1Tt=1 \rightarrow T do :
      • ϵ\epsilon-greedy 策略根据 QQ 选择当前状态 ss 下的动作 aa
      • 得到环境反馈的 r,sr, s^{\prime}
      • Q(s,a)Q(s,a)+α[r+γmaxaQ(s,a)Q(s,a)]Q(s, a) \leftarrow Q(s, a)+\alpha\left[r+\gamma \max _{a^{\prime}} Q\left(s^{\prime}, a^{\prime}\right)-Q(s, a)\right]
      • sss \leftarrow s^{\prime}
    • end for
  • end for

  我们可以用价值迭代的思想来理解 Q-learning,即 Q-learning 是直接在估计 QQ^*,因为动作价值函数的贝尔曼最优方程是 :

Q(s,a)=r(s,a)+γsSP(ss,a)maxaQ(s,a)Q^*(s, a)=r(s, a)+\gamma \sum_{s^{\prime} \in \mathcal{S}} P\left(s^{\prime} \mid s, a\right) \max _{a^{\prime}} Q^*\left(s^{\prime}, a^{\prime}\right)

  而 Sarsa 估计当前 ϵ\epsilon-贪婪策略的动作价值函数。

  • Q-learning 的更新并非必须使用当前贪心策略采样得到的数据,因为给定任意都可以直接根据更新公式来更新,为了探索,我们通常使用一个 ϵ\epsilon-贪婪策略来与环境交互。
  • Sarsa 必须使用当前 ϵ\epsilon-贪婪策略采样得到的数据,因为它的更新中用到的的是当前策略在下的动作。
  • 我们称 Sarsa 是在线策略 (on-policy) 算法,称 Q-learning 是离线策略 (off-policy) 算法,这两个概念强化学习中非常重要。

参考资料 (References)