美文网首页
强化学习教程(1) - 先了解几个公式

强化学习教程(1) - 先了解几个公式

作者: Jtag特工 | 来源:发表于2021-08-21 22:24 被阅读0次

    强化学习教程(1) - 先了解几个公式

    对于学习强化学习的好处,大家已经了解很多了,这里就不多叙述了。
    开篇有几点想提醒新入门的同学,关于强化学习的难点。

    • 首先是要做好啃一些理论和公式的准备,虽然深度强化学习可以做到像调库一样使用成熟算法,但是有扎实的理论基础对于学习前沿论文还是一个必要的选项。
    • 第二是对算力的需求要有明确的考虑。比如我们调库可以很容易实现Atari游戏的对战,但是能打败计算机是需要用GPU或其他加速的,想用CPU训练几分钟就能通关还是不现实的。
    • 第三是对于强化学习和深度学习编程框架需要有一定的了解,这样一旦遇到问题才有更多的办法将理论转化成工具。

    这个小系列教程,我希望能够从理论、理论的代码实现、主要框架和工具、几个实际问题的例子以及强化学习的历史与流派五个方面来说明。

    第一步我们先尝试理解透理论,我们先从很多同学最不喜欢看的公式开始说起,这一关突破后,再结合代码看就更容易理解了。

    状态、动作和奖励

    强化学习的主体是一个Agent,它可以获取环境的状态S,通过动作A来对环境产生影响,最后从环境获取奖励R。强化学习就是一个通过寻找最佳的动作序列来获取最大的奖励的过程。

    假设最初的状态为S0,此时实施动作A0,获取奖励R1,之后的状态变成S1,再施以动作A1,获取奖励R2,状态变成S2,以此类推。

    我们考虑状态S的概率分布St和奖励R的概率分布Rt。

    在后面的符号中,我们使用Pr(S_t=s)来表示S_t=s时的概率。

    概率公式

    我们定义一个函数p(s',r,s,a),其值为Pr(S_t=s',R_t=r|S_{t-1}=s,A_{t-1}=a)
    为了让前后式看起来更一致些,我们把p(s',r,s,a)写作p(s',r | s,a)

    式子写成:p(s',r | s,a)=Pr(S_t=s',R_t=r|S_{t-1}=s,A_{t-1}=a)

    虽然写法变了,但是对于函数功能没有任何影响。

    如果不考虑奖励,我们可以定义一个三元函数,这个函数描述状态转移的概率:
    p(s',s,a)=Pr(S_t=s'|S_{t-1}=s,A_{t-1}=a)
    或者写作:p(s'|s,a)=Pr(S_t=s'|S_{t-1}=s,A_{t-1}=a)

    这两个函数的关系也容易理解,3元函数等于4元函数在所有奖励情况下的汇总加和:
    p(s',s,a)=\sum_{r\in R} p(s',r,s,a)
    或者写作:
    p(s' | s,a)=\sum_{r\in R} p(s',r | s,a)

    期望公式

    我们再将函数简化成二元的,只有状态s和动作a,这时我们定义这个函数r(s,a)表示对于奖励的数学期望。注意啦,这是个期望函数,所以名字从p变成了r。

    我们使用符号\mathbb{E}[X]表示随机变量X的数学期望,它的定义为\mathbb{E}[X]=\sum_x p(x)x。也就是等于每一项的值乘以它出现的概率。

    我们举个例子,比如掷骰子,点数为1,2,3,4,5,6,出现的概率分别为1/6。
    则数学期望为1 \times \frac{1}{6}+2 \times \frac{1}{6}+3 \times \frac{1}{6}+4 \times \frac{1}{6}+5 \times \frac{1}{6}+6 \times \frac{1}{6}= 3.5

    则定义r(s,a)=\mathbb E[R_t| S_{t-1}=s, A_{t-1}=a]
    我们将其按定义展开,得到:
    r(s,a)=\mathbb E[R_t| S_{t-1}=s, A_{t-1}=a]=\sum_{r\in R} r \times \sum_{s'\in S} p(s',r | s,a)

    其中,\sum_{r\in R} r是收益,而\sum_{s'\in S} p(s',r | s,a)是r收益的所有状态的概率和。

    最后,我们再定义一个“状态-动作-后继状态”的数学期望的函数r(s,a,s')=\mathbb{E}[R_t | S_{t-1}=s, A_{t-1}=a, S_t = s']

    因为指定了后继状态,其概率就是四元组函数值除以状态转移函数的值:\frac{p(s',r | s, a)}{p(s'|s,a)}。这样我们前面几个函数就串起来了。

    再根据数学期望的定义展开,得到:
    r(s,a,s')=\mathbb{E}[R_t | S_{t-1}=s, A_{t-1}=a, S_t = s']=\sum_{r\in R}r \times \frac{p(s',r | s, a)}{p(s'|s,a)}

    公式小结

    总结一下,我们定义了4个函数,两个概率函数,两个奖励的期望函数:
    公式1-1:p(s',r | s,a)=Pr(S_t=s',R_t=r|S_{t-1}=s,A_{t-1}=a) (四元组函数)
    公式1-2:p(s'|s,a)=Pr(S_t=s'|S_{t-1}=s,A_{t-1}=a) (状态转移函数)
    公式1-3:r(s,a)=\mathbb E[R_t| S_{t-1}=s, A_{t-1}=a]=\sum_{r\in R} r \times \sum_{s'\in S} p(s',r | s,a) (奖励的数学期望函数)
    公式1-4:r(s,a,s')=\mathbb{E}[R_t | S_{t-1}=s, A_{t-1}=a, S_t = s']=\sum_{r\in R}r \times \frac{p(s',r | s, a)}{p(s'|s,a)} ("状态-动作-后继状态"数学期望函数)

    其中,四元组函数用的最多。公式部分,一般的书都一笔带过,只有Sutton和Barto的《Reinforcement Learning》讲得比较细,我这里可能更加絮叨一些。

    另外,如果强化学习想要入门的话,建议从Sutton这本书开始学起。如果有一个人是强化学习之父的话,那就是Richard Sutton。Sutton在时序差分法和策略梯度法等方面有开创性的贡献。

    收益序列

    强化学习并不是贪婪法,并不是追究每一步的收益都是最大的。比如说下一局棋,目标是赢得这一局,而不见得是每一步都多吃一个子。这样我们希望获得的最优解,是每一步之和最大化。
    这个最大化的收益总和我们记为G_t,则
    G_t=R_{t+1}+R_{t+2}+R_{t+3}+...+R_T

    不过,上面的公式是在有限步的情况下是可用的。如果针对于无限步的情况,就会获取一个无穷大的结果,这样也就无法求所谓的最大值了。
    无穷级数的知识告诉我们,通过增加一个小于1大于0的折扣系数,我们就可以将无穷的序列之和变为一个有穷的值。
    加上折扣的公式为:
    G_t=R_{t+1}+\gamma R_{t+2}+\gamma^2R_{t+3}+\gamma^3R_{t+4}+...
    用求和符号可以记为:
    \sum_{k=0}^\infty \gamma^k R_{t+k+1}

    t+1时刻的回报期望和G_{t+1},使用上面的公式可得:
    G_{t+1}=R_{t+2}+\gamma R_{t+3}+\gamma^2R_{t+4}+\gamma^3R_{t+5}+...

    通过观察可以发现,如果将G_{t+1}乘以\gamma,则与G_t就差一个R_{t+1},即:
    G_t=R_{t+1}+\gamma G_{t+1}

    这个公式虽然简单,但是后面经常会用到。
    我们记作公式1-5:G_t=R_{t+1}+\gamma G_{t+1}

    我们举个例子来加深记忆,如果R_t是个常数1,而折扣率\gamma<1,则回报
    G_t=\sum_{k=0}^{\infty}\gamma^k=\frac{1}{1-\gamma}

    策略函数与动作价值函数

    要想改变收益,我们就需要进行一些选择,我们将从状态到选择动作的概率之间的函数叫做策略。
    我们用函数\pi(a,s)表示S_t=s, A_t=a时的概率。
    为了提醒我们对于每个s\in S,都有一个a\in A的概率分布,我们把这个函数写成像个条件概率一样的\pi(a|s)
    可表示为:\pi(a|s)=Pr[A_t=a |S_t=s]

    选择了一个策略之后,我们如何评价这个策略的绩效呢?我们再定义一个价值函数v_\pi(s),用来表示从状态s开始,使用\pi策略的收益的期望。

    同样,我们可以用\mathbb E_\pi[]来表示使用策略\pi时的数学期望值。
    这样,状态价值函数可以定义为:v_\pi(s)=\mathbb E_\pi[G_t |S_t=s]

    如果将数学期望用概率Pr来展开的话,可得:
    v_\pi(s)=\mathbb E_\pi[G_t |S_t=s]=\sum_g g \times Pr[G_t=g | S_t=s]

    使用折扣公式的话,可得到:
    v_\pi(s)=\mathbb E_\pi[G_t |S_t=s]=\mathbb E_\pi[\sum_{k=0}^\infty \gamma^k R_{t+k+1}|S_t=s]

    如果不只考虑状态s,还考虑动作a的话,也就是说,在状态s下采用动作a时的策略价值,可以写作:
    q_\pi(s,a)=\mathbb E_\pi[G_t |S_t=s,A_t=a]=\mathbb E_\pi[\sum_{k=0}^\infty \gamma^k R_{t+k+1}|S_t=s,A_t=a]
    公式虽然变长了,但是除了指定了a之外,并没有其它的变化。我们将这个函数q_\pi称为策略\pi的动作价值函数。

    再代入上节讲到的收益序列的递推关系式,可以得到
    公式1-6:v_\pi(s)=\mathbb E_\pi[G_t|S_t=s]=\mathbb E_\pi[R_{t+1}+\gamma G_{t+1}| S_t=s]

    马尔可夫决策过程与贝尔曼方程

    下面我们做一道习题,看看大家有没有理解上面的公式。题目为:用t时刻的动作价值函数q_\pi(s,a)来表示状态价值函数v_\pi(s)

    我们从状态价值函数的定义开始展开:
    v_\pi(s)=\mathbb E_\pi[G_t |S_t=s]=\sum_g g \times Pr[G_t=g | S_t=s]

    我们可以将Pr[G_t=g | S_t=s]展开成带动作a的形式\sum_g g \sum_a Pr[G_t=g, A_t=a | S_t=s]
    再用条件概率公式展开一下:\sum_g g \sum_a Pr[A_t=a|S_t=s]Pr[G_t=g | S_t=s, A_t=a]
    我们再将前面的\sum_g g移到中间去:\sum_a Pr[A_t=a|S_t=s]\sum_g g Pr[G_t=g | S_t=s, A_t=a]

    \sum_g g Pr[G_t=g | S_t=s, A_t=a]其实就是\mathbb E[G_t|S_t=s, A_t=a],再进一步看,这不就是q_\pi(s,a)么。
    再看前面的Pr[A_t=a | S_t=s],就是\pi(a|s)嘛,不能前面加个\sum_a就不认识了。

    将上面的结果整理下:
    公式1-7:v_\pi(s)=\sum_a \pi(a|s)q_\pi(s,a)

    我们继续努力,再来尝试用t+1时刻的状态价值函数表示t时刻的动作价值函数。思路还是跟上面的类似:

    \mathbb E_\pi[G_{t+1}|S_t=s,A_t=a]
    =\sum_g g Pr[G_{t+1}=g | S_t=s, A_t=a]
    =\sum_g g \sum_{s'}Pr[S_{t+1}=s', G_{t+1}=g | S_t=s, A_t=a]
    =\sum_g g \sum_{s'}Pr[S_{t+1}=s' | S_t=s, A_t=a]Pr[G_{t+1}=g| S_t=s, A_t=a, S_{t+1}=s']

    推到这一步,我们终于要让马尔可夫性出马了,要不然就推不下去了。
    马尔可夫性是指,当前状态只与上一个状态相关,而与之前的状态无关。
    所以我们可以将S_t=s, A_t=a这样跟上个状态相关的数据去掉。
    =\sum_g g \sum_{s'}Pr[S_{t+1}=s' | S_t=s, A_t=a]Pr[G_{t+1}=g| S_{t+1}=s']
    =\sum_{s'}Pr[S_{t+1}=s' | S_t=s, A_t=a] \mathbb{E}_{\pi}[G_{t+1}=g | S_{t+1}=s']
    =\sum_{s'}p(s'|s,a)v_{\pi}(s')

    q_{\pi}(s,a)=\mathbb{E}_{\pi}[G_t|S_t=s,A_t=a]
    =\mathbb{E}_{\pi}[R_{t+1}+\gamma G_{t+1} | S_t=s, A_t=a]
    =\mathbb{E}_{\pi}[R_{t+1} |S_t=s, A_t=a]+ \gamma\mathbb{E}_{\pi}[ G_{t+1} | S_t=s, A_t=a]
    =\sum_{s',r}p(s',r|s,a)[r + \gamma v_{\pi}(s')]

    我们整理一下:
    公式1-8: q_{\pi}(s,a)=\sum_{s',r}p(s',r|s,a)[r + \gamma v_{\pi}(s')]

    我们把公式1-6跟公式1-5 v_\pi(s)=\sum_a \pi(a|s)q_\pi(s,a) 结合起来,得到:
    公式1-9: v_\pi(s)=\sum_a \pi(a|s) \sum_{s',r}p(s',r|s,a)[r+\gamma v_{\pi}(s')]
    这个公式被称为v_{\pi}贝尔曼方程Bellman Equation.

    强化学习的目的:寻找最优策略和最优价值函数

    前面虽然公式推导比较多,但是基本脉络是很清晰的,我们不过是为了引入策略函数和价值函数两个函数。为了能够让这两个函数迭代求解,我们推导出了贝尔曼方程。

    万事俱备,我们后面的主要工作就是求最优策略和最优价值函数。

    我们将其形式化,最优值函数定义为:
    v_*(s)=\max_{\pi}v_{\pi}(s)

    最优策略我们用最优动作价值函数来表示,记作
    q_*(s,a)=\max_{\pi}q_{\pi}(s,a)

    二者之间的关系可以表示为:
    公式1-10:q_*(s,a)=\mathbb{E}[R_{t+1}+\gamma v_*(S_{t+1}) | S_t=s, A_t=a]

    我们将其代入贝尔曼方程:
    v_*(s)=\max_{a\in A(s)}q_{\pi_*}(s,a)
    v_*(s)=\max_{a}\mathbb{E}_{\pi_*}[G_t|S_t=s,A_t=a]
    我们代入公式1-5,得到
    v_*(s)=\max_{a}\mathbb{E}_{\pi_*}[R_{t+1}+\gamma G_{t+1}|S_t=s,A_t=a]
    通过公式1-10可以得到:
    公式1-11:v_*(s)=\max_{a}\mathbb{E}[R_{t+1}+\gamma v_*(S_{t+1}) | S_t=s, A_t=a]
    再根据公式1-8: q_{\pi}(s,a)=\sum_{s',r}p(s',r|s,a)[r + \gamma v_{\pi}(s')]
    可以得到:
    公式1-12:v_*(s)=\max_{a}\sum_{s',r}p(s',r|s,a)[r + \gamma v_*(s')]

    公式1-11和公式1-12就是价值函数的贝尔曼最优方程的两种形式。

    针对有限马尔可夫决策过程来说,公式1-12有独立于策略的唯一解。如果环境变化函数p是已知的,我们就可以用求解线性方程组的方法来求解最优价值函数。比如我们可以通过scipy库的optimize.linprog函数来进行这种计算。

    res = scipy.optimize.linprog(c,a_ub, b_ub, bounds=bounds, method='interior-point')
    

    有了最优价值函数之后,我们就可以通过贪婪法去搜索一个最优的策略。也就是说选择每一步价值函数最大的策略,就可以获取到这种策略。

    同样,根据公式1-8: q_{\pi}(s,a)=\sum_{s',r}p(s',r|s,a)[r + \gamma v_{\pi}(s')],我们还可以得到最优策略函数的贝尔曼最优方程:
    公式1-13:q_{*}(s,a)=\sum_{s',r}p(s',r|s,a)[r + \gamma \max_{a}q_{*}(s',a')]

    同样可以通过求解线性方程组的方式来获取最优策略函数的解。求得之后,对于每个状态,我们简化到只要使用最大的动作a就可以获取到一个最优策略。

    小结

    本章我们主要讲解了强化学习的基本概念以及贝尔曼最优方程。相信经过上面的讲解,大家对于贝尔曼最优方程的来龙去脉和为什么依赖于马尔可夫决策过程的特性都有了一定的了解。
    如果大家觉得对数学要求比较高也不用担心,因为后面我们将讲解的大部分都是基于无模型的方法,我们只要记得贝尔曼最优方程是个迭代的方程就好,后面我们用蒙特卡洛法、时序差分法、策略梯度法、执行者-评论者方法等都不需要太多的数学知识。像策略梯度定理证明之类的推导也只了解结论即可。

    欢迎来到强化学习的世界!

    相关文章

      网友评论

          本文标题:强化学习教程(1) - 先了解几个公式

          本文链接:https://www.haomeiwen.com/subject/ybiytltx.html