强化学习
强化学习(reinforcement learning,RL)讨论的问题是智能体(agent)怎么在复杂、不确定的环境(environment)里面去最大化它能获得的奖励。
强化学习概念
智能体
做出动作,并影响于环境
环境
返回作用后的状态,和上一步的奖励
奖励
是由环境给可显示智能体在某一步采取某个策略的表现如何?
延迟奖励与序列生成
在一个强化学习环境里面,智能体的目的就是选取一系列的动作来最大化奖励,所以这些选取的动作 必须有长期的影响。
在做出游戏时当前帧对动作进行采样,生成很多局游戏。我们将当前的智能体与环境交互,会得到一系列观测。每一个观测可看成一个轨迹(trajectory)。 轨迹就是当前帧以及它采取的策略。
动作空间
离散动作空间(discrete action space)
连续动作空间(continuous action space)
策略
随机性策略(stochastic policy)就是 π 函数,即 $\pi(a|s)=p\left(a_t=a|s_t=s\right)$。输入一个状态 s,输出一个概率。这个概率是智能体所有动作的概率,然后对这个概率分布进行采样,可得到智能体将采取的 动作。比如可能是有 0.7 的概率往左,0.3 的概率往右,那么通过采样就可以得到智能体将采取的动作。
确定性策略(deterministic policy)就是智能体直接采取最有可能的动作,即 $a^*=\arg\text{max}\pi(a\mid s)$。
价值函数
对未来奖励的预测,我们用它来评估状态的好坏。
状态价值函数:反应在当前状态下我们使用策略 π 的时候,未来可以获得的奖励。
$V_\pi(s)\doteq\mathbb{E}\pi\left[G_t\mid s_t=s\right]=\mathbb{E}\pi\left[\sum{k=0}^\infty\gamma^kr{t+k+1}\mid s_t=s\right],\text{对于所有的}s\in S$
动作价值函数:反应在当前状态下我们做出动作a,未来可以获得的奖励。
$Q_\pi(s,a)\doteq\mathbb{E}\pi\left[G_t\mid s_t=s,a_t=a\right]=\mathbb{E}\pi\left[\sum{k=0}^\infty\gamma^kr{t+k+1}\mid s_t=s,a_t=a\right]$
Q:基于价值的智能体和基于策略的智能体有什么区别?
A:基于策略的智能体:智能体会制定一套动作策略(确定在给定状态下需要采取何种动作),并根据这个策略进行操作。强化学习算法直接对策略进行优化,使制定的策略能够获得最大的奖励。
基于价值的智能体:智能体维护一个价值表格或价值函数,并通过这个价值表格或价值函数来选取价值最大 的动作。基于价值迭代的方法只能应用在不连续的、离散的环境下。
Q:有模型智能体与无模型只智能体的区别
A:
如果这个四元组中所有元素均已知,且状态集合和动作集合在有限步数内是有限集,则智能体都已知这些可以对真实环境进行建模,构建一个虚拟世界来模拟真实环境中的状态和交互反应。具体来说,智能体知道状态是如何转移的和奖励函数是如何产生的,它就能知道在某一状态下执行某一动作后能带来的奖励和环境的下一状态,这样智能体就可以直接在虚拟世界中学习和规划策略(动态规划算法)即可。
无模型强化学习没有对真实环境进行建模,智能体只能在真实环境中通过一定的策略来执行动作,等待奖励和状态迁移,然后根据这些反馈信息来更新动作策略,这样反复迭代直到学习到最优策略。所以无模型强化学习是通过不断地探索来进行学习的。
Q:强化学习与监督学习的区别
监督学习:
- 监督学习的数据时符合一个独立同分布的(相互之间没有关系)
- 做出预测之后我们直接告诉他预测结果的对错,进而计算损失函数来训练神经网络。
强化学习:
- 是通过与环境进行交互,每个输入的状态之间有很强的连续性,
- 当智能体(神经网络)做出动作后不会立刻收到反馈,也不能很清楚的知道对错。学习器需要自己去发现哪些动作可以带来 最多的奖励,只能通过不停地尝试来发现最有利的动作
- 智能体获得自己能力的过程,其实是不断地试错探索(trial-and-error exploration)的过程。探索 (exploration)和利用(exploitation)是强化学习里面非常核心的问题。
强化学习既不属于监督学习也不属于无监督学习,它是一种独立的机器学习范式。
马尔科夫决策过程
智能体交互过程
智能体得到环境的状态后,它会采取动作,并 把这个采取的动作返还给环境。环境得到智能体的动作后,它会进入下一个状态,把下一个状态传给智能体。
马尔可夫性质
指一个随机过程在给定现在状态及所有过 去状态情况下,其未来状态的条件概率分布仅依赖于当前状态
马尔可夫过程是一组具有马尔可夫性质的随机变量序列 s1, · · · , st,其中下一个时刻的状态 $s_{t+1}$ 只取 决于当前状态 st。我们设状态的历史为 $h_t={s_1,s_2,s_3,\ldots,s_t}$(ht 包含了之前的所有状态),则马尔可夫 过程满足条件
$p\left(s_{t+1}\mid s_t\right)=p\left(s_{t+1}\mid h_t\right)$
贝尔曼期望方程
是当前状态与未来状态的迭代关系,表示当前状态的价值函数可以通过下个状态的价 值函数来计算。
所以说贝尔曼方程定义了状态之间的迭代关系,即
$V(s)=R(s)+\gamma\sum_{s’\in S}p\left(s’\mid s\right)V\left(s’\right)$
时序差分学习
(temporal-difference learning,TD learning)的方法
马尔可夫奖励过程的转移
$P_{\pi}\left(s’\mid s\right)=\sum_{a\in A}\pi(a\mid s)p\left(s’\mid s,a\right)$
Q 函数也被称为动作价值函数(action-value function)。Q 函数定义的是在某一个状态采取某一个动作,它有可能得到的回报的一个期望,即
$Q_\pi(s,a)=\mathbb{E}_\pi\left[G_t\mid s_t=s,a_t=a\right]$
推导过程:
贝尔曼期望方程
$V_{\pi}(s)=\mathbb{E}{\pi}\left[r{t+1}+\gamma V_{\pi}\left(s_{t+1}\right)\mid s_{t}=s\right]$
策略评估
马尔可夫决策过程控制
策略评估是指给定马尔可夫决策过程和策略,我们可以估算出价值函数的值。如果我们只有马尔可夫 决策过程,那么应该如何寻找最佳的策略,从而得到最佳价值函数(optimal value function)呢
$V^*(s)=\max_{\pi}V_\pi(s)$
我们搜索一种策略 π 让每个状态的价值最大。V ∗ 就是到达每一个状态,它的值的最 大化情况。在这种最大化情况中,我们得到的策略就是最佳策略,
$\pi^*(s)=\arg\max_\pi V_\pi(s)$
Q:策略迭代与价值迭代的区别
策略迭代分两步。首先进行策略评估,即对当前已经搜索到的策略函数进行估值。得到估值后,我们进行策略改进, 即把 Q 函数算出来,进行进一步改进。不断重复这两步,直到策略收敛。价值迭代直接使用贝尔曼最优方程进行迭代,从而寻找最佳的价值函数。找到最佳价值函数后,我们再提取最佳策略。
面试问题
2-1 友善的面试官: 请问马尔可夫过程是什么?马尔可夫决策过程又是什么?其中马尔可夫最重要的 性质是什么呢?
2-2 友善的面试官: 请问我们一般怎么求解马尔可夫决策过程?
2-3 友善的面试官: 请问如果数据流不具备马尔可夫性质怎么办?应该如何处理?
2-4 友善的面试官: 请分别写出基于状态价值函数的贝尔曼方程以及基于动作价值函数的贝尔曼方程。
2-5 友善的面试官: 请问最佳价值函数 V ∗ 和最佳策略 π∗ 为什么等价呢?
2-6 友善的面试官:能不能手写一下第 n 步的价值函数更新公式呀?另外,当 n 越来越大时,价值函 数的期望和方差是分别变大还是变小呢?
强化学习方法——表格方法
如图所示,在 t − 1 时刻,我看到熊对我招手,下意识的动作就是逃跑。熊看到有人逃跑,就可能觉得发现了猎物,并开始发动攻击。而在 t 时刻, 我如果选择装死的动作,可能熊咬咬我、摔几下就觉得挺无趣的,可能会走开。这个时候我再逃跑,可能 就成功了,这就是一个序列决策过程。
在多次尝试和熊打交道之后,我们就可以对熊的不同的状态做出判断,用状态动作价值来表达在某个 状态下某个动作的好坏。如图 3.6 所示,如果 Q 表格是一张已经训练好的表格,这张表格就像是一本生 活手册。通过查看这本手册,我们就知道在熊发怒的时候,装死的价值会高一点;在熊离开的时候,我们 偷偷逃跑会比较容易获救。
Q: 为什么我们可以用未来的总奖励来评价当前动作是好是坏?
这是因为在现实世界中奖励往往是延迟的,所以强化学习需要学习远期的奖励。我们一 般会从当前状态开始,把后续有可能会收到的所有奖励加起来计算当前动作的 Q 值,让 Q 值可以真正代 表当前状态下动作的真正价值。
无模型的预测——蒙特卡洛方法
蒙特卡洛方法是基于采样的方法,给定策略 π,我们让智能体与环境进行交互,可以得到很多轨迹。 每个轨迹都有对应的回报:
$G_t=r_{t+1}+\gamma r_{t+2}+\gamma^2r_{t+3}+\ldots $
我们求出所有轨迹的回报的平均值,就可以知道某一个策略对应状态的价值,即
$V_\pi(s)=\mathbb{E}_{\tau\sim\pi}\left[G_t\mid s_t=s\right]$
蒙特卡洛 方法使用经验平均回报(empirical mean return)的方法来估计,它不需要马尔可夫决策过程的状态转移 函数和奖励函数,并且不需要像动态规划那样用自举的方法。
通过采样的办法计算它,从某个状态开始,把小船放到状态转移矩阵里面,让它“随波逐流”,这样就会产生一个轨 迹。产生一个轨迹之后,就会得到一个奖励,那么直接把折扣的奖励即回报 g 算出来。算出来之后将它积 累起来,得到回报 Gt。当积累了一定数量的轨迹之后,我们直接用 Gt 除以轨迹数量,就会得到某个状态 的价值。
我们使用蒙特卡洛方法得到的轨迹对应树上蓝色的轨迹,轨迹上的状态已经是决定 的,采取的动作也是已经决定的。我们现在只更新这条轨迹上的所有状态,与这条轨迹没有关系的状态都 不进行更新。
蒙特卡洛相比动态规划
蒙特卡洛方法相比动态规划方法是有一些优势的。首先,蒙特卡洛方法适用于环境未知的情况,而动 态规划是有模型的方法。蒙特卡洛方法只需要更新一条轨迹的状态,而动态规划方法需要更新所有的状态。 状态数量很多的时候(比如 100 万个、200 万个),我们使用动态规划方法进行迭代,速度是非常慢的。这 也是基于采样的蒙特卡洛方法相对于动态规划方法的优势。
无模型的预测——时序差分方法
时序差分方法的目的是对于某个给定的策略 π,在线地算出它的价值函数,即一步一步地(step-by-step)算。最简单的算法是一步时序差分(one-step TD), 即 TD(0)。每往前走一步,就做一步自举,用得到的估计回报$r_{t+1}+\gamma V(s_{t+1})$来更 新上一时刻的值 V (st):
$V\left(s_t\right)\leftarrow V\left(s_t\right)+\alpha\left(r_{t+1}+\gamma V\left(s_{t+1}\right)-V\left(s_t\right)\right)$
它相比动态规划不在记录所有的概率的回报了而是只计算自身概率的回报,相比蒙特卡洛他只需要一步时序差分
时序差分误差(TD error)$\delta=r_{t+1}+\gamma V(s_{t+1})-V(s_t)$。类比增量式蒙特卡洛方法,给定一个回合 i,我们可以更新 V (st) 来逼近真实的回报 Gt,具体更新公式为
$V\left(s_t\right)\leftarrow V\left(s_t\right)+\alpha\left(G_{i,t}-V\left(s_t\right)\right)$
比较时序差分方法和蒙特卡洛方法。
(1)时序差分方法可以在线学习(online learning),每走一步就可以更新,效率高。蒙特卡洛方法必 须等游戏结束时才可以学习。
(2)时序差分方法可以从不完整序列上进行学习。蒙特卡洛方法只能从完整的序列上进行学习。
(3)时序差分方法可以在连续的环境下(没有终止)进行学习。蒙特卡洛方法只能在有终止的情况下 学习。
(4)时序差分方法利用了马尔可夫性质,在马尔可夫环境下有更高的学习效率。蒙特卡洛方法没有假设环境具有马尔可夫性质,利用采样的价值来估计某个状态的价值,在不是马尔可夫的环境下更加有效。
通过调整TD的步数,可以进行蒙特卡洛方法和时序差分方法之间的权衡。如果 n = ∞,即 整个游戏结束后,再进行更新,时序差分方法就变成了蒙特卡洛方法。如果时序差分方法需要更广度的更新,就变成了动态规划方法(因为动态规划方法 是把所有状态都考虑进去来进行更新)。如果时序差分方法需要更深度的更新,就变成了蒙特卡洛方法。 n 步时序差分可写为
无模型的控制——策略迭代
策略迭代由两个步骤组成。第一,我们根据给定的当前策略 π 来估计价值函数;第二,得到估计的价值函数后,我们通过贪心的方法来改进策略,即
为了保证足够和有方向的探索,ε-贪心(ε-greedy)探索。ε-贪心是指我们有 1 − ε 的概率会按照 Q 函数来决定动作,通常 ε 就设一个很小的值,1 − ε 可能是 0.9,也就是 0.9 的概 率会按照 Q 函数来决定动作,但是我们有 0.1 的概率是随机的。通常在实现上,ε 的值会随着时间递减。
Sarsa:同策略时序差分控制
Sarsa 将原本时序差分方法更新 V 的过程,变成了更新 Q,Sarsa 属于单步更新算法,每执行一个动 作,就会更新一次价值和策略。
$Q\left(s_t,a_t\right)\leftarrow Q\left(s_t,a_t\right)+\alpha\left[r_{t+1}+\gamma Q\left(s_{t+1},a_{t+1}\right)-Q\left(s_t,a_t\right)\right]$
Q 学习:异策略时序差分控制
Q 学习是一种异策略(off-policy)算法。异策略在学习的过程中,有两种不同的策 略:目标策略(target policy)和行为策略(behavior policy)。目标策略是我们需要去学习的策略,一 般用 π 来表示。行为策略是探索环境的策略,一般用 μ 来表示。行为策略可以大胆地去探索到所有 可能的轨迹,采集轨迹,采集数据,然后把采集到的数据“喂”给目标策略学习。
在异策略学习的过程中,轨迹都是行为策略与环境交互产生的,产生这些轨迹后,我们使用这些轨迹 来更新目标策略 π。异策略学习有很多好处。首先,我们可以利用探索策略来学到最佳的策略,学习效率高;其次,异策略学习可以让我们学习其他智能体的动作,进行模仿学习,学习人或者其他智能体产生的 轨迹;最后,异策略学习可以让我们重用旧的策略产生的轨迹,探索过程需要很多计算资源,这样可以节 省资源。
$Q\left(s_t,a_t\right)\leftarrow Q\left(s_t,a_t\right)+\alpha\left[r_{t+1}+\gamma\max_aQ\left(s_{t+1},a\right)-Q\left(s_t,a_t\right)\right]$
同策略与异策略的区别
在强化学习中,同策略(on-policy)和异策略(off-policy)是两种不同的学习方法,它们之间的主要区别在于它们如何处理采样的轨迹或经验。
- 同策略(On-policy):
- 在同策略方法中,学习算法使用与当前策略相同的策略来生成经验,并且使用这些经验来更新当前的策略。
- 具体来说,同策略方法通常使用蒙特卡洛方法或时序差分学习(如TD-learning),在每次迭代中直接利用当前策略生成的轨迹来更新策略。
- 由于同策略方法直接依赖于当前策略生成的经验,因此它们更容易收敛到局部最优解,但在处理探索和利用之间的权衡时可能会有一定的限制。
- 异策略(Off-policy):
- 在异策略方法中,学习算法使用与当前策略不同的策略生成经验,并且使用这些经验来更新一个或多个不同的目标策略。
- 具体来说,异策略方法通常利用重要性采样等技术来估计不同策略之间的期望值,然后使用这些估计来更新目标策略。
- 异策略方法具有更大的灵活性,因为它们可以利用已有数据来更新目标策略,而无需依赖于当前策略生成的轨迹。这使得异策略方法在探索和利用之间的权衡方面更加灵活。
面试
3-1 友善的面试官:同学,你能否简述同策略和异策略的区别呢?
3-2 友善的面试官:能否细致地讲一下 Q 学习算法,最好可以写出其 Q(s, a) 的更新公式。另外,它 是同策略还是异策略,原因是什么呢?
3-3 友善的面试官:好的,看来你对于 Q 学习算法很了解,那么能否讲一下与 Q 学习算法类似的 Sarsa 算法呢,最好也可以写出其对应的 Q(s, a) 更新公式。另外,它是同策略还是异策略,为什么?
3-4 友善的面试官:请问基于价值的方法和基于策略的方法的区别是什么?
3-5 友善的面试官:请简述一下时序差分方法。
3-6 友善的面试官:请问蒙特卡洛方法和时序差分方法是无偏估计吗?另外谁的方差更大呢?为什么?
3-7 友善的面试官:能否简单说一下动态规划方法、蒙特卡洛方法和时序差分方法的异同点?
策略梯度
Actor的策略决定了演员的动作,即给定一个输入,它会输 出演员现在应该要执行的动作。策略一般记作 π。假设我们使用深度学习来做强化学习,策略就是一个网络。网络里面有一些参数, 我们用 θ 来代表 π 的参数。
一场游戏称为一个回合。将这场游戏里面得到的所有奖励都加起来,就是总奖励(total reward),也就是回报,我们用 R 来表示它。
在一场游戏里面,我们把环境输出的 s 与演员输出的动作 a 全部组合起来,就是一个轨迹,即
给定演员的参数 θ,我们可以计算某个轨迹 τ 发生的概率为
总奖励使用 τ 策略出现的概率进行加权,对所有的 τ 进行求和,就是期望值。给定一个参数,我们可以计算期望值为
$\bar{R}\theta=\sum_\tau R(\tau)p_\theta(\tau)=\mathbb{E}{\tau\sim p_\theta(\tau)}[R(\tau)]$
我们要最大化期望奖励。因为我们要让奖励越大越好,所以可以使用梯度上升(gradient ascent)来最大化期望奖励。
我们对 ̄ Rθ 做梯度运算
由公式$\nabla f(x)=f(x)\nabla\log f(x)$得$\nabla p_\theta(\tau)=p_\theta(\tau)\nabla\log p_\theta(\tau)$
我们对 τ 进行求和,把 R(τ ) 和 log pθ(τ ) 这两项使用 pθ(τ ) 进行加权,既然使用 pθ(τ ) 进行加权,它们就可以被写成期望的形式。也就是我们从 pθ(τ ) 这个分布里面采样 τ ,去计算 R(τ ) 乘 ∇ log pθ(τ ),对所有可能的 τ 进行求和,就是期望的值(expected value)
可以看到最后的结果和奖励的正负成完全相关,我们用梯度上升来更新参数
更新完模型以后,我们要重新采样数据再更新模型。注意,一般策略梯度(policy gradient,PG) 采样的数据只会用一次。我们采样这些数据,然后用这些数据更新参数,再丢掉这些数据。接着重新采样 数据,才能去更新参数。
策略梯度实现技巧
增加基线
但在很多游 戏里面,奖励总是正的,最低都是 0。假设我们在某一个状态有 3 个动作 a、b、c 可以执行。根据式 (4.16),我们要把这 3 个动作的概率,对数概率都提高。但是它们前面的权重 R(τ ) 是不一样的。权重是有大有小的,权重小 的,该动作的概率提高的就少;权重大的,该动作的概率提高的就多。因为对数概率是一个概率,所以动 作 a、b、c 的对数概率的和是 0。所以提高少的,在做完归一化(normalize)以后,动作 b 的概率就是下 降的;提高多的,该动作的概率才会上升。
但是但我们真正在学习的时候,只是采样了少量的 s 与 a 的对。因为我们做 的是采样,所以有一些动作可能从来都没有被采样到。但我们可能只采样到动作 b 或者只采样到动作 c,没有采样到动作 a。但现在所有动作的 奖励都是正的,所以根据式 (4.16),在这个状态采取 a、b、c 的概率都应该要提高。我们会遇到的问题是, 因为 a 没有被采样到,所以其他动作的概率如果都要提高,a 的概率就要下降。所以 a 不一定是一个不好 的动作,它只是没有被采样到。
为了解决奖励总是正的的问题,我们可以把奖励减 b,即
分配合适的分数一个做法是计算某个状态-动作对的奖励的时候,不把整场游戏得到的奖励全部加起来,只计算从这 个动作执行以后得到的奖励。因为这场游戏在执行这个动作之前发生的事情是与执行这个动作是没有关系 的,所以在执行这个动作之前得到的奖励都不能算是这个动作的贡献。我们把执行这个动作以后发生的所 有奖励加起来,才是这个动作真正的贡献。
REINFORCE:蒙特卡洛策略梯度
我们介绍一下策略梯度中最简单的也是最经典的一个算法 REINFORCE。REINFORCE 用的是回合更新的方式REINFORCE 用的是回 合更新的方式,它在代码上的处理上是先获取每个步骤的奖励,然后计算每个步骤优化每一个动作的输出。所以我们在编写代码时会设计一个函数,这个函数的输入是每个步骤获取的 奖励,输出是每一个步骤的未来总奖励。因为未来总奖励可写为即上一个步骤和下一个步骤的未来总奖励的关系如式 (4.22) 所示,所以在代码的计算上,我们是从后往前 推,一步一步地往前推,先算 GT ,然后往前推,一直算到 G1。在代码上计算时,我们要获取神经网络的输出。神经网络会 输出每个动作对应的概率值(比如 0.2、0.5、0.3),然后我们还可以获取实际的动作 at,把动作转成独热 (one-hot)向量(比如 [0,1,0])与 log[0.2, 0.5, 0.3] 相乘就可以得到 log π(at|st, θ) 。
如图 4.18 所示,策略梯度预测每一个状态下应该要输出的动作的概率,即输入状态 st,输出 动作 at 的概率,比如 0.02、0.08、0.9。实际上输出给环境的动作是随机选择一个动作,比如我们选择向右 这个动作,它的独热向量就是(0,0,1)。我们把神经网络的输出和实际动作代入交叉熵的公式就可以求出 输出动作的概率和实际动作的概率之间的差距。但实际的动作 at 只是我们输出的真实的动作,它不一定 是正确的动作,它不能像手写数字识别一样作为一个正确的标签来指导神经网络朝着正确的方向更新,所 以我们需要乘一个奖励回报 Gt。Gt 相当于对真实动作的评价。如果 Gt 越大,未来总奖励越大,那就说 明当前输出的真实的动作就越好,损失就越需要重视。如果 Gt 越小,那就说明动作 at 不是很好,损失的 权重就要小一点儿,优化力度也要小一点儿。通过与手写数字识别的一个对比,我们就知道为什么策略梯 度损失会构造成这样。
面试题
4-1 友善的面试官:同学来吧,给我手动推导一下策略梯度公式的计算过程。
4-2 友善的面试官:可以说一下你所了解的基于策略梯度优化的技巧吗?
近端策略优化
策略梯度是同策略的算法,因为在策略梯度中,我们需要一个智能体、一个策略和一个演员。演员去与环境交互搜集数据,搜集很多的轨迹 τ ,根据搜集到的数据按照策略梯度的公式更新策略的参数,所以策略梯度是一个同策略的算法。同策略算法采集的数据只能用一次。 πθ 采样的轨迹 τ 求期望。一旦更新了参数,从 θ 变成 θ′ ,概 率 pθ(τ ) 就不对了,之前采样的数据也不能用了
重要度采样
假设我们有一个函数 f (x),要计算从分布 p 采样 x,再把 x 代入 f ,得到 f (x)。我们该怎么计算 f (x) 的期望值呢?假设我们不能对分布 p 做积分,但可以从分布 p 采样一些数据 xi。把 xi 代入 f (x),取 它的平均值,就可以近似 f (x) 的期望值
假设我们不能从分布 p 采样数据,只能从另外一个分布 q 采样数据 x,q 可以 是任何分布。如果我们从 q 采样 xi,就不能使用式 (5.2)。因为式 (5.2) 是假设 x 都是从 p 采样出来的。所以我们做一个修正,期望值 Ex∼p[f (x)] 就是 f (x)p(x)dx。所以我们从 q 里面采样 x,再计算 f (x) p(x) q(x) ,再取期望 值。所以就算我们不能从 p 里面采样数据,但只要能从 q 里面采样数据,就可以计算从 p 采样 x 代入 f 以后的期望值
因为是从 q 采样数据,所以我们从 q 采样出来的每一笔数据,都需要乘一个重要性权重(importance weight) p(x) q(x) 来修正这两个分布的差异。
但是在实现上,p 和 q 的差距不能太大。差 距太大,会有一些问题。如果 p(x) q(x) 差距很大,f (x) p(x) q(x) 的方差就会很大。所以理论上它们的期望值一样,也就是,我们只要对分布 p 采样足够多次,对分布 q 采样足够多次,得到的结果会是一样的。但是如果我们采样的次数不够多,因 为它们的方差差距是很大的,所以我们就有可能得到差别非常大的结果。
Q:现在的数据是从 θ′ 采样出来的,从 θ 换成 θ′ 有什么好处呢? A:因为现在与环境交互的是 θ′ 而不是 θ,所以采样的数据与 θ 本身是没有关系的。因此我们就可以 让 θ′ 与环境交互采样大量的数据,θ 可以多次更新参数,一直到 θ 训练到一定的程度。更新多次以后,θ′ 再重新做采样,这就是同策略换成异策略的妙处。
现在要做的就是把重要性采样用在异策略的情况中,把同策略训练的算法改成异策略训练的算法。怎 么改呢?
实际在做策略梯度的时候,我们并不是给整个轨迹 τ 一样的分数,而是将每一个状态-动作对分开计 算。实际更新梯度的过程可写为
所以现在 st、at 是 θ′ 与环境交互以后 所采样到的数据。但是训练时,要调整的参数是模型 θ。所以我们要有一个修 正的项。
DQN
传统的强化学习算法会使用表格的形式存储状态价值函数${V_{π}(s)}$或动作价值函数${Q_{π}(s,a)}$,但是这样的 方法存在很大的局限性。例如,现实中的强化学习任务所面临的状态空间往往是连续的,存在无穷多个状态,在这种情况下,使用价值函数近似利用函数直接拟合状态价值函 数或动作价值函数,降低了对存储空间的要求,有效地解决了这个问题。
DQN就是使用神经网络来近似价值函数。
状态价值函数${V_{π}(s)}$可以评估当前环境的好坏
动作价值函数${Q_{π}(s,a)}$可以评估在当前状态做出某一个动作的好坏
有两种不同的方法可以衡量状态价值函数${V_{π}(s)}$ :基于蒙特卡洛的方法和基于时序差分的方法。
蒙特卡洛的方法 是训练完整的一轮再进行的训练,在训练的时候,它就是一个回归问题(regression problem)。网络的输出就是一个值, 我们希望在输入 sa 的时候,输出的值与之后的累计奖励 ${G_{a}}$越接近越好。
时序差分的方法,基于时序差分的方法不需要等到一整轮结束,只需要在某一个状态 st 的时候,采取动作 at 得到奖励 rt ,接下来进入状态 st+1,就可 以使用时序差分的方法。我们可以通过式 (6.2) 来使用时序差分的方法。
我们希望${V_{π}(S_t)}$与${V_{π}(S_{t+1})}$相减的损失与 rt 接 近,训练下去,更新${V_{π}}$的参数,我们就可以把函数学习出来。
时序差分方法的更新值函数时只依赖于单个时间步的奖励和后续状态的估计值,因此通常具有较低的方差。它不需要等待整个序列的结束,因此可以更频繁地进行更新,从而减少了方差。
${Q_{π}(s,a)}$代表在s状态下采取a动作后后边的策略仍然由策略 π决定会获得的奖励。
我们学习出一个 Q 函数以后,就可以找到一个新的策略 π′ ,策 略 π′ 会比原来的策略 π 要好(稍后会定义什么是好)。 再去学习它的 Q 函数,得到新的 Q 函数以后,再去寻找一个更好的策略。这样一直循环下去,策略就会 越来越好。
证明改成策略后价值函数会变好
证明改进一个策略的一部分之后$\max_aQ_\pi(s,a)=Q_\pi\left(s,\pi’(s)\right)$之后那么新的价值函数一定会比之前的价值函数要好
$V_\pi(s)=Q_\pi(s,\pi(s))$
$Q_\pi(s,\pi(s))\leqslant\max_aQ_\pi(s,a)$
$Q_\pi\left(s,\pi’(s)\right)=\max_aQ_\pi(s,a)$
DQN的技巧
目标网络
ε-贪心
回放缓冲区
- 减少与环境交互的次数:
- 通过回放缓冲区,可以减少与环境的交互次数,因为训练时不必依赖于实时的策略。过去的经验可以被重复利用,从而有效地增加了样本的利用率。
- 增加数据样本的多样性:
- 如果批量数据都具有相似性质,训练结果可能会受到影响。通过回放缓冲区,可以收集来自不同策略的经验,因此采样到的批量数据将更加多样化。这有助于提高网络的泛化能力和训练的稳定性。
- 提高训练效率和性能:
- 通过减少与环境的交互次数和增加数据样本的多样性,回放缓冲区可以提高训练的效率和性能。
为什么DQN的训练不需要依赖于实时的策略
DQN的训练过程与策略的收集是解耦的。策略的收集可以是通过任何一种实现。
DQN伪代码
面试
6-1 友善的面试官:请问深度 Q 网络是什么?其两个关键性的技巧分别是什么?
6-2 友善的面试官:那我们继续分析!你刚才提到的深度 Q 网络中的两个技巧————目标网络和经 验回放,其具体作用是什么呢?
6-3 友善的面试官:深度 Q 网络和 Q 学习有什么异同点?
6-4 友善的面试官:请问,随机性策略和确定性策略有什么区别吗?
6-5 友善的面试官:请问不打破数据相关性,神经网络的训练效果为什么就不好
演员评论家算法
演员-评论员算法是一种结合策略梯度和时序差分学习的强化学习方法
策略梯度算法回顾
在更新策略参数 θ 的时候,我们可以通过下边公式来计算梯度
$\nabla\bar{R_\theta}\approx\frac{1}{N}\sum_{n=1}^{N}\sum_{t=1}^{T_n}\left(\sum_{t^{\prime}=t}^{T_n}\gamma^{t^{\prime}-t}r_{t^{\prime}}^n-b\right)\nabla\log p_\theta\left(a_t^n\mid s_t^n\right)$
在这个描述中,首先智能体与环境进行交互,根据当前状态 s 采取动作 a 的概率可以由策略网络(参数为 θ)给出,即 pθ(at|st)。接下来,智能体在采取动作 a 后直到一轮结束的累积奖励,其中:
- $\sum_{t^{\prime}=t}^{T_n}\gamma^{t^{\prime}-t}r_{t}^n$ 表示从时间步 t 到游戏结束 T 的累积奖励的总和。
- γ 是折扣因子,通常取值为 0.9 或 0.99,用来衡量未来奖励的重要性,影响着长期奖励的权重。
- b 是基线值,用于减少累积奖励的方差,以帮助更稳定地估计动作的价值。减去基线值的目的是使得累积奖励的项在正负间波动,从而引导策略的调整方向。
综合起来,根据当前策略网络输出的动作概率和累积奖励,可以通过更新参数 θ 来调整策略,使得在给定状态 s 下采取动作 a 的概率适应奖励的变化,以达到优化智能体的目标。
这要求我们统计累积奖励但由于交互过程本身的随机性和我们采样的数量不够的原因,导致累积奖励的方差可能会非常大。
深度 Q 网络回顾
$Q(s,a)=\mathbb{E}{s’}[r+\gamma\max{a’}Q(s’,a’)|s,a]$
$L(\theta)=\frac{1}{N}\sum_i(Q(s_i,a_i;\theta)-y_i)^2$
y 是目标值
算法细节
随机变量 G 的期望值正好就是 Q 值,假设用$\mathbb{E}\left[G_t^n\right]$来代表 $\sum_{t^{\prime}=t}^{T_n}\gamma^{t^{\prime}-t}r_{t}^n$ 这一项,把 Q 函数套在这里就结束了,我们就可以把演员与评论员这两个方法结合 起来。
我们就可以把 Q 函数的值用V取代,这样两个网络的估计就会变为一个网络进而减少了误差
最后优势演员评论家算法的更新
算法流程
面试问题
9-1 友善的面试官:请简述一下异步优势演员-评论员算法(A3C),另外 A3C 是同策略还是异策略的模型呀?
9-2 友善的面试官:请问演员-评论员算法有何优点呢?
9-3 友善的面试官:请问异步优势演员-评论员算法具体是如何异步更新的?
9-4 友善的面试官:演员-评论员算法中,演员和评论员两者的区别是什么?
9-5 友善的面试官:演员-评论员算法框架中的评论员起了什么作用?
9-6 友善的面试官:简述异步优势演员-评论员算法的优势函数。
深度确定性策略梯度
Q 学习、深度 Q 网络等算法是没有办法处理连续的动作。
随机性策略与确定性策略进行解释。对随机性策略来说,输入某一个状态 s,采取某一个动 作的可能性并不是百分之百的,而是有一个概率的(就好像抽奖一样),根据概率随机抽取一个动作。而 对于确定性策略来说,它不受概率的影响。当神经网络的参数固定之后,输入同样的状态,必然输出同样 的动作,这就是确定性策略。
要输出离散动作,我们就加一个 softmax 层来确保所有的输出是动作概率,并且所 有的动作概率和为 1。要输出连续动作,我们一般可以在输出层加一层 tanh 函数,把输出限制到 [−1,1] 。
DDPG 是深度 Q 网络的一个扩展版本,可以扩展到连续动作空间。
深度 Q 网络与 DDPG 的联系如图 12.7 所示。深度 Q 网络的最佳策略是想要学出一个很好的 Q 网 络,学出这个网络之后,我们希望选取的那个动作使 Q 值最大。DDPG 的目的也是求解让 Q 值最大的那 个动作。演员只是为了迎合评委的打分而已,所以优化策略网络的梯度就是要最大化这个 Q 值,所以构 造的损失函数就是让 Q 取一个负号
最开始训练的时候,这两个神经网络的参数是随机的。所以评论员最开始是随机打分的,演员也随机 输出动作。但是由于有环境反馈的奖励存在,因此评论员的评分会越来越准确,所评判的演员的表现也会 越来越好。既然演员是一个神经网络,是我们希望训练好的策略网络,我们就需要计算梯度来更新优化它 里面的参数 θ 。
DDPG和A2C的actor网络在实现上的主要区别归结于它们各自策略的输出方式,这导致了确定性和随机性策略的不同。我们来具体看看这两种策略是如何实现的,以及为什么会产生这样的差异。
DDPG的Actor网络(确定性策略)
在DDPG中,actor网络直接输出给定状态下的动作值。这意味着网络的输出层直接对应于动作空间的维度,并且每个输出节点的值表示相应动作的具体数值。例如,如果动作空间是一个连续的二维空间,那么actor网络将有两个输出,每个输出直接对应一个动作的数值。
- 实现:使用全连接层构建网络,输出层的激活函数(如tanh或sigmoid)通常被用来确保输出动作的值在合理的范围内。网络直接从输入状态映射到动作值,没有任何概率分布的介入。
- 为什么是确定性:因为对于给定的输入状态,网络总是产生同一组动作值,没有随机性介入。策略是确定性的,因为它不依赖于随机过程来选择动作。
A2C的Actor网络(随机策略)
A2C中的actor网络输出的是动作的概率分布,而不是具体的动作值。对于离散动作空间,这通常意味着输出层有一个节点对应每个可能的动作,使用softmax函数来确保输出值形成一个概率分布。对于连续动作空间,actor可能输出参数来定义动作概率分布(例如,高斯分布的均值和标准差)。
- 实现:对于离散动作,网络通过softmax输出层产生每个动作的概率。对于连续动作,网络可能输出一组参数,这些参数定义了动作值的概率分布(例如,输出均值和方差来定义高斯分布)。
- 为什么是随机性:因为动作的选择依赖于输出概率分布,即使对于同一个输入状态,每次推断都可能根据概率分布随机选择不同的动作。这种随机性有助于探索,确保策略不会过早地陷入局部最优解。
产生确定性和随机性的原因
- 设计哲学:DDPG致力于在连续动作空间中找到精确控制的最优解,因此采用确定性策略直接输出动作值。而A2C采用随机策略来促进探索,适用于既有连续也有离散动作空间的环境。
- 网络输出:DDPG的网络输出是直接动作值,因此是确定性的;A2C的网络输出是动作的概率分布,因此是随机性的。
- 探索机制:DDPG通常依靠外部策略(如噪声添加)来引入探索,而A2C利用其随机策略本身的特性来探索。