跳转至

10 Reinforcement Learning

强化学习是机器学习的一个重要分支,与监督学习和无监督学习并列。它的核心思想是让智能体(Agent)通过与环境(Environment)的持续交互来学习如何采取行动,以最大化某种累积的奖励信号。这类似于人类或动物通过试错和从结果中学习来掌握技能的过程。

Example

10.1 Bellman equation

我们如何用数学的语言对 RL问题进行描述呢?

马尔可夫性质

马尔可夫性质指的是在给定当前状态的情况下,未来状态的分布仅依赖于当前状态,而不依赖于过去的状态。换句话说,当前状态包含了所有关于过去历史的信息,足以预测未来的状态。

在马尔可夫决策过程(Markov Decision Process, MDP)中,这一性质被用来定义一个数学框架,用于解决强化学习(Reinforcement Learning, RL)问题。MDP由五个元素组成:状态集(\(\mathcal{S}\))、动作集(\(\mathcal{A}\))、奖励函数(\(\mathcal{R}\))、转移概率(\(\mathbb{P}\))和折扣因子(\(\gamma\))。【其中,状态集表示所有可能的状态,动作集表示所有可能的动作,奖励函数描述了在特定状态下执行特定动作后获得的即时奖励,转移概率描述了从当前状态和动作转移到下一个状态的概率分布,而折扣因子则用于衡量未来奖励相对于即时奖励的重要性。】

整个过程大致如下:

  • 在时间步 t=0 时,环境采样一个初始状态 \(s_0 \sim p(s_0)\)

  • 然后,在每个时间步 t 从 0 开始直到任务完成:

    • 智能体选择一个动作 \(a_t\)
    • 环境根据奖励函数采样一个奖励 \(r_t \sim R(\cdot | s_t, a_t)\)
    • 环境根据状态转移概率采样下一个状态 \(s_{t+1} \sim P(\cdot | s_t, a_t)\)
    • 智能体接收到奖励 \(r_t\) 并观察到下一个状态 \(s_{t+1}\)

策略 \(\pi\) 是从状态集合 \(S\) 到动作集合 \(A\) 的一个函数,它规定了在每个状态下应采取的动作。

目标是找到最优策略 \(\pi^*\),以最大化累积折扣奖励:\(\sum_{t \geq 0} \gamma^t r_t\)。由于我们整个过程是伴随着随机性的,所以我们要找的最大的那个最优策略希望累计折扣奖励的期望最大化! $$ \pi^* = \arg \max_{\pi} \mathbb{E}\left[\sum_{t \geq 0} \gamma^t r_t | \pi \right] $$

with \(s_0 \sim p(s_0)\), \(a_t \sim \pi(\cdot | s_t)\), \(s_{t+1} \sim p(\cdot | s_t, a_t)\)

为了找到最好的策略,我们引入两个函数以评估每个状态以及每个状态/动作对的好坏

The value function at state \(s\), is the expected cumulative reward from following the policy from state \(s\): $$ V^\pi(s) = \mathbb{E}\left[\sum_{t\geq0} \gamma^t r_t | s_0 = s, \pi\right] $$ The Q-value function at state s and action a, is the expected cumulative reward from taking action a in state s and then following the policy: $$ Q^\pi(s, a) = \mathbb{E}\left[\sum_{t\geq0} \gamma^t r_t | s_0 = s, a_0 = a, \pi\right] $$ The optimal Q-value function Q is the maximum expected cumulative reward achievable from a given (state, action) pair: $$ Q^(s, a) = \max_{\pi}\mathbb{E}\left[\sum_{t\geq0} \gamma^t r_t | s_0 = s, a_0 = a, \pi\right] $$ 其中 Q 满足 Bellman equation: $$ Q^(s, a) = \mathbb{E}{s' \sim \mathcal{E}} \left[ r + \gamma \max Q^*(s', a') \mid s, a \right] $$ \(\mathcal{E}\) 代表环境的转移模型(transition model),它描述了在给定当前状态 s 和动作 a 的情况下,转移到下一个状态 s' 的概率分布。

该方程描述了当前状态-动作对 \((s,a)\) 的最优Q值与下一个状态 \(s'\) 的最优Q值之间的关系。那么最优策略 \(\pi^*\) 对应于在任何状态下选择由 \(Q^*\) 指定的最佳动作。

我们应当如何求解上述的方程呢?

Value iteration algorithm: Use Bellman equation as an iterative update $$ Q_{i+1}(s, a) = \mathbb{E} \left[ r + \gamma \max_{a'} Q_i(s', a') \mid s, a \right] $$ \(Q_i\) will converge to \(Q^*\) as \(i \rightarrow \infty\)

具体的算法过程可以看参考文章

这个方法有一个问题就是不可扩展性,因为我们需要对每一个 (s,a) 对求 Q (s,a) ,如果像游戏那样的,以每一种像素排列为一种状态,那么这个状态数会非常爆炸,这个方法就不是很有效了。

我们的方法是利用一个 function approximator 来估计 Q(s,a) ,使用神经网络来完成。

10.2 Q-learning

Q-learning: Use a function approximator to estimate the action-value function $$ Q(s,a;\theta) \approx Q^*(s,a) $$ 如果这个函数估计器是一个深度神经网络,那么这个方法就是 deep q-learning

我们如何训练整个估计过程?首先确定损失函数 $$ L_i(\theta_i) = \mathbb{E}{s, a \sim \rho(\cdot)} \left[ (y_i - Q(s, a; \theta_i))^2 \right] $$ 其中 $$ y_i = \mathbb{E}) \mid s, a \right] $$ 相应的 Backward Pass 过程,梯度的计算如下: $$ \nabla_{\theta_i} L_i(\theta_i) = \mathbb{E}}} \left[ r + \gamma \max_{a'} Q(s', a'; \theta_{i-1{s, a \sim \rho(\cdot); s' \sim \mathcal{E}} \left[ (r + \gamma \max Q(s, a; \theta_i) \right] $$ 神经网络的结构如下【以 Atari Games 为例】:} Q(s', a'; \theta_{i-1}) - Q(s, a; \theta_i)) \nabla_{\theta_i

但是这个基础的方法有一些问题:

  • 如果直接从连续的时间步中抽取样本进行训练,这些样本往往是高度相关的。例如,在一个游戏环境中,连续的动作和状态变化通常是逐步且渐进的,这会导致相邻样本之间的相似度很高。
  • 高度相关的样本会使得学习过程变得低效,因为神经网络很难从这些相似的样本中提取出有效的信息和模式。

于是我们引入经验回放池

  • 经验回放池通过存储大量的历史经验(即状态、动作、奖励和下一个状态的四元组 \((s_t,a_t,r_t,s_{t+1})\),并从中随机抽取小批量样本进行训练,打破了样本之间的相关性。
  • 这种随机抽样的方式确保了每次训练使用的样本是独立同分布的(i.i.d.),从而提高了学习的效率和稳定性。

我们每次训练的时候,每个时间步所需要做的操作是

  • 获取当前状态 \(s_t\),然后根据主网络【Q 为主网络,target Q 为目标网络】,选择使 \(Q(s_t,a;\theta)\) 最大的动作(一般我们采用的是 \(\epsilon\) - greedy 的政策,这里为了简单阐述)然后执行动作 \(a_t\) 得到奖励 \(r_t\) 和下一个状态 \(s_{t+1}\) 然后将该四元组 \((s_t, a_t, r_t, s_{t+1})\) 存入经验回放池 \(D\)

  • 接下来训练主网络,从经验回放池 \(D\) 中随机抽取一个小批量的经验样本,大小为 \(B\)。对于每个采样的经验 \((s,a,r,s′)\),计算目标值 \(y = r + \gamma \max_{a'} Q(s', a'; \theta_{\text{target}})\) ,然后计算主网络的 Q 值 \(Q(s,a;\theta)\),然后计算损失函数,然后计算关于主网络参数 \(\theta\) 的梯度,利用优化算法更新主网络参数

  • 最后定期更新目标网络,使用软更新【\(\theta_{\text{target}} \leftarrow \tau \theta + (1 - \tau) \theta_{\text{target}}\)】或者硬更新【\(\theta_{\text{target}} \leftarrow \theta\)】,更新目标网络。

伪代码如下

10.3 Policy Gradients

Q-Learning 有什么问题呢?Q函数可能非常复杂,尤其是在高维状态空间和动作空间中。这意味着对于每一个可能的状态-动作对 (s,a)(s,a),都需要估计一个精确的Q值。当状态和动作的数量非常大时,这变得极其困难。

robot grasping an object

机器人抓取物体:考虑一个机器人需要抓取一个物体的任务。在这个任务中,机器人的状态可以包括其关节的角度、速度、位置、物体的位置和姿态等。这些因素共同构成了一个非常高维的状态空间。

高维状态导致的问题:由于状态空间是高维的,因此存在大量的可能状态。每个状态又对应着多个可能的动作,这就导致了巨大的状态-动作对 (s,a)(s,a) 数量。在这种情况下,要精确地学习每一个状态-动作对的Q值是非常困难的

Q-learning通过学习动作价值函数(Q函数)来间接地找到最优策略。具体来说,它试图估计在每个状态下采取每个动作的预期累积奖励,然后根据这些Q值选择最优动作。而Policy Gradients方法直接优化策略参数,而不是显式地学习Q函数。策略 \(π(a∣s)\) 表示在给定状态下选择某个动作的概率分布。

Policy Gradients可以避免在高维状态空间中学习复杂的Q函数的问题。例如,在机器人抓取物体的任务中,策略可以简单地表示为“闭合你的手”,而不需要精确地估计每一个状态-动作对的Q值。


首先我们定义一类参数化策略 \(Π={π_θ,θ∈\mathbb{R}^m}\)。这里 \(π_θ\) 表示依赖于参数 \(θ\) 的策略【两者一一对应】,\(θ\) 是一个 \(m\) 维向量。

每个 \(π_θ\) 都是一个从状态空间 \(S\) 到动作空间 \(A\) 的映射,即 \(π_θ:\mathcal{S}→\mathcal{A}\) 或者更具体地,\(π_θ(a∣s)\) 表示在状态 \(s\) 下选择动作 \(a\) 的概率。

对于每个参数化策略 \(π_θ\),我们定义其价值函数 \(J(θ)\) 为: $$ J(\theta) = \mathbb{E}\left[\sum_{t \geq 0} \gamma^t r_t | \pi_\theta\right] $$ 我们希望找到最优策略 \(\theta^*\),使得 $$ \theta^* = \arg \max_{\theta} J(\theta) $$ 我们应该如何找到呢?最朴素的想法就是对 \(J(\theta)\) 关于 \(\theta\) 进行梯度上升

REINFORCE algorithm

\[ \begin{aligned} J(\theta) &= \mathbb{E}_{\tau \sim p(\tau; \theta)}[r(\tau)]\\ &= \int_{\tau} r(\tau)p(\tau; \theta)\text{d}\tau \end{aligned} \]

其中, \(r(\tau)\) 是轨迹 \(\tau\) 的累积奖励,\(\tau = (s_0, a_0, r_0, s_1, \ldots)\)

为什么 \(J(\theta)\) 可以写成上面那个式子?

首先我们要理解上面那个式子为什么是期望?因为即使我们给定了策略,每一步的选择仍然充满选择性,同时即使确定了状态和动作,与环境交互得到下一个状态时也存在随机性。然后理解 \(p(\tau;\theta)\) 的意思就是产生确定性操作状态 \((s_0, a_0, r_0, s_1, \ldots)\) 的概率

\(J(\theta)\) 关于 \(\theta\) 求导,得到 $$ \nabla_{\theta} J(\theta) = \int_{\tau} r(\tau) \nabla_{\theta} p(\tau; \theta) \text{d}\tau $$ 其中 $$ p(\tau;\theta) = \Pi_{t\ge0}p(s_{t+1}|s_t,a_t)\pi_\theta(a_t|s_t) $$ 我们发现如果我们要对上述式子的 \(\theta\) 求偏导会非常困难,于是我们需要对其做一些操作,【大致的思路我感觉是将乘法变成加法】 $$ \begin{aligned} \nabla_{\theta} J(\theta) &= \int_{\tau} r(\tau) \nabla_{\theta} p(\tau; \theta) d\tau \ &= \int_{\tau} r(\tau) \left( p(\tau; \theta) \frac{\nabla_{\theta} p(\tau; \theta)}{p(\tau; \theta)} \right) d\tau \ &= \int_{\tau} r(\tau) \nabla_{\theta} \log p(\tau; \theta) p(\tau; \theta) d\tau \ &= \mathbb{E}{\tau \sim p(\tau; \theta)} \left[ r(\tau) \nabla \end{aligned} $$ 那么对 } \log p(\tau; \theta) \right] \quad \text{(Can estimate with Monte Carlo sampling)\(\log p(\tau;\theta)\) 求导的结果就比较好了 $$ \begin{aligned} \log p(\tau; \theta) &= \sum_{t \geq 0} \log p(s_{t+1} | s_t, a_t) + \log \pi_\theta(a_t | s_t) \ \nabla_\theta \log p(\tau; \theta) &= \sum_{t \geq 0} \nabla_\theta \log \pi_\theta(a_t | s_t) \quad \text{(Doesn't depend on transition probabilities!)} \end{aligned} $$ 然后我们就可以利用蒙特卡洛方法来估计,得到 $$ \nabla_{\theta} J(\theta) \approx \sum_{t \geq 0} r(\tau) \nabla_{\theta} \log \pi_{\theta}(a_t | s_t) $$ 我们翻译一下上面这个公式,可以认为

  • If \(r(\tau)\) is high, push up the probabilities of the actions seen

  • If \(r(\tau)\) is low, push down the probabilities of the actions seen

虽然该梯度估计在期望意义上是无偏的(unbiased),即其数学期望正确地指向策略梯度的方向,但由于它依赖于完整的轨迹回报 \(r(τ)\),而 \(r(τ)\) 本身具有很高的方差,导致每次估计的波动很大。因此,尽管估计是无偏的,但高方差会显著降低学习的效率和稳定性,使得每次梯度更新可能偏离真实方向较远。

于是我们需要降方差

First idea: Push up probabilities of an action seen, only by the cumulative future reward from that state【这里的结果仍然是无偏的】

\[ \nabla_{\theta} J(\theta) \approx \sum_{t \geq 0} \left( \sum_{t' \geq t} r_{t'} \right) \nabla_{\theta} \log \pi_{\theta}(a_t | s_t) \]

Second idea: Use discount factor \(\gamma\) to ignore delayed effects【这里我们修改了奖励函数】

$$ \nabla_{\theta} J(\theta) \approx \sum_{t \geq 0} \left( \sum_{t' \geq t} \gamma^{t'-t} r_{t'} \right) \nabla_{\theta} \log \pi_{\theta}(a_t | s_t) $$ 但是我们如果仅仅只是使用轨迹价值的绝对值其实是没有什么意义的,因为可能价值都是正的,为我们一直在提升每个动作的概率,我们所期待的操作应该是提升那些比我期待的要好的操作,降低那些比我期待的要差的操作,于是为我们引入 baseline

那么我们的梯度就如下计算 $$ \nabla_{\theta} J(\theta) \approx \sum_{t \geq 0} \left( \sum_{t' \geq t} \gamma^{t'-t} r_{t'} - b(s_t) \right) \nabla_{\theta} \log \pi_{\theta}(a_t | s_t) $$ 那么我们应该如何选择这个 baseline 呢?回忆一下之前讲的 Q-function 和 value function,如果 \(Q^\pi (s_t,a_t) - V^\pi(s_t)\) 比较大的话,我们就觉得这个动作是好的 $$ \nabla_{\theta} J(\theta) \approx \sum_{t \geq 0} (Q^{\pi_{\theta}}(s_t, a_t) - V^{\pi_{\theta}}(s_t)) \nabla_{\theta} \log \pi_{\theta}(a_t | s_t) $$ 但是我们并不知道 Q 和 V,我们可以通过神经网络来学习吗?当然可以,引入 Actor-Critic Algorithm

Actor-Critic Algorithm

演员(Actor)是指策略函数 ,即学习一个策略来得到尽量高的回报。

评论家(Critic)是指值函数 ,对当前策略的值函数进行估计,即评估演员的好坏。

借助于价值函数,演员-评论家算法可以进行单步更新参数,不需要等到回合结束才进行更新。

大致的算法有两种:

Recurrent Attention Model (RAM)

借助强化学习,我们也优化处理图片识别的问题。

在人进行图片识别的过程中,往往不是直接全局观看,而常常是一部分一部分地看,然后综合起来。于是我们可以利用强化学习让机器知道应该如何看

评论区

对你有帮助的话请给我个赞和 star => GitHub stars
欢迎跟我探讨!!!