美文网首页
强化学习入门

强化学习入门

作者: 神的第57个名字 | 来源:发表于2021-01-29 14:28 被阅读0次

    强化学习通过序列决策控制智能体与环境交互,并且尝试获得最大奖励,其应用场景包括在机器人学、自动驾驶、推荐系统和健康医疗等领域。本文简单介绍强化学习理论的形式化和基本算法。

    强化学习方法的分类

    目前主流的强化学习算法主要分为两大类方法:基于值函数的方法和基于策略的方法。

    基于值函数的策略评估和策略提升:基于值函数算法的问题在于算法的收敛性没有保证,而且价值函数的很小波动可能会导致策略的决剧烈变化,在机器人控制中,这样的不稳定性将破坏机器人的物理系统。策略迭代的核心思想是基于值函数确定策略的方式,策略迭代的另一个缺点是策略提升(policy improvement)过程,在动作空间是连续的或者维数巨大的情况下,计算使得价值动作函数最大的动作a是困难的.

    策略梯度方法:直接在策略空间中进行搜索,包括原始策略梯度,但是问题在于高方差,包括各类偏差的引入,引入基线可以一定程度缓解高方差的问题。因此引进了一系列校正和近似算法,包括Actor-Critic结构等。

    强化学习的基本理论设定

    强化学习的基本理论由马尔可夫决策过程(Mackov Decision Process, MDP)发展而来,该系统由其状态、动作、奖励函数和转移概率对(\mathcal{S}, \mathcal{A}, \mathcal{R}, \mathcal{T})唯一决定.
    在MDP的设定中,假设系统当前所处状态为s_{t}\in \mathcal{S},我们采取动作a_{t} \in \mathcal{A},系统从环境中有一定概率P(s_{t+1} | s_{t}, a_{t})转移到新状态s_{t+1},并且得到一个与之对应的来自环境的即时奖励r(s_{t}, a_{t}),我们称某条特定轨迹\tau上的的即时奖励之和为对应于这条轨迹的回报,轨迹定义为序列\tau = (s_{0}, a_{0}, \cdots, s_{t}, a_{t}),那么我们有R(\tau) = \sum_{t=0}^{T}\gamma^{t}r(s_{t}, a_{t}, s_{t+1})。在状态独立的假设下,我们可以得到轨迹的分布,其实就是一个条件概率的连乘:(即时奖励函数)

    p(\tau) = d_{0}(s_{0})\Pi_{t=0}^{T}\pi(a_{t} | s_{t})T(s_{t+1} | s_{t}, a_{t}).

    根据当前状态采取动作的方式我们称之为策略,策略可以视为状态的函数或者动作空间上的分布,如果是前者,即下一步的动作由当前状态唯一确定,我们称之为确定型策略\pi, a=\pi(s);如果是后者,我们可以得到一个动作空间上的分布\pi(a|s),至于最后选什么动作可以采取贪心或者Boltzmann探索的方式. 注意到这两种情形下我们没对符号作出区分,均以\pi表示. 强化学习的目标是在轨迹分布上求期望回报的最大值:
    \begin{aligned} & \max_{\pi} J(\pi), \\ J(\pi) = \mathbb{E}_{\tau \sim p_{\pi}(\tau)} & [\sum_{t=0}^{T}\gamma^{t}r(s_{t}, a_{t})] \end{aligned}

    也就是我们需要对所有可能的\pi得到J(\pi)的最大值,其中T是探索环境的最大长度,也可以是无穷大,取T = \infty有时候对于理论分析来说比较方便. 通常来说我们假设转移概率模型是不需要提前知道的,也即在P(s_{t+1} |s_{t}, a_{t})未知的情况下我们也能得到一个好的策略,这是大多数强化学习模型所考虑的情形,即无模型学习(model-free learning)对于需要学习这一转移概率的模型,我们称之为基于模型的强化学习(model-based learning). 强化学习算法经常面临的一个问题称之为信用分配问题,或者说奖励与动作之间的不匹配问题,或者说长期奖励的分配问题,也就是当前的回报可能不是由所采取动作引起的,而是之前很多步所采取动作的结果.

    接下来我们需要引入两个常用的值函数:状态值函数和状态-动作值函数,状态函数通过从当前状态出发所得到的轨迹的期望回报为指标来衡量当前状态,
    V^{\pi}(s_{t}) = \mathbb{E}_{\tau\sim p_{\pi}(\tau|s_{t})}[\sum_{t'=t}^{T}\gamma^{t'-t}r(s_{t}, a_{t})]
    根据递归,我们可以得到状态值的 Bellman 等式:
    V^{\pi}(s) = \mathbb{E}_{p(s' | s, a)\pi(a | s)}[r(s, a, s') + \gamma V^{\pi}(s')]

    状态-动作值函数则多了对于当前状态下所采取动作的评价,
    Q^{\pi}(s_{t}, a_{t}) = \mathbb{E}_{\tau\sim p_{\pi}(\tau|s_{t}, a_{t})}[\sum_{t'=t}^{T}\gamma^{t'-t}r(s_{t}, a_{t})]
    同样根据递归我们有关于状态-动作值的Bellman等式:
    Q^{\pi}(s) = \mathbb{E}_{p(s' | s, a)}[r(s, a, s')] + \gamma\mathbb{E}_{p(s' | s, a)\pi(a' | s')}[Q^{\pi}(s', a')]

    关于状态值和状态动作值,我们根据定义可以得到这两个值之间的如下关系:
    V^{\pi}(s_{t}) = \mathbb{E}_{a_{t}\sim \pi(a_{t} | s_{t})}[Q^{\pi}(s_{t}, a_{t})]
    以及,
    Q^{\pi}(s_{t}, a_{t}) = r(s_{t}, a_{t}) + \gamma \mathbb{E}_{s_{t+1} \sim T(s_{t+1 | s_{t}, a_{t}})}[V^{\pi}(s_{t+1})]

    强化学习的求解思路总体来说可以分为两类:策略迭代和策略搜索. 前者依赖于价值函数的表格描述,后者依赖于对于策略梯度的近似. 直观上看,强化学习的目标就是极大化V(s_{0})s_{0}是体系的初始状态,对于有限状态和有限动作的空间,我们可以通过动态规划的方式得到V(s_{0})的最大值. 举个例子,假如计算s_{0}依赖于计算s_{1}s_{2}的值,而计算s_{1}的值依赖于计算s_{3}s_{4}的值,s_{2}依赖于计算s_{5}的值,那么为了得到s_{0}的值,我们就得往后迭代,最后将这些值往回递推得到当前策略下s_{0}的值,我们需要找到某个策略使得s_{0}的值最大.

    对于第一类方法策略迭代而言,其想法很直观,通过逼近最优状态动作值函数Q(s, a),并将最大动作值对应的动作作为当前状态下的所选动作。主要分为两步,

    • 策略评估(policy evaluation):在当前策略\pi下得到值函数Q^{\pi}(s, a),也就是用Q^{\pi}(s, a)作为当前策略的评价指标;
    • 策略提升(policy improvement): 根据当前值函数Q^{\pi}(s, a)得到新策略,在该策略下总是选择使得Q^{\pi}(s, a)最大的动作,即新的策略\pi^{*}之下,选择的动作为a = \argmax_{a}Q^{\pi}(s, a). 上述算法的最关键问题是如何从数据中近似状态动作值函数,这在统计学和机器学习中都被作为回归问题看待,各类技术被用来进行更好的值函数近似,包括最小二乘近似或者神经网络逼近等等.

    直接学习Q函数的方法也叫做Q学习,已有理论表明,在\alpha取合适值的情况下,Q学习被证明几乎确定地收敛到最优Q函数.

    第二类方法是进行直接策略搜索,既然我们想要找某个函数的最小值,最直接的策略就是最速下降法,也就是在梯度方向进行步长搜索找到最合适的下降步长,每次进行这样的操作,直到迭代收敛. 虽然\pi不是向量而是一个函数,对其求梯度在数学上也没有困难,此时我们得到的其实是J(\pi)\pi的泛函导数. 在更多实用的场合下,我们其实将策略函数和一个参数族之间作了一一对应,也就是用一个参数\theta \in \mathbb{R}^{n}去表征一个策略\pi,并将这个策略显式记为\pi_{\theta}. 这里顺带提一句,由于最速下降法只有一阶收敛速率,只适合在远离极值位置处时进行搜索,在接近极小点的位置,由于梯度很小,这也会让接近极小点的速率下降,这时候更适合用带有二阶梯度信息的牛顿下降法,机器学习也一直有一些领域致力于发展带有二阶信息的梯度下降法去求J(\theta)的极值,如ACKTR算法,考虑了分布空间而不是参数空间上的自然梯度,这一部分有了些积累,有空再开一篇.

    然而如果不对\pi所属的函数空间作出限制,我们无法数值求解上述泛函的极值. 在深度学习兴起之前,多是使用特殊函数类,譬如多项式函数类或者高斯函数类对\pi作逼近. 但目前我们多使用神经网络作为非线性函数逼近器去逼近策略\pi,在这种情况下,我们将策略记为\pi_{\theta},其中\theta是神经网络的参数.

    相比基于值函数的方法,策略梯度方法的优势在于其收敛性更有保证,尤其适用于使用神经网络作为函数逼近的方法中,其优势在于处理巨大的动作空间和状态空间,甚至是连续状态空间和动作空间。

    我们可以得到如下极大问题:
    \begin{aligned} \max_{\theta} J(\theta), & \\ J(\theta) = \mathbb{E}_{\tau \sim p_{\pi_{\theta}}(\tau)} [\sum_{t=0}^{T}\gamma^{t} & r(s_{t}, a_{t})] \end{aligned}
    梯度上升法能保证每次的迭代都是有提升的,但有一个最大的问题是会陷入局部极大值,而这个局部极大值可能表现很差.

    直接对参数\theta求梯度可以得到如下梯度的表达式:
    \nabla_{\theta}J(\pi_{\theta}) = \mathbb{E}_{\tau \sim p_{\pi_{\theta}}(\tau)} [\sum_{t=0}^{T}\gamma^{t}\nabla_{\theta}\log\pi_{\theta}(a_{t}|s_{t})(\sum_{t'=t}^{T}r(s_{t'}, a_{t'}) - b(s_{t}))]
    通常称A(s_{t}, a_{t}) = \sum_{t'=t}^{T}r(s_{t'}, a_{t'}) - b(s_{t})为优势函数,b(s_{t})为只依赖于状态的函数.

    但直接策略梯度方法一般不直接用于实际中,这主要是由于式(\ref{pg})虽然是策略梯度的无偏差估计量,但通常面临着高方差的问题,效果不太理想。而且,直接策略梯度算法面临着无法重用数据的问题,每当策略发生改变,新的梯度估计和之前梯度估计完全独立,因此没有用上历史信息。很多学者都对此提出一定的修正,这些修正的目的都是取得策略梯度逼近中偏差和方差之间的平衡。此处所引入的策略梯度中一般都会从回报G_{t}中减去基线价值,这个技巧能在保持偏差不变的基础上减小方差。通常选择的基线为状态价值函数,这样一来我们在梯度下降中使用优势来进行计算A(s, a) = Q(s, a) - V(s).

    注意之前提到的公式都是基于在策略的,也就是说收集数据的策略恰好就是我们想要优化的那个策略,这意味着一旦策略发生更新,那么之前的策略所收集的数据无法再次使用了,这类方式在对于数据获取比较困难的场合来说不是很友好. 我们可以通过离策略(off-policy)公式来复用数据,我们当前有一些轨迹来自于另一个策略\beta, 但是你想通过这些数据得到在当前策略\pi之下的轨迹回报,此时我们需要根据重要性采样来作出调整:
    \begin{aligned} J(\pi_{\theta}) & = \mathbb{E}_{\tau \sim \pi_{\theta}(\tau)}[\sum_{t=0}^{T}\gamma^{t}r(s, a)] \\ & = \mathbb{E}_{\tau\sim \pi_{\beta}(\tau)}[(\Pi_{t=0}^{T} \frac{\pi_{\theta}(a_{t} | s_{t})}{\pi_{\beta}(a_{t} | s_{t})}) \sum_{t=0}^{T}\gamma^{t}r(s, a)] \\ & \approx \sum_{i=1}^{n}\omega_{H}^{i}\sum_{t=0}^{T}\gamma ^{t}r_{t}^{i} \end{aligned}
    第一个等号的成立来自期望的定义.

    小结

    本文主要介绍了强化学习理论的形式化 -- MDP,后续的算法都会基于这些进行讨论,因此对于入门者来说还是需要了解的。同时介绍了基于值函数的方法和基于策略梯度的方法,这几乎涵盖了所有主流的强化学习算法(当然还有一类是结合了值函数近似和策略梯度逼近的方法,后续文章中会给出),后续将继续对一些强化学习算法给出记录和自己的理解.

    相关文章

      网友评论

          本文标题:强化学习入门

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