专栏首页磐创AI技术团队的专栏深度强化学习专栏(三)

深度强化学习专栏(三)

作者 | 小猴锅

编辑 | 安可

出品 | 磐创AI团队出品

磐创AI导读】:本篇文章是深度强化学习专栏的第三篇,讲了第四节无模型的强化学习方法,希望对大家有所帮助。查看上篇关于本专栏的介绍:深度强化学习(DRL)专栏开篇

目录:

1. 引言

  • 专栏知识结构
  • 从AlphaGo看深度强化学习

2. 强化学习基础知识

  • 强化学习问题
  • 马尔科夫决策过程
  • 最优价值函数和贝尔曼方程

3. 有模型的强化学习方法

  • 价值迭代
  • 策略迭代

4. 无模型的强化学习方法

  • 蒙特卡洛方法
  • 时序差分学习
  • 值函数近似
  • 策略搜索

5. 实战强化学习算法

  • Q-learning 算法
  • Monte Carlo Policy Gradient 算法
  • Actor Critic 算法

6. 深度强化学习算法

  • Deep Q-Networks(DQN)
  • Deep Deterministic Policy Gradient(DDPG)

7. 专栏小结

4 无模型的强化学习方法

在有模型(model-based)的强化学习方法中,我们拥有环境的完整描述(例如状态转移概率P和奖励R),所以可以使用动态规划的方法求解策略。然而在实际情况中,我们很少会拥有这么详细的环境信息(例如“Frozen Lake”游戏),这时就需要agent自己去探索环境,并寻找策略。我们称这种情况为无模型(model-free)的强化学习方法。这也是强化学习问题中最常使用的方法。

4.1 蒙特卡洛方法

蒙特卡洛方法(Monte Carlo Methods)又称为统计模拟方法,通过前面的学习,我们知道实际上Q值函数(动作-价值函数)其实就是一个期望,所以我们可以直接使用采样来代替期望。

蒙特卡洛方法的思想是:对于某个随机事件,如果我们想要得到该随机事件发生的概率,可以通过重复实验的方式,以该事件发生的频率来近似替代该事件发生的概率。

无模型的强化学习方法和上一节里介绍的策略迭代的方法思路很像,也同样由两部分组成:策略估计和策略改进。

1.策略估计和策略改进

在策略迭代方法中的策略估计部分,由于中间动作(或状态)的奖励R是已知的,所以只要按照当前策略走一遍,就可以得到当前状态的价值。而在无模型的强化学习方法中,由于不知道中间动作(或状态)的奖励,所以如果想要知道某个状态的价值,就需要从这个状态出发,按照当前策略,走完多个回合并得到多个累积奖励,然后计算这多个累积奖励的平均值作为当前状态的价值,即用采样去逼近真实的值,以“Frozen Lake”游戏为例,如下图所示:

图1 从S_2状态出发的多条路线的累积奖励

如图1所示,假设以S_2状态为例,从S_2状态出发直到终止状态,可以有多条路径,每条路径都可以得到一个累积奖励,我们将所有累积奖励的平均值作为当前状态S_2的状态价值,即:

仔细观察图1我们会发现,例如第二条路径,S_2状态和S_3状态都被访问了两次。根据计算每条路径的累积奖励的方式不同,蒙特卡洛方法可以分为两种:First-Visit Monte Carlo和Every-Visit Monte Carlo。在First-Visit Monte Carlo方法中,不管一个状态被访问了多少次,在计算累积奖励的时候只考虑第一次的访问。而在Every-Visit Monto Carlo方法中,如果一个状态被多次访问,则在计算累积奖励的时候,每一次的访问都会被考虑在内。

目前我们只考虑了状态的价值,同样的方法可以得到状态-动作价值(Q值):在状态S下采取动作a,之后遵循当前策略π获得的累计期望奖励就是Q^π (s,a)的价值。

在得到Q值函数后,策略改进的方法就和前面策略迭代方法中的策略改进方法一样,即:利用当前的Q值函数更新策略(策略就是采取具有Q值最大的按个动作),如果更新后的策略与之前的策略一致,则说明已经收敛,策略求解结束,否则继续执行策略估计。

Initialization:
Initial a polic π
For s in S:
    For a in A:
        Initial Q(s,a) and Return(s,a)
        c(s,a)=0
For i in range(k):
Generate an episode using π
For each state s appearing in the episode:
G ← the return that follows the first occurrence of s
Q(s_t,a_t)=(c(s_t,a_t)*Q(s_t,a_t)+G)/(c(s_t,a_t)+1)
c(s_t,a_t)++
end for
update policy π(s)=argmaxQ(s,a)
end for

蒙特卡洛算法

2.环境探索

在策略估计的时候还存在一个问题,我们是想通过计算策略π下,从状态S出发的多个路径的平均累积奖励,然而,一但确定了这个策略π,那么每次采取的动作必然有a_t=π(s_t)。即一但策略确定后,能够采取的动作也就确定了,所以不管走多少个回合,路径都是一样的,如此一来就没法进行策略估计了。所以我们需要有一个探索环境的办法。一种常用的方法是ε贪心(ε-greedy)搜索。

ε贪心搜索方法:首先初始一个概率ε,在进行策略估计的时候,以ε的概率随机选择一个动作,以1-ε的概率去根据当前的策略选择动作。考虑到刚开始进行策略估计的时候,应该更注重对环境的探索,而随着策略慢慢地改进,则应该更注重策略的利用。所以,初始的ε值较大,随着策略的不断改进,慢慢减小ε的值。

3.确定性的和非确定性的环境状态

“Frozen Lake”游戏有“无风”和“有风”两种游戏模式。“无风”模式下,游戏环境是确定的,即agent执行一个动作(例如右移或下移)后,到达的下一个状态是确定的,并且得到的奖励也是确定的,而在“有风”模式下,环境状态则不确定了。图6-10中的蒙特卡洛算法考虑的是非确定性的环境状态,所以采用取平均值的方式,希望能够近似替代真实的状态价值。如果是确定性的环境状态的话,就可以省去取平均值的操作,直接赋值为:Q(s_t,a_t)=G。

4.在策略(on-policy)和离策略(off-policy)

在策略(on-policy)和离策略(off-policy)是强化学习问题中常见的两个概念。在agent进行策略估计的时候,我们需要使用一些办法进行环境的探索,例如ε贪心搜索。在这种情况下,我们学到的策略π其实是带有探索的策略,如果我们在进行策略改进的时候,也使用该策略的话,则会导致我们最终得到的策略也是带有探索的策略。策略估计和策略改进都是用这种带有探索的策略的情况称为在策略(on-policy)。

然而我们更希望最终agent学到的策略是不带探索的,虽然在策略评估的时候我们避免不了使用探索策略,但是在策略改进的时候,我们可以有一些方法抵消掉探索对策略的影响,这种只在策略估计的时候使用带探索的策略,而在策略改进的时候只考虑不带探索的策略的方式称为离策略(off-policy)。在蒙特卡洛方法中我们可以使用重要性采样(importance sampling)技术实现离策略的算法。

4.2 时序差分学习

时序差分学习(Temporal-Difference Learning)是另一种无模型(model-free)的强化学习方法。蒙特卡洛方法不足的地方是它只能应用于回合步数有限的情况(因为蒙特卡洛方法只有在一个回合结束并得到一个奖励后,才能去更新一个状态的价值),然而现实问题中,很多问题并不能在有限的步数里结束,例如无人驾驶和机器人控制,而时序差分学习则可以应用于这类回合持续时间很长的任务。

1. 蒙特卡洛更新和时序差分更新

在蒙特卡洛方法里我们都是利用一个回合结束后得到的奖励来更新当前的Q值,这种更新的方式称为蒙特卡洛更新。我们希望可以尽早的更新Q值,而不是只有等到一个回合结束之后才能更新,这就是时序差分更新。

在蒙特卡洛算法中,更新Q值的公式为:

式1

公式1是将所有的累积奖励取平均值,假设c(s_t,a_t )=k,并用G_i表示第i次得到的奖励的话,公式1可以表示为:

式2

我们将公式2中的1/(k+1)看做一个参数α,我们称之为学习率,学习率的存在是为了Q值最终收敛,并且该参数的值随着时间递减。现在我们将公式2改写为一个更常用的形式:

式3

上式中的G-Q(s_t,a_t )称为蒙特卡洛误差。事实上,Q(s_t,a_t )的值其实就是agent在状态s_t下,执行动作a_t后,沿着当前策略走下去后所能得到的累积奖励的期望,是对奖励的一个估计值,而蒙特卡洛算法中走完一个回合后得到的G是真实的奖励值,时序差分学习希望用这个估计的奖励值替代真实的奖励值。因此,时序差分方法更新Q值的公式为:

式4

公式4中的

称为时序差分误差(TD误差),r_(t+1)+γQ(s_(t+1),a_(t+1))是公式3中G的近似值,公式4中的折扣因子γ(0≤γ≤1)在本专栏的2.1节中介绍过。如果去掉折扣因子γ,则有:

在介绍蒙特卡洛方法的时候,我们说到了确定性的和非确定性的环境状态,在时序差分学习方法中,如果环境状态是确定的,则Q值的更新公式为:

式5

2. Sarsa算法

Sarsa算法是时序差分学习的在策略版本,Sarsa算法的伪代码如下:

For s in S:
For a in A:
    Initialize Q(s,a)
For i in range(k):
Initialize S
Choose a using policy derived from Q (e.g.ε-greedy)
Repeat (for each step of episode):
Take action a,observe r and s
Choose a^' using policy derived from Q (e.g.ε-greedy)
Q(s, a) ← Q(s, a) + α[R + γQ(s^', a^') − Q(s, a)]
s ←s^'; a ←a^'
until s is terminal
End for

Sarsa算法

3. Q-Learning算法

Q-Learning算法是时序差分学习方法的离策略版本,Q-Learning算法的伪代码如下:

For s in S:
For a in A:
    Initialize Q(s,a)
For i in range(k):
Initialize S
Repeat (for each step of episode):
Choose a using policy derived from Q (e.g.ε-greedy)
Take action a,observe r and s
Q(s, a) ← Q(s, a) + α[R + γmax(Q(s^', a^')) − Q(s, a)]
s ←s^'
until s is terminal
End for

Q-Learning算法

在时序差分学习方法中,在策略的Sarsa算法使用估计的策略采取动作,而离策略的Q-Learning算法选择所有可能的下一动作中Q值最大的动作(即Q-Learning有一个专门用来产生行为的策略)。

如果是在确定性的环境状态下,Q-Learning的Q值的更新方式可以简化为:

式6

这里我们介绍的Sarsa算法和Q-Learning算法均为单步更新算法,即时序差分误差都只用来更新前一个值,我们可以通过使用资格迹(eligibility trace)来实现多步的更新,有关资格迹的讨论不在本专栏的范围。

4.3 值函数近似

在前面介绍的所有强化学习方法中,我们所有的状态-动作价值(Q值)或状态价值(V值)都是存放在表中的,这种方法在状态空间和动作空间都不大的情况下还很适用,一旦状态空间和动作空间变得很大,那么表格的尺寸也会变得很大,有时甚至大到无法存储(例如围棋),即使能够存储,算法的效率也会受到很大影响。而且如果是连续的状态和动作(例如无人驾驶),使用表格势必会将状态和动作离散化,这可能会导致误差。因此,我们想用一个函数来近似表示Q值表(或V值表),这种方法称为值函数近似(Value Function Approximation)。

利用函数去逼近Q值表(或V值表)的问题可以看作一个回归问题,以Q-Learning为例,我们定义一个回归器Q(s,a|θ),其中θ是一个参数向量。我们输入的数据是状态-动作对(s_t,a_t),希望输出的是

的值,因此,我们可以定义误差函数为:

具体这个回归器的选择,可以是一个线性的模型,也可以是一个非线性的模型,例如神经网络。

4.4 策略搜索

1. 基于值函数(value-based)和基于策略函数(policy-based)

前面介绍的所有方法都是先把V值或者Q值估计出来,然后再从中推导出策略,我们称这一类方法为基于值函数(value-based)的方法。使用基于值函数的方法可以采用表格的形式,如果使用函数近似的话会出现策略退化问题。为了解决这个问题,我们可以直接去寻找策略,而不是通过值函数来导出策略,这种直接学习策略的方法称为基于策略函数(policy-based)的方法。我们一般是直接在策略空间中搜索得到最优策略,该方法称为策略搜索(policy search)。

2.策略梯度(Policy Gradient)

在策略搜索中,我们可以使用基于梯度的方式来优化策略,这种方法称为策略梯度。假设我们的策略函数为π_θ (a|s),θ为这个函数的参数,我们定义目标函数为:

式7

有了目标函数J(θ),我们可以使用梯度上升的方法来优化参数θ使得目标函数J(θ)增大,梯度就是函数J(θ)关于参数θ的导数,即:

式8

上式中

是从时刻t作为起始时刻,直至结束后得到的累积奖励。

3. Monte Carlo Policy Gradient算法

在前面介绍蒙特卡洛方法的时候介绍过,期望可以通过采样的方法近似,对于当前的策略π_θ,我们可以通过让agent在环境中运行,得到多个运动轨迹,对于每一条轨迹,我们可以计算每个时刻的梯度,将得到的梯度乘以一个学习率用来更新参数,这就是Monte Carlo Policy Gradient算法(或称REINFORCE算法)。

Input: a differentiable policy parameterization π_θ (a|s)
Initialize policy parameter θ
Repeat:
Generate an episode τ: S_0,A_0,R_1,…, S_(T-1), A_(T-1), R_T, following π_θ (a|s)
For each step of the episode t = 0,…,T-1:
G ← return from step t
                  θ← θ+ 〖αγ〗^t G(τ_(t:T) ) ∂/∂θ logπ_θ (a_t |s_t)
    End
Until θ is converged
Output: π_θ

Monte Carlo Policy Gradient算法

4. Actor Critic算法

在Monte Carlo Policy Gradient算法中,我们每次都要走完一条完整的轨迹才能得到累积奖励,我们希望像时序差分方法一样,可以实现单步更新。演员-评论家(actor-critic)算法是一种结合了策略梯度和时序差分的强化学习方法。

在actor-critic算法中,我们既要学习策略π_θ (s,a),同时还要学习值函数V_ϕ (s)。

Input: a differentiable policy parameterization π_θ (a|s)
Input: a differentiable state-value parameterization V_∅ (s)
Repeat:
Initialize state s
         ℷ=1
  Repeat:
      On state s, choose an action a=π_θ (a|s)
      Execute a, get reward r and new state s^'
      δ←r+γV_∅ (s^' )-V_∅ (s)
      ∅←∅+βλδ ∂/(∂∅) V_∅ (s) #更新值函数的参数
      θ←θ+αλδ ∂/∂θ logπ_θ (a|s) #更新策略函数的参数
      λ←γλ
      s←s^'
  until s is terminal
until θ is converged
Output: π_θ

actor-critic算法

本文分享自微信公众号 - 磐创AI(xunixs),作者:小猴锅

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 计算智能(CI)之粒子群优化算法(PSO)(一)

    计算智能(ComputationalIntelligence ,CI)是以生物进化的观点认识和模拟智能。按照这一观点,智能是在生物的遗传、变异、生长以及外部环境...

    磐创AI
  • 干货 | 集成聚类回顾(一)

    在理解原始数据的初始阶段经常使用聚类分析,尤其对于先验知识很少的这种新问题。此外,在监督学习的预处理阶段,它被用来识别离群值和可能的对象类,用于以下的专家指导的...

    磐创AI
  • 深度强化学习(DRL)专栏(二):有模型的强化学习

    【磐创AI导读】:本篇文章是深度强化学习专栏的第二篇,讲了第三节有模型的强化学习,希望对大家有所帮助。查看上篇关于本专栏的介绍:深度强化学习(DRL)专栏开篇。...

    磐创AI
  • 漫话:如何给女朋友解释什么是策略模式?

    周末无事,窝在家里面看《权力的游戏第八季》,看的很是津津有味,虽然感觉有一点点要烂尾,但是我还是忍不住要去看到底谁可以坐上铁王座。

    Java识堂
  • Java Html转pdf实战

    年尾手头没啥事,干起了打杂工作,最近帮忙解决后端项目里一个html批量转pdf速度慢的问题,项目里用到的转换工具是 wkhtmltopdf ,这货转单个html...

    Zachary46
  • VUE开发一个组件——日历选择控件

    Javanx
  • 【Go 语言社区】浅析javascript的间隔调用和延时调用

    用 setInterval方法可以以指定的间隔实现循环调用函数,直到clearInterval方法取消循环 用clearInterval方法取消循环时,必须将s...

    李海彬
  • cmake:gperftools性能分析工具find libprofiler 脚本暨profiler的静态连接问题

    gperftools是一个很好用的性能分析工具,但没有提供官方的用于查找profiler库的cmake脚本,所以在基于cmake管理的项目中如果要在系统查找li...

    用户1148648
  • 如何评价无监督聚类算法

    用户1737318
  • 用Python做投资-python仿真等价鞅下的收益曲线

    如果我们按照这样的次序下注:1,2,4,8,16,......,2^n.只要有一次获胜,那么我们就从头再来。这里我们可以看出,每次获胜都可以赢得1元钱。因为2^...

    钱塘小甲子

扫码关注云+社区

领取腾讯云代金券