【深度强化学习】深度强化学习揭秘

2017 年 11 月 13 日 产业智能官 哈工大SCIR

                                                                        

原文:Demystifying Deep Reinforcement Learning(点击文末“阅读原文”访问)

译者:哈工大 SCIR 刘一佳

两年前,伦敦的一家叫DeepMind的小公司在Arxiv上发表了一篇名为“Playing Atari with Deep Reinforcement Learning”的先驱性文章。这篇文章介绍了如何让计算机学习玩Atari游戏。文中计算机的学习方法仅限于观察游戏机屏幕以及分数奖励。由于运行在Atari上的游戏玩法各不相同,目标也不尽一致,这篇文章的过人之处在于采用完全相同的框架玩不同的游戏,并且取得了非常好的成绩。文中提到他们的算法可以玩七种不同的游戏,其中三种甚至好于人类水平。

作为通用人工智能的第一步(具体指同一人工智能程序可以适应不同环境,而非针对某些具体任务设计人工智能程序),这篇文章受到了广泛关注。DeepMind也不出意外地被谷歌公司收购并站在了深度学习研究的前沿。在2015年2月,他们的文章“Human-level control through deep reinforcement learning”被Nature杂志以封面文章的形式发表。在这篇文章中,他们的人工智能程序已经能玩49种不同的游戏了。更激动人心的是,其中半数游戏中的表现已经超越了人类的顶尖选手。

虽然在学术界,深度学习模型已经在监督学习和非监督学习问题上广泛地使用,深度强化学习仍带有神秘的色彩。在这篇文章中,我将试着揭掉它神秘的面纱并将背后的基本原理展示给读者。这篇文章应该非常适合那些具备机器学习以及深度学习基础,但还没花时间仔细研究深度强化学习的读者们。 在进入主题之前,首先简要介绍一下本文的组织方式:

  1. 强化学习的主要挑战是什么?本节将用功劳分配问题作为例子并且介绍探索-利用困境。

  2. 如何对强化学习进行数学定义?本节将定义马尔科夫决策过程并用他来定义强化学习。

  3. 强化学习中如何制定长期决策?本节将定义“打折的未来奖励”,而这一定义是后续部分基础。

  4. 强化学习中如何估计或者近似未来奖励?本节将介绍一种简单的基于表的Q-learning算法。

  5. 如果状态过多(基于表的方法不可行时)如何估计或者近似未来奖励?本节将介绍如何使用深度学习的方式替换Q表。

  6. 如何才能从数据中学习模型使其真正工作?本节将介绍一种能够增强模型稳定性的技术——“经验回放技术”。

  7. 未来工作,文章的最后将介绍一种探索-利用困境的简易解决方案。

强化学习

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


图1,Atari Breakout游戏,(图片来源:DeepMind)

假设你想教神经网络模型玩这个游戏,模型的输入是游戏机屏幕像素所构成的图片,输出是三种动作:向左,向右以及开火(把球射出)。把这个问题建模为分类问题是很合理的——对于每个屏幕画面,你都需要进行决策:是左移,右移,还是开火。分类的建模方法看起来很直接。不过,你需要大量训练数据训练你的分类模型。传统的做法是找一些专家让他们玩游戏并且记录他们的游戏过程。但人类肯定不是这样玩游戏的。我们不需要有人站在我们背后告诉我们向左还是向右。我们只需要知道在某些情况下我们做了正确的动作并且得分了,其他的依靠我们自身的学习机制完成。 这个问题就是强化学习尝试解决的问题。强化学习处于监督学习与无监督学习的中间地带。在监督学习中,每个训练实例都有一个正确标签;在无监督学习中,训练实例并没有标签。在强化学习中,训练实例有稀疏并延时的标签——奖励。基于奖励,强化学习中的智能体可以学习如何对环境做出正确的反映。

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

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

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

马尔科夫决策过程

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

假想你是一个智能体(agent),面对某种场景(比如说Breakout游戏)。你所处的环境可以定义为状态(state)(比如横杆的位置,球的位置,球的方向,当前环境中的砖块等等)。智能体能够在环境中采取一些动作(actions)(比如向左或向右移动横杆)。这些动作会导致一些奖励(reward)(比如分数的增加)。智能体采取动作将导致新的环境,也就是新的状态。在新的状态下,智能体能够继续采取动作,循环往复。你采取行动的原则叫做策略(policy)。通常来讲,环境是很复杂的,智能体的下一状态可能带有一定的随机性(比如当你失去一个球发射另一个球时,它的方向是随机的)。


图2:左:强化学习问题,右:马尔科夫决策过程

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


其中,si表示状态,ai表示动作,ri+1是采取动作后的奖励。当状态序列达到终止状态sn时(比如“Game Over”画面),一个马尔科夫决策过程结束。马尔科夫决策过程服从马尔科夫假设,也就是说,下一状态si+1只与当前状态si和ai有关,与之前的状态或动作无关。

打折的未来奖励

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

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


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


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


这里,gamma是一个0到1的值。这个gamma值使得我们更少地考虑哪些更长远未来的奖励。数学直觉好的读者可以很快地看出Rt可以用Rt+1来表示,从而将上式写成一种递推的形式,即:


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

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

Q-learning

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


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

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

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


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

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


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

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


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

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

Deep Q Network

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

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

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


图3:左:朴素的Q-函数网络 右:在DeepMind论文中使用优化的Q网络 DeepMind在论文中使用的网络结构如下:


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

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


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

  1. 对于当前状态s,通过前向过程获得所有动作的Q-值

  2. 对于下一个状态s’,通过前向过程计算Q-值最大的动作max_a’ Q(s’, a’)

  3. 将r+\gamma max_a’ Q(s’, a’)作为学习目标,对于其他动作,设定第一步获得的Q-值作为学习目标(也就是不会在反向过程中更新参数)

  4. 使用反向传播算法更新参数。

经验回放

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

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

探索-利用困境

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

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

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

Deep Q-learning算法

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


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

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

最后要注意的问题

自从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学习玩一个新游戏的过程就像观察野外的动物。通过不断地与环境交互获得奖励从而成为更强的物种。

原文致谢

感谢Ardi Tampuu, Tanel Pärnamaa, Jaan Aru, Ilya Kuzovkin, Arjun Bansal and Urs Köster在本文成文过程中给出的建议。

翻译术语表


英文

中文

Q-learning


Q-network

Q-网络

Q-function

Q-函数

Q-value

Q-

State

状态

Action

动作

Reward

奖励

Future reward

未来奖励

Discounted future reward

打折的未来奖励

Credit-assignment problem

信用分配问题

Policy

策略

Bellman-equation

贝尔曼公式

Markov Decision Process

马尔科夫决策过程

exploration-exploitation dilemma

探索-利用困境

Experience replay

经验回放

\epsilon greedy exploration

\epsilon-贪心探索


校对:车万翔,郭江



浅析强化学习及使用Policy Network实现自动化控制


来源: 人工智能头条                    

                                                                         

作者 | 黄文坚




浅析强化学习




强化学习(Reinforcement Learning)是机器学习的一个重要分支,主要用来解决连续决策的问题。强化学习可以在复杂、不确定的环境中学习如何实现我们设定的目标。强化学习的应用场景非常广,几乎包括了所有需要做一系列决策的问题,比如控制机器人的电机让它执行特定任务,给商品定价或者库存管理,玩视频或棋牌游戏等。

强化学习也可以应用到有序列输出的问题中,因为它可以针对一系列变化的环境状态,输出一系列对应的行动。举个简单的例子,围棋(乃至全部棋牌类游戏)可以归结为一个强化学习问题,我们需要学习在各种局势下如何走出最好的招法。

一个强化学习问题包含三个主要概念,即环境状态(Environment State)、行动(Action)和奖励(Reward),而强化学习的目标是获得最多的累计奖励。

在围棋中,环境状态就是已经下出来的某个局势,行动是在某个位置落子,奖励则是当前这步棋获得的目数(围棋中存在不确定性,在结束对弈后计算的目数是准确的,棋局中获得的目数是估计的),而最终目标就是在结束对弈时总目数超过对手,赢得胜利。我们要让强化学习模型根据环境状态、行动和奖励,学习出最佳策略,并以最终结果为目标,不能只看某个行动当下带来的利益(比如围棋中通过某一手棋获得的实地),还要看到这个行动未来能带来的价值(比如围棋中外势可以带来的潜在价值)。

我们回顾一下,AutoEncoder属于无监督学习,而MLP、CNN和RNN都属于监督学习,但强化学习跟这两种都不同。它不像无监督学习那样完全没有学习目标,也不像监督学习那样有非常明确的目标(即label),强化学习的目标一般是变化的、不明确的,甚至可能不存在绝对正确的标签。

强化学习已经有几十年的历史,但是直到最近几年深度学习技术的突破,强化学习才有了比较大的进展。Google DeepMind结合强化学习与深度学习,提出DQN(Deep Q-Network,深度Q网络),它可以自动玩Atari 2600系列的游戏,并取得了超过人类的水平。

而DeepMind的AlphaGo结合了策略网络(Policy Network)、估值网络(Value Network,也即DQN)与蒙特卡洛搜索树(Monte Carlo Tree Search),实现了具有超高水平的围棋对战程序,并战胜了世界冠军李世石。

DeepMind使用的这些深度强化学习模型(Deep Reinforcement Learning,DRL)本质上也是神经网络,主要分为策略网络和估值网络两种。深度强化学习模型对环境没有特别强的限制,可以很好地推广到其他环境,因此对强化学习的研究和发展具有非常重大的意义。下面我们来看看深度强化学习的一些实际应用例子。

我们也可以使用深度强化学习自动玩游戏,如图1所示,用DQN可学习自动玩Flappy Bird。DQN前几层通常也是卷积层,因此具有了对游戏图像像素(raw pixels)直接进行学习的能力。前几层卷积可理解和识别游戏图像中的物体,后层的神经网络则对Action的期望价值进行学习,结合这两个部分,可以得到能根据游戏像素自动玩Flappy Bird的强化学习策略。

而且,不仅是这类简单的游戏,连非常复杂的包含大量战术策略的《星际争霸2》也可以被深度强化学习模型掌握。目前,DeepMind就在探索如何通过深度强化学习训练一个可以战胜《星际争霸2》世界冠军的人工智能,这之后的进展让我们拭目以待。

 

图1  使用深度强化学习自动玩Flappy Bird

深度强化学习最具有代表性的一个里程碑自然是AlphaGo。在2016年,Google DeepMind的AlphaGo以4:1的比分战胜了人类的世界冠军李世石,如图2所示。

围棋可以说是棋类游戏中最为复杂的,19×19的棋盘给它带来了3361种状态,除去其中非法的违反游戏规则的状态,计算机也是无法通过像深蓝那样的暴力搜索来战胜人类的,要在围棋这个项目上战胜人类,就必须给计算机抽象思维的能力,而AlphaGo做到了这一点。

 

图2  AlphaGo代表了深度强化学习技术的巅峰

在AlphaGo中使用了快速走子(Fast Rollout)、策略网络、估值网络和蒙特卡洛搜索树等技术。图3所示为AlphaGo的几种技术单独使用时的表现,横坐标为步数,纵坐标为预测的误差(可以理解为误差越低模型效果越好),其中简单的快速走子策略虽然效果比较一般,但是已经远胜随机策略。

估值网络和策略网络的效果都非常好,相对来说,策略网络的性能更胜一筹。AlphaGo融合了所有这些策略,取得了比单一策略更好的性能,在实战中表现出了惊人的水平。


图3  AlphaGo中随机策略、快速走子、估值网络和策略网络(SL和RL两种)的性能表现

Policy-Based(或者Policy Gradients)和Value-Based(或者Q-Learning)是强化学习中最重要的两类方法,其主要区别在于Policy-Based的方法直接预测在某个环境状态下应该采取的Action,而Value Based的方法则预测某个环境状态下所有Action的期望价值(Q值),之后可以通过选择Q值最高的Action执行策略。

这两种方法的出发点和训练方式都有不同,一般来说,Value Based方法适合仅有少量离散取值的Action的环境,而Policy-Based方法则更通用,适合Action种类非常多或者有连续取值的Action的环境。而结合深度学习后,Policy-Based的方法就成了Policy Network,而Value-Based的方法则成了Value Network。

图4所示为AlphaGo中的策略网络预测出的当前局势下应该采取的Action,图中标注的数值为策略网络输出的应该执行某个Action的概率,即我们应该在某个位置落子的概率。


图4  AlphaGo中的策略网络,输出在某个位置落子的概率

图5所示为AlphaGo中估值网络预测出的当前局势下每个Action的期望价值。估值网络不直接输出策略,而是输出Action对应的Q值,即在某个位置落子可以获得的期望价值。随后,我们可以直接选择期望价值最大的位置落子,或者选择其他位置进行探索。


图5  AlphaGo中的估值网络,输出在某个位置落子的期望价值

在强化学习中,我们也可以建立额外的model对环境状态的变化进行预测。普通的强化学习直接根据环境状态预测出行动策略,或行动的期望价值。如果根据环境状态和采取的行动预测接下来的环境状态,并利用这个信息训练强化学习模型,那就是model-based RL。

对于复杂的环境状态,比如视频游戏的图像像素,要预测这么大量且复杂的环境信息是非常困难的。如果环境状态是数量不大的一些离散值(m),并且可采取的行动也是数量较小的一些离散值(n),那么环境model只是一个简单的m×n的转换矩阵。对于一个普通的视频游戏环境,假设图像像素为64×64×3,可选行动有18种,那么我们光存储这个转换矩阵就需要大的难以想象的内存空间(25664×64×3×18)。

对于更复杂的环境,我们就更难使用model预测接下来的环境状态。而model-free类型的强化学习则不需要对环境状态进行任何预测,也不考虑行动将如何影响环境。model-free RL直接对策略或者Action的期望价值进行预测,因此计算效率非常高。当然,如果有一个良好的model可以高效、准确地对环境进行预测,会对训练RL带来益处;但是一个不那么精准的model反而会严重干扰RL的训练。因此,对大多数复杂环境,我们主要使用model-free RL,同时供给更多的样本给RL训练,用来弥补没有model预测环境状态的问题。




使用策略网络实现自动化控制




前面提到了强化学习中非常重要的3个要素是Environment State、Action和Reward。在环境中,强化学习模型的载体是Agent,它负责执行模型给出的行动。环境是Agent无法控制的,但是可以进行观察;根据观察的结果,模型给出行动,交由Agent来执行;而Reward是在某个环境状态下执行了某个Action而获得的,是模型要争取的目标。

在很多任务中,Reward是延迟获取的(Delayed),即某个Action除了可以即时获得Reward,也可能跟未来获得的Reward有很大关系。

所谓策略网络,即建立一个神经网络模型,它可以通过观察环境状态,直接预测出目前最应该执行的策略(Policy),执行这个策略可以获得最大的期望收益(包括现在的和未来的Reward)。

与普通的监督学习不同,在强化学习中,可能没有绝对正确的学习目标,样本的feature不再和label一一对应。对某一个特定的环境状态,我们并不知道它对应的最好的Action是什么,只知道当前Action获得的Reward还有试验后获得的未来的Reward。

我们需要让强化学习模型通过试验样本自己学习什么才是某个环境状态下比较好的Action,而不是告诉模型什么才是比较好的Action,因为我们也不知道正确的答案(即样本没有绝对正确的label,只有估算出的label)。我们的学习目标是期望价值,即当前获得的Reward,加上未来潜在的可获取的reward。

为了更好地让策略网络理解未来的、潜在的Reward,策略网络不只是使用当前的Reward作为label,而是使用Discounted Future Reward,即把所有未来奖励依次乘以衰减系数γ。这里的衰减系数一般是一个略小于但接近1的数,防止没有损耗地积累导致Reward目标发散,同时也代表了对未来奖励的不确定性的估计。


我们使用被称为Policy Gradients的方法来训练策略网络。Policy Gradients指的是模型通过学习Action在Environment中获得的反馈,使用梯度更新模型参数的过程。在训练过程中,模型会接触到好Action及它们带来的高期望价值,和差Action及它们带来的低期望价值,因此通过对这些样本的学习,我们的模型会逐渐增加选择好Action的概率,并降低选择坏Action的概率,这样就逐渐完成了我们对策略的学习。

和Q-Learning或估值网络不同,策略网络学习的不是某个Action对应的期望价值Q,而是直接学习在当前环境应该采取的策略,比如选择每个Action的概率(如果是有限个可选Action,好的Action应该对应较大概率,反之亦然),或者输出某个Action的具体数值(如果Action不是离散值,而是连续值)。因此策略网络是一种End-to-End(端对端)的方法,可以直接产生最终的策略。

Policy Based的方法相比于Value-Based,有更好的收敛性(通常可以保证收敛到局部最优,且不会发散),对高维或者连续值的Action非常高效(训练和输出结果都更高效),同时能学习出带有随机性的策略。例如,在石头剪刀布的游戏中,任何有规律的策略都会被别人学习到并且被针对,因此完全随机的策略反而可以立于不败之地(起码不会输给别的策略)。在这种情况下,可以利用策略网络学到随机出剪刀、石头、布的策略(三个Action的概率相等)。

我们需要使用Gym辅助我们进行策略网络的训练。Gym是OpenAI推出的开源的强化学习的环境生成工具。在Gym中,有两个核心的概念,一个是Environment,指我们的任务或者问题,另一个就是Agent,即我们编写的策略或算法。Agent会将执行的Action传给Environment,Environment接受某个Action后,再将结果Observation(即环境状态)和Reward返回给Agent。Gym中提供了完整的Environment的接口,而Agent则是完全由用户编写。

下面我们就以Gym中的CartPole环境作为具体例子。CartPole任务最早由论文《Neuronlike Adaptive Elements That Can Solve Difficult Learning Control Problem》提出,是一个经典的可用强化学习来解决的控制问题。

如图6所示,CartPole的环境中有一辆小车,在一个一维的无阻力轨道上行动,在车上绑着一个连接不太结实的杆,这个杆会左右摇晃。我们的环境信息observation并不是图像像素,而只是一个有4个值的数组,包含了环境中的各种信息,比如小车位置、速度、杆的角度、速度等。

我们并不需要知道每个数值对应的具体物理含义,因为我们不是要根据这些数值自己编写逻辑控制小车,而是设计一个策略网络让它自己从这些数值中学习到环境信息,并制定最佳策略。我们可以采取的Action非常简单,给小车施加一个正向的力或者负向的力。我们有一个Action Space的概念,即Action的离散数值空间,比如在CartPole里Action Space就是Discrete(2),即只有0或1,其他复杂一点的游戏可能有更多可以选择的值。我们并不需要知道这里的数值会具体对应哪个Action,只要模型可以学习到采取这个Action之后将会带来的影响就可以,因此Action都只是一个编码。

CartPole的任务目标很简单,就是尽可能地保持杆竖直不倾倒,当小车偏离中心超过2.4个单位的距离,或者杆的倾角超过15度时,我们的任务宣告失败,并自动结束。在每坚持一步后,我们会获得+1的reward,我们只需要坚持尽量长的时间不导致任务失败即可。任务的Reward恒定,对任何Action,只要不导致任务结束,都可以获得+1的Reward。但是我们的模型必须有远见,要可以考虑到长远的利益,而不只是学习到当前的Reward。

 

图6  CartPole环境中包含一个可以控制移动方向的小车和不稳的杆

当我们使用env.reset()方法后,就可以初始化环境,并获取到环境的第一个Observation。此后,根据Observation预测出应该采取的Action,并使用env.step(action)在环境中执行Action,这时会返回Observation(在CartPole中是4维的抽象的特征,在其他任务中可能是图像像素)、reward(当前这步Action获得的即时奖励)、done(任务是否结束的标记,在CartPole中是杆倾倒或者小车偏离中心太远,其他游戏中可能是被敌人击中。

如果为True,应该reset任务)和info(额外的诊断信息,比如标识了游戏中一些随机事件的概率,但是不应该用来训练Agent)。这样我们就进入Action-Observation的循环,执行Action,获得Observation,再执行Action,如此往复直到任务结束,并期望在结束时获得尽可能高的奖励。我们可执行的Action在CartPole中是离散的数值空间,即有限的几种可能,在别的任务中可能是连续的数值,例如在赛车游戏任务中,我们执行的动作是朝某个方向移动,这样我们就有了0~360度的连续数值空间可以选择。

下面就使用TensorFlow创建一个基于策略网络的Agent来解决CartPole问题。我们先安装OpenAI Gym。本节代码主要来自DeepRL-Agents的开源实现。

pip install gym


接着,载入NumPy、TensorFlow和gym。这里用gym.make(‘CartPole-v0’)创建CartPole问题的环境env。

import numpy as np

import tensorflow as tf

import gym

env = gym.make('CartPole-v0')


先测试在CartPole环境中使用随机Action的表现,作为接下来对比的baseline。首先,我们使用env.reset()初始化环境,然后进行10次随机试验,这里调用env.render()将CartPole问题的图像渲染出来。使用np.random.randint(0,2)产生随机的Action,然后用env.step()执行随机的Action,并获取返回的observation、reward和done。

如果done标记为True,则代表这次试验结束,即倾角超过15度或者偏离中心过远导致任务失败。在一次试验结束后,我们展示这次试验累计的奖励reward_sum并重启环境。

env.reset()

random_episodes = 0

reward_sum = 0

while random_episodes < 10:

    env.render()

    observation, reward, done, _ = env.step(np.random.randint(0,2))

    reward_sum += reward

    if done:

        random_episodes += 1

        print("Reward for this episode was:",reward_sum)

        reward_sum = 0

        env.reset()


可以看到随机策略获得的奖励总值差不多在10~40之间,均值应该在20~30,这将作为接下来用来对比的基准。我们将任务完成的目标设定为拿到200的Reward,并希望通过尽量少次数的试验来完成这个目标。

Reward for this episode was: 12.0

Reward for this episode was: 17.0

Reward for this episode was: 20.0

Reward for this episode was: 44.0

Reward for this episode was: 28.0

Reward for this episode was: 19.0

Reward for this episode was: 13.0

Reward for this episode was: 30.0

Reward for this episode was: 20.0

Reward for this episode was: 26.0


我们的策略网络使用简单的带有一个隐含层的MLP。先设置网络的各个超参数,这里隐含节点数H设为50,batch_size设为25,学习速率learning_rate为0.1,环境信息observation的维度D为4,gamma即Reward的discount比例设为0.99。

在估算Action的期望价值(即估算样本的学习目标)时会考虑Delayed Reward,会将某个Action之后获得的所有Reward做discount并累加起来,这样可以让模型学习到未来可能出现的潜在Reward。注意,一般discount比例要小于1,防止Reward被无损耗地不断累加导致发散,这样也可以区分当前Reward和未来Reward的价值(当前Action直接带来的Reward不需要discount,而未来的Reward因存在不确定性所以需要discount)。

H = 50 

batch_size = 25 

learning_rate = 1e-1 

D = 4 

gamma = 0.99 


下面定义策略网络的具体结构。这个网络将接受observations作为输入信息,最后输出一个概率值用以选择Action(我们只有两个Action,向左施加力或者向右施加力,因此可以通过一个概率值决定)。我们创建输入信息observations的placeholder,其维度为D。

然后使用tf.contrib.layers.xavier_initializer初始化算法创建隐含层的权重W1,其维度为[D, H]。接着用tf.matmul将环境信息observation乘上W1再使用ReLU激活函数处理得到隐含层输出layer1,这里注意我们并不需要加偏置。同样用xavier_initializer算法创建最后Sigmoid输出层的权重W2,将隐含层输出layer1乘以W2后,使用Sigmoid激活函数处理得到最后的输出概率。

observations = tf.placeholder(tf.float32, [None,D] , name="input _x")

W1 = tf.get_variable("W1", shape=[D, H],

                     initializer=tf.contrib.layers.xavier_initializer())

layer1 = tf.nn.relu(tf.matmul(observations,W1))

W2 = tf.get_variable("W2", shape=[H, 1],

                     initializer=tf.contrib.layers.xavier_initializer())

score = tf.matmul(layer1,W2)

probability = tf.nn.sigmoid(score)


这里模型的优化器使用Adam算法。我们分别设置两层神经网络参数的梯度的placeholder——W1Grad和W2Grad,并使用adam.apply_gradients定义我们更新模型参数的操作updateGrads。之后计算参数的梯度,当积累到一定样本量的梯度,就传入W1Grad和W2Grad,并执行updateGrads更新模型参数。

这里注意,深度强化学习的训练和其他神经网络一样,也使用batch training的方式。我们不逐个样本地更新参数,而是累计一个batch_size的样本的梯度再更新参数,防止单一样本随机扰动的噪声对模型带来不良影响。

adam = tf.train.AdamOptimizer(learning_rate=learning_rate) 

W1Grad = tf.placeholder(tf.float32,name="batch_grad1") 

W2Grad = tf.placeholder(tf.float32,name="batch_grad2")

batchGrad = [W1Grad,W2Grad]

updateGrads = adam.apply_gradients(zip(batchGrad,tvars))


下面定义函数discount_rewards,用来估算每一个Action对应的潜在价值discount_r。因为CartPole问题中每次获得的Reward都和前面的Action有关,属于delayed reward。因此需要比较精准地衡量每一个Action实际带来的价值时,不能只看当前这一步的Reward,而要考虑后面的Delayed Reward。那些能让Pole长时间保持在空中竖直的Action,应该拥有较大的期望价值,而那些最终导致Pole倾倒的Action,则应该拥有较小的期望价值。

我们判断越靠后的Action的期望价值越小,因为它们更可能是导致Pole倾倒的原因,并且判断越靠前的Action的期望价值越大,因为它们长时间保持了Pole的竖直,和倾倒的关系没有那么大。我们倒推整个过程,从最后一个Action开始计算所有Action应该对应的期望价值。

输入数据r为每一个Action实际获得的Reward,在CartPole问题中,除了最后结束时的Action为0,其余均为1。下面介绍具体的计算方法,我们定义每个Action除直接获得的Reward外的潜在价值为running_add,running_add是从后向前累计的,并且需要经过discount衰减。而每一个Action的潜在价值,即为后一个Action的潜在价值乘以衰减系数gamma再加上它直接获得的reward,即running_add*gamma+r[t]。这样从最后一个Action开始不断向前累计计算,即可得到全部Action的潜在价值。这种对潜在价值的估算方法符合我们的期望,越靠前的Action潜在价值越大。

def discount_rewards(r):

    discounted_r = np.zeros_like(r)

    running_add = 0

    for t in reversed(range(r.size)):

        running_add = running_add * gamma + r[t]

        discounted_r[t] = running_add

    return discounted_r


我们定义人工设置的虚拟label(下文会讲解其生成原理,其取值为0或1)的placeholder——input_y,以及每个Action的潜在价值的placeholder——advangtages。这里loglik的定义略显复杂,我们来看一下loglik到底代表什么。Action取值为1的概率为probability(即策略网络输出的概率),Action取值为0的概率为1-probability,label取值与Action相反,即label=1-Action。当Action为1时,label为0,此时loglik=tf.log(probability),Action取值为1的概率的对数;当Action为0时,label为1,此时loglik=tf.log(1-probability),即Action取值为0的概率的对数。所以,loglik其实就是当前Action对应的概率的对数,我们将loglik与潜在价值advantages相乘,并取负数作为损失,即优化目标。我们使用优化器优化时,会让能获得较多advantages的Action的概率变大,并让能获得较少advantages的Action的概率变小,这样能让损失变小。

通过不断的训练,我们便能持续加大能获得较多advantages的Action的概率,即学习到一个能获得更多潜在价值的策略。最后,使用tf.trainable_variables()获取策略网络中全部可训练的参数tvars,并使用tf.gradients求解模型参数关于loss的梯度。

input_y = tf.placeholder(tf.float32,[None,1], name="input_y")

advantages = tf.placeholder(tf.float32,name="reward_signal")

loglik = tf.log(input_y*(input_y - probability) + \

             (1 - input_y)*(input_y + probability))

loss = -tf.reduce_mean(loglik * advantages) 


tvars = tf.trainable_variables()

newGrads = tf.gradients(loss,tvars)


在正式进入训练过程前,我们先定义一些参数,xs为环境信息observation的列表,ys为我们定义的label的列表,drs为我们记录的每一个Action的Reward。我们定义累计的Reward为reward_sum,总试验次数total_episodes为10000,直到达到获取200的Reward才停止训练。

xs,ys,drs = [],[],[]

reward_sum = 0

episode_number = 1

total_episodes = 10000


我们创建默认的Session,初始化全部参数,并在一开始将render的标志关闭。因为render会带来比较大的延迟,所以一开始不太成熟的模型还没必要去观察。先初始化CartPole的环境并获得初始状态。然后使用sess.run执行tvars获取所有模型参数,用来创建储存参数梯度的缓冲器gradBuffer,并把gardBuffer全部初始化为零。接下来的每次试验中,我们将收集参数的梯度存储到gradBuffer中,直到完成了一个batch_size的试验,再将汇总的梯度更新到模型参数。

with tf.Session() as sess:

    rendering = False

    init = tf.global_variables_initializer()

    sess.run(init)

    observation = env.reset() 


    gradBuffer = sess.run(tvars)

    for ix,grad in enumerate(gradBuffer):

        gradBuffer[ix] = grad * 0


下面进入试验的循环,最大循环次数即为total_episodes。当某个batch的平均Reward达到100以上时,即Agent表现良好时,调用env.render()对试验环境进行展示。先使用tf.reshape将observation变形为策略网络输入的格式,然后传入网络中,使用sess.run执行probability获得网络输出的概率tfprob,即Action取值为1的概率。接下来我们在(0,1)间随机抽样,若随机值小于tfprob,则令Action取值为1,否则令Action取值为0,即代表Action取值为1的概率为tfprob。

while episode_number <= total_episodes:

        

        if reward_sum/batch_size > 100 or rendering == True : 

            env.render()

            rendering = True

            

        x = np.reshape(observation,[1,D])

        

        tfprob = sess.run(probability,feed_dict={observations: x})

        action = 1 if np.random.uniform() < tfprob else 0


然后将输入的环境信息observation添加到列表xs中。这里我们制造虚拟的label——y,它取值与Action相反,即y=1-action,并将其添加到列表ys中。然后使用env.step执行一次Action,获取observation、reward、done和info,并将reward累加到reward_sum,同时将reward添加到列表drs中。

xs.append(x)

    y = 1 - action

    ys.append(y)


    observation, reward, done, info = env.step(action)

    reward_sum += reward


    drs.append(reward) 


当done为True,即一次试验结束时,将episode_numer加1。同时使用np.vstack将几个列表xs、ys、drs中的元素纵向堆叠起来,得到epx、epy和epr,并将xs、ys、drs清空以备下次试验使用。这里注意,epx、epy、drs即为一次试验中获得的所有observation、label、reward的列表。我们使用前面定义好的discount_rewards函数计算每一步Action的潜在价值,并进行标准化(减去均值再除以标准差),得到一个零均值标准差为1的分布。这么做是因为discount_reward会参与到模型损失的计算,而分布稳定的discount_rewad有利于训练的稳定。

if done: 

          episode_number += 1

          epx = np.vstack(xs)

          epy = np.vstack(ys)

          epr = np.vstack(drs)

          xs,ys,drs = [],[],[] 


          discounted_epr = discount_rewards(epr)

          discounted_epr -= np.mean(discounted_epr)

          discounted_epr /= np.std(discounted_epr)


我们将epx、epy和discounted_epr输入神经网络,并使用操作newGrads求解梯度。再将获得的梯度累加到gradBuffer中去。

tGrad = sess.run(newGrads,feed_dict={observations: epx,

                       input_y: epy, advantages: discounted_epr})

          for ix,grad in enumerate(tGrad):

               gradBuffer[ix] += grad


当进行试验的次数达到batch_size的整倍数时,gradBuffer中就累计了足够多的梯度,因此使用updateGrads操作将gradBuffer中的梯度更新到策略网络的模型参数中,并清空gradBuffer,为计算下一个batch的梯度做准备。这里注意,我们是使用一个batch的梯度更新参数,但是每一个梯度是使用一次试验中全部样本(一个Action对应一个样本)计算出来的,因此一个batch中的样本数实际上是25(batch_size)次试验的样本数之和。

同时,我们展示当前的试验次数episode_number,和batch内每次试验平均获得的reward。当我们batch内每次试验的平均reward大于200时,我们的策略网络就成功完成了任务,并将终止循环。如果没有达到目标,则清空reward_sum,重新累计下一个batch的总reward。同时,在每次试验结束后,将任务环境env重置,方便下一次试验。

if episode_number % batch_size == 0: 

    sess.run(updateGrads,feed_    

   dict={W1Grad: gradBuffer[0],

              W2Grad:gradBuffer[1]})

   for ix,grad in enumerate(gradBuffer):

        gradBuffer[ix] = grad * 0

   print('Average reward for episode %d : %f.' % \

     (episode_ number,reward_sum/batch_size))

                

if reward_sum/batch_size > 200: 

    print("Task solved in",episode_number, 'episodes!')

    break

                    

    reward_sum = 0

            

    observation = env.reset()


下面是模型的训练日志,可以看到策略网络在仅经历了200次试验,即8个batch的训练和参数更新后,就实现了目标,达到了batch内平均230的reward,顺利完成预设的目标。有兴趣的读者可以尝试修改策略网络的结构、隐含节点数、batch_size、学习速率等参数来尝试优化策略网络的训练,加快其学习到好策略的速度。

Average reward for episode 25 : 19.200000.

Average reward for episode 50 : 30.680000.

Average reward for episode 75 : 41.360000.

Average reward for episode 100 : 52.160000.

Average reward for episode 125 : 70.680000.

Average reward for episode 150 : 84.520000.

Average reward for episode 175 : 153.320000.

Average reward for episode 200 : 230.400000.

Task solved in 200 episodes!


作者简介:黄文坚,PPmoney大数据算法总监。负责集团的风控、理财、互联网证券等业务的数据挖掘工作;Google TensorFlow Contributor;前明略数据技术合伙人。




人工智能赛博物理操作系统

AI-CPS OS

人工智能赛博物理操作系统(新一代技术+商业操作系统“AI-CPS OS”:云计算+大数据+物联网+区块链+人工智能)分支用来的今天,企业领导者必须了解如何将“技术”全面渗入整个公司、产品等“商业”场景中,利用AI-CPS OS形成数字化+智能化力量,实现行业的重新布局、企业的重新构建和自我的焕然新生。


AI-CPS OS的真正价值并不来自构成技术或功能,而是要以一种传递独特竞争优势的方式将自动化+信息化、智造+产品+服务和数据+分析一体化,这种整合方式能够释放新的业务和运营模式。如果不能实现跨功能的更大规模融合,没有颠覆现状的意愿,这些将不可能实现。


领导者无法依靠某种单一战略方法来应对多维度的数字化变革。面对新一代技术+商业操作系统AI-CPS OS颠覆性的数字化+智能化力量,领导者必须在行业、企业与个人这三个层面都保持领先地位:

  1. 重新行业布局:你的世界观要怎样改变才算足够?你必须对行业典范进行怎样的反思?

  2. 重新构建企业:你的企业需要做出什么样的变化?你准备如何重新定义你的公司?

  3. 重新打造自己:你需要成为怎样的人?要重塑自己并在数字化+智能化时代保有领先地位,你必须如何去做?

AI-CPS OS是数字化智能化创新平台,设计思路是将大数据、物联网、区块链和人工智能等无缝整合在云端,可以帮助企业将创新成果融入自身业务体系,实现各个前沿技术在云端的优势协同。AI-CPS OS形成的字化+智能化力量与行业、企业及个人三个层面的交叉,形成了领导力模式,使数字化融入到领导者所在企业与领导方式的核心位置:

  1. 精细种力量能够使人在更加真实、细致的层面观察与感知现实世界和数字化世界正在发生的一切,进而理解和更加精细地进行产品个性化控制、微观业务场景事件和结果控制。

  2. 智能:模型随着时间(数据)的变化而变化,整个系统就具备了智能(自学习)的能力。

  3. 高效:企业需要建立实时或者准实时的数据采集传输、模型预测和响应决策能力,这样智能就从批量性、阶段性的行为变成一个可以实时触达的行为。

  4. 不确定性:数字化变更颠覆和改变了领导者曾经仰仗的思维方式、结构和实践经验,其结果就是形成了复合不确定性这种颠覆性力量。主要的不确定性蕴含于三个领域:技术、文化、制度。

  5. 边界模糊:数字世界与现实世界的不断融合成CPS不仅让人们所知行业的核心产品、经济学定理和可能性都产生了变化,还模糊了不同行业间的界限。这种效应正在向生态系统、企业、客户、产品快速蔓延。

AI-CPS OS形成的数字化+智能化力量通过三个方式激发经济增长:

  1. 创造虚拟劳动力,承担需要适应性和敏捷性的复杂任务,即“智能自动化”,以区别于传统的自动化解决方案;

  2. 对现有劳动力和实物资产进行有利的补充和提升,提高资本效率

  3. 人工智能的普及,将推动多行业的相关创新,开辟崭新的经济增长空间


给决策制定者和商业领袖的建议:

  1. 超越自动化,开启新创新模式:利用具有自主学习和自我控制能力的动态机器智能,为企业创造新商机;

  2. 迎接新一代信息技术,迎接人工智能:无缝整合人类智慧与机器智能,重新

    评估未来的知识和技能类型;

  3. 制定道德规范:切实为人工智能生态系统制定道德准则,并在智能机器的开

    发过程中确定更加明晰的标准和最佳实践;

  4. 重视再分配效应:对人工智能可能带来的冲击做好准备,制定战略帮助面临

    较高失业风险的人群;

  5. 开发数字化+智能化企业所需新能力:员工团队需要积极掌握判断、沟通及想象力和创造力等人类所特有的重要能力。对于中国企业来说,创造兼具包容性和多样性的文化也非常重要。


子曰:“君子和而不同,小人同而不和。”  《论语·子路》云计算、大数据、物联网、区块链和 人工智能,像君子一般融合,一起体现科技就是生产力。


如果说上一次哥伦布地理大发现,拓展的是人类的物理空间。那么这一次地理大发现,拓展的就是人们的数字空间。在数学空间,建立新的商业文明,从而发现新的创富模式,为人类社会带来新的财富空间。云计算,大数据、物联网和区块链,是进入这个数字空间的船,而人工智能就是那船上的帆,哥伦布之帆!


新一代技术+商业的人工智能赛博物理操作系统AI-CPS OS作为新一轮产业变革的核心驱动力,将进一步释放历次科技革命和产业变革积蓄的巨大能量,并创造新的强大引擎。重构生产、分配、交换、消费等经济活动各环节,形成从宏观到微观各领域的智能化新需求,催生新技术、新产品、新产业、新业态、新模式。引发经济结构重大变革,深刻改变人类生产生活方式和思维模式,实现社会生产力的整体跃升。





产业智能官  AI-CPS



用“人工智能赛博物理操作系统新一代技术+商业操作系统“AI-CPS OS”:云计算+大数据+物联网+区块链+人工智能)在场景中构建状态感知-实时分析-自主决策-精准执行-学习提升的认知计算和机器智能;实现产业转型升级、DT驱动业务、价值创新创造的产业互联生态链






长按上方二维码关注微信公众号: AI-CPS,更多信息回复:


新技术:“云计算”、“大数据”、“物联网”、“区块链”、“人工智能”;新产业:“智能制造”、“智能农业”、“智能金融”、“智能零售”、“智能城市”、“智能驾驶”;新模式:“财富空间”、“特色小镇”、“赛博物理”、“供应链金融”


点击“阅读原文”,访问AI-CPS OS官网




本文系“产业智能官”(公众号ID:AI-CPS)收集整理,转载请注明出处!



版权声明产业智能官(公众号ID:AI-CPS推荐的文章,除非确实无法确认,我们都会注明作者和来源。部分文章推送时未能与原作者取得联系。若涉及版权问题,烦请原作者联系我们,与您共同协商解决。联系、投稿邮箱:erp_vip@hotmail.com







登录查看更多
20

相关内容

【IJCAI2020-华为诺亚】面向深度强化学习的策略迁移框架
专知会员服务
27+阅读 · 2020年5月25日
多智能体深度强化学习的若干关键科学问题
专知会员服务
188+阅读 · 2020年5月24日
深度强化学习策略梯度教程,53页ppt
专知会员服务
178+阅读 · 2020年2月1日
2019必读的十大深度强化学习论文
专知会员服务
58+阅读 · 2020年1月16日
【强化学习】深度强化学习初学者指南
专知会员服务
179+阅读 · 2019年12月14日
专知会员服务
207+阅读 · 2019年8月30日
TensorFlow 2.0深度强化学习指南
云栖社区
18+阅读 · 2019年2月1日
深度强化学习简介
专知
30+阅读 · 2018年12月3日
资源 | 《深度强化学习》手稿开放了!
THU数据派
16+阅读 · 2018年10月24日
【代码集合】深度强化学习Pytorch实现集锦
机器学习算法与Python学习
8+阅读 · 2018年10月23日
深度强化学习入门,这一篇就够了!
机器学习算法与Python学习
27+阅读 · 2018年8月17日
深度强化学习的弱点和局限(上)
论智
8+阅读 · 2018年2月26日
如何开启深度强化学习的大门?
StuQ
8+阅读 · 2017年9月12日
Arxiv
3+阅读 · 2018年11月13日
Arxiv
3+阅读 · 2018年10月5日
Hierarchical Deep Multiagent Reinforcement Learning
Arxiv
8+阅读 · 2018年9月25日
VIP会员
相关VIP内容
【IJCAI2020-华为诺亚】面向深度强化学习的策略迁移框架
专知会员服务
27+阅读 · 2020年5月25日
多智能体深度强化学习的若干关键科学问题
专知会员服务
188+阅读 · 2020年5月24日
深度强化学习策略梯度教程,53页ppt
专知会员服务
178+阅读 · 2020年2月1日
2019必读的十大深度强化学习论文
专知会员服务
58+阅读 · 2020年1月16日
【强化学习】深度强化学习初学者指南
专知会员服务
179+阅读 · 2019年12月14日
专知会员服务
207+阅读 · 2019年8月30日
相关资讯
TensorFlow 2.0深度强化学习指南
云栖社区
18+阅读 · 2019年2月1日
深度强化学习简介
专知
30+阅读 · 2018年12月3日
资源 | 《深度强化学习》手稿开放了!
THU数据派
16+阅读 · 2018年10月24日
【代码集合】深度强化学习Pytorch实现集锦
机器学习算法与Python学习
8+阅读 · 2018年10月23日
深度强化学习入门,这一篇就够了!
机器学习算法与Python学习
27+阅读 · 2018年8月17日
深度强化学习的弱点和局限(上)
论智
8+阅读 · 2018年2月26日
如何开启深度强化学习的大门?
StuQ
8+阅读 · 2017年9月12日
Top
微信扫码咨询专知VIP会员