2018年6月1日星期五

Google被骂成筛子

问耕 发自 凹非寺量子位 出品 | 公众号 QbitAI

Google终于放弃了。

这家陷入四面楚歌境地的科技巨头,周五在内部会议上作出决定:不再与美国国防部续约Project Maven项目,双方的合作2019年到期后结束。根据这项秘密协议,Google原本要为美军无人机提供顶尖AI技术。

然而关于这场风波的更多猛料,还在继续爆出。Google不愿为人所知的真相,不断从水面之下浮出。

甚至连The Intercept都出手了。如果你熟知当年的斯诺登事件,就知道这家调查新闻网站火力有多猛。

科技巨头抢单争夺战

Google高管十分重要与军方的此次合作。而且The Intercept报道,对这个大单垂涎的不止Google。

根据他们获取的邮件,Google国防销售团队的艾琳·布雷克(Aileen Black)谈到Project Maven交易时,将其描述为科技行业"人工智能巨头之间长达5个月的竞争"。

"总交易额为2500万到3000万美元,其中1500万美元是在未来18个月内完成。"她写道,"随着项目规模扩大,每年的预算预计达到2.5亿美元。"

艾琳发送的那封去年9月13日的备忘录似乎提到了名为JEDI的项目,今后10年的总价值达到100亿美元。而Google则有意获取该项目。JEDI项目是在9月12日宣布的。

艾琳写道,该项目推进速度很快,五角大楼"正在快速追踪"Google的云安全认证,她认为这种进展"非常重要"。

Google内部邮件还指出,多家科技公司都在相互竞争,希望赢得Project Maven合同。一位参与谈判的Google高管写道,亚马逊等其他科技公司也在参与这类项目。(亚马逊尚未对此置评。)

Google高管表示,Project Maven不只是一个小型军事实验项目,而是与其他硅谷公司竞相争夺的价值数十亿美元的大型云计算合同"直接相关"。

这些邮件还进一步显示,亚马逊AWS云计算部门也参与了Project Maven。

关于Project Maven的内部时间线也被The Intercept获得,让外界得以一窥合同的进展情况。

2017年10月27日,Google云团队访问拥有大量无人机飞行员的比尔空军基地,"会见操作用户(空军数据分析师),他们将从2018年6月开始成为我们技术的最终用户和初级测试员。"

之前一周,带头拓展Project Maven的约翰·沙纳汉(John Shanahan)将军访问了Advanced Solutions Lab,会见了参与该项目的50位成员。沙纳汉宣称"国防部今后的东西没有内置人工智能技术都不应该上战场。"

这个时间线还描述了Google如何与军方展开持续合作来改进产品,包括用户界面。

"虽然最初的核心技术重点仍是探索、分类和(有限制地)追踪某写物体,但我们正在考虑如何解决客户对更有挑战的、能解决用户实际问题的使用场景的担忧。"该文件指出。

不止于此,从邮件内容获知,Google正和其他与国防部合作的公司一起开发一个机器学习项目,准备建立一个可以监控整座城市的复杂系统

Google,欲盖弥彰

今年三月,Google内部的抗议活动已经声势浩大。数千Google员工联名上书,抵制与五角大楼(美国国防部)的这次合作。

Google高层试图平息这些异议。

据《纽约时报》报道,Google云CEO戴安·格林(Diane Greene)在媒体报道此事后的全体员工大会上表示,该合同金额"只有"900万美元——对于这样一家规模庞大的科技巨头来说,这确实算不上大项目。

而The Intercept获得的邮件则描绘出一番不同的情景。

这些去年9月的邮件显示,Google的BD部门预计军用无人机人工智能收入将从最初的每年1500万美元增加到2.5亿美元

事实上,在该合同被媒体曝光后,五角大楼又向Project Maven额外增加了1亿美元拨款。

显然这已经不是小生意了,同学们。

也难怪Google高层如此重视这单生意。毕竟这能让Google云服务赢得更多的来自军方的订单。不过,Google又不想该合作关系被外界察觉到。

参与去年9月的一系列电子邮件讨论中,一个重要的讨论话题,就是Project Maven合同可能引发的公关灾难。是否披露该交易成为一个重要的关注点

"这是媒体损坏Google声誉的绝佳机会。你们大概听说过伊隆·马斯克的评论,他认为人工智能可能引发第三次世界大战。"Google云首席科学家李飞飞在邮件中说。

"我不知道如果媒体开始渲染Google秘密开发人工智能武器,或者用人工智能为国防行业开发武器,会发生什么事情。"她说。

Google政府销售团队指出,Project Maven通过一份授予给ECS Federal的合同被隐藏起来。

"该合同并不是直接与Google签订的,而是通过合作伙伴(ECS)签订的,而我们的条款则会禁止在没有双方同意的情况下发布新闻稿。"艾琳写道。国防部"不会在没有我们同意的情况下透露任何关于Google的信息。"

尽管保密程度较高,但艾琳警告称,此事最终还是会曝光,而与合同流程有关的信息也可以通过《信息自由法案》被公众获取。艾琳说,"由我们自己公布条款难道不是最好的方案吗?"

然而,该项目从来没有公开宣布

直到2018年3月媒体曝光。

军方力量

如我们标题所说,为了这件事,Google被骂成了筛子。

3月,Google内部3000多名员工联名上书,抵制与五角大楼的合作。

4月,事件进一步发酵,包括Bengio等上百名学者、科学家二次上书,数十名员工因此离职,要求Google退出Maven项目,并且起草政策声明Google永远不会开发战争技术。

当然,也不是完全一边倒。比如华盛顿大学教授、《终极算法》作者Pedro Domingos就此公开提出了质疑。

他在Twitter上向Google员工喊话:如果前几代技术人员都像你们这样,拒绝国防相关的工作,我们现在就不会有互联网,也不会有Google。

有人附议说:其他国家正在高科技领域全速前进,而且没有道德约束。Google在捍卫西方价值观方面确实没得说。

这确实也有一定道理。

互联网、无人驾驶汽车、手持电子设备、人工智能、GPS……这些今天我们耳熟能详的高科技产品,最初的推动者,都是美国军方。

当然,科学家反对科技用于军事用途,也是一项传统。

即便是Google本身,也一直和军方有合作。例如Google Earth就一直跟五角大楼有较为深度的整合。

Google,开枪

最后,放一段最近很火的视频。

艺术家Alexander Reben最近放出了一段视频,也许这可以看成是行为艺术吧。

在这段30秒的视频里,Reben没有动手,但是语音发出了一个命令:"OK Google,开枪"。

不到一秒的转瞬之间,Google Assistant人工智能助手,扣动了一部手枪的扳机,击倒了一颗红苹果。随即,蜂鸣器发出刺耳的嗡嗡声。

嗡嗡声持久不绝。

到底是谁开了枪?

在这个案例中,Reben告诉AI开枪。Engadget在报道中说,如果AI足够智能以预测我们的需求,或许有一天AI会主动除掉那些让我们不开心的人。Reben说,讨论这样一个装置,比是否存在这样一个装置更重要。

欢迎大家关注我们的专栏:量子位 - 知乎专栏

诚挚招聘

量子位正在招募编辑/记者,工作地点在北京中关村。期待有才气、有热情的同学加入我们!相关细节,请在量子位公众号(QbitAI)对话界面,回复"招聘"两个字。

量子位 QbitAI · 头条号签约作者

վ'ᴗ' ի 追踪AI技术和产品新动态



via 量子位 - 知乎专栏 https://ift.tt/2J3JoH4
RSS Feed

RSS5

IFTTT

谷歌大脑提出自动数据增强方法AutoAugment:可迁移至不同数据集

近日,来自谷歌大脑的研究者在 arXiv 上发表论文,提出一种自动搜索合适数据增强策略的方法 AutoAugment,该方法创建一个数据增强策略的搜索空间,利用搜索算法选取适合特定数据集的数据增强策略。此外,从一个数据集中学到的策略能够很好地迁移到其它相似的数据集上。

引言

深度神经网络是强大的机器学习系统,当使用海量数据训练时,深度神经网络往往能很好地工作。数据增强是一种通过随机「增广」来提高数据量和数据多样性的策略 [1-3]。在图像领域,常见的数据增强技术包括将图像平移几个像素,或者水平翻转图像。直观来看,数据增强被用来为模型引入数据域中的不变性:目标分类通常对水平翻转或平移是不敏感的。网络架构也可以被用于对不变性进行硬编码:卷积神经网络适用于平移不变性 [3-6],而物理模型适用于平移、旋转和原子排列的不变性 [7-12]。然而,使用数据增强技术来表达潜在的不变性比直接将不变性硬编码到模型中更简单。

然而,机器学习和计算机视觉社区的一个大的关注点是设计出更好的网络架构(例如 [13-21])。人们较少将精力放在寻找引入更多不变性的更好的数据增强方法上。例如,在 ImageNet 上,Alex 等人 [3] 在 2012 年引入的数据增强方法仍然是现在的标准操作,仅有微小的改变。即使对特定数据集找到了数据增强的改进方法,这些方法通常也不能有效地迁移到其他的数据集上。例如,在训练期间对图像进行水平翻转在 CIFAR-10 数据集上是一个有效的数据增强方法,但是在 MNIST 上并不奏效,这是因为这些数据集中出现的对称性不同。最近,对自动学习到的数据增强技术的需求发展成为一个重要的待解决问题 [22]。

在本论文中,作者旨在实现为目标数据集寻找有效数据增强策略的自动化过程。在本文第三节的实现中,每个策略都表示一些可能的数据增强操作的选项和顺序,其中每一个操作是图像处理函数(例如,平移、旋转或色彩归一化),及应用该函数的概率和幅度(magnitude)。作者使用一种搜索算法寻找这些操作的最佳选项和顺序,以使这样训练出的神经网络能获得最佳的验证准确率。在本文的实验中,作者使用增强学习 [23] 作为搜索算法,但是作者认为如果使用更好的算法 [21,24],结果可以得到进一步改进。

作者提出的方法在 CIFAR-10、简化的 CIFAR-10、CIFAR-100、SVHN、简化的 SVHN,以及 ImageNet(不添加额外数据)等数据集上取得了目前最高的准确率。在 CIFAR-10 上的误差率为 1.48%,比之前最先进的模型 [21] 的误差率低 0.65%。在 SVHN 上,作者将目前最低的误差率从 1.30% [25] 降低到了 1.02%。在简化数据集上,本文提出的方法取得了和不使用任何非标注数据的半监督方法相当的性能。在 ImageNet 数据集上,作者提出的方法达到了 83.54% 的 Top-1 准确率。最后,作者展示了在一个任务中找到的策略可以很好地泛化到不同的模型和数据集上。例如,在 ImageNet 上发现的策略能在各种各样的 FGVC 数据集上带来显著的性能提升。即使在那些对在 ImageNet 上预训练好的权重进行调优也帮助不大的数据集上 [26],例如 Stanford Cars [27] 和 FGVC Aircraft [28],使用 ImageNet 上的策略训练可以分别减少 1.16% 和 1.76% 的误差率。这一结果表明迁移数据增强策略为迁移学习提供了一种新的可选方案。

AutoAugment

作者将寻找最佳数据增强策略的问题形式化为一个离散搜索问题。在搜索空间中,一个策略由 5 个子策略组成,每个子策略又包含依次被应用的两个图像处理操作,每个操作也都和两个超参数相关:1)应用操作的概率 2)操作的幅度。

图 1 展示了在搜索空间中的一个包含 5 个子策略的策略示例。第一个子策略指定了依次进行对 X 坐标的剪切(ShearX)和图像翻转操作(Invert)。应用 ShearX 操作的概率是 0.9,并且当应用这个操作时,其幅度为十分之七。接着,作者以 0.8 的概率应用 Invert 操作,该操作不使用幅度信息。作者强调这些操作需要按照指定顺序执行。

图 1:在 SVHN 上发现的一个策略,以及如何使用它在给定用于训练神经网络的原始图像的条件下来生成增强后的数据。这个策略包含 5 个子策略。对于小批量中的每一张图像,作者均匀地随机选取一个子策略去生成一张变换后的图像来训练神经网络。每个子策略由两个操作组成,每个操作都与两个数值相关联:调用操作的概率、操作的幅度。由于存在调用操作的概率,因此该操作在这个小批量中可能不被应用。然而,如果它被应用了,这个应用的幅度就是固定的。作者通过展示即使使用相同的子策略,一个示例图片能够在不同的小批量中被不同地变换,强调了应用子策略的随机性。正如文中所解释的,在 SVHN 上,AutoAugment 更常采取几何变换措施。我们可以从中看出为什么翻转(Invert)在 SVHN 上是一个被普遍选择的操作,因为图像中的数字在这种变换下具有不变性。

表 1:在 CIFAR-10 上的测试集误差率(%)。此误差率越低越好。本文的实验复现了所有基线模型和带 Cutout 的基线模型结果,并且与之前报告的结果 [25,56,58,59] 相匹配。只有 Shake-Shake(26 2x112d)网络例外,该网络比 [58] 中最大的模型拥有更多的滤波器——112 vs 96,而且结果也与之前论文中报告的不同。请注意,在简化的 CIFAR-10 上找到了最好的策略。

表 2:在 CIFAR-100 上的测试集误差率(%)。本文的实验复现了 Wide-ResNet 和 ShakeDrop 的基线模型和 Cutout 模型结果,并且与之前报告的结果 [25,59] 相匹配。请注意,在简化 CIFAR-10 上找到了最佳的策略。

图 2:在 ImageNet 上一个成功的数据增强策略。如文中所描述的,大多数在 ImageNet 上建立的策略使用了基于色彩的转换。

论文:AutoAugment: Learning Augmentation Policies from Data

论文链接:https://arxiv.org/abs/1805.09501

摘要:在本论文中,我们进一步研究了用于图像的数据增强技术,并提出了一个名为「AutoAugment」的简单过程,用来搜索改进的数据增强策略。本文主要的观点是创建一个数据增强策略的搜索空间,直接在感兴趣的数据集上评估特定策略的质量。在「AutoAugment」的实现过程中,我们设计了一个搜索空间,该搜索空间中的一个策略包含了许多子策略,我们为每个小批量(mini-batch)中的每张图像随机选择一个子策略。每个子策略由两个操作组成,每个操作都是类似于平移、旋转或剪切的图像处理函数,以及应用这些函数的概率和幅度(magnitude)。我们使用搜索算法来寻找最佳策略,这样神经网络就能在目标数据集上获得最高的验证准确率。我们的方法在 CIFAR-10、CIFAR-100、SVHN 和 ImageNet 上取得了目前最高的准确率(在不加入额外数据的情况下)。在 ImageNet 上,我们取得了 83.54% 的 Top-1 准确率。在 CIFAR-10 上,我们取得了 1.48% 的误差率,比之前最佳模型的误差率低 0.65%。在简化数据集上,AutoAugment 的性能与不使用任何非标注样本的半监督学习方法相当。最后,从一个数据集中学到的策略能够被很好地迁移到其它相似的数据集上。例如,在 ImageNet 上学到的策略能够让我们在细粒度视觉分类数据集 Stanford Cars 上取得目前最高的准确率,并且不用在额外的数据上对预训练的权重进行调优。

]]> 原文: https://ift.tt/2squroa
RSS Feed

机器知心

IFTTT

走近流行强化学习算法:最优Q-Learning

Q-Learning 是最著名的强化学习算法之一。我们将在本文中讨论该算法的一个重要部分:探索策略。但是在开始具体讨论之前,让我们从一些入门概念开始吧。

强化学习(RL)

强化学习是机器学习的一个重要领域,其中智能体通过对状态的感知、对行动的选择以及接受奖励和环境相连接。在每一步,智能体都要观察状态、选择并执行一个行动,这会改变它的状态并产生一个奖励。

马尔科夫决策过程(MDP)

在绝大多数传统的设置中,RL 解决 MDP。即使在 RL 的核心部分,我们也不会在本文中涉及 MDP 理论。维基百科上有关于 MDP 很好的简介。

我们将要解决「forest fire」的马尔科夫决策问题,这个在 python 的 MDP 工具箱(http://pymdptoolbox.readthedocs.io/en/latest/api/example.html)中是可以看到的。

森林由两种行动来管理:「等待」和「砍伐」。我们每年做出一个行动,首要目标是为野生动物维护一片古老的森林,次要目标是伐木赚钱。每年都会以 p 的概率发生森林火灾(森林正常生长的概率就是 1-p)。

我们将马尔科夫决策过程记为 (S, A, P, R, γ),其中:

  • S 是有限状态空间:按照树龄分为三类:0—20 年,21—40 年,大于 40 年

  • A 是有限行动空间:「等待」和「砍伐」

  • P 和 R 是转换矩阵和奖励矩阵,它们的闭合形式容易表达出来

  • γ是表示长期奖励和短期奖励之间的区别的折扣因子

  • 策略π是在给定的当前状态下动作的平稳分布(马尔可夫性)

目标就是找到在不了解任何马尔科夫动态特性的情况下来寻找马尔科夫决策过程的最优策略π*。需要注意的是,如果我们具有这种知识,像最有价值迭代这种算法就可以找到最优策略。

def optimal_value_iteration(mdp, V0, num_iterations, epsilon=0.0001):     V = np.zeros((num_iterations+1, mdp.S))     V[0][:] = np.ones(mdp.S)*V0     X = np.zeros((num_iterations+1, mdp.A, mdp.S))     star = np.zeros((num_iterations+1,mdp.S))     for k in range(num_iterations):         for s in range(mdp.S):             for a in range(mdp.A):                 X[k+1][a][s] = mdp.R[a][s] + mdp.discount*np.sum(mdp.P[a][s].dot(V[k]))             star[k+1][s] = (np.argmax(X[k+1,:,s]))             V[k+1][s] = np.max(X[k+1,:,s])          if (np.max(V[k+1]-V[k])-np.min(V[k+1]-V[k])) < epsilon:             V[k+1:] = V[k+1]             star[k+1:] = star[k+1]             X[k+1:] = X[k+1]             break         else: pass      return star, V, X 

    

这里的最优策略是相当符合直觉的,就是等到森林达到最老的树龄再砍伐,因为我们把树龄最老的时候的砍伐奖励设置成了其成长过程中的 5 倍(r1=10,r2=50)。

Q-LEARNING

Q-Learning 中策略(π)的质量函数,它将任何一个状态动作组合(s,a)和在观察状态 s 下通过选择行动 a 而得到的期望积累折扣未来奖励映射在一起。

Q-Leraning 被称为「没有模型」,这意味着它不会尝试为马尔科夫决策过程的动态特性建模,它直接估计每个状态下每个动作的 Q 值。然后可以通过选择每个状态具有最高 Q 值的动作来绘制策略。

如果智能体能够以无限多的次数访问状态—行动对,那么 Q-Learning 将会收敛到最优的 Q 函数 [1]。

同样,我们也不会深入讨论 Q-Learning 的细节。如果你对它不太熟悉,这里有 Siraj Raval 的解释视频。

下面我们将展示 Q-Learning 的 Python 实现。请注意,这里所拥的学习率(alpha)遵循 [3] 的结果,使用 w=0.8 的多项式。

这里用到的探索策略(ε-greedy)在后面会有细节介绍。

def q_learning(mdp, num_episodes, T_max, epsilon=0.01):     Q = np.zeros((mdp.S, mdp.A))     episode_rewards = np.zeros(num_episodes)     policy = np.ones(mdp.S)     V = np.zeros((num_episodes, mdp.S))     N = np.zeros((mdp.S, mdp.A))     for i_episode in range(num_episodes):          # epsilon greedy exploration         greedy_probs = epsilon_greedy_exploration(Q, epsilon, mdp.A)         state = np.random.choice(np.arange(mdp.S))         for t in range(T_max):             # epsilon greedy exploration             action_probs = greedy_probs(state)             action = np.random.choice(np.arange(len(action_probs)), p=action_probs)             next_state, reward = playtransition(mdp, state, action)             episode_rewards[i_episode] += reward             N[state, action] += 1             alpha = 1/(t+1)**0.8             best_next_action = np.argmax(Q[next_state])                 td_target = reward + mdp.discount * Q[next_state][best_next_action]             td_delta = td_target - Q[state][action]             Q[state][action] += alpha * td_delta             state = next_state         V[i_episode,:] = Q.max(axis=1)         policy = Q.argmax(axis=1)      return V, policy, episode_rewards, N 

Exploration/Exploitation 权衡

连续学习算法会涉及到一个基本的选择:

  • Exploitation: 在目前已经给定的信息下做出最佳选择

  • Exploration: 通过做出其他选择收集更多的信息

成功的平衡 exploration 和 exploitation 对智能体的学习性能有着重要的影响。太多的 exploration 会阻止智能体最大化短期奖励,因为所选的 exploration 行动可能导致来自环境的不良奖励。另一方面,在不完全的知识中 exploiting 会阻止智能体最大化长期奖励,因为所选的 exploiting 行动可能一直不是最优的。

ε-greedy exploration 策略

这是一个很朴素的 exploration 策略:在每一步都以概率 ε选择随机的动作。

这也许是最常用的、也是最简单的 exploration 策略。在很多实现中,ε都被设置为随时间衰减,但是在一些例子中,ε也被设置为定值。

def epsilon_greedy_exploration(Q, epsilon, num_actions):     def policy_exp(state):         probs = np.ones(num_actions, dtype=float) * epsilon / num_actions         best_action = np.argmax(Q[state])         probs[best_action] += (1.0 - epsilon)         return probs     return policy_exp 

「乐观面对不确定性」的 exploration 策略

这个概念首次在随机多臂赌博机(SMAB)环境中被首次提出,这是一个古老的决策过程,为了最大化机器给出的期望折扣奖励,赌徒在每一步都要决定摇动哪一个机器。

赌徒面临着一个 exploration/exploitation 权衡,使用具有最高平均奖励的机器或者探索其他表现并不是很好的机器以得到更高的奖励。

SMAB 和 Q-Learning 中的 exploration 问题很相似。

  • Exploitation: 在给定的状态下选择具有最高 Q 值的动作

  • Exploration: 探索更多的动作(选择没有被足够得访问或者从未被访问的动作)

图片来自微软研究院

「面对不确定性的乐观」(OFU)状态:无论什么时候,我们都对老虎机的输出结果是不确定的,所以我们预计环境是最好的,然后选择最好的老虎机。

OFU 背后的直觉是:

  • 如果我们处于最好的处境:OFU 会选择最佳的老虎机(没有遗憾)

  • 如果我么不在最好的处境中:不确定性会减少(最佳)

最著名的 OFU 算法之一是 UCB(置信区上界)[2]。我们按照下面的方法将它用在 Q-learning 中。

定义:

  • Q(s, a): 状态 s 下采用动作 a 的 Q 值

  • N(t, s, a):在时间 t,动作 a 在状态 s 被选择的次数

智能体的目标是:Argmax {Q(s, a)/ a ∈ A}。代表在状态 s 下选择具有最大 Q 值的动作。但是时间 t 的实际 Q(s, a) 是未知的。

我们有:Q(s,a) = + (Q(s,a) − ),是时间 t 估计的 Q 值。(Q(s,a) − ) 对应的是误差项,我们可以形成边界并使用 OFU。

Hoeffding 不等式是限制这个误差的一种方式,我们可以证明:

最优策略可以被写成:

Argmax {Q+(t, s, a)/ a ∈ A}

其中β ≥ 0 调节 exploration。当β=0 的时候,该策略仅仅利用过去的估计(遵循 leader 策略)。

这个范围是该领域最常用的。还有很多其他改进这个范围的工作(UCB-V、UCB、KL-UCB、Bayes-UCB、BESA 等)。

这里是我们对经典 UCB exploration 策略的实现,以及它在 Q-Learning 中使用的结果。

def UCB_exploration(Q, num_actions, beta=1):     def UCB_exp(state, N, t):         probs = np.zeros(num_actions, dtype=float)         Q_ = Q[state,:]/max(Q[state,:]) + np.sqrt(beta*np.log(t+1)/(2*N[state]))         best_action = Q_.argmax()         probs[best_action] = 1         return probs     return UCB_exp 

UCB exploration 似乎能够快速地达到很高的奖励,然而训练过程还是受到早期 exploration 的干扰,对于更复杂的马尔科夫决策过程而言,这是有优势的,因为智能体可以免于非最优的解决方案。

我们来更加仔细地比较这两种策略。

总结及展望

Q-learning 是最常用的强化学习算法之一。在这篇文章中,我们讨论了 exploration 策略的重要性以及 UCB exploration 策略的使用,而并非最出名的ε-greedy exploration 策略。为了平衡 exploration 和 exploitation,更多的改进乐观策略可能会被用到。

参考文献

[1] T. Jaakkola, M. I. Jordan, and S. P. Singh,「On the convergence of stochastic iterative dynamic programming algorithms」Neural computation, vol. 6, no. 6, pp. 1185–1201, 1994.

[2] P. Auer,「Using Confidence Bounds for Exploitation-Exploration Trade-offs」, Journal of Machine Learning Research 3 397–422, 2002.

[3] E. Even-Dar, Y. Mansour,「Learning Rates for Q-learning」, Journal of Machine Learning Research 5 1–25, 2003. 

原文链接:https://medium.com/sequential-learning/optimistic-q-learning-b9304d079e11

]]> 原文: https://ift.tt/2J3Gke2
RSS Feed

机器知心

IFTTT

强化学习训练Chrome小恐龙Dino Run:最高超过4000分

强化学习是当前人工智能领域内一个非常热门的研究方向,在游戏智能体方面的进展尤其耀眼。美国东北大学在读硕士 Ravi Munde 近日发文介绍了其构建《小恐龙快跑(Dino Run)》强化学习智能体的过程。《小恐龙快跑》是 Chrome 浏览器上的一款隐藏小游戏,当你的浏览器断开网络时,你的屏幕上就会出现这只小恐龙,此时只需点击方向键 ↑ 即可开启游戏。

DeepMind 2013 年发表的论文《使用深度强化学习玩 Atari 游戏(Playing Atari with Deep Reinforcement Learning)》为强化学习引入了一种新的深度学习模型,并展现了其仅使用原始像素作为输入就能掌握 Atari 2600 电脑游戏的不同控制策略的能力。在本教程中,我将使用 Keras 实现这篇论文。我首先会介绍强化学习的基础知识,然后深入代码以获得实践性的理解。

AI 玩《小恐龙快跑》

我在 2018 年 3 月初开始了这个项目并得到了一些优良的结果。但是,这个只有 CPU 的系统没法学习更多功能。强大的 GPU 能显著提升其性能表现。

在我们得到一个可运行的模型之前,有很多步骤和概念需要我们理解。

步骤:

  • 构建一个浏览器(JavaScript)和模型(Python)之间的双向接口

  • 获取和预处理图像

  • 训练模型

  • 评估

源代码:https://ift.tt/2spltY3

开始

要这样完成训练和玩游戏,你可以在设置好环境后克隆这个 GitHub 库:

  1. git clone https://github.com/Paperspace/DinoRunTutorial.git

然后在 Jupyter Notebook 上操作

  1. Reinforcement Learning Dino Run.ipynb

要确保你首先运行了 init_cache() 来初始化文件系统结构。

强化学习

一个学习走路的孩子

对很多人来说,这可能是一个新词汇,但我们每个人都使用强化学习(RL)的概念学习过走路,而且我们的大脑现在依然这样运作。奖励系统是任何强化学习算法的基础。如果我们回到小孩走路的比喻,正面奖励可能是父母的掌声或拿到糖果;负面奖励就是没有糖果。然后,孩子在开始走路之前首先要学会站立。就人工智能而言,智能体(我们这里就是小恐龙 Dino)的主要目标是通过在环境中执行一个特定的动作序列来最大化特定的数值奖励。强化学习中最大的难题是没有监督(有标注数据)来引导智能体。它必须进行探索,靠自己学习。智能体首先会随机执行动作,然后观察每个动作所产生的奖励,再学习预测面临相似的环境状态时可能最好的动作。

最简单纯粹的强化学习框架

Q 学习(Q-learning)

Q 学习是一种强化学习技术,在这种技术中,我们试图近似一个特定函数,使其能为任意环境状态序列得到动作-选择策略。Q 学习是强化学习的一种无模型的实现,其中维护着一个相对每个状态、所采取的动作和所得到的奖励的 Q 值表。一个样本 Q 值表应该能让我们了解数据的结构。在我们的案例中,状态即是游戏截屏,动作则是什么也不做和跳 [0,1]


一个样本 Q 值表

我们使用深度神经网络,通过回归方法来解决这一问题,然后选择有最高预测 Q 值的动作。若想详细了解 Q 学习,可参看 Tambet Matiisen 的这篇出色文章:https://ai.intel.com/demystifying-deep-reinforcement-learning/。你也可以参看我之前的文章,了解 Q 学习的所有参数:https://ift.tt/2w0Qiql

设置

首先设置训练过程所需的环境。

1. 选择虚拟机(VM):我们需要一个完整的桌面环境,让我们可以在其中获取截屏并将其用于训练。我选择了一个 Paperspace ML-in-a-box (MLIAB) Ubuntu 镜像。MLIAB 的优势在于预装了 Anaconda 和很多其它的机器学习库。

ML-in-a-box (MLIAB)

2. 配置和安装 Keras 并使用 GPU

我们需要安装 Keras 和 TensorFlow 的 GPU 版本。Paperspace 的虚拟机预装了这些,但如果没有安装,可以执行下列操作来安装:

  1. pip install keras

  2. pip install tensorflow

另外,要确保 GPU 能被识别出来。执行下列 Python 代码,你应该能看到可用的 GPU 设备:

  1. from keras import backend as K

  2. K.tensorflow_backend._get_available_gpus()

3. 安装依赖包

  • Selenium: pip install selenium

  • OpenCV: pip install opencv-python

  • 下载 Chromedriver:https://ift.tt/2J2Yrke

游戏框架

你可以将你的浏览器指向 chrome://dino 或直接拔下网络插口来启动游戏。另一种方法是从 Chromium 的开源库提取这个游戏——如果我们想要修改游戏代码的话。

我们的模型是用 Python 写的,而游戏是用 JavaScript 构建的。要让它们之间能进行通信,我们需要一些接口工具。

Selenium 是一种常用的浏览器自动化工具,可用于向浏览器发送动作和获取当前分数等不同的游戏参数

现在我们有可以向游戏发送动作的接口了,我们还需要一个获取游戏画面的机制。

Selenium 和 OpenCV 能分别为截屏和图像预处理提供最佳的表现,能实现 6-7 FPS 的帧率。

我们只需要 4 FPS 的帧率,所以足够了。

游戏模块

我们使用这个模块实现了 Python 和 JavaScript 之间的接口。下面的代码片段应该能让你一窥该模块所执行的功能。

  1. class Game:

  2.    def __init__(self):

  3.        self._driver = webdriver.Chrome(executable_path = chrome_driver_path)

  4.        self._driver.set_window_position(x=-10,y=0)

  5.        self._driver.get(game_url)

  6.    def restart(self):

  7.        self._driver.execute_script("Runner.instance_.restart()")

  8.    def press_up(self):

  9.        self._driver.find_element_by_tag_name("body").send_keys(Keys.ARROW_UP)

  10.    def get_score(self):

  11.        score_array = self._driver.execute_script("return Runner.instance_.distanceMeter.digits")

  12.        score = ''.join(score_array).

  13.         return int(score)

智能体模块

我们使用智能体模块封装了所有接口。我们使用这一模块控制小恐龙 Dino 以及获取智能体在环境中的状态。

  1. class DinoAgent:

  2.    def __init__(self,game): #takes game as input for taking actions

  3.        self._game = game;

  4.        self.jump(); #to start the game, we need to jump once

  5.    def is_crashed(self):

  6.        return self._game.get_crashed()

  7.    def jump(self):

  8.         self._game.press_up()

游戏状态模块

为了将动作发送给模块并得到由该动作导致的环境转换的结果状态,我们使用了游戏-状态模块。通过接收&执行动作、确定奖励和返回经历元组,其简化了这一过程。

  1. class Game_sate:

  2.    def __init__(self,agent,game):

  3.        self._agent = agent

  4.        self._game = game

  5.    def get_state(self,actions):

  6.        score = self._game.get_score()

  7.        reward = 0.1 #survival reward

  8.        is_over = False #game over

  9.        if actions[1] == 1: #else do nothing

  10.            self._agent.jump()

  11.        image = grab_screen(self._game._driver)

  12.        if self._agent.is_crashed():

  13.            self._game.restart()

  14.            reward = -1

  15.            is_over = True

  16.         return image, reward, is_over #return the Experience tuple

图像处理流程

获取图像

获取游戏画面的方法有很多,比如使用 PIL 和 MSS Python 库来获取整个屏幕的截屏然后裁剪相关区域。但是,其最大的缺点是对屏幕分辨率和窗口位置的敏感度。幸运的是,该游戏使用了 HTML Canvas。我们可以使用 JavaScript 轻松获取 base64 格式的图像。我们使用 Selenium 运行这个脚本。

  1. #javascript code to get the image data from canvas

  2. var canvas = document.getElementsByClassName('runner-canvas')[0];

  3. var img_data = canvas.toDataURL()

  4. return img_data


从 Canvas 提取出的图像

  1. def grab_screen(_driver = None):

  2.    image_b64 = _driver.execute_script(getbase64Script)

  3.    screen = np.array(Image.open(BytesIO(base64.b64decode(image_b64))))

  4.    image = process_img(screen)#processing image as required

  5.     return image

处理图像

获取得到的原始图像的分辨率大约是 600×150,有 3 个通道(RGB)。我们打算使用 4 个连续截屏作为该模型的单个输入。这会使得我们的单个输入的维度高达 600×150×3×4。这样的计算成本很高,而且并非所有特征都对玩游戏有用。所以我们使用 OpenCV 库对图像进行尺寸调整、裁剪和处理操作。处理后得到的最终输入图像尺寸只有 80×80 像素,且只有单个通道(灰度)。

  1. def process_img(image):

  2.    image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

  3.    image = image[:300, :500]

  4.     return image

图像处理

模型架构

所以我们得到了输入,并且能使用该模型的输出来玩游戏了,现在我们来看看模型的架构。

我们使用了按顺序连接的三个卷积层,之后再将它们展平成密集层和输出层。这个只使用 CPU 的模型不包含池化层,因为我去除了很多特征,添加池化层会导致已经很稀疏的特征出现显著损失。但借助 GPU,我们可以容纳更多特征,而无需降低帧率。

最大池化层能显著提升密集特征集的处理结果。

模型架构

我们的输出层由两个神经元组成,每一个都表示每个动作的最大预测奖励。然后我们选择有最大奖励(Q 值)的动作。

  1. def buildmodel():

  2.    print("Now we build the model")

  3.    model = Sequential()

  4.    model.add(Conv2D(32, (8, 8), padding='same',strides=(4, 4),input_shape=(img_cols,img_rows,img_channels)))  #80*80*4

  5.    model.add(MaxPooling2D(pool_size=(2,2)))

  6.    model.add(Activation('relu'))

  7.    model.add(Conv2D(64, (4, 4),strides=(2, 2),  padding='same'))

  8.    model.add(MaxPooling2D(pool_size=(2,2)))

  9.    model.add(Activation('relu'))

  10.    model.add(Conv2D(64, (3, 3),strides=(1, 1),  padding='same'))

  11.    model.add(MaxPooling2D(pool_size=(2,2)))

  12.    model.add(Activation('relu'))

  13.    model.add(Flatten())

  14.    model.add(Dense(512))

  15.    model.add(Activation('relu'))

  16.    model.add(Dense(ACTIONS))

  17.    adam = Adam(lr=LEARNING_RATE)

  18.    model.compile(loss='mse',optimizer=adam)

  19.    print("We finish building the model")

  20.     return model

训练

训练阶段发生的事情有这些:

  • 从无动作开始,得到初始状态(s_t)

  • 观察 OBSERVATION 步数的玩游戏过程

  • 预测和执行一个动作

  • 将经历存储在重放记忆(Replay Memory)中

  • 从重放记忆随机选取一批,然后在其上训练模型

  • 如果游戏结束,则重新开始

这部分的代码有点长,但理解起来相当简单。

  1. def trainNetwork(model,game_state):

  2.    # store the previous observations in replay memory

  3.    D = deque() #experience replay memory

  4.    # get the first state by doing nothing

  5.    do_nothing = np.zeros(ACTIONS)

  6.    do_nothing[0] =1 #0 => do nothing,

  7.                     #1=> jump

  8.    x_t, r_0, terminal = game_state.get_state(do_nothing) # get next step after performing the action

  9.    s_t = np.stack((x_t, x_t, x_t, x_t), axis=2).reshape(1,20,40,4) # stack 4 images to create placeholder input reshaped 1*20*40*4

  10.    OBSERVE = OBSERVATION

  11.    epsilon = INITIAL_EPSILON

  12.    t = 0

  13.    while (True):

    「不再作恶」:谷歌决定 2019 年后退出军事项目Project Maven

    据国外媒体 Gizmodo 报道,今天,谷歌云首席执行官 Diane Greene 在与员工的一次内部会议上宣布,谷歌决定于 2019 年后退出饱受争议的军事项目 Project Maven。Greene 告诉员工,公司内部的抵制是谷歌决定不再续签合同的主要原因。在长达两个月大量员工的抵制之下,谷歌似乎正准备放弃潜在收入可达每年上亿美元的军事 AI 领域。

    今天,谷歌云首席执行官 Diane Greene 在与员工的一次内部会议上宣布,该公司与五角大楼 Project Maven 的合同将于 2019 年到期,并决定不再续约。该项目中谷歌帮助美国政府利用人工智能分析无人机拍摄画面,引发了大量争议。该决定发布的前几天,The Verge 报道称谷歌将发布新的道德准则来指导军事 AI 发展,这份准则定于下周公布。谷歌没有立即发表评论。

    这项决定或许可以平息谷歌最近的动荡局面。自从 Gizmodo 在 3 月份的一项调查中披露谷歌与 Project Maven 的关系以来,这种动荡已经持续了数月。调查报告指出,当时听闻谷歌正在利用公司开发的软件协助政府的无人机在海外杀人,该公司的员工非常「愤怒」。

    在事件演变的过程中,谷歌一直在试图消解公司与员工之间的内部争议。谷歌云首席执行官 Diane Greene 曾在一次公司集会上表示:「该合同仅价值 900 万美元。」对于谷歌这样的科技巨头来说,这是一个很小的数字。

    Diane Greene,谷歌云 CEO。谷歌在参与军事无人机项目上遭遇了公司内外的强大压力。

    面对 Project Maven 事件,谷歌高管们曾在内部讨论过公司在公共关系上遭遇困难的可能性,是否公开这一合同是讨论的核心问题之一。「这对于媒体而言就是一枚重磅炸弹,他们可以据此找到大量攻击谷歌的方式,」谷歌云首席科学家李飞飞表示。「你可能听说过伊隆·马斯克有关第三次世界大战起于 AI 的言论。」

    「我不知道如果媒体开始将这样的内容——谷歌正在秘密构建 AI 武器——作为主题,会发生什么,」李飞飞说道。「自 2017 年起,谷歌云一直在努力构建『AI 民主化』的新图景,Diane 和我也一直在讨论面向企业的人性化 AI。我会非常小心地维护这些积极的方面。」

    然而,据 Gizmodo 报道,谷歌明显是把这份合同当作获取更多利润丰厚的五角大楼合同的重要途径,这份合同涉及向政府提供谷歌的开源软件 TensorFlow 平台。The Intercept 近期获取的泄露邮件显示,尽管谷歌低估了参与 Project Maven 的重要性,但它期望能从类似的 AI 项目中获利。谷歌的业务发展部门预测,与军事无人机相关的人工智能项目带来的收入有望从每年 1500 万美元增加至 2.5 亿美元。

    事实上,在 3 月底谷歌签署合约的消息爆出之后,五角大楼在 Project Maven 项目上又追加了 1 亿美元的投入。

    谷歌的内部通讯还指出,另外几家美国科技巨头也参与了 Project Maven 的竞标。一位参与该项目谈判的谷歌高管表示:其他科技公司,如亚马逊也正在参与其中。谷歌高管表示,这一项目并不仅仅是军方对于先进技术的小规模实验,而是与其他硅谷科技巨头正在争夺的、价值数十亿美元的云计算项目「密切相关」的项目。

    尽管参与 Project Maven 并不意味着谷歌开发的软件会被用于驾驶或以任何积极形式参与美国的作战无人机活动,但毫无疑问,谷歌仍会提供图像分析的工具和专业技术。从表面上看,Project Maven 致力于让攻击型无人机以及其他种类的作战无人机更加平民化。计算机视觉算法(人工智能领域中机器学习的一大分支)在理论上可以为使用者更好地分辨目标,减少附带伤害,然而谷歌对 Project Maven 的参与程度在这里从未明确。「这项技术旨在标记图像以供人类审阅,它可以拯救人的生命,并让使用者无需参与繁琐的识别工作。」谷歌曾在今年 4 月的一份声明中这样告诉《纽约时报》。

    但是,谷歌任何使用 AI 来帮助或增强硬件或政府武器的举措,不管其最终目的如何,都遭到了谷歌员工和技术批评家的强烈抵制,技术批评家认为自动硬件是危险的堕落,并涉及复杂的伦理问题。今年 4 月,超过 3000 名谷歌员工签署致谷歌 CEO Sundar Pichai 的公开信,建议谷歌退出 Project Maven,信中写道:「谷歌不应该参与战争。」

    「该合同危及到谷歌的声誉,并与我们的核心价值相悖,」抵制信中这样写道,「开发该技术来帮助美国政府进行军事侦察及其可能导致的致命结果,都是不可接受的。」5 月初,Gizmodo 报道十余名员工因谷歌对此事的不作为及继续参与 Project Maven 怒而辞职。

    现在,来自谷歌内外的压力最终使得这家公司明确立场。据 Gizmodo 报道,Greene 告诉员工,抵制是谷歌决定不再续签合同的主要原因。凑巧的是,5 月 18 日,谷歌更新了其行为准则,删除了该公司一贯的座右铭「不作恶」(Don't be evil),换成了「做正确的事」(Do the right thing)。

    参考内容:https://ift.tt/2H8A0w6

                     https://ift.tt/2JcmxF2

    ]]> 原文: https://ift.tt/2Jai2Le
    RSS Feed

    机器知心

    IFTTT

    Waymo又一次性壕购6.2万辆无人车,现在Uber都想叫爸爸了

    郭一璞 发自 凹非寺 量子位 报道 | 公众号 QbitAI

    整个自动驾驶圈都被Waymo吓尿了。

    就在今天,无人车跑得最快的Waymo随手壕了一把:一次性下单62000辆克莱勒斯Pacifica MPV。

    生产克莱勒斯的FCA集团没宣布订单总额,不过如果按照公开单价2.7万美元~4.3万美元来算,这可能会是一笔16.7亿美元~26.7亿美元的大手笔交易,折合人民币大约107亿~173亿元,总之得有一百多个小目标了。

    不知道你怎么看?不过从量子位听到的评价来说,不少无人车创业者都受惊了。

    Waymo壕壕壕

    毫无疑问,当这62000辆新无人车投入使用,Waymo牌无人车不仅比其他玩家多,还可能比当前所有无人车玩家测试车总和还要多……

    就问你怕不怕?反正Uber准备叫爸爸了。

    克莱勒斯Pacifica MPV,就是我们经常在新闻图片里见到的,在加州、亚利桑那等地路测的Waymo无人驾驶车辆。

    FCA在公布这一订单的同时,还对外表示,他们正在和Waymo合作,探讨如何让自动驾驶技术获得许可,以便实现更大范围的商用。

    FCA的CEO塞尔吉奥·马尔乔内表示:"FCA致力于为用户提供安全、高效和现实的自动驾驶技术。我们与Waymo合作的战略合作关系,将有助于推动前沿创新技术。"

    而Waymo CEO John Krafcik对这项合作也津津乐道:"自Waymo成立第一天起,我们的使命就是研发最好的自动驾驶系统,让人们都用上自动驾驶系统,创造更安全的道路交通。我们很高兴能够深化与FCA的合作关系,这将帮助我们落地无司机的自动驾驶服务,继续探索未来的产品,来完成Waymo的使命。"

    别忘了捷豹

    当然,Waymo无人车可不止克莱斯勒一家。

    他们不久前还在纽约和捷豹路虎高调牵手,说要合作推出世界上第一辆高档全自动驾驶汽车—价格约70万元的捷豹I-PACE车型。

    这已经是Waymo继小型车、SUV、萤火虫,克莱勒斯MPV和卡车之后的第六款车型了。

    连Uber都坐不住了

    除了生产汽车的FCA与捷豹陆虎之外,提供打车服务的Uber也坐不住了,尽管Uber与Waymo此前曾经是闹上法庭的死对头。

    据路透社及Engadget报道,Uber正在和Waymo商谈,讨论如何让Waymo的自动驾驶技术应用在Uber的打车app中。Uber CEO达拉·科斯罗萨西(Dara Khosrowshahi)周三说:"欢迎Waymo的车辆加入我们的网络。"他认为,当前进行的商谈标志着两家公司的和解。

    科斯罗萨西将Waymo评价为"令人难以置信的技术供应商",他还说:"我们正在和Waymo商谈,如果能达成合作自然很好;如果无法合作,我们也可以接受。"

    然而Waymo对此却拒绝发表评论。毕竟,没有Uber的人生,Waymo一样活得很好

    何况此前Uber算是把Waymo得罪了一下。

    去年,Waymo说他们一位跳槽去Uber的前员工,带走了数千份机密文件。这件事让双方闹上法庭,最终在今年2月以Uber把自己0.34%的股份(大约2.45亿美元)赔偿给Waymo而终结。

    更重要的是,Waymo准备推出自己的无司机自动驾驶乘车服务app,此前已经和Uber的竞争对手Lyft建立了合作。

    自2009年以来,Waymo的车辆已经在公共道路上行驶了将近1000万公里,在模拟环境中行驶了超过80亿公里,并进行了包含2万多种驾驶场景的测试。

    截至5月18日,Waymo已经有51辆汽车在加州进行了配备安全员的自动驾驶路测,并且是目前唯一一家申请多台车辆无司机路测的公司。

    欢迎大家关注我们的专栏:量子位 - 知乎专栏

    诚挚招聘

    量子位正在招募编辑/记者,工作地点在北京中关村。期待有才气、有热情的同学加入我们!相关细节,请在量子位公众号(QbitAI)对话界面,回复"招聘"两个字。

    量子位 QbitAI · 头条号签约作者

    վ'ᴗ' ի 追踪AI技术和产品新动态



    via 量子位 - 知乎专栏 https://ift.tt/2J1JGya
    RSS Feed

    RSS5

    IFTTT

    JavaScript 之父联手近万名开发者集体讨伐 Oracle:给 JavaScript 一条活路吧!- InfoQ 每周精要848期

    「每周精要」 NO. 848 2024/09/21 头条 HEADLINE JavaScript 之父联手近万名开发者集体讨伐 Oracle:给 JavaScript 一条活路吧! 精选 SELECTED C++ 发布革命性提案 "借鉴"Rust...