深度学习与计算机视觉教程(17) | 深度强化学习 (马尔可夫决策过程,Q-Learning,DQN)(CV通关指南·完结)

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情


Reinforcement Learning; 深度学习与计算机视觉; Stanford CS231n

本系列为 斯坦福CS231n 《深度学习与计算机视觉(Deep Learning for Computer Vision)》的全套学习笔记,对应的课程视频可以在 这里 查看。更多资料获取方式见文末。


引言

监督学习(Supervised Learning)和无监督学习(Unsupervised Learning)之外,我们还有另外一类机器学习算法,叫做「强化学习」。

  • 监督学习:从外部监督者提供的带标注训练集中进行学习(任务驱动型)
  • 无监督学习:寻找未标注数据中隐含结构的过程(数据驱动型)。
  • 强化学习:「试探」与「开发」之间的折中权衡,智能体必须开发已有的经验来获取收益,同时也要进行试探,使得未来可以获得更好的动作选择空间(即从错误中学习)。强化学习也可以理解为有延迟标签(奖励)的学习方式。

目前强化学习在包括游戏广告和推荐对话系统机器人等多个领域有着非常广泛的应用。我们会在下面再展开介绍。

本篇重点

  • 强化学习概念与应用
  • 马尔可夫决策过程
  • Q-Learning 算法
  • DQN(Deep Q Network)算法

1.强化学习介绍与应用

1.1 强化学习介绍

强化学习是一类对目标导向的学习与决策问题进行理解和自动化处理的算法。它强调智能体通过与环境的直接互动来学习,无需像监督学习一样密集的样本级标签标注,通过奖励来学习合理的策略。

强化学习包含2个可以进行交互的对象:智能体(Agnet)环境(Environment) ,它们的定义与介绍如下:

  • 智能体(Agent) :可以感知环境的状态(State) ,并根据反馈的奖励(Reward) 学习选择一个合适的动作(Action) ,我们希望它能最大化长期总收益。
  • 环境(Environment) :环境会接收智能体执行的一系列动作,对这一系列动作进行评价并转换为一种可量化的信号反馈给智能体。环境对智能体来说是一套相对固定的规则。

强化学习系统; Agnet, Environment;

强化学习系统在智能体(Agnet)环境(Environment) 之外,还包含其他核心要素:策略(Policy)回报函数(Reward Function)价值函数(Value Function)环境模型(Environment Model)

上述核心要素中「环境模型」是可选的。

  • 策略(Policy) :智能体在环境中特定时间的行为方式,策略可以视作环境状态到动作的映射。
  • 回报函数(Reward Function) :智能体在环境中的每一步,环境向其发送的1个标量数值,指代「收益」。
  • 价值函数(Value Function) :表示了从长远的角度看什么是好的。一个状态的价值是一个智能体从这个状态开始,对将来累积的总收益的期望。
  • 环境模型(Environment Model) :是一种对环境的反应模式的模拟,它允许对外部环境的行为进行推断。

1.2 强化学习应用

1) 游戏

AlphaGo 是于 2014 年开始由 Google DeepMind 开发的人工智能围棋软件。AlphaGo 在围棋比赛中战胜人类顶级选手取得成功,它包含了大量强化学习的算法应用,核心过程是使用蒙特卡洛树搜索(Monte Carlo tree search),借助估值网络(value network)与走棋网络(policy network)这两种深度神经网络,通过估值网络来评估大量选点,并通过走棋网络选择落点。

强化学习应用; 游戏 AlphaGo

AlphaStar 是由 DeepMind 开发的玩 星际争霸 II 游戏的人工智能程序。它能够通过模仿学习星际争霸上玩家所使用的基本微观和宏观策略。这个初级智能体在 95% 的游戏中击败了内置的「精英」AI 关卡(相当于人类玩家的黄金级别)。

AlphaStar 神经网络结构将 Transformer 框架运用于模型单元(类似于关系深度强化学习),结合一个深度 LSTM 核心、一个带有 pointer network 的自回归策略前端和一个集中的值基线。超强的网络设计使得其适合长期序列建模和大输出空间(如翻译、语言建模和视觉表示)的挑战。它还还集成了多智能体学习算法。

强化学习应用; 游戏 AlphaStar

OpenAI Five 是一个由 OpenAI 开发的用于多人视频游戏 Dota 2 的人工智能程序。OpenAI Five 通过与自己进行超过 10,000 年时长的游戏进行优化学习,最终获得了专家级别的表现。

强化学习应用; 游戏 OpenAI Five

Pluribus 是由 Facebook 开发的第一个在六人无限注德州扑克中击败人类专家的 AI 智能程序,其首次在复杂游戏中击败两个人或两个团队。

强化学习应用; 游戏 Pluribus

2) 广告和推荐

在淘宝京东等电商领域与字节跳动等信息流产品里,也可以见到强化学习的有效应用,它使得广告投放与推荐更具智能化。

强化学习应用; 广告和推荐

3) 对话系统

Alphago 的成功使人们看到了强化学习在序列决策上的巨大进步,这些进步进而推动了深度强化学习算法在自动语音和自然语言理解领域的研究和应用,探索解决自然语言理解及响应等开展对话中存在的挑战。基于深度强化学习的 Bot 具有扩展到当前尚无法涉足领域的能力,适用于开放域聊天机器人的场景。

强化学习应用; 推荐系统

4) 机器人

复杂未知环境下智能感知与自动控制是目前机器人在控制领域的研究热点之一,在高维连续状态-动作空间中,运用深度强化学习进行机器人运动控制有很不错的效果,最终可以应用在自主导航、物体抓取、步态控制、人机协作以及群体协同等很多任务上。

强化学习应用; 机器人

2.从游戏说起强化学习

首先,让我们简单介绍一下 Breakout 这个游戏。在这个游戏中,你需要控制屏幕底端的一根横杆左右移动,将飞向底端的球反弹回去并清除屏幕上方的砖块。每次你击中并清除了砖块,你的分数都会增加——你获得了奖励。

强化学习; Atari Breakout游戏

假设你想教神经网络模型玩这个游戏,模型的输入是游戏机屏幕像素所构成的图片,输出是三种动作:向左,向右以及开火(把球射出)。把这个问题建模为分类问题是很合理的——对于每个屏幕画面,你都需要进行决策:是左移,右移,还是开火。

分类的建模方法看起来很直接。不过,你需要大量训练数据训练你的分类模型。传统的做法是找一些专家让他们玩游戏并且记录他们的游戏过程。

但人类肯定不是这样玩游戏的,我们不需要有人站在我们背后告诉我们向左还是向右。我们只需要知道在某些情况下我们做了正确的动作并且得分了,其他的依靠我们自身的学习机制完成。这个问题就是强化学习尝试解决的问题。

强化学习处于监督学习与无监督学习的中间地带。在监督学习中,每个训练实例都有一个正确标签;在无监督学习中,训练实例并没有标签。在强化学习中,训练实例有稀疏并延时的标签——奖励。基于奖励,强化学习中的智能体可以学习如何对环境做出正确的反映。

上述的观点看起来很直观,但是实际存在很多挑战。举例来讲,在 Breakout 这个游戏中,击中砖块并且得分和前一时刻如何移动横杆没有直接关系。最相关的是前面如何将横杆移动到正确位置并反弹球。这个问题叫做信用分配问题(credit assignment problem),即:建模获得奖励之前的哪些动作对获得奖励产生贡献以及贡献的大小

如果你已经获得了某种策略并且通过它得了不少奖励,你应该继续坚持这种策略还是试试其他的可能获得更高分的策略?仍举 Breakout 这个游戏为例,在游戏开始时,你把横杆停在左边并把球射出去,如果你不移动横杆,你总是能得 10 分的(当然得分的下一秒,你就死了)。你满足于这个得分吗,或者你想不想再多得几分?这种现象有一个专门的名词——探索-利用困境(exploration-exploitation dilemma) 。决策时应该一直延用现有的策略还是试试其他更好的策略?

强化学习是人类(或者更一般的讲,动物)学习的一种重要模式。父母的鼓励,课程的分数,工作的薪水——这些都是我们生活中的奖励。功劳分配问题以及探索-利用困境在我们日常生活工作中经常发生。这就是我们研究强化学习的原因。而对于强化学习,游戏是尝试新方法的最佳的沙盒。

3. 马尔科夫决策过程

下面,我们的问题是如何形式化定义强化学习问题使其支持推断。最常用的表示方式是马尔科夫决策过程。

假想你是一个智能体(agent),面对某种场景(比如说 Breakout 游戏)。你所处的环境可以定义为状态(state)(比如横杆的位置,球的位置,球的方向,当前环境中的砖块等等)。

智能体能够在环境中采取一些动作(actions)(比如向左或向右移动横杆)。这些动作会导致一些奖励(reward)(比如分数的增加)。智能体采取动作将导致新的环境,也就是新的状态。在新的状态下,智能体能够继续采取动作,循环往复。你采取行动的原则叫做策略(policy)。

通常来讲,环境是很复杂的,智能体的下一状态可能带有一定的随机性(比如当你失去一个球发射另一个球时,它的方向是随机的)。

马尔可夫决策过程; Markov decision process

一系列的状态、动作、以及采取动作的规则构成了一个马尔科夫决策过程(Markov decision process)。一个马尔科夫决策过程(比如一局游戏)由一串有限个数的状态、动作、反馈组成,形式化地表示为:

s0,a0,r1,s1,a1,r2,s2,…,sn−1,an−1,rn,sns_0, a_0, r_1, s_1, a_1, r_2, s_2, …, s_{n-1}, a_{n-1}, r_n, s_ns0,a0,r1,s1,a1,r2,s2,…,sn−1,an−1,rn,sn

其中 sis_isi 代表状态,aia_iai 代表动作,ri+1r_{i+1}ri+1 代表进行动作后获得的奖励,sns_nsn 是终止状态。一个马尔科夫决策过程建立在马尔科夫假设上,即下一时刻的状态 si+1s_{i+1}si+1 只和当前状态 sis_isi 和动作 aia_iai 有关,和之前的状态及动作无关。

4. 打折的未来奖励

为了在长期决策过程中表现的更好,我们不但要考虑采取一个动作后的即时奖励,也要考虑这个动作的未来奖励。那么问题来了,我们应该如何建模这个未来奖励?

给定一个马尔科夫决策过程,它对应的奖励总和很容易用如下方式计算:

R=r1+r2+r3+…+rnR=r_1+r_2+r_3+…+r_nR=r1+r2+r3+…+rn

而 ttt 时刻的未来奖励可以表示为:

Rt=rt+rt+1+rt+2+…+rnR_t=r_t+r_{t+1}+r_{t+2}+…+r_nRt=rt+rt+1+rt+2+…+rn

由于智能体所处的环境非常复杂,我们甚至无法确定在两次采取相同动作,智能体能够获得相同的奖励。智能体在未来进行的动作越多,获得的奖励越不相同。所以,我们一般采用一种「打折的未来奖励」作为 ttt 时刻未来奖励的代替。

Rt=rt+γrt+1+γ2rt+2…+γn−trnR_t=r_t+\gamma r_{t+1}+\gamma^2 r_{t+2}…+\gamma^{n-t} r_nRt=rt+γrt+1+γ2rt+2…+γn−trn

其中 γ\gammaγ 是 000 到 111 之间的折扣因子。这个 γ\gammaγ 值使得我们更少地考虑哪些更长远未来的奖励。数学直觉好的读者可以很快地看出 RtR_tRt 可以用 Rt+1R_{t+1}Rt+1 来表示,从而将上式写成一种递推的形式,即:

Rt=rt+γ(rt+1+γ(rt+2+…))=rt+γRt+1R_t=r_t+\gamma (r_{t+1}+\gamma (r_{t+2}+…))=r_t+\gamma R_{t+1}Rt=rt+γ(rt+1+γ(rt+2+…))=rt+γRt+1

如果 γ\gammaγ 是 000,我们将会采取一种短视的策略。也就是说,我们只考虑即刻奖励。如果我们希望在即刻奖励与未来奖励之间寻求一种平衡,我们应该使用像 0.90.90.9 这样的参数。如果我们所处的环境对于动作的奖励是固定不变的,也就是说相同的动作总会导致相同的奖励,那么 γ\gammaγ 应该等于 111。

好的策略应该是:智能体在各种环境下采用最大(打折的)未来奖励的策略。

5. Q-learning算法

5.1 Q-Learning算法讲解

在 Q-learning 中,我们定义一个 Q(s,a)Q(s, a)Q(s,a) 函数,用来表示智能体在 sss 状态下采用 aaa 动作并在之后采取最优动作条件下的打折的未来奖励。

Q(st,at)=maxπRt+1Q(s_t,a_t)=max_{\pi} R_{t+1}Q(st,at)=maxπRt+1

直观讲,Q(s,a)Q(s, a)Q(s,a) 是智能体「在 sss 状态下采取 aaa 动作所能获得的最好的未来奖励」。由于这个函数反映了在 sss 状态下采取 aaa 动作的质量(Quality),我们称之为Q-函数。

这个定义看起来特别奇怪。我们怎么可能在游戏进行的过程中,只凭一个状态和动作估计出游戏结束时的分数呢?实际上我们并不能估计出这个分数。但我们可以从理论上假设这样函数的存在,并且把重要的事情说三遍,「Q-函数存在,Q-函数存在,Q-函数存在」。Q-函数是否存在呢?

如果你还不相信,我们可以在假设Q-函数存在的情况下想一想会发生什么。假设智能体处在某个状态并且思考到底应该采用 aaa 动作还是 bbb 动作,你当然希望选取使游戏结束时分数最大的动作。如果你有那个神奇的Q-函数,你只要选取Q-函数值最大的动作。

π(s)=argmaxaQ(s,a)\pi(s) =argmax_a Q(s,a)π(s)=argmaxaQ(s,a)

上式中,π\piπ 表示在 sss 状态下选取动作的策略。

然后,我们应该如何获得Q-函数呢?首先让我们考虑一个转移 <s, a, r, s’>。我们可以采用与打折的未来奖励相同的方式定义这一状态下的Q函数。

Q(s,a)=r+γmaxa’Q(s’,a’)Q(s,a)=r + \gamma max_{a’}Q(s’,a’)Q(s,a)=r+γmaxa’Q(s’,a’)

这个公式叫贝尔曼公式。如果你再想一想,这个公式实际非常合理。对于某个状态来讲,最大化未来奖励相当于最大化即刻奖励与下一状态最大未来奖励之和。

Q-learning 的核心思想是:我们能够通过贝尔曼公式迭代地近似Q-函数。最简单的情况下,我们可以采用一种填表的方式学习Q-函数。这个表包含状态空间大小的行,以及动作个数大小的列。填表的算法伪码如下所示:

css复制代码initialize Q[numstates,numactions] arbitrarily
observe initial state s
repeat
    select and carry out an action a
    observe reward r and new state s'
    Q[s,a] = Q[s,a] + α(r + γmaxa' Q[s',a'] - Q[s,a])
    s = s'
until terminated

Al gorithm 5 Q-learning 迭代算法

Algorithm 5 Q-learning; 迭代算法

其中 α\alphaα 是在更新 Q[s,a]Q[s, a]Q[s,a] 时,调节旧 Q[s,a]Q[s, a]Q[s,a] 与新 Q[s,a]Q[s, a]Q[s,a] 比例的学习速率。如果α=1\alpha=1α=1, Q[s,a]Q[s, a]Q[s,a] 就被消掉,而更新方式就完全与贝尔曼公式相同。

使用 maxa’Q[s’,a’]max_{a’}Q[s’, a’]maxa’Q[s’,a’] 作为未来奖励来更新 Q[s,a]Q[s, a]Q[s,a] 只是一种近似。在算法运行的初期,这个未来奖励可能是完全错误的。但是随着算法迭代, Q[s,a]Q[s, a]Q[s,a] 会越来越准(它的收敛性已经被证明)。我们只要不断迭代,终有一天它会收敛到真实的Q函数的。

5.2 Q-Learning案例

我们来通过一个小案例理解一下 Q-Learning 算法是如何应用的。

1) 环境

假设我们有5个相互连接的房间,并且对每个房间编号,整个房间的外部视作房间5。 Q-Learning案例; 环境

以房间为节点,房门为边,则可以用图来描述房间之间的关系:

Q-Learning案例; 环境

2) 奖励机制

这里设置一个agent(在强化学习中, agent 意味着与环境交互、做出决策的智能体), 初始可以放置在任意一个房间, agent最终的目标是走到房间5(外部)。

为此, 为每扇门设置一个 reward(奖励), 一旦 agent 通过该门, 就能获得奖励:

Q-Learning案例; 奖励机制

其中一个特别的地方是房间5可以循环回到自身节点, 并且同样有100点奖励。

在 Q-learning 中, agent 的目标是达成最高的奖励值, 如果 agent 到达目标, 就会一直停留在原地, 这称之为 absorbing goal。

对于 agent, 这是i一个可以通过经验进行学习的 robot, agent 可以从一个房间(节点)通过门(边)通往另一个房间(节点), 但是它不知道门会连接到哪个房间, 更不知道哪扇门能进入房间5(外部)。

3) 学习过程

举个栗子,现在我们在房间2设置一个 agent,我们想让它学习如何走能走向房间5。

Q-Learning案例; 学习过程

在 Q-leanring 中,有两个术语 state(状态)和 action(行为)。

每个房间可以称之为 state,而通过门进行移动的行为称之为 action,在图中 state 代表节点,action 代表边。

现在代理处于 state2 ( 节点2,房间2),从 state2 可以通往 state3 ,但是无法直接通往 state1

state3 ,可以移动到 state1 或回到 state2

Q-Learning案例; 学习过程

根据现在掌握的 state,reward,可以形成一张 reward table(奖励表),称之为矩阵 RRR:

Q-Learning案例; 学习过程

只有矩阵 RRR 是不够的, agent 还需要一张表, 被称之为矩阵 QQQ , 矩阵 QQQ 表示 agent 通过经验学习到的记忆(可以理解为矩阵 QQQ 就是模型通过学习得到的权重)。

起初, 代理对环境一无所知, 因此矩阵 QQQ 初始化为 000。为了简单起见, 假设状态数已知为6。如果状态数未知, 则 QQQ 仅初始化为单个元素 000, 每当发现新的状态就在矩阵中添加更多的行列。

Q-learning 的状态转移公式如下:

Q(state,action)=R(state,action)+Gamma∗Max[Q(next−state,allactions)]Q(state, action) = R(state, action) + Gamma \ast Max[Q(next-state, all actions)]Q(state,action)=R(state,action)+Gamma∗Max[Q(next−state,allactions)]

根据该公式, 可以对矩阵 QQQ 中的特定元素赋值。

agent 在没有老师的情况下通过经验进行学习(无监督), 从一个状态探索到另一个状态, 直到到达目标为止。每次完整的学习称之为 episode(其实也就相当于 epoch), 每个 episode 包括从初始状态移动到目标状态的过程, 一旦到达目标状态就可以进入下一个 episode。

4) 算法过程

perl复制代码设置gamme参数, 在矩阵R中设置reward
初始化矩阵Q
对于每一个episode:
    选择随机的初始状态(随便放到一个房间里)
    如果目标状态没有达成, 则
        从当前所有可能的action中选择一个
        执行action, 并准备进入下一个state
        根据action得到reward
        计算$Q(state, action) = R(state, action) + Gamma * Max[Q(next-state, all actions)]$
        将下一个state设置为当前的state.
        进入下一个state
结束

在算法中, 训练agent在每一个episode中探索环境(矩阵 RRR ), 并获得reward, 直到达到目标状态。训练的目的是不断更新agent的矩阵 QQQ :每个episode都在对矩阵 QQQ 进行优化。因此, 起初随意性的探索就会被通往目标状态的最快路径取代。

参数 gamma 取 000 到 111 之间。该参数主要体现在 agent 对于 reward 的贪心程度上, 具体的说, 如果 gamma 为 000, 那么 agent 仅会考虑立即能被得到的 reward, 而 gamma 为 111 时, agent 会放长眼光, 考虑将来的延迟奖励。

要使用矩阵 QQQ , agent 只需要查询矩阵 QQQ 中当前 state 具有最高 QQQ 值的 action:

  • ① 设置当前 state 为初始 state
  • ② 从当前 state 查询具有最高 QQQ 值的 action
  • ③ 设置当前 state 为执行 action 后的 state
  • ④ 重复2,3直到当前 state 为目标 state

5) Q-learning模拟

现在假设 gamme=0.8gamme=0.8gamme=0.8,初始 state 为房间 111。

初始化矩阵 QQQ :

Q-Learning案例; 模拟

同时有矩阵 RRR :

Q-Learning案例; 模拟

① episode 1

现在 agent 处于房间1, 那么就检查矩阵 RRR 的第二行。agent 面临两个action, 一个通往房间3, 一个通往房间5。通过随机选择, 假设agent选择了房间5。

Q(state,action)=R(state,action)+Gamma∗Max[Q(nextstate,allactions)]Q(state, action) = R(state, action) + Gamma \ast Max[Q(next state, all actions)]Q(state,action)=R(state,action)+Gamma∗Max[Q(nextstate,allactions)]

Q(1,5)=R(1,5)+0.8∗Max[Q(5,1),Q(5,4),Q(5,5)]=100+0.8∗0=100Q(1, 5) = R(1, 5) + 0.8 \ast Max[Q(5, 1), Q(5, 4), Q(5, 5)] = 100 + 0.8 \ast 0 = 100Q(1,5)=R(1,5)+0.8∗Max[Q(5,1),Q(5,4),Q(5,5)]=100+0.8∗0=100

由于矩阵 QQQ 被初始化为 000, 因此 Q(5,1)Q(5,1)Q(5,1), Q(5,4)Q(5, 4)Q(5,4), Q(5,5)Q(5, 5)Q(5,5) 都是 000, 那么 Q(1,5)Q(1, 5)Q(1,5) 就是 100100100。

现在房间5变成了当前 state, 并且到达目标 state, 因此这一轮 episode 结束。

于是 agent 对矩阵 QQQ 进行更新。

Q-Learning案例; 模拟 - episode 1

② episode 2

现在, 从新的随机 state 开始, 假设房间3为初始 state。

同样地, 查看矩阵 RRR 的第四行, 有3种可能的 action:进入房间1、2或者4。通过随机选择, 进入房间 111。计算 QQQ 值:

Q(state,action)=R(state,action)+Gamma∗Max[Q(nextstate,allactions)]Q(state, action) = R(state, action) + Gamma \ast Max[Q(next state, all actions)]Q(state,action)=R(state,action)+Gamma∗Max[Q(nextstate,allactions)]

Q(3,1)=R(3,1)+0.8∗Max[Q(1,3),Q(1,5)]=0+0.8∗100=80Q(3, 1) = R(3, 1) + 0.8 \ast Max[Q(1, 3), Q(1, 5)] = 0+ 0.8 \ast 100 = 80Q(3,1)=R(3,1)+0.8∗Max[Q(1,3),Q(1,5)]=0+0.8∗100=80

现在 agent 处于房间111, 查看矩阵 RRR 的第二行。此时可以进入房间3或房间5, 选择去5, 计算Q值:

Q(state,action)=R(state,action)+Gamma∗Max[Q(nextstate,allactions)]Q(state, action) = R(state, action) + Gamma \ast Max[Q(next state, all actions)]Q(state,action)=R(state,action)+Gamma∗Max[Q(nextstate,allactions)]

Q(1,5)=R(1,5)+0.8∗Max[Q(5,1),Q(5,4),Q(5,5)]=100+0.8∗0=100Q(1, 5) = R(1, 5) + 0.8 \ast Max[Q(5, 1), Q(5, 4), Q(5, 5)] = 100 + 0.8 \ast 0 = 100Q(1,5)=R(1,5)+0.8∗Max[Q(5,1),Q(5,4),Q(5,5)]=100+0.8∗0=100

由于到达目标 state, 对矩阵 QQQ 进行更新,Q(3,1)=80Q(3, 1)=80Q(3,1)=80,Q(1,5)=100Q(1, 5)=100Q(1,5)=100。

Q-Learning案例; 模拟 - episode 2

③ episode n

之后就是不断重复上面的过程,更新 QQQ 表,直到结束为止。

6) 推理

假设现在 QQQ 表被更新为:

Q-Learning案例; 推理

对数据标准化处理( matrixQ/max(matrixQ)matrix_Q / max(matrix_Q)matrixQ/max(matrixQ) ),可以将 QQQ 值看作概率:

Q-Learning案例; 推理

描绘成图:

Q-Learning案例; 推理

到这里已经很清晰了,agent 已经总结出一条从任意房间通往房间5(外部)的路径。

6.Deep Q Network算法

6.1 算法介绍

Breakout游戏的状态可以用横杆的位置,球的位置,球的方向或者每个砖块是否存在来进行定义。然而,这些表示游戏状态的直觉只能在一款游戏上发挥作用。我们要问:我们能不能设计一种通用的表示游戏状态的方法呢?最直接的方法是使用游戏机屏幕的像素作为游戏状态的表示。像素可以隐式地表示出球速以及球的方向之外的所有游戏状态的信息。而如果采用连续两个游戏机屏幕的像素,球速和球的方向也可以得到表示。

如果 DeepMind 的论文采用离散的游戏屏幕作为状态表示,让我们计算一下使用连续四步的屏幕作为状态,可能的状态空间。屏幕大小 84∗8484 \ast 8484∗84,每个像素点有 256256256 个灰度值,那么就有 25684∗84∗4∼1067970256^{84 \ast 84 \ast 4} \sim10^{67970}25684∗84∗4∼1067970 种可能的状态。也就是说,我们的Q-表将要有 106797010^{67970}1067970 行。这个数字甚至多于宇宙中的原子个数!有人会说:有些屏幕状态永远不会出现,或者,能不能只用在学习过程中碰到过的状态作为Q-表的状态呢?即便如此,这种稀疏表示的Q-表里仍包含很多状态,并且需要很长时间收敛。理想的情况是,即便某些状态没有见过,我们的模型也能对它进行比较合理的估计。

在这种情况下,深度学习就进入了我们的视野。深度学习的一大优势是从结构数据中抽取特征(对数据进行很好的表示)。我们可以用一个神经网络对Q-函数进行建模。这个神经网络接收一个状态(连续四步的屏幕)和一个动作,然后输出对应的Q-函数的值。当然,这个网络也可以只接受一个状态作为输入,然后输出所有动作的分数(具体来讲是动作个数大小的向量)。这种做法有一个好处:我们只需要做一次前向过程就可以获得所有动作的分数。

朴素的Q-函数网络; 在DeepMind论文中使用优化的Q网络

DeepMind 在论文中使用的网络结构如下:

LayerInputFilter sizeStrideNum filtersActivationOutput
conv184x84x48×8432ReLU20x20x32
conv220x20x324×4264ReLU9x9x64
conv39x9x643×3164ReLU7x7x64
fc47x7x64512ReLU512
fc551218Linear18

这个网络是普通的神经网络:从输入开始,三个卷积层,接着两个全连接层。熟悉使用神经网络做物体识别的读者或许会意识到,这个网络没有池化层(pooling layer)。但是细想一下我们就知道,池化层带来位置不变性,会使我们的网络对于物体的位置不敏感,从而无法有效地识别游戏中球的位置。而我们都知道,球的位置对于决定游戏潜在的奖励来讲有非常大的意义,我们不应该丢掉这部分信息。

输入是 84∗8484 \ast 8484∗84 的灰度图片,输出的是每种可能的动作的Q-值。这个神经网络解决的问题变成了一个典型的回归问题。简单的平方误差可以用作学习目标。

L=12[r+γmaxa′Q(s′,a′)⏟target−Q(s,a)⏟prediction]2L=\frac{1}{2}[\underbrace{r + \gamma max_{a’}Q(s’,a’)}{\text{target}} - \underbrace{Q(s,a)}{\text{prediction}}]^2L=21[targetr+γmaxa′Q(s′,a′)−predictionQ(s,a)]2

给定一个转移<s, a, r, s’>,Q-表的更新算法只要替换成如下流程就可以学习Q-网络。

  • 对于当前状态 s,通过前向过程获得所有动作的Q-值
  • 对于下一个状态s’,通过前向过程计算Q-值最大的动作 maxa’Q(s’,a’)max_{a’} Q(s’, a’)maxa’Q(s’,a’)
  • 将 r+γmaxa’Q(s’,a’)r+\gamma max_{a’} Q(s’, a’)r+γmaxa’Q(s’,a’) 作为学习目标,对于其他动作,设定第一步获得的Q-值作为学习目标(也就是不会在反向过程中更新参数)
  • 使用反向传播算法更新参数。

6.2 经验回放

到现在,我们已经知道如何用 Q-learning 的算法估计未来奖励,并能够用一个卷积神经网络近似Q-函数。但使用Q 值近似非线性的Q-函数可能非常不稳定。你需要很多小技巧才能使这个函数收敛。即使如此,在单GPU上也需要一个星期的时间训练模型。

这其中,最重要的技巧是经验回放(experience replay)。在玩游戏的过程中,所有经历的<s, a, r, s’>都被记录起来。当我们训练神经网络时,我们从这些记录的<s, a, r, s’>中随机选取一些mini-batch作为训练数据训练,而不是按照时序地选取一些连续的<s, a, r, s’>。在后一种做法中,训练实例之间相似性较大,网络很容易收敛到局部最小值。同时,经验回放也使 Q-learning 算法更像传统监督学习。我们可以收集一些人类玩家的记录,并从这些记录中学习。

6.3 探索-利用困境

Q-learning 算法尝试解决信用分配问题。通过 Q-learning ,奖励被回馈到关键的决策时刻。然而,我们还没有解决探索-利用困境。

我们第一个观察是:在游戏开始阶段,Q-表或Q-网络是随机初始化的。它给出的Q-值最高的动作是完全随机的,智能体表现出的是随机的「探索」。当Q-函数收敛时,随机「探索」的情况减少。所以, Q-learning 中包含「探索」的成分。但是这种探索是「贪心」的,它只会探索当前模型认为的最好的策略。

对于这个问题,一个简单的修正技巧是使用 ϵ\epsilonϵ- 贪心探索。在学习Q-函数时,这种技巧以 ϵ\epsilonϵ 的概率选取随机的动作做为下一步动作,1−ϵ1-\epsilon1−ϵ 的概率选取分数最高的动作。在DeepMind的系统中,ϵ\epsilonϵ 随着时间从 111 减少到 0.10.10.1。这意味着开始时,系统完全随机地探索状态空间,最后以固定的概率探索。

6.4 Deep Q-learning算法流程

最后给出使用经验回放的 Deep Q-learning 算法

vbnet复制代码initialize replay memory D
initialize action-value function Q with random weights
observe initial state s
repeat
    select an action a
        with probability ε select a random action
        otherwise select a = argmaxa’Q(s,a’)
    carry out action a
    observe reward r and new state s’
    store experience <s, a, r, s’> in replay memory D
    sample random transitions <ss, aa, rr, ss’> from replay memory D
    calculate target for each minibatch transition
        if ss’ is terminal state then tt = rr
        otherwise tt = rr + γmaxa’Q(ss’, aa’)
    train the Q network using (tt - Q(ss, aa))^2 as loss
    s = s'
until terminated

中文版算法流程如下:

css复制代码初始化回放存储D
使用随机权重初始化动作价值函数Q
观察初始状态s
重复
    选择一个动作s
        以概率ε选择一个随机动作
        否则选择 a=argmaxa'Q(s,a')
    执行动作a
    观察奖励r和新状态s'
    在回放存储D中保存经验<s,a,r,s′>
    从回放存储D中进行样本随机变换<ss,aa,rr,ss'>
    为每个微批数据变换计算目标
        如果ss′是终点状态,那么tt=rr
        否则tt=rr+Ymax a' Q(ss',aa′)
    使用(tt-Q(ss,aa))2作为损失训练Q网络 
    s=s'

除了上述技巧,DeepMind 还使用了一系列其他的技巧,比如:目标网络、误差截断、回馈截断等等。但是这些已经超出本文的范畴了。

最令人惊喜的是这种算法可以应对各种学习问题。在算法的运行初期,Q-函数用来学习模型参数的数据几乎完全是(随机猜测的)垃圾数据,在运行过程中,也只能通过一些偶然的奖励学习参数。这种事情想想就很疯狂,它是怎么学到一个很好的模型呢?但事实上,它确实学到了一个很好的模型。

7.DQN后续

自从 Deep Q-learning 提出之后,很多工作尝试对他进行提升,其中包括:Double Q-learning, Prioritized Experience Replay, Dueling Network Architecture, extension to continuous action space 等等。如果要跟进最新的研究成果,可以关注 NIPS 2015 deep reinforcement learning workshop 以及ICLR 2016(用「reinforcement」作为关键词搜索)。有一点需要注意的是 Deep Q-learning 已经被谷歌申请专利了。

我们常说我们还没搞清楚什么是人工智能。一旦我们搞清其中的工作原理,它看起来就不那么智能。但是深度Q-网络仍在不断地给我带来惊喜。观察 Q-learning 学习玩一个新游戏的过程就像观察野外的动物。通过不断地与环境交互获得奖励从而成为更强的物种。

8.拓展学习

可以点击 B站 查看视频的【双语字幕】版本

9.要点总结

本篇介绍了强化学习:

  • 强化学习是不同于监督学习与无监督学习的另外一类算法,主要是「智能体」与「环境」交互学习。
  • 强化学习没去在「游戏」「广告与推荐」「智能对话」「机器人」等领域都有应用。
  • GAN 是目前能生成最好样本的模型,但是训练需要技巧且不稳定,查询推断上也有一些问题。
  • 马尔科夫决策过程
  • 打折未来奖励及其计算方式
  • Q-Learning 算法
  • Deep Q-Learning 算法

ShowMeAI 斯坦福 CS231n 全套解读

ShowMeAI 系列教程推荐

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值