强化学习(强化主干知识,看这篇就够了)

强化学习

强化学习到底是什么?若是想略微了解强化学习大概的意思和操作,把握一个主干知识,而不做深入研究,看这篇文章就很够了。

核心内容

元素简介

强化学习考察的是对于一个对象(智能体),从一个状态执行某种动作到下一个状态,并在这个过程中,给其一定的奖赏或者惩罚,是它尽可能往好的方面去做。就像马戏团的驯养师,对其宠物,若其表现好,就给它一点吃的,若其表现不好,就抽它两鞭子,使得它最后,能够有一系列出色的表现。

为了说清楚这个问题,我们需要介绍一下状态空间 S S S、动作集 A A A、状态转移概率 P P P和奖赏 R R R

在这里插入图片描述
如图所示,状态空间表示所有状态的一个集合,动作集表示所有动作的一个集合。

状态转移概率是一个函数,表示在当前状态 s s s下,执行某个动作 a a a之后,转移到某个状态的概率,即 P : S × A × S ↦ R P : S \times A \times S \mapsto \mathbb{R} P:S×A×SR指定了转移概率。举例比如说状态 s 1 s_1 s1下,执行动作 a 1 a_1 a1,可能转移到 s 1 s_1 s1,也可能转移 s 2 s_2 s2,二者概率不同。图示 s 2 s_2 s2也是可以以一定的概率执行相应的动作,执行相应的动作,都以一定的概率转移到不同的状态,为了图示简明,没有画出来。

R : S × A × S ↦ R R : S \times A \times S \mapsto \mathbb{R} R:S×A×SR指定了奖赏。这个奖赏不仅跟起始状态和动作有关,也和动作执行后达到的状态有关。

还有一个是策略函数 π \pi π,它表示给你一个状态,你应该要执行什么动作,当然,如果你执行的动作不确定,而是以一定概率执行相应的动作,那么 π \pi π其实就是对应于动作的概率函数,即用 π ( s , a ) \pi(s,a) π(s,a)表示在状态s下选择动作a的概率。要有 ∑ a π ( s , a ) = 1 \sum_{a} \pi(s, a)=1 aπ(s,a)=1

优化目标:状态值函数

给定一个策略 π \pi π(这个策略不一定是最优的),那么对于执行动作的步数有限(设为 T T T步)和无限的时候,我们分别定义状态值函数:

{ V T π ( s ) = E π [ 1 T ∑ t = 1 T r t ∣ s 0 = s ] V γ π ( s ) = E π [ ∑ t = 0 + ∞ γ t r t + 1 ∣ s 0 = s ] \left\{\begin{array}{l}{V_{T}^{\pi}(s)=\mathbb{E}_{\pi}\left[\frac{1}{T} \sum_{t=1}^{T} r_{t} | s_{0}=s\right]} \\ {V_{\gamma}^{\pi}(s)=\mathbb{E}_{\pi}\left[\sum_{t=0}^{+\infty} \gamma^{t} r_{t+1} | s_{0}=s\right]}\end{array}\right. {VTπ(s)=Eπ[T1t=1Trts0=s]Vγπ(s)=Eπ[t=0+γtrt+1s0=s]

这个状态值函数的意思就是在当前状态 s s s下,平均累积奖赏的一个数学期望,它是一个函数,对于不同的状态 s s s,它有不同的值。当步数是无穷的时候,我们定义一个折扣因子 γ \gamma γ,使得距离越远的地方,奖赏的对累积奖赏影响越小。这里的数学期望,其实有两层含义,一个是指定动作之后,可能会以不同的概率转移到不同的状态,可以求一个期望。另一个是,对于状态 s s s而言,会以 π ( s , a ) \pi(s,a) π(s,a)的概率执行不同的动作,对于不同的动作可以求一个期望。

所以,我们想要做的,其实就是想办法找一个策略,使得这个状态值函数达到最大。这是我们的目标。

有了这个优化目标,我们来看看如何最大化这个优化目标。

不妨考虑模型已知的情况,即状态空间,动作空间,转移概率和奖赏我们都是知道的。在模型不是已知的情况下,比如说奖赏Reward不清楚,我们可以使用模特卡洛的方法,让智能体多做几次动作,计算累积回报,求得平均来得到我们需要的奖赏值。贪婪算法是在“探索”(exploration)和“利用”(exploitation)之间取一个折中,所谓的探索,其实就是以频率替代概率,多做几次实验,取平均值,来作为我们需要的值的期望,所谓的利用,就是在策略中选择期望最大的动作。

对于有限步情况,考虑某一个指定的策略 π \pi π,因为模型已知,它的状态值函数根据数学期望的定义可以进行拆分和全概率展开:

V T π ( s ) = E π [ 1 T ∑ t = 1 T r t ∣ s 0 = s ] = E π [ 1 T r 1 + T − 1 T 1 T − 1 ∑ t = 2 T r t ∣ s 0 = s ] = ∑ a ∈ A π ( s , a ) ∑ s ′ ∈ S P ( s ′ ∣ s , a ) ( 1 T R ( s ′ ∣ s , a ) + T − 1 T E π [ 1 T − 1 ∑ t = 1 T − 1 r t ∣ s 0 = s ′ ] ) = ∑ a ∈ A π ( s , a ) ∑ s ′ ∈ S P ( s ′ ∣ s , a ) ( 1 T R ( s ′ ∣ s , a ) + T − 1 T V T − 1 π ( s ′ ) ) \begin{aligned} V_{T}^{\pi}(s) &=\mathbb{E}_{\pi}\left[\frac{1}{T} \sum_{t=1}^{T} r_{t} | s_{0}=s\right] \\ &=\mathbb{E}_{\pi}\left[\frac{1}{T} r_{1}+\frac{T-1}{T} \frac{1}{T-1} \sum_{t=2}^{T} r_{t} | s_{0}=s\right] \\ &=\sum_{a \in A} \pi(s, a) \sum_{s^{\prime} \in S} P(s^{\prime}|s,a)\left(\frac{1}{T} R(s'|s,a)+\frac{T-1}{T} \mathbb{E}_{\pi}\left[\frac{1}{T-1} \sum_{t=1}^{T-1} r_{t} | s_{0}=s^{\prime}\right]\right) \\ &=\sum_{a \in A} \pi(s, a) \sum_{s^{\prime} \in S} P(s^{\prime}|s,a)\left(\frac{1}{T} R(s'|s,a)+\frac{T-1}{T} V_{T-1}^{\pi}\left(s^{\prime}\right)\right) \end{aligned} VTπ(s)=Eπ[T1t=1Trts0=s]=Eπ[T1r1+TT1T11t=2Trts0=s]=aAπ(s,a)sSP(ss,a)(T1R(ss,a)+TT1Eπ[T11t=1T1rts0=s])=aAπ(s,a)sSP(ss,a)(T1R(ss,a)+TT1VT1π(s))

对于无限步的情况,也可以类似展开得到如下结果:

V γ π ( s ) = ∑ a ∈ A π ( s , a ) ∑ s ′ ∈ S P ( s ′ ∣ s , a ) ( R ( s ′ ∣ s , a ) + γ V γ π ( s ′ ) ) V_{\gamma}^{\pi}(s)=\sum_{a \in A} \pi(s, a) \sum_{s^{\prime} \in S} P(s^{\prime}|s,a)\left(R(s'|s,a)+\gamma V_{\gamma}^{\pi}\left(s^{\prime}\right)\right) Vγπ(s)=aAπ(s,a)sSP(ss,a)(R(ss,a)+γVγπ(s))

上面这俩方程,姑且就叫做值函数递归方程(也叫贝尔曼方程?)。从值函数递归方程上看,我们可以知道,当模型已知,策略已知的情况下,我们其实是可以递归地求得在该策略下各个时刻的状态值函数。也就是说,从值函数的初始值 V 0 π V^\pi_0 V0π出发,通过一次迭代求得各个状态的一步奖赏 V 1 π V_1^\pi V1π,进而再通过一次迭代求得 V 2 π V_2^\pi V2π……

状态-动作值函数

状态-动作值表示的是在某状态下,执行动作 a a a后的一个平均累积奖赏。它和状态值函数相比,因为动作给定了,所以不再计算关于动作的期望。即:

{ Q T π ( s , a ) = ∑ s ′ ∈ S P ( s ′ ∣ s , a ) ( 1 T R ( s ′ ∣ s , a ) + T − 1 T V T − 1 π ( s ′ ) ) Q γ π ( s , a ) = ∑ s ′ ∈ S P ( s ′ ∣ s , a ) ( R ( s ′ ∣ s , a ) + γ V γ π ( s ′ ) ) \left\{\begin{array}{l}{Q_{T}^{\pi}(s, a)=\sum_{s^{\prime} \in S} P(s^{\prime}|s,a)\left(\frac{1}{T} R(s'|s,a)+\frac{T-1}{T} V_{T-1}^{\pi}\left(s^{\prime}\right)\right)} \\ {Q_{\gamma}^{\pi}(s, a)=\sum_{s^{\prime} \in S} P(s^{\prime}|s,a)\left(R(s'|s,a)+\gamma V_{\gamma}^{\pi}\left(s^{\prime}\right)\right)}\end{array}\right. {QTπ(s,a)=sSP(ss,a)(T1R(ss,a)+TT1VT1π(s))Qγπ(s,a)=sSP(ss,a)(R(ss,a)+γVγπ(s))

所以,如果通过值函数递归方程算得了状态值函数,我们就可以通过上述表达来求得每一时刻的状态-动作值函数。

策略迭代和值迭代

策略迭代

通过以上的论述,相必大家有一定的想法来计算最优策略。一个自然而然的思路就是策略迭代算法。

算法的基本过程就是先随意给定一个策略,比如说 π ( s , a ) = 1 ∣ A ( s ) ∣ \pi(s, a)=\frac{1}{|A(s)|} π(s,a)=A(s)1,然后通过值函数递归表达式,算出该策略下每一个时刻的值函数。有了值函数,我们通过状态-动作值函数的表达式,可以求解每一个时刻的状态动作值。有了状态-动作值函数,我们可以通过关于动作最大化状态-动作值函数,进行更新策略: π ′ ( s ) = arg ⁡ max ⁡ a ∈ A Q π ( s , a ) \pi^{\prime}(s)=\underset{a \in A}{\arg \max } Q^{\pi}(s, a) π(s)=aAargmaxQπ(s,a)。有了更新后的策略,重复以上过程,直到收敛。这就是所谓的策略迭代算法,通过不断地迭代策略,来找到最优策略。容易证明,上述算法是收敛的。

值迭代

另一个经典的迭代方法是值迭代方法。用 V ∗ V^* V Q ∗ Q^* Q来表示最优策略 π ∗ \pi^* π下的状态值函数和状态-动作值函数。

容易想到的是,某一时刻某一状态下,最优值函数必然是最优策略下的状态-动作值函数关于动作的一个最大化,即:

V ∗ ( s ) = max ⁡ a ∈ A Q ∗ ( s , a ) V^{*}(s)=\max _{a \in A} Q^{{*}}(s, a) V(s)=aAmaxQ(s,a)

这个是容易证明的。简单地想,如果某个策略下的某一步的值函数不是最优的,那么一定可以改成状态-动作值的最大化相对应的策略,使状态值增大。

把这个写开,就成了:

{ V T ∗ ( s ) = max ⁡ a ∈ A ∑ s ′ ∈ S P ( s ′ ∣ s , a ) ( 1 T R ( s ′ ∣ s , a ) + T − 1 T V T − 1 ∗ ( s ′ ) ) V γ ∗ ( s ) = max ⁡ a ∈ A ∑ s ′ ∈ S P ( s ′ ∣ s , a ) ( R ( s ′ ∣ s , a ) + γ V γ ∗ ( s ′ ) ) \left\{\begin{array}{l}{V_{T}^{*}(s)=\max _{a \in A} \sum_{s^{\prime} \in S} P(s^{\prime}|s,a)\left(\frac{1}{T} R(s'|s,a)+\frac{T-1}{T} V_{T-1}^{*}\left(s^{\prime}\right)\right)} \\ {V_{\gamma}^{*}(s)=\max _{a \in A} \sum_{s^{\prime} \in S} P(s^{\prime}|s,a)\left(R(s'|s,a)+\gamma V_{\gamma}^{*}\left(s^{\prime}\right)\right)}\end{array}\right. {VT(s)=maxaAsSP(ss,a)(T1R(ss,a)+TT1VT1(s))Vγ(s)=maxaAsSP(ss,a)(R(ss,a)+γVγ(s))

上式是关于最优值函数的一个迭代公式,就被称为是贝尔曼最优性方程。其对应的最优状态-动作值函数为:

{ Q T ∗ ( s , a ) = ∑ s ′ ∈ S P ( s ′ ∣ s , a ) ( 1 T R ( s ′ ∣ s , a ) + T − 1 T max ⁡ a ′ ∈ A Q T − 1 ∗ ( s ′ , a ′ ) ) Q γ ∗ ( s , a ) = ∑ s ′ ∈ S P ( s ′ ∣ s , a ) ( R ( s ′ ∣ s , a ) + γ max ⁡ a ′ ∈ A Q γ ∗ ( s ′ , a ′ ) ) \left\{\begin{array}{l}{Q_{T}^{*}(s, a)=\sum_{s^{\prime} \in S} P(s^{\prime}|s,a)\left(\frac{1}{T} R(s'|s,a)+\frac{T-1}{T} \max _{a^{\prime} \in A} Q_{T-1}^{*}\left(s^{\prime}, a^{\prime}\right)\right)} \\ {Q_{\gamma}^{*}(s, a)=\sum_{s^{\prime} \in S} P(s^{\prime}|s,a)\left(R(s'|s,a)+\gamma \max _{a^{\prime} \in A} Q_{\gamma}^{*}\left(s^{\prime}, a^{\prime}\right)\right)}\end{array}\right. {QT(s,a)=sSP(ss,a)(T1R(ss,a)+TT1maxaAQT1(s,a))Qγ(s,a)=sSP(ss,a)(R(ss,a)+γmaxaAQγ(s,a))

由贝尔曼最优性方程,容易知道,我们不需要通过策略迭代,一次性就可以把最优策略 π ∗ \pi^* π下的值函数统统求出来。由此,所谓的值迭代算法,就不言而喻了。或通过迭代贝尔曼公式,或通过迭代最优动作价值函数进而关于动作求最大化,都能够求得最优策略。不再细述。

Q学习、SARSA、时序差分学习

强化学习的算法除了值迭代和策略迭代,比较经典的还有Q learning、Sarsa和TD(时序差分),最新的算法还有SAC和TD3等。这些算法的目标都是最大化值函数,都大同小异,可以简单地理解成求动作值函数的各种不同的方法,若只想浅窥深度学习,而不做细致研究,不必再在乎这些算法的推导以及收敛性证明,在合适的情形下直接拿来用就好了。

Q学习

Q学习算法,需要了解Q表。Q-table 其实就是把状态和动作一个作为行标,一个作为列标搞成表格。我们要求状态-动作值函数( Q Q Q函数)其实也就是要想办法求出最优动作下的Q表。

具体的算法是先随意初始化一个Q表,然后随机地选择状态 s s s和动作 a a a,根据奖赏函数计算出奖赏 R R R,然后根据上述最优状态-动作值函数的迭代公式,更新Q表。如此反复,直到Q表不再变化。

看简单的例子链接或者链接,就很容易明白Q学习时怎么操作的了。

SARSA和时序差分学习

Sarsa是Q学习算法的改进。Sarsa和Q以及TD本质上都是一脉同根的。

对于三者的一个差别和理解,可以看这个链接

深度强化学习

所谓深度强化学习,只不过是用神经网络去表示出最优策略下的状态-动作值函数 Q ∗ ( s , a ) Q^*(s,a) Q(s,a)。有了 Q ∗ ( s , a ) Q^*(s,a) Q(s,a)的神经网络表示,下面的事情不就好办了?

为什么要用深度学习呢?因为当状态空间和动作空间很大的时候,甚至在连续的情况下,往往是连续的,用值迭代算法,或者Q学习算法,来计算 Q Q Q函数,计算量都太大。而我们知道,神经网络刚好就是来逼近一个复杂的高数据量的函数的,用它来表示 Q Q Q函数,岂不妙哉?基于这样一个想法,才有了深度强化学习。

深度学习需要提供训练数据,标签怎么找?可以将下一步的 Q Q Q值作为标签。直观上理解就是, Q Q Q值变化不大了,往往达到了最优。

但是若使用相同的网络来生成下一个目标 Q Q Q值和估计当前 Q Q Q值,会导致振荡性甚至发散。还有就是,深度学习要求样本之间相互独立且同分布,但强化学习样本并不满足这个条件。因此DQN中使用三个技巧来来解决这一系列问题:经验回放,目标网络和自适应性学习率调整方法。所以,深度强化学习就有了一系列可学习和研究的东西。

这个链接这个链接上有关于DQN的简单介绍,看看也就明白了。

一些学习资料

有几本理论比较清晰的书籍,见此GitHub

如果对于机器学习没有了解,可以看一下先修课程

张志华老师的视频教程1,提取码aqyf 视频教程2,提取码777p 视频教程3,提取码rjgi

另外,也可以在哔哩哔哩上搜索张志华老师的机器学习课程以及莫烦的python教程。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 点我我会动 设计师:上身试试 返回首页