Value iterationQ-learning 构成了强化学习 (Reinforcement Learning, RL) 的两个基本算法。 过去 10 年 RL 中的许多惊人壮举,例如 Atari 的 Deep Q-Learning 或 AlphaGo,都植根于这些基础。 在这篇博客中,我们将介绍 RL 用来描述世界的基础模型,即马尔可夫决策过程 (Markov decision process, MDP),以及执行 RL 的两种算法:value iteration 和 Q-learning。 在这篇博文结束时,您应该能够理解 value iteration 和 Q-learning 之间的联系,以及如何使用这些算法中的任何一种来学习最优策略。

这篇文章分为三个部分:

  • Markov decision processes
  • Value functions and Value iteration
  • Q-learning and Deep Q-learning

Markov Decision Processes

MDP 是一个 5 元组,描述由以下五个元素组成的环境:

  • States: State (通常表示为sss,译为状态) 是agent (一般译为智能体) 可以存在的世界上任何预定义的瞬时实例。在本文的其余部分,我们将使用变量 SSS 来表示世界上所有可能状态的集合,其中 s∈Ss\in Ss∈S 指的是单个状态。
  • Actions: Action (通常表示为aaa,译为动作)是由agent促成的事件,它可以将其从一种状态转换到另一种状态,前提是这种转换是可能的MDP。 我们将使用 AAA 来表示世界上所有可能的动作的集合,其中 a∈Aa\in Aa∈A 指的是单个动作。 我们注意到,动作可能没有确定性的后果。 例如,掷硬币可能不会每次都给您相同的结果! 动作具有确定性效果的程度由转移函数 (transition function) 描述。
  • Transition function: Transition function (通常表示为PPP或TTT,译为转移函数) 是一个函数,它定义了在给定当前状态和有动作的情况下移动到特定下一个状态的概率。 转移函数在数学上定义如下,T:S×A×S′→[0,1]T:S\times A\times S' \rightarrow [0,1]T:S×A×S′→[0,1].
  • Reward: Reward function (通常表示为RRR,译为奖励函数) 指定了一个实数值,该数值定义了处于某个状态、采取一个动作并转移在下一个状态的功效或“好”的衡量标准。 与转移函数类似,奖励定义如下,R:S×A×S′→RR:S\times A\times S' \rightarrow \mathbb{R}R:S×A×S′→R. 请注意,您最终进入的状态可能是无法控制的,因为状态转换可以是动态的。
  • Discount Factor: 可以使用 γ\gammaγ 指定折扣因子 (discount factor),其中γ∈[0,1)\gamma\in [0,1)γ∈[0,1)。 注意折扣因子非包含上限(即γ≠1\gamma\neq 1γ​=1)。 不允许γ=1\gamma = 1γ=1允许 MDP 在数学上更加稳健。 具体来说,RL 算法的目标通常是随着时间的推移最大化折扣奖励。 考虑无限时间(infinite horizon) MDP(即 MDP 永远不会结束)的情况,其中奖励总是正的。 如果折扣因子 γ\gammaγ 等于 1,那么未来折扣奖励的总和将是无限的,这使得 RL 算法难以收敛(即,知道它们何时可以停止确定在每个状态下应该采取哪些动作)。 因此,gammagammagamma 的选择对于 RL 算法的成功至关重要,例如 Q-learningvalue iteration

您可能已经阅读过一个称为马尔可夫链(Markov chains)的概念。 虽然本文不会涉及马尔可夫链,但了解马尔可夫链和马尔可夫决策过程之间的区别很重要,因为这两个概念共享马尔可夫属性(markov property)。

从根本上说,马尔可夫链由除了动作、奖励和折扣因子的马尔可夫决策过程的组成部分组成。 马尔可夫链中的agent无法控制他们的动作,是由世界在控制agent的行动。 在马尔可夫决策过程中,agent对结果有影响。 因此,马尔可夫链的转移函数被简单地定义为,T:S×S′→[0,1]T:S \times S' \rightarrow [0,1]T:S×S′→[0,1].

Markov Property: 当下一个状态仅取决于当前状态和当前动作并且独立于之前的状态和动作的历史时,马尔可夫属性成立。

Nota bene: 在某些 MDP 中,您可能会看到初始状态分布 (initial state distribution) 包含在 MDP 中。 虽然这仍然是一个有效的表示,但在本博客中,我们将保持对初始状态分布的不可知论。

Value functions 和 Value Iteration

Value function (通常表示为V(s)V(s)V(s),译为值函数) 是对给定 MDP 和策略 (policy, 描述agent在每个状态中采取哪些动作) 的任何给定状态 sss 可以收到的预期奖励的度量。正式地,一个策略 (表示为π:S→[0,1]∣A∣\pi : S \to [0,1]^{|A|}π:S→[0,1]∣A∣) 是以状态 sss 为条件的动作 a∈Aa\in Aa∈A 的概率分布。这个博客中,我们将考虑确定性的策略 (即对于单个动作aaa,π(s,a)=1\pi(s,a)=1π(s,a)=1;而对于其他动作a′≠aa'\neq aa′​=a,π(s,a′)=0\pi(s,a')=0π(s,a′)=0)。定义了策略后,我们现在可以在数学上定义策略的值函数:

Vπ(s)=E[∑t=0∞γtrt∣π,s0=s]V^\pi(s)=E \left[ \sum_{t=0}^{\infty}\gamma^t r_t \vert \pi, s_0=s \right]Vπ(s)=E[t=0∑∞​γtrt​∣π,s0​=s]

在确定性世界中,这种期望 (expectation) 可以忽略不计。 然而,一般来说,我们将期望包括在内,因为策略(例如,一个agent并不总是喜欢早餐吃同样的东西)和转移函数(例如,交通有多糟糕)可以描述非确定性属性我们要建模的问题。

值迭代 (Value Iteration) 的目标是找到最大化值函数的策略:

π∗(s)=arg max⁡π∈ΠVπ(s),∀s∈S\pi^*(s)=\argmax_{\pi\in \Pi} V^\pi(s), \forall s\in Sπ∗(s)=π∈Πargmax​Vπ(s),∀s∈S

在这个方程中 Π\PiΠ 表示 MDP 内所有可能策略的集合,π∗(s)\pi^*(s)π∗(s) 是最优策略 (optimal policy) 。值函数方程 (即 Vπ(s)=E[∑t=0∞γtrt∣π,s0=s]V^\pi(s)=E \left[ \sum_{t=0}^{\infty}\gamma^t r_t \vert \pi, s_0=s \right]Vπ(s)=E[∑t=0∞​γtrt​∣π,s0​=s]) 是遵循从状态 sss 开始的策略 π\piπ,直到沿着轨迹 (trajectory) 从 t=0t=0t=0 到 t=∞t=\inftyt=∞ 前进无限数量的时间步长 ttt(即,一系列 状态-动作对,(<s1,a1>,<s2,a2>,…)(<s_1,a_1>,<s_2,a_2>,\dots)(<s1​,a1​>,<s2​,a2​>,…)) ,其中累积的奖励 rtr_trt​ 通过乘以 γt\gamma_tγt​ 进行折扣。 这种折扣奖励的过程意味着,您越往未来走,奖励对处于状态 sss 的价值或“好”的影响就会越来越小。 调整 γ\gammaγ 允许您定义您的偏好,以优化短期和长期收益 (gain)。期望很重要,因为如前一段所述,转移可能是不确定的,因此期望提供了折扣奖励的标准化估计。

值迭代是一种计算算法,它提供了一种寻找最优策略的方法。 该算法通过迭代确定处于每个状态 sss 的值来工作,假设agent在该状态下在值函数的当前估计下采取最佳可能行动。 值迭代算法如下图所示。


该算法迭代地更新每个状态 sss 的值 V(s)V(s)V(s),直到达到一个值的变化可以忽略不计的点,如阈值 Δ0\Delta_0Δ0​ 所定义的。 请注意该算法中的第 7 行,其中我们考虑状态 sss、动作 aaa 和结果状态 s′s's′,序列为 <s,a,s′><s,a,s'><s,a,s′>。 第 7 行通过更新给定状态的值来工作,称为值更新,让人想起贝尔曼的最优条件 (Bellman’s optimality condition)。 这个条件说

V(s)=max⁡a∈AE[R(s,a,s′)+γmax⁡a′V(s′)]=max⁡a∈A∑s′∈ST(s,a,s′)[R(s,a,s′)+γV(s′)]V(s)=\max_{a\in A} E \left[ R(s,a,s') + \gamma \max_{a'} V(s') \right] = \max_{a\in A}\sum_{s'\in S}T(s,a,s') \left[ R(s,a,s') + \gamma V(s') \right]V(s)=a∈Amax​E[R(s,a,s′)+γa′max​V(s′)]=a∈Amax​s′∈S∑​T(s,a,s′)[R(s,a,s′)+γV(s′)]

当这个条件对给定状态 sss 成立时,我们会在第 8 行发现 temp−V(s)=0temp-V(s)=0temp−V(s)=0。 如果条件对所有状态 sss 都成立,则值函数已经收敛到最优值函数 V∗=Vπ∗V^*=V^{\pi *}V∗=Vπ∗,并且可以通过第 11 行简单地提取最优策略 π∗\pi^*π∗ 。从某种意义上说,值迭代通过迭代地假装或强制执行(第 7 行)贝尔曼最优条件成立,测量条件是否不成立(第 8 行),并在条件保持在可接受的误差范围内时终止(第 3 行)。

收敛后(即达到可接受的误差水平 Δ<Δ0\Delta < \Delta_0Δ<Δ0​),此值迭代返回一个值函数 V∗V^*V∗,它提供对未来预期奖励的估计,当遵循最优策略 π∗\pi ^ *π∗,以及最优策略本身。 为了完全清楚,我们应该注意到返回的实际值函数和策略只是近似最优的,在技术上将它们称为 V≈V∗V \approx V^*V≈V∗ 和 π≈π∗\pi \approx \pi^*π≈π∗ 会更准确 。

Nota Bene: 在一些教科书中,贝尔曼的更新方程可能会被另外定义,考虑到奖励函数独立于下一个状态 s′s's′,即
V(s)←max⁡aR(s,a)+∑s′T(s,a,s′)γV(s′)V(s) \leftarrow \max_a R(s,a)+\sum_{s'} T(s,a,s') \gamma V(s')V(s)←amax​R(s,a)+s′∑​T(s,a,s′)γV(s′)

现在让我们定义 Q-value (Q值) 和 Q-function (Q函数)。 与值函数类似,Q 函数是一种价值度量。 然而,与值函数不同的是,Q 函数测量在给定状态下采取特定动作的预期折扣奖励,即 R:S×A→RR:S\times A\rightarrow\mathbb{R}R:S×A→R。 我们将 Q-value 称为 Q 函数返回的值。

尽管 Q-learning 是用于估计 Q 值并因此从这些 Q 值优化策略的首选算法,但您也可以修改值迭代算法来求解 Q 值。

由于引入了 Q 函数,两种算法之间存在两个主要区别。 首先,由于 Q 函数依赖于状态和动作,我们需要遍历所有可能的动作(第 6 行)以及所有状态的集合。 其次,您会注意到更新规则(第 8 行)在合并 Q 函数后发生了变化。 由于对下一个状态 s′s's′ 的最优 Q 值 Q(s′,a′)Q(s',a')Q(s′,a′) 的估计取决于下一个动作 a′a'a′,我们需要替换来自算法 1 的第 7 行的 V(s′)V(s')V(s′) ,替换成算法 2 第 8 行中的max⁡a′Q(s′,a′)\max_{a'}Q(s',a')maxa′​Q(s′,a′)。

我们注意到算法 1 和 2 通常被称为“精确强化学习” (exact RL) 的风格,因为与强化学习中常用的函数逼近算法(即基于深度学习的强化学习)不同,在这里,我们保证能够解决真的、在误差 Δ\DeltaΔ 范围内、并且给定足够的计算资源 的最优 Q 值。 “近似”强化学习技术(例如深度强化学习)通常没有这样的保证。

那么,一个需要回答的重要问题是,“为什么我们不在实践中这样做而不是 Q-learning?” 不幸的是,RL 的大多数实际应用都包含太多的状态,甚至无法迭代一次,更不用说算法收敛到可接受的错误阈值所需的大量时间了。 因此,首选函数逼近算法,例如Deep Q-learning。

Q-Learning 和 Deep Q-learning

在讨论 Q-learning 本身之前,让我们定义一个称为贝尔曼残差 (Bellman Residual) 的术语。

δ(s,a,s′)=[R(s,a,s′)+γmax⁡a′Q(s′,a′)]−[Q(s,a)]\delta(s,a,s')=\left[ R(s,a,s') + \gamma\max_{a'}Q(s',a') \right] - \left[ Q(s,a) \right]δ(s,a,s′)=[R(s,a,s′)+γa′max​Q(s′,a′)]−[Q(s,a)]

由 δ\deltaδ 表示的贝尔曼残差计算 Q-learning 的测量误差,以描述给定转换序列 <s,a,s′><s,a,s'><s,a,s′> 时 Q 函数的当前估计有多错误。 当 Q 函数最优时,我们应该发现 Bellman 最优条件的修正形式成立:

Q(s,a)=E[R(s,a,s′)+γmax⁡a′∈AQ(s′,a′)]=∑s′T(s,a,s′)[R(s,a,s′)+γmax⁡a′∈AQ(s′,a′)]Q(s,a)=E\left[ R(s,a,s')+\gamma \max_{a'\in A} Q(s',a') \right]=\sum_{s'}T(s,a,s')\left[ R(s,a,s') + \gamma\max_{a'\in A} Q(s',a') \right]Q(s,a)=E[R(s,a,s′)+γa′∈Amax​Q(s′,a′)]=s′∑​T(s,a,s′)[R(s,a,s′)+γa′∈Amax​Q(s′,a′)]

当这个条件成立时,我们应该发现对于所有可能的转换序列 δ(s,a,s′)=0\delta(s,a,s')=0δ(s,a,s′)=0 。 然而,当我们第一次初始化 Q 函数时,就像我们在算法 3 的第 2 行中所做的那样,我们的 Q 函数几乎肯定会出错,并且 δ(s,a,s′)\delta(s,a,s')δ(s,a,s′) 不会等于零。 那么,我们如何改进我们的 Q 函数以使其正确呢?

Q-learning 的工作方式是将我们当前对 Q 函数 Q(s,a)Q(s,a)Q(s,a) 的估计与 Q 函数应该是什么的“点估计”“混合”,即 R(s,a,s′)+γmax⁡a′Q(s′,a′)R(s, a,s')+\gamma\max_{a'}Q(s',a')R(s,a,s′)+γmaxa′​Q(s′,a′)。 混合程度由以下等式中的超参数 α\alphaα 控制:

Q(s,a)=(1−α)Q(s,a)+α[R(s,a,s′)+γmax⁡a′Q(s′,a′)]Q(s,a)=(1-\alpha)Q(s,a)+\alpha \left[ R(s,a,s')+\gamma\max_{a'}Q(s',a') \right]Q(s,a)=(1−α)Q(s,a)+α[R(s,a,s′)+γa′max​Q(s′,a′)]

如果 α=1\alpha=1α=1,那么我们将完全忽略当前对 Q 函数的估计。 如果α=0\alpha=0α=0,那么我们完全忽略新信息。 在实践中设置 α\alphaα 的一个不错的起点是选择 α=0.99\alpha=0.99α=0.99,这将大部分重点放在 Q 函数的当前估计上。 但是,我们鼓励您尝试实验此参数!

Q-learning 的完整算法如下图所示。

重要的是要注意,与前面描述的贝尔曼方程版本不同,Q-learning 在其贝尔曼更新方程中不包括转移函数!在 Q-learning 中,我们改为模拟环境中的动作,并利用模拟期间访问的状态(即轨迹)来应用贝尔曼方程。算法中的模拟函数显示了在 Q-learning 中如何对轨迹进行采样。在轨迹的每个时间步中,我们使用 epsilon-greedy 采样策略来选择一个动作。如果随机采样的概率大于预定义的 ϵ\epsilonϵ 值,则我们贪婪地采样该动作,否则我们从所有动作的空间中随机采样一个动作。选择后,我们模拟该动作并观察该动作的下一个状态和收到的奖励。最后,我们将所有观察到的信息存储到内存缓冲区中,更新当前状态并重复此过程,直到达到最终状态。然后使用从每个模拟计算的轨迹通过 Bellman 更新方程(Q-learning 中的第 6 行)更新 Q 值。

没有转移函数使得 Q-learning 成为一种无模型 (model-free) 的 RL 算法,因为它不需要任何“世界”的先验知识来学习最优策略。 这种无模型特性很重要,因为在实践中,您很少能够访问实际应用程序中所有状态动作对的转移概率。

有了足够的时间和采样轨迹,Q-learning 将能够估计每个状态动作对的最优 Q 值。 然而,按照目前的构造,Q-learning 算法需要一个查找表来查找每个可能的状态动作对,并填写这些值。 现实世界任务中状态动作空间的大小使得维护 Q 值查找表是不可行的。 计算能力不足的一种可能解决方案是使用函数逼近技术,例如 Deep Q-learning。 术语“深度”来自使用神经网络参数化 Q 值。 因此,我们的目标不是学习 Q 值的表,而是转向学习可以为任何给定状态动作对输出 Q 值的神经网络的权重。 使用 Bellman 残差的平方作为我们的损失函数,我们可以应用反向传播算法 (backpropagation)(第 2 周介绍)来学习 Q 网络的权重。

与 Q-learning 相比,Deep Q-learning 更适合实际应用的三个主要原因是:

  • 内存不足:Q-learning 需要存储所有状态和动作的查找表,导致大多数现实应用对 RAM 的需求不可行。

  • 时间不够:Deep Q-learning 的训练速度通常要快得多,因为它能够结合批量梯度下降 (batched gradient descent) 和自适应优化 (adaptive optimization) 等技术。除此之外,Deep Q-learning 不需要收敛每个状态动作对的 Q 值。

  • 插值:Deep Q-learning 是一种函数逼近算法。因为 Q 网络近似于状态和动作的 Q 值,我们可以假设网络可以对相似的状态和动作对插入 q 值,即 Q(s,a)≈Q(s′,a′)Q(s,a)\approx Q(s',a')Q(s,a)≈Q(s′,a′) 如果 (s,a)≈(s′,a′)(s,a)\approx (s',a')(s,a)≈(s′,a′)。在实践中,Deep Q-learning 比为每个单独的状态-动作对寻求收敛更有效。但是,在某些病理情况 (pathological cases) 下,这可能不是真的,例如,当状态或行为的最轻微变化可能导致截然不同的结果时。

参考资源

[1] Bootcamp Summer 2020 Week 3 – Value Iteration and Q-learning

value iteration和Q-learning算法相关推荐

  1. 强化学习(二):Q learning 算法

    强化学习(一):基础知识 强化学习(二):Q learning算法 Q learning 算法是一种value-based的强化学习算法,Q是quality的缩写,Q函数 Q(state,action ...

  2. 【强化学习笔记】从 “酒鬼回家” 认识Q Learning算法

    1.背景 现在笔者来讲一个利用Q-learning 方法帮助酒鬼回家的一个小例子, 例子的环境是一个一维世界, 在世界的右边是酒鬼的家.这个酒鬼因为喝多了,根本不记得回家的路,只是根据自己的直觉一会向 ...

  3. Deep Q Network 算法

     Deep Q Network 算法前置基础知识: Reinforcement Learning 基本概念 Q Leaning算法原理 深度学习神经网络知识 Tensorflow.Pytorch.Py ...

  4. 强化学习入门 : 一文入门强化学习 (Sarsa、Q learning、Monte-carlo learning、Deep-Q-Network等)

    最近博主在看强化学习的资料,找到这两个觉得特别适合入门,一个是"一文入门深度学习",一个是"莫烦PYTHON". 建议:看资料的时候可以多种资料一起参考,一边调 ...

  5. q learning matlab,用Matlab实现简单的Q-learning算法(学习走出房间)

    看到一个简单有趣的Q learning例子,写了段matlab代码实现一下.有兴趣的请先阅读原文 链接 dbstop if error%stop at the error if it happens ...

  6. Online Learning算法理论与实践

    Online Learning是工业界比较常用的机器学习算法,在很多场景下都能有很好的效果.本文主要介绍Online Learning的基本原理和两种常用的Online Learning算法:FTRL ...

  7. Q learning

    今天继续写RL的exercise2,发现Q learning一直不收敛.本来就是个很简单的算法,改了好久都不知道fault在哪里,一开始以为是超参数调的不好,结果调了好久的参数都不行.后来发现自己犯了 ...

  8. 【Matlab】强化Q学习算法求解迷宫问题

    本篇博客向大家介绍一个利用强化Q学习求解迷宫问题的实例. 在这个问题中,机器人只能向上下左右四个方向移动.在每一步,基于机器人动作的结果,它被教导和再教导是否是一个好的动作,最终整个过程被一次又一次地 ...

  9. [强化学习实战]出租车调度-Q learning SARSA

    出租车调度-Q learning & SARSA 案例分析 实验环境使用 同策时序差分学习调度 异策时序差分调度 资格迹学习调度 结论 代码链接 案例分析 本节考虑Gym库里出租车调度问题(T ...

  10. [PARL强化学习]Sarsa和Q—learning的实现

    [PARL强化学习]Sarsa和Q-learning的实现 Sarsa和Q-learning都是利用表格法再根据MDP四元组<S,A,P,R>:S: state状态,a: action动作 ...

最新文章

  1. java object转int_Java字节码文件解析
  2. oracle10.2 管理工具,Oracle 10.2.0.5 EM管理器的BUG
  3. linux 块设备驱动(二)——块设备数据结构
  4. redis数据持久化到mysql_Redis【数据持久化篇】
  5. eclipse中设置svn的commit快捷键
  6. ubuntu - 安装hive
  7. 追债之旅(Dijkstra最短路)
  8. 信息学奥赛一本通 1121:计算矩阵边缘元素之和 | OpenJudge NOI 1.8 03:计算矩阵边缘元素之和
  9. 白话设计模式--行为型模式--Template Method模式(模板方法模式)
  10. 二叉树的inorder实现:递归、栈、Morris遍历
  11. 借助Grub4DOS的grldr启动Windows PE(软启动)
  12. 机器视觉OpenCV-sobel、robert、gauss算子边缘检测
  13. 数字逻辑电路(一、基本概述、数制及其转换)
  14. 使用Dreamweaver进行一个简单的图文混排1/HTML
  15. sqlserver中计算日期差
  16. 使用Python对Dicom文件进行读取与写入的实现(pydicom 和 SimpleITK)
  17. gcc ld链接脚语法简明讲解
  18. JavaScript:实现加密哈希SHA-256 算法(附完整源码)
  19. 搞机吧 | 刷rec、线刷、卡刷教程
  20. 【PIC】单片机基本概述

热门文章

  1. 通过read()读文件
  2. 神经网络基础-反向传播
  3. 弹出窗口与选择器(二)
  4. moment获取时间
  5. 2023 磨水笔主页开源html源码
  6. “可口可乐”的制作配方泄漏了!~囧~
  7. 苹果生产日期对照表2020_苹果官方确认:部分批次AirPodsPro会有声音故障问题
  8. 收藏优秀外贸平台B2B网站 开发国外客户用什么平台
  9. 万物互联重新定义“耳朵经济”,荔枝财报透露出什么行业信号?
  10. 一句话笔记-关于Linux挂载U盘乱码