2017年12月5日星期二

机器之心「AI00」十一月榜单:OpenAI科学家创立Embodied Intelligence

We believe AI should be an extension of individual human wills and, in the spirit of liberty, as broadly and evenly distributed as possible. -OpenAI


「AI00 ,这是一个开源项目」


这不仅是一份榜单,更是一个开源项目,主要基于以下几点:


人工智能是一个复杂庞大的体系,涉及众多学科,也关乎技术、产品、行业和资本等众多要素,报告的写作团队只代表他们的专业观点,有自己的局限性,需要更多行业专家参与进来加以修正和完善。人工智能技术和行业的发展瞬息万变,而报告的制作周期较长,其中的内容和数据势必会落后于行业的最新进展,无法同时满足时效性和高质量的要求。而领域内参与者的及时更新可以解决这个问题。我们深刻地理解在没有专业用户反馈的情况下所做出报告的质量局限性,所以希望用工程界「Agile Development」的理念来对待我们的报告,不断收集专业反馈来持续提升报告质量。人工智能是一个永恒命题,我们不仅会把「100 家公司」这个主题持续做下去,还会陆续开展其他主题。这个过程需要人工智能领域不同的参与者加入进来。向 OpenAI 、「斯坦福人工智能百年研究」和「Open Source」致敬。


为此,我们邀请人工智能领域的科学家、技术专家、产业专家、专业投资人和读者加入进来,共同完成这项人工智能的长期研究。


如果你对「AI00」感兴趣,可在公众号对话框回复「AI00」(注:字母 AI 加数字 00)查看本开源项目的具体参与方式。


「AI00」第一期的榜单得到了来自投资界、人工智能产业界和学界的众多反馈,我们也依此对榜单的信息作出了一些订正和调整。在前几期的榜单中,我们先后增加了 Waymo、Neurala、Graphcore、云从科技、Citadel 与 Petuum 、竹间智能、Gamalon 和 DataRobot 等公司,同时也移除了一些公司。


在新一期的榜单中,我们加入了备受业界关注的 Embodied Intelligence 公司。更详细的内容请查看机器之心对该公司的专访:前OpenAI科学家辞职创立智能机器人公司,我们和他们的CEO聊了聊


下面我们将介绍 Embodied Intelligence 上榜的理由:


Embodied Intelligence 成立于 2017 年 9 月,总部位于美国加州埃默里维尔市,由前 OpenAI 科学家——加州伯克利大学的教授、机器人学习大牛 Pieter Abbeel 和 Peter Chen、Rocky Duan 共同创办成立。



这家公司提供的智能模块可以接入任何市面上的机器人,让它们可以自然地学习新的技能,而不需要通过编写晦涩难懂的代码来完成,并将这种自动化技术应用到世界范围内的工厂、仓库、甚至是家庭中。


由于「师徒」三人曾参与并贡献了 OpenAI 整个机构 40% 的论文发表,在强化学习和生成模型上做出了很多成绩,该公司备受业界关注。目前,获得硅谷风险投资机构 Amplify Partners 和其他投资方的共 700 万美元的种子轮融资,其中还包括一家来自中国的风投峰瑞资本(FreeS Fund)。因此,机器之心把其列入了最值得关注的创业公司新秀之一。


以下为 AI00 十一月榜单:


1. 语音和自然语言处理


公司 国家 技术研究 产品应用 市值 / 估值 / 融资额
搜狗 中国 人工智能综合研究 搜索引擎、知识图谱、输入法、语音交互产品等 估值约50亿美元
X.AI 美国 自然语言处理 个性化智能助理 三轮融资共获得 3.4 亿美元
科大讯飞 中国 语音技术和自然语言处理 智能家居、车载、电信等行业解决方案 市值约 393 亿人民币
思必驰 中国 智能语音交互和自然对话 车载、智能家居和智能机器人等智能硬件的语音交互服务 B 轮:2 亿人民币
大象声科 中 / 美 声源分离、声音增强、声纹识别、麦克风阵列 会议转录,通讯,机器人,智能家居,虚拟现实,增强现实,混合现实 未透露
竹间智能 中国 情感对话机器人、语音情感技术、多模态情感识别 竹间个人助理机器人小影、金融机器人、客服机器人 2500万美元融资
TalkIQ 美国 语音识别技术、自然语言处理技术(NLP) 电话语言反馈、预测销售结果、自动信息检索 1400万美元的A轮融资
Solvvy  美国 智能客服 理解和分类用户请求 1200万美元的A轮融资


2. 计算机视觉 


公司 国家 技术研究 产品应用 市值 / 估值 / 融资额
Clarifai 美国 计算机视觉 图像及视频识别 API B 轮: 3000 万美元
Affectiva 美国 计算机视觉和深度学习 实时面部表情分析和情绪识别解决方案 四轮融资共获得 3372 万美元
ViSenze 新加坡 计算机视觉、视觉搜索、图像识别 电子商务、移动商务、 在线广告等图像识别解决方案 两轮融资共获得 1400 万美元
Orbital 

Insight

美国 计算机视觉、深度学习和数据科学 分析海量卫星图像,用于经济趋势分析和公益研究 C轮融资共 5千万美元
Planet 

Labs

美国 计算机视觉和数据科学 将卫星图像识别用于农业、城市规划和灾害响应等 2015 年 5 月融资 1830 万美元
Descartes

Labs

美国 计算机视觉和深度学习 通过 DLFP 平台为农业提供数据分析和预测的解决方案 B轮 3千万美元
商汤科技 中国 计算机视觉和深度学习 人脸识别、危险品识别、行为检测、车辆检测等的安防监控系统 4.1亿美元最新融资
旷视科技 中国 计算机视觉和深度学习 Face++ 人脸识别云服务平台、Image++ 图像识别平台、VisionHacker 移动游戏工作室 C轮4.6亿美元融资
依图科技 中国 计算机视觉和深度学习 基于图像理解的信息获取和人机交互服务 3.8亿元C轮融资
图普科技 中国 计算机视觉和深度学习 图像识别、视频鉴黄、智能审核、图片增值等云服务 新一轮千万美元融资
Neurala 波士顿 深度学习、计算机视觉 帮助机器人和智能设备学习和适应环境的软件 A 轮融资约1400 万美元
云从科技 中国 人脸识别、计算机视觉 金融机构人脸识别应用、公安系统实时布控、追逃等 B 轮 5亿人民币


3. 芯片和硬件


公司 国家 技术研究 产品应用 市值 / 估值 / 融资额
Wave

Computing

美国 深度学习芯片架构 DPU (Dataflow Processing Unit) 3轮融资共5900万美元
Ceva 美国 人工智能芯片技术 用于机器学习的第二代神经网络软件框架 CDNN2 纳斯达克上市,市值 9.12 亿美元
Tera

Deep

美国 基于 FPGA,针对于服务器端的高性能深度学习平台 被移动设备直接嵌入的深度学习模块 未透露
寒武纪科技 中国 深度学习 中国首款神经网络处理器 1亿美元 A 轮融资
深鉴科技 中国 深度学习 DPU 平台 深度学习 DPU 平台 A+轮约4000万美元融资
Graphcore 英国 深度学习硬件和软件开发 开源软件框架 Poplar 和「智能处理器」IPU A 轮融资 3000 万美元
Groq 美国 深度学习硬件、芯片 暂无信息

1030 万美元融资


4. 智能机器


公司 国家 技术研究 产品应用 市值 / 估值 / 融资额
ABB 

Robotics

瑞士 机器人及自动化技术 工业机器人、智能设备 468.95 亿美元市值
Fanuc 日本 机器人及自动化技术 工业机器人 4.4兆日元市值
KUKA 

Robotics

德国 机器人及自动化技术 工业机器人 美的 272 亿美元拿下库卡 94.55% 的股份
Rethink

Robotics

美国 机器人、人机交互 智能机器人 1800万美元新一轮融资
Universal

Robots

丹麦 机器人及自动化技术 工业机器人 未透露
3D Robotics 美国 计算机视觉、机器人技术 无人机,软件服务 五轮融资超 1 亿 2 千 600 万美元
Cyberdyne 日本 可穿戴设备 医疗助理机器人 2083.56 亿日元市值
iRobot 美国 计算机视觉、机器人技术 电子产品,家用机器人 27亿美元市值
ReWalk

Robotics

德国 计算机视觉、机器人技术 代步机器人,残障专用智能设备 2000万美元市值
Dyson 英国 智能机器,自动视觉定位及室内地图构建 清洁机器人 未透露
新松机器人 中国 机器人及自动化技术 工业机器人和行业解决方案 约 289 亿市值
埃夫特

机器人

中国 机器人 工业机器人、智能装备和行业解决方案 未透露
大疆 中国 计算机视觉、无人机控制、环境及障碍感知、视觉跟随、自动寻路 无人机航拍和图像传输 估值约100亿美元
Embodied Intelligence 美国 可以接入机器人的智能模块,工厂、仓库等自动化技术 智能设备 种子轮 700 万美元融资


5. 医疗

请点击此处输入图片描述

公司 国家 技术研究 产品应用 市值 / 估值 / 融资额
Arterys 美国 深度学习系统生成医疗图像 深度学习分析系统 Arterys System 1200 万美元 A 轮融资
Enlitic 美国 深度学习、大数据、图像检测 癌症检测系统 三轮融资共 1500 万美元
VoxelCloud(体素科技) 美国 深度学习 医疗影像分析云服务 千万美金 A 轮融资
Insilico

Medicine

美国 深度学习和大数据 癌症诊疗 1000万美元最新融资
Oncora

Medical

美国 大数据和机器学习技术 通过数据分析为放射肿瘤学家提供临床决策支持,用于个性化医疗。 两轮融资共 132 万美元
Atomwise 美国 深度学习 药物发现 种子轮 630 万美元
TwoXAR 美国 深度学习 通过药物研发平台 DUMA™来评估大型公共和私有数据集,以迅速识别药物,并对药物和疾病的匹配度按照概率进行排序。 种子轮 340 万美元
Berg 

Health

美国 深度学习 Interrogative Biology® 平台结合病人生物学和人工智能分析来进行药物发现、开发和诊断等。 未透露
Cloud

MedX

美国 机器学习、自然语言处理 拥有 MedxExchange 、MedxInsights 和 MedxCare 三款服务产品的医疗人工智能平台,提供数据、医疗洞见和健康管理服务。 融资 660 万美元
Deep

Genomics

加拿大 深度学习、基因生物学 精准医疗 种子轮 370 万美元
碳云智能 中国 大数据、人工智能 通过数据挖掘和机器分析提供个人性健康指数分析和预测。 A 轮融资近 10 亿人民币


6. 金融


公司 国家 技术研究 产品应用 市值 / 估值 / 融资额
Context

Relevant

美国 数据挖掘、预测分析 本地分析软件和云服务 五轮融资 4430 万美元
Kensho

Technologies

美国 机器学习、自然语言处理、数据挖掘 金融分析辅助决策系统 B 轮融资 5000 万美元(2017 年 2 月)年2
Zest

Finance

美国 数据挖掘、机器学习 信用服务 四轮共 1.12 亿美元
Aire 英国 信用评级 金融产品的信用评级 四轮共 700 万美元
高盛 美国 数据挖掘、机器学习 AppBank、金融业务自动化 市值 867.10 亿美元
蚂蚁金服 中国 人工智能、数据挖掘 智能助理、信用评级和风险管理等应用 估值 600 亿美元
Citadel 美国 人工智能、数据挖掘 对冲基金 目前掌管至少 260 亿美元资产


7. 智能驾驶


公司 国家 技术研究 产品应用 市值 / 估值 / 融资额
Waymo 美国 自动驾驶 自动驾驶汽车 谷歌无人驾驶项目开始以独立公司的身份运营
Tesla 美国 自动驾驶 电动汽车 498.35 亿美元市值
Drive.ai 美国 深度学习 自动驾驶汽车 5000 万美元B轮融资
nuTonomy 新加坡 / 美国 3D 自动驾驶技术 城市自动驾驶的算法和软件 2轮融资公1960万美元
Innoviz 

Technologies

以色列 智能 3D 传感、传感器融合和精准地图和定位等核心自动驾驶技术 物美价廉的高清晰度固态激光雷达 完成了 A 轮融资,金额高达 900 万美元
Peloton Technology 美国 雷达和专用短程通信安全系统 自动驾驶卡车 最新一轮6000万美元融资(2017 年 4 月)
SmartDrive 美国 计算机视觉、数据挖掘 交通安全和表现的智能解决方案 六轮融资共 1.8 亿美元
Zoox 美国 全自动驾驶 全新的自动驾驶汽车 3 轮融资共 2.9 亿美元
图森未来 中国 计算机视觉和深度学习 自动驾驶 5500 万美金的 C 轮融资
Minieye 中国 计算机视觉、智能驾驶 辅助驾驶系统 A 轮数千万人民币
Argo AI 美国 人工智能和自动驾驶技术发 自动驾驶汽车 福特将持续注资 10 亿美元


8. 垂直应用


公司 国家 技术研究 产品应用 市值 / 估值 / 融资额
Darktrace 英国 利用机器学习和独家算法来检测和响应以前未识别的网络威胁 Darktrace 的核心产品为「企业免疫系统」(EIS) 三轮共融资 1.045 亿美元
Uber 美国 自动驾驶、机器学习、数据挖掘 自动驾驶汽车、智能交通和智能出行应用 12 轮融资 87.1 亿美元,估值 660 亿美元
Airbnb 美国 机器学习 开源 AeroSolve 机器学习框架、智能助手、智能推荐、定价 9 轮共融资 20 亿 9 千万美元
Salesforce 美国 云计算、深度学习、数据处理 CRM 解决方案 市值约 638.37 亿美元
Slack 美国 机器学习 企业通讯应用,bots 平台 总融资 5.4 亿美元,估值约 38 亿美元
Sentient

Technologies

美国 人工智能、大规模分布式计算 解决复杂商业问题的综合智能系统 1.03 亿美元 C 轮融资,三轮共 1.3578 亿美元
Dataminr 美国 数据挖掘 基于社交网络的数据分析服务 1.3 亿美元 D 轮融资。五轮共 1.83 亿美元
ROSS 

Intelligence

美国 认知计算、深度学习、自然语言处理 法务研究智能辅助工具 未透露
滴滴 中国 自动驾驶、机器学习、数据挖掘 自动驾驶汽车、智能交通和智能出行应用 超55亿美元新一轮融资 (2017 年 4 月)
今日头条 中国 深度学习、自然语言处理、图像识别 媒体产品的应用 估值约 120 亿美元
地平线机器人 中国 基于云端的深度神经网络算法、图像、语音、自然语言理解和运动控制、技术集成 智能机器解决方案 A+ 轮近美元
Cylance 美国 机器学习、数学科学 使用人工智能来预防网络攻击 已融资 1.77 亿美元
Sift Science 美国 机器学习 利用人工智能/机器学习来开发网络安全应用的公司 4 轮共 5360 万美元融资
SparkCognition 美国 机器学习、人工智能、数据分析 使用机器学习和人工智能技术来分析预测网络安全漏洞与系统故障 新一轮3250万美元融资


9. 机器学习


公司 国家 技术研究 产品应用 市值 / 估值 / 融资额
DeepMind 英国 人工智能基础研究 AlphaGo、医疗健康、谷歌内部产品应用。 以 4 亿英镑(约 5.32 亿美元)被谷歌收购
Vicarious 美国 人工智能基础研究 新的计算机视觉系统,机器人视觉 五轮获得 7200 万美元融资
Bonsai 美国 深度学习 Inkling 脚本语言和集成开发环境 Mastermind 760 万美元A轮融资
Preferred

Networks

日本 深度学习 深度学习操作系统 Chainer,机器学习在物联网的应用 三轮融资共 1730 万美元
Skymind 美国 深度学习 深度学习企业应用包 SKIL、开源框架 Deeplearning4j 种子轮融资 300 万美元
H2O.ai 美国 机器学习 开源机器学习平台和商业化支持 四轮融资 3360 万美元
Uptake 美国 数据挖掘、机器学习 为铁路、建筑等大行业提供数据预测分析 SaaS 服务 B轮融资5000万美元(2017 年 4 月)
Indico 美国 机器学习 为数据科学家提供图像、文本的识别和分析的工具 4轮融资共 438 万美元
第四范式 中国 机器学习 金融应用和「先知」平台 A 轮:数百万美元
Gamalon 美国 机器学习 Bayesian Program Synthesis 可以自行编写代码,用最优的方法解释收集到的数据 来自 DARPA 的 770 万美元投资、来自 Felicis Ventures 的 450 万美元种子轮融资
DataRobot 美国 机器学习 机器学习平台公司,DataRobot 平台上有数百个开源机器学习算法 5400 万美元 C 轮融资
Petuum 美国 机器学习与人工智能平台 PetuumOS、Poseidon 框架、Petuum Healthcare Solutions 9300万美元B轮融资
Algorithmia 美国 算法 类似于苹果 App Store 的「算法应用」商店 1050 万美元 A 轮融资


10. 大公司


公司 国家 技术研究 产品应用 市值 / 估值 / 融资额
谷歌 美国 人工智能综合研究 TensorFlow 等开源框架,Google Photos、Now、Inbox 和搜索等多项产品和服务、硬件 市值 6701 亿美元
Facebook 美国 人工智能综合研究 多个开源框架和硬件平台,Messenger、社交网络和定向广告等多项产品和服务 市值 4296 亿美元
亚马逊 美国 人工智能综合研究 云服务、Echo 等智能家居、机器人、电商产品应用 市值 4696 亿美元
微软 美国 人工智能综合研究 CNTK 等开源框架,Cortana、小冰等多项产业和服务,硬件 市值 5362 亿美元
IBM 美国 人工智能综合研究 Watson、行业认知计算解决方案、量子计算机等 市值 1434 亿美元
苹果 美国 人工智能综合研究 基于智能手机等硬件的多项产品和硬件、智能助手、智能家居、医疗等 市值 8067 亿美元
百度 中国 人工智能综合研究 开源框架 PaddlePaddle、百度大脑、自动驾驶、互联网应用 市值 676 亿美元
阿里巴巴 中国 人工智能综合研究 云服务、人工智能平台 DT PAI、电商产品应用 市值3079 亿美元
腾讯 中国 人工智能综合研究 互联网应用 25683.98亿人名币
NVIDIA 美国 人工智能硬件 GPU、深度学习超级计算机 DGX-1、自动驾驶超级计算机 Xavier 市值 832.07 亿美元
英特尔 美国 人工智能硬件 CPU、Xeon Phi、Nervana 市值 1706.30 亿美元
高通 美国 人工智能硬件 移动智能设备芯片 市值约 899.36 亿美元
赛灵思 美国 全可编程技术和器件 All Programmable FPGA、SoC 和 3D IC 提供商 160.70 亿美元
华为 中国 人工智能综合研究、硬件 人机交互设备应用、芯片等 2017 年以 785.108 亿美元营业收入首次打入《财富》前百强


「 AI00 开源项目」参与方式:


1)直接在 Github 页面进行 contribute ,http://ift.tt/2zTfZH6


]]> 原文: http://ift.tt/2zTg0La
RSS Feed

机器知心

IFTTT

伯克利强化学习新研究:机器人只用几分钟随机数据就能学会轨迹跟踪

伯克利人工智能研究实验室(BAIR)博客近日介绍了一种使用神经网络动态的基于模型的强化学习方法,该方法能够非常高效地利用数据,能让强化学习智能体使用少量数据就学会轨迹跟踪。除了模拟实验,他们还在真实机器人上进行了评估,让一个机器人只用 17 分钟数据就学会了轨迹跟踪。机器之心对介绍这项研究的博客文章进行了编译介绍,相关论文和代码可在文末查阅。

图 1:一个学习后的神经网络动态模型能让六足机器人学习奔跑和遵照所需的轨迹运动,这个学习仅使用了 17 分钟的真实经验。


让机器人在真实世界自动行动是很困难的。真的非常非常困难。即使有昂贵的机器人和世界级的研究团队,机器人仍然还难以在复杂的非结构化环境中自动导航和交互。


为什么我们身边还没有自动机器人。要做出能够应付我们这个世界的复杂性的工程系统是非常艰难的。


从非线性的动态和局部可观测性到不可预测的地形和传感器故障,机器人尤其容易受到墨菲定律的影响,即任何可能出错的事情都会出错。我们没有通过编码我们的机器人可能遇到的每种场景来对抗墨菲定律,而是选择了拥抱这种失败的可能性并让我们的机器人可以从中学习。从经验中学习控制策略是很有好处的,因为和人工设计的控制器不同,通过学习得到的控制器可以适应更多数据并随之改善进步。因此,当机器人面对一个任何事都可能出错的场景时,尽管它仍会出错,但经过学习的控制器有望在下一次遇到相似场景时纠正这些错误。


为了应对真实世界中的任务的复杂性,当前的基于学习的方法通常会使用深度神经网络,这种方法很强大但在数据方面不是很高效:这些基于试错方法的学习器多半第二次、第三次还会出错,而且往往会出错数千到数百万次之多。现代深度强化学习方法的这种样本低效性是基于学习的方法在真实世界中应用的主要瓶颈之一。


我们研究了使用神经网络控制机器人的可以高效利用样本的基于学习的方法。对于复杂的并且会进行大量接触的仿真机器人和真实机器人(图 1)来说,我们的方法可以仅使用几分钟的数据就能学会跟踪轨迹的运动技能,而且这几分钟的数据是该机器人在该环境中随机行动而收集到的。在这篇博客中,我们将概述性地介绍我们的方法和结果。你可以在文末列出的研究论文中查看更多细节和代码。


样本高效性:无模型方法与基于模型的方法


根据经验学习机器人技能通常是在强化学习的领域内。强化学习算法一般可以分为两大类:无模型方法(学习一个策略或价值函数)和基于模型的方法(学习一个动态模型)。尽管无模型深度强化学习算法可以学习很多类型的机器人技能,但它们往往会有非常高的样本复杂度、通常需要数百万样本才能得到优良的表现并且通常一次只能学习一个任务。尽管之前已经有一些研究将这些无模型算法用在了真实的操作任务上,但这些算法的高样本复杂度和不灵活性妨碍了它们被用在真实世界中学习运动技能。


基于模型的强化学习算法通常被认为能更有效地利用样本。但为了实现优良的样本效率,从传统上看,这些基于模型的算法要么使用了相对简单的函数近似器(不能很好地泛化到复杂任务),要么就使用了高斯过程等概率动态模型(可以很好地泛化,但难以应对复杂和高维的领域,比如带有会导致不连续动态的摩擦接触的系统)。相反,我们使用了中等规模的神经网络来作为可以实现出色样本效率的函数近似器,同时仍然有足够的表现能力可以泛化和应用到各种复杂和高维的运动任务上。


基于模型的深度强化学习的神经网络动态


在我们的工作中,我们的目标是将深度神经网络模型在其它领域的成功扩展到基于模型的强化学习领域。最近几年将神经网络与基于模型的强化学习结合起来的工作没能实现与更简单的模型(比如高斯过程)相媲美的结果。比如,Gu et. al. 观察到甚至线性模型也能在合成经验生成(synthetic experience generation)上得到更好的表现,而 Heess et. al. 则发现将神经网络纳入无模型学习系统中只能得到相对较少的增益。我们的方法取决于几个关键决定。首先,我们在一个模型预测控制框架中使用了这个学习得到的神经网络模型,其中系统可以迭代式地重新规划和纠正自己的错误。其次,我们使用了一个相对较短的视野预测(horizon look-ahead),这样我们就不必依赖于模型去执行深入未来的非常精准的预测。这两种相对简单的设计决定让我们的方法可以执行范围广泛的运动任务,这些任务之前还没使用直接在原始状态观察上运行的通用的基于模型的强化学习方法完成过。


我们的基于模型的强化学习方法如图 2 所示。我们保持着一个迭代式地添加内容的轨迹数据集,我们使用这个数据集来训练我们的动态模型。该数据集使用了随机轨迹进行初始化。然后我们使用该数据集训练神经网络动态模型并使用我们学习到的动态模型收集额外的轨迹以聚合到该数据集上,我们通过交替这两个过程执行强化学习。我们将在下面讨论这两个组件。


图 2:我们的基于模型的强化学习算法的概览。


动态模型


我们将我们学习到的动态函数参数化为了一个深度神经网络,这个参数化过程所用到的一些权重需要通过学习得到。我们的动态函数以当前状态 s_t 和动作 a_t 为输入,然后输出预测 。该动态模型本身可以在监督式学习设置中进行训练,其中收集到的训练数据以输入 (s_t,a_t) 和对应的输出标签 的方式成对出现。


注意我们上面所说的「状态」可能会随智能体而变化,而且它的元素可能包含质心位置、质心速度、关节位置和其它我们选择包含进来的可测量。


控制器


为了使用学习到的动态模型完成任务,我们需要定义一个编码该任务的奖励函数。比如,标准的 x_vel 奖励可以编码向前运动的任务。对于跟随轨迹的任务,我们构建了一个鼓励靠近轨迹同时沿轨迹向前运动的奖励函数。


使用这个学习到的动态模型和任务奖励函数,我们构建了一个基于模型的控制器。在每个时间步骤,该智能体都通过随机生成 K 个候选动作序列来规划未来的 H 个步骤,这个过程使用了学习到的动态模型来预测这些动作序列的结果,然后选择其中对应于最高累积奖励的序列(图 3)。然后我们仅执行该动作序列中的第一个动作,然后再在下一个时间步骤重复这个规划过程。这个重新规划过程使得该方法能稳健地应对这个学习到的动态模型中的不准确性。


图 3:这个过程的图示:使用学习到的动态模型模拟多个候选动作序列、预测它们的结果、根据奖励函数选出其中最好的一个。


结果


我们首先在一些不同的 MuJoCo 智能体上对我们的方法进行了评估,包括游泳智能体、半猎豹智能体和蚂蚁智能体。图 4 表明:使用我们学习到的动态模型和 MPC 控制器,这些智能体可以沿由一组稀疏的路径点定义的路径运动。此外,我们的方法仅需要使用几分钟的随机数据来训练学习到的动态模型,这表明它能很有效地利用样本。


注意,我们使用这种方法只训练了该模型一次,但是简单地通过修改奖励函数,我们可以在运行时将该模型应用到各种不同的所需轨迹上,而无需再单独针对特定任务进行训练。



图 4:蚂蚁智能体、游泳智能体和半猎豹智能体的轨迹跟踪。每个智能体为跟随这些不同的轨迹所使用的动态模型都只训练了一次,并且都只使用了随机收集的训练数据。


我们的方法中的哪些方面对表现优良而言很重要呢?我们首先检查了改变 MPC 规划视野 H 所造成的影响。图 5 表明如果视野太短会给表现得到负面影响,这可能是因为存在无法恢复的贪婪行为(greedy behavior)。对于半猎豹智能体,如果视野太长也会带来负面影响,因为学习到的动态模型中存在不准确性。图 6 给出了我们学习到的动态模型单次 100 步预测,表明对特定状态元素的开环预测最终会偏离 ground truth。因此,为了在避免贪婪行为的同时最小化不准确模型的不利影响,使用适中的规划视野最好。

图 5:控制器为规划使用不同的视野值所得到的任务表现图。视野太低不好,太高也不好。


图 6:该动态模型的 100 步前向模拟(开环),表明为特定状态元素进行的开环预测最终会偏离 ground truth。


我们还改变了用于训练动态模型的初始随机轨迹的数量。图 7 表明:尽管更多的初始训练数据可以得到更好的初始表现,但数据聚合还是允许少数据的初始实验运行达到较高的最终表现水平。这显著突出了来自强化学习的在策略数据(on-policy data)可以如何提升样本效率。


图 7:使用不同数量的初始随机数据训练的动态模型所实现的任务表现图。


需要指出,这种基于模型的控制器的最终表现仍然显著低于非常好的无模型学习器(此时无模型的学习器使用的数据要多数千倍)。这种次优的表现有时被称为「模型偏差(model bias)」,是基于模型的强化学习领域的一个已知问题。为了解决这个问题,我们也提出了一种将基于模型的和无模型的学习结合起来的混合方法,从而消除了收敛时的渐进偏差(asymptotic bias),但这需要额外的经验。这种混合方法及更多其它分析可在我们的论文中查看。


学习在真实世界中运行


图 8:VelociRoACH 长 10cm,重大约 30 克,每秒可移动长达 27 个机体长度,并且使用了 2 个电机来控制全部 6 条腿。


因为我们的基于模型的强化学习算法可以使用比无模型算法少几个数量级的经验来学习运动步态,所以我们可以直接在真实的机器人平台上对其进行评估。在另一项工作中,我们研究了这种方法可以如何完全从真实经验中学习,从而完全从头开始为一个毫米机器人(图 8)学习运动步态。


毫米机器人(millirobot)由于尺寸小和生产成本低,所以是很多应用的理想平台。但是,因为这些毫米机器人有欠驱动(underactuation)、功率限制和尺寸上的问题,所以控制它们是很困难的。尽管人工设计的控制器有时候可以控制这些毫米机器人,但它们往往难以应付动态的策略和复杂的地形。因此我们利用了前面提到的基于模型的学习技术来让 VelociRoACH 毫米机器人学习轨迹跟踪。图 9 表明我们的基于模型的控制器只使用 17 分钟的随机数据进行训练,就可以高速准确地跟踪轨迹。


图 9:使用我们的基于模型的学习方法,VelociRoACH 沿各种所需的轨迹运动。


为了分析该模型的泛化能力,我们收集了地毯(carpet)和聚苯乙烯泡沫塑料(styrofoam)地形的数据,然后我们评估了我们的方法,如表 1 所示。和预期的一样,当在与训练所用的地形相同的地形上执行时,基于模型的控制器的表现最优,说明该模型能够整合关于地形的知识。但是,当该模型在从这两种地形上收集到的数据上同时训练时,其表现会下降,这很可能表明为了开发算法来构建在多种不同任务设置上都有效的学习模型,还需要进行更多的研究。表 2 很有希望地表明当使用更多数据训练这种动态模型时,其表现会提升,这说明我们的方法会随时间持续改善(这和人工设计的解决方案不一样),这是个非常鼓舞人心的结果。


表 1:使用不同类型的数据训练模型以及让该模型在不同的表面上执行时所产生的轨迹跟踪成本。


表 2:使用不同数量的数据和不同的腿训练得到的动态模型在应用期间所产生的轨迹跟踪成本。


我们希望这些结果能体现基于模型的方法在高效利用样本的机器人学习上的潜力并激励这一领域的未来研究。


]]> 原文: http://ift.tt/2nz7FKQ
RSS Feed

机器知心

IFTTT

听说你用JavaScript写代码?本文是你的机器学习指南


JavaScript 是一种流行的高级编程语言,它被世界上的绝大多数网站所使用,也被所有主流浏览器所支持。随着深度学习的火热,越来越多开发者开始探索使用 JavaScript 实现人工智能与机器学习算法。近日,来自德国的 Robin Wieruch 发布了一系列使用 JavaScript 构建机器学习的教程,本文将主要介绍使用 JavaScript 实现神经网络的方法。




有网友对此表示:「我本想写一篇激烈的反驳文,其中阐述如果没有 GPU 的支持,这种做法是毫无意义的……但它可以使用 WebGL 来应用 GPU 的能力。而且,这可能比你在本地桌面上安装 TensorFlow 堆栈要简单一万倍。」


近期,原作者发表了一系列有关在 JavaScript 上实现人工智能和机器学习算法的文章,其中包括:



这些机器学习算法的实现是基于 math.js 库的线性代数(如矩阵运算)和微分的,你可以在 GitHub 上找到所有这些算法:


GitHub 链接:http://ift.tt/2ASUcCR


如果你发现其中存在任何缺陷,欢迎对这个资源提出自己的改进,以帮助后来者。我希望不断为 web 开发者们提供更多、更丰富的机器学习算法。


就我个人来说,我发现实现这些算法在某种程度上是一个非常具有挑战性的任务。特别是当你需要在 JavaScript 上实现神经网络的前向和反向传播的时候。由于我自己也在学习神经网络的知识,我开始寻找适用于这种工作的库。希望在不久的将来,我们能够轻松地在 GitHub 上找到相关的基础实现。然而现在,以我使用 JavaScript 的阅历,我选择了谷歌发布的 deeplearn.js 来进行此项工作。在本文中,我将分享使用 deeplearn.js 和 JavaScript 实现神经网络从而解决现实世界问题的方式——在 web 环境上。


首先,我强烈推荐读者先学习一下深度学习著名学者吴恩达的《机器学习》课程。本文不会详细解释机器学习算法,只会展示它在 JavaScript 上的用法。另一方面,该系列课程在算法的细节和解释上有着令人惊叹的高质量。在写这篇文章之前,我自己也学习了相关课程,并试图用 JavaScript 实现来内化课程中的相关知识。


神经网络的目的是什么?


本文实现的神经网络需要通过选择与背景颜色相关的适当字体颜色来改善网页可访问性。比如,深蓝色背景中的字体应该是白色,而浅黄色背景中的字体应该是黑色。你也许会想:首先你为什么需要一个神经网络来完成任务?通过编程的方式根据背景颜色计算可使用的字体颜色并不难,不是吗?我很快在 Stack Overflow 找到了该问题的解决办法,并根据我的需求做了调整,以适应 RGB 空间中的颜色。



function getAccessibleColor(rgb) {  let [ r, g, b ] = rgb;  let colors = [r / 255, g / 255, b / 255];  let c = colors.map((col) => {    if (col <= 0.03928) {      return col / 12.92;    }    return Math.pow((col + 0.055) / 1.055, 2.4);  });  let L = (0.2126 * c[0]) + (0.7152 * c[1]) + (0.0722 * c[2]);  return (L > 0.179)    ? [ 0, 0, 0 ]    : [ 255, 255, 255 ]; }


当已经有一个编程的方法可以解决该问题的时候,使用神经网络对于该现实世界问题价值并不大,没有必要使用一个机器训练的算法。然而,由于可通过编程解决这一问题,所以验证神经网络的性能也变得很简单,这也许能够解决我们的问题。查看该 GitHub 库(http://ift.tt/2nxIMiG


下文将从头开始指导你设置神经网络的所有部分,并由你决定把文件/文件夹设置中的部分合在一起。但是你可以整合以前引用的 GitHub 库以获取实现细节。


JavaScript 中的数据集生成


机器学习中的训练集由输入数据点和输出数据点(标签)组成。它被用来训练为训练集(例如测试集)之外的新输入数据点预测输出的算法。在训练阶段,由神经网络训练的算法调整其权重以预测输入数据点的给定标签。总之,已训练算法是一个以数据点作为输入并近似输出标签的函数。

该算法经过神经网络的训练后,可以为不属于训练集的新背景颜色输出字体颜色。因此,稍后你将使用测试集来验证训练算法的准确率。由于我们正在处理颜色,因此为神经网络生成输入颜色的样本数据集并不困难。


function generateRandomRgbColors(m) {  const rawInputs = [];  for (let i = 0; i < m; i++) {    rawInputs.push(generateRandomRgbColor());  }  return rawInputs; } function generateRandomRgbColor() {  return [    randomIntFromInterval(0, 255),    randomIntFromInterval(0, 255),    randomIntFromInterval(0, 255),  ]; } function randomIntFromInterval(min, max) {  return Math.floor(Math.random() * (max - min + 1) + min); }


generateRandomRgbColors() 函数创建给定大小为 m 的部分数据集。数据集中的数据点是 RGB 颜色空间中的颜色。每种颜色在矩阵中被表征为一行,而每一列是颜色的特征。特征是 RGB 空间中的 R、G、B 编码值。数据集还没有任何标签,所以训练集并不完整,因为它只有输入值而没有输出值。


由于基于已知颜色生成可使用字体颜色的编程方法是已知的,因此可以使用调整后的功能版本以生成训练集(以及稍后的测试集)的标签。这些标签针对二分类问题进行了调整,并在 RGB 空间中隐含地反映了黑白的颜色。因此,对于黑色,标签是 [0,1];对于白色,标签是 [1,0]。


function getAccessibleColor(rgb) {  let [ r, g, b ] = rgb;  let color = [r / 255, g / 255, b / 255];  let c = color.map((col) => {    if (col <= 0.03928) {      return col / 12.92;    }    return Math.pow((col + 0.055) / 1.055, 2.4);  });  let L = (0.2126 * c[0]) + (0.7152 * c[1]) + (0.0722 * c[2]);  return (L > 0.179)    ? [ 0, 1 ] // black    : [ 1, 0 ]; // white } 


现在你已经准备好一切用于生成(背景)颜色的随机数据集(训练集、测试集),它被分类为黑色或白色(字体)颜色。


function generateColorSet(m) {  const rawInputs = generateRandomRgbColors(m);  const rawTargets = rawInputs.map(getAccessibleColor);  return { rawInputs, rawTargets }; }


使神经网络中底层算法更好的另一步操作是特征缩放。在特征缩放的简化版本中,你希望 RGB 通道的值在 0 和 1 之间。由于你知道最大值,因此可以简单地推导出每个颜色通道的归一化值。


function normalizeColor(rgb) {  return rgb.map(v => v / 255); }


你可以把这个功能放在你的神经网络模型中,或者作为单独的效用函数。下一步我将把它放在神经网络模型中。


JavaScript 神经网络模型的设置阶段


现在你可以使用 JavaScript 实现一个神经网络了。在开始之前,你需要先安装 deeplearn.js 库:一个适合 JavaScript 神经网络的框架。官方宣传中说:「deeplearn.js 是一个开源库,将高效的机器学习构造块带到 web 中,允许在浏览器中训练神经网络或在推断模式下运行预训练模型。」本文,你将训练自己的模型,然后在推断模式中运行该模型。使用该库有两个主要优势:


  • 首先,它使用本地电脑的 GPU 加速机器学习算法中的向量计算。这些机器学习计算与图解计算类似,因此使用 GPU 的计算比使用 CPU 更加高效。
  • 其次,deeplearn.js 的结构与流行的 TensorFlow 库类似(TensorFlow 库也是谷歌开发的,不过它使用的是 Python 语言)。因此如果你想在使用 Python 的机器学习中实现飞跃,那么 deeplearn.js 可提供通向 JavaScript 各领域的捷径。


现在回到你的项目。如果你想用 npm 来设置,那么你只需要在命令行中安装 deeplearn.js。也可以查看 deeplearn.js 项目的官方安装说明文档。


npm install deeplearn


我没有构建过大量神经网络,因此我按照构建神经网络的一般实践进行操作。在 JavaScript 中,你可以使用 JavaScript ES6 class 来推进它。该类可以通过定义神经网络特性和类方法为你的神经网络提供完美的容器。例如,你的颜色归一化函数可以在类别中找到一个作为方法的点。


class ColorAccessibilityModel {  normalizeColor(rgb) {    return rgb.map(v => v / 255);  } } export default ColorAccessibilityModel;


或许那也是你的函数生成数据集的地方。在我的案例中,我仅将类别归一化作为分类方法,让数据集生成独立于类别之外。你可以认为未来有不同的方法来生成数据集,不应该在神经网络模型中进行定义。不管怎样,这只是一个实现细节。

训练和推断阶段都在机器学习的涵盖性术语会话(session)之下。你可以在神经网络类别中设置会话。首先,你可以输入来自 deeplearn.js 的 NDArrayMathGPU 类别,帮助你以计算高效的方式在 GPU 上进行数学运算。


import {  NDArrayMathGPU, } from 'deeplearn'; const math = new NDArrayMathGPU(); class ColorAccessibilityModel {  ... } export default ColorAccessibilityModel;


第二,声明分类方法类设置会话。其函数签名使用训练集作为参数,成为从先前实现的函数中生成训练集的完美 consumer。第三步,会话初始化空的图。之后,图将反映神经网络的架构。你可以随意定义其特性。


import {  Graph,  NDArrayMathGPU, } from 'deeplearn'; class ColorAccessibilityModel {  setupSession(trainingSet) {    const graph = new Graph();  }  .. } export default ColorAccessibilityModel;


第四步,你用张量的形式定义图中输入和输出数据点的形态。张量是具备不同维度的数组,它可以是向量、矩阵,或更高维度的矩阵。神经网络将这些张量作为输入和输出。在我们的案例中,有三个输入单元(每个颜色通道有一个输入单元)和两个输出单元(二分类,如黑白)。


class ColorAccessibilityModel {  inputTensor;  targetTensor;  setupSession(trainingSet) {    const graph = new Graph();    this.inputTensor = graph.placeholder('input RGB value', [3]);    this.targetTensor = graph.placeholder('output classifier', [2]);  }  ... } export default ColorAccessibilityModel;


第五步,神经网络包含隐藏层。奇迹如何发生目前仍是黑箱。基本上,神经网络提出自己的交叉计算参数(在会话中经过训练)。不过,你可以随意定义隐藏层的维度(每个单元大小、层大小)。


class ColorAccessibilityModel {  inputTensor;  targetTensor;  setupSession(trainingSet) {    const graph = new Graph();    this.inputTensor = graph.placeholder('input RGB value', [3]);    this.targetTensor = graph.placeholder('output classifier', [2]);    let connectedLayer = this.createConnectedLayer(graph, this.inputTensor, 0, 64);    connectedLayer = this.createConnectedLayer(graph, connectedLayer, 1, 32);    connectedLayer = this.createConnectedLayer(graph, connectedLayer, 2, 16);  }  createConnectedLayer(    graph,    inputLayer,    layerIndex,    units,  ) {    ...  }  ... } export default ColorAccessibilityModel; 


根据层的数量,你可以变更图来扩展出更多层。创建连接层的分类方法需要图、变异连接层(mutated connected layer)、新层的索引,以及单元数量。图的层属性可用于返回由名称确定的新张量。


class ColorAccessibilityModel {  inputTensor;  targetTensor;  setupSession(trainingSet) {    const graph = new Graph();    this.inputTensor = graph.placeholder('input RGB value', [3]);    this.targetTensor = graph.placeholder('output classifier', [2]);    let connectedLayer = this.createConnectedLayer(graph, this.inputTensor, 0, 64);    connectedLayer = this.createConnectedLayer(graph, connectedLayer, 1, 32);    connectedLayer = this.createConnectedLayer(graph, connectedLayer, 2, 16);  }  createConnectedLayer(    graph,    inputLayer,    layerIndex,    units,  ) {    return graph.layers.dense(      `fully_connected_${layerIndex}`,      inputLayer,      units    );  }  ... } export default ColorAccessibilityModel;


神经网络中的每一个神经元必须具备一个定义好的激活函数。它可以是 logistic 激活函数。你或许已经从 logistic 回归中了解到它,它成为神经网络中的 logistic 单元。在我们的案例中,神经网络默认使用修正线性单元。


class ColorAccessibilityModel {  inputTensor;  targetTensor;  setupSession(trainingSet) {    const graph = new Graph();    this.inputTensor = graph.placeholder('input RGB value', [3]);    this.targetTensor = graph.placeholder('output classifier', [2]);    let connectedLayer = this.createConnectedLayer(graph, this.inputTensor, 0, 64);    connectedLayer = this.createConnectedLayer(graph, connectedLayer, 1, 32);    connectedLayer = this.createConnectedLayer(graph, connectedLayer, 2, 16);  }  createConnectedLayer(    graph,    inputLayer,    layerIndex,    units,    activationFunction  ) {    return graph.layers.dense(      `fully_connected_${layerIndex}`,      inputLayer,      units,      activationFunction ? activationFunction : (x) => graph.relu(x)    );  }  ... } export default ColorAccessibilityModel;


第六步,创建输出二分类的层。它有两个输出单元,每一个表示一个离散的值(黑色、白色)。


class ColorAccessibilityModel {  inputTensor;  targetTensor;  predictionTensor;  setupSession(trainingSet) {    const graph = new Graph();    this.inputTensor = graph.placeholder('input RGB value', [3]);    this.targetTensor = graph.placeholder('output classifier', [2]);    let connectedLayer = this.createConnectedLayer(graph, this.inputTensor, 0, 64);    connectedLayer = this.createConnectedLayer(graph, connectedLayer, 1, 32);    connectedLayer = this.createConnectedLayer(graph, connectedLayer, 2, 16);    this.predictionTensor = this.createConnectedLayer(graph, connectedLayer, 3, 2);  }  ... } export default ColorAccessibilityModel;


第七步,声明一个代价张量(cost tensor),以定义损失函数。在这个案例中,代价张量是均方误差。它使用训练集的目标张量(标签)和训练算法得到的预测张量来计算代价。


class ColorAccessibilityModel {  inputTensor;  targetTensor;  predictionTensor;  costTensor;  setupSession(trainingSet) {    const graph = new Graph();    this.inputTensor = graph.placeholder('input RGB value', [3]);    this.targetTensor = graph.placeholder('output classifier', [2]);    let connectedLayer = this.createConnectedLayer(graph, this.inputTensor, 0, 64);    connectedLayer = this.createConnectedLayer(graph, connectedLayer, 1, 32);    connectedLayer = this.createConnectedLayer(graph, connectedLayer, 2, 16);    this.predictionTensor = this.createConnectedLayer(graph, connectedLayer, 3, 2);    this.costTensor = graph.meanSquaredCost(this.targetTensor, this.predictionTensor);  }  ... } export default ColorAccessibilityModel;


最后但并非不重要的一步,设置架构图的相关会话。之后,你就可以开始准备为训练阶段导入训练集了。


import {  Graph,  Session,  NDArrayMathGPU, } from 'deeplearn'; class ColorAccessibilityModel {  session;  inputTensor;  targetTensor;  predictionTensor;  costTensor;  setupSession(trainingSet) {    const graph = new Graph();    this.inputTensor = graph.placeholder('input RGB value', [3]);    this.targetTensor = graph.placeholder('output classifier', [2]);    let connectedLayer = this.createConnectedLayer(graph, this.inputTensor, 0, 64);    connectedLayer = this.createConnectedLayer(graph, connectedLayer, 1, 32);    connectedLayer = this.createConnectedLayer(graph, connectedLayer, 2, 16);    this.predictionTensor = this.createConnectedLayer(graph, connectedLayer, 3, 2);    this.costTensor = graph.meanSquaredCost(this.targetTensor, this.predictionTensor);    this.session = new Session(graph, math);    this.prepareTrainingSet(trainingSet);  }  prepareTrainingSet(trainingSet) {    ...  }  ... } export default ColorAccessibilityModel;


不过目前在准备神经网络的训练集之前,设置还没完成。首先,你可以在 GPU 数学计算环境中使用回调函数(callback function)来支持计算,但这并不是强制性的,可自主选择。


import {  Graph,  Session,  NDArrayMathGPU, } from 'deeplearn'; const math = new NDArrayMathGPU(); class ColorAccessibilityModel {  session;  inputTensor;  targetTensor;  predictionTensor;  costTensor;  ...  prepareTrainingSet(trainingSet) {    math.scope(() => {      ...    });  }  ... } export default ColorAccessibilityModel;

其次,你可以解构训练集的输入和输出(标签,也称为目标)以将其转换成神经网络可读的格式。deeplearn.js 的数学计算使用内置的 NDArrays。你可以把它们理解为数组矩阵中的简单数组或向量。此外,输入数组的颜色被归一化以提高神经网络的性能。


import {  Array1D,  Graph,  Session,  NDArrayMathGPU, } from 'deeplearn'; const math = new NDArrayMathGPU(); class ColorAccessibilityModel {  session;  inputTensor;  targetTensor;  predictionTensor;  costTensor;  ...  prepareTrainingSet(trainingSet) {    math.scope(() => {      const { rawInputs, rawTargets } = trainingSet;      const inputArray = rawInputs.map(v => Array1D.new(this.normalizeColor(v)));      const targetArray = rawTargets.map(v => Array1D.new(v));    });  }  ... } export default ColorAccessibilityModel;


第三,shuffle 输入和目标阵列。shuffle 的时候,deeplearn.js 提供的 shuffler 将二者保存在 sync 中。每次训练迭代都会出现 shuffle,以馈送不同的输入作为神经网络的 batch。整个 shuffle 流程可以改善训练算法,因为它更可能通过避免过拟合来实现泛化。


import {  Array1D,  InCPUMemoryShuffledInputProviderBuilder,  Graph,  Session,  NDArrayMathGPU, } from 'deeplearn'; const math = new NDArrayMathGPU(); class ColorAccessibilityModel {  session;  inputTensor;  targetTensor;  predictionTensor;  costTensor;  ...  prepareTrainingSet(trainingSet) {    math.scope(() => {      const { rawInputs, rawTargets } = trainingSet;      const inputArray = rawInputs.map(v => Array1D.new(this.normalizeColor(v)));      const targetArray = rawTargets.map(v => Array1D.new(v));      const shuffledInputProviderBuilder = new InCPUMemoryShuffledInputProviderBuilder([        inputArray,        targetArray      ]);      const [        inputProvider,        targetProvider,      ] = shuffledInputProviderBuilder.getInputProviders();    });  }  ... } export default ColorAccessibilityModel;


最后,馈送条目(feed entries)是训练阶段中神经网络前馈算法的最终输入。它匹配数据和张量(根据设置阶段的形态而定义)。


import {  Array1D,  InCPUMemoryShuffledInputProviderBuilder  Graph,  Session,  NDArrayMathGPU, } from 'deeplearn'; const math = new NDArrayMathGPU(); class ColorAccessibilityModel {  session;  inputTensor;  targetTensor;  predictionTensor;  costTensor;  feedEntries;  ...  prepareTrainingSet(trainingSet) {    math.scope(() => {      const { rawInputs, rawTargets } = trainingSet;      const inputArray = rawInputs.map(v => Array1D.new(this.normalizeColor(v)));      const targetArray = rawTargets.map(v => Array1D.new(v));      const shuffledInputProviderBuilder = new InCPUMemoryShuffledInputProviderBuilder([        inputArray,        targetArray      ]);      const [        inputProvider,        targetProvider,      ] = shuffledInputProviderBuilder.getInputProviders();      this.feedEntries = [        { tensor: this.inputTensor, data: inputProvider },        { tensor: this.targetTensor, data: targetProvider },      ];    });  }  ... } export default ColorAccessibilityModel;


这样,神经网络的设置就结束了。神经网络的所有层和单元都实现了,训练集也准备好进行训练了。现在只需要添加两个配置神经网络行为的超参数,它们适用于下个阶段:训练阶段。


import {  Array1D,  InCPUMemoryShuffledInputProviderBuilder,  Graph,  Session,  SGDOptimizer,  NDArrayMathGPU, } from 'deeplearn'; const math = new NDArrayMathGPU(); class ColorAccessibilityModel {  session;  optimizer;  batchSize = 300;  initialLearningRate = 0.06;  inputTensor;  targetTensor;  predictionTensor;  costTensor;  feedEntries;  constructor() {    this.optimizer = new SGDOptimizer(this.initialLearningRate);  }  ... } export default ColorAccessibilityModel;


第一个参数是学习速率(learning rate)。学习速率决定算法的收敛速度,以最小化成本。我们应该假定它的数值很高,但实际上不能太高了。否则梯度下降就不会收敛,因为找不到局部最优值。


第二个参数是批尺寸(batch size)。它定义每个 epoch(迭代)里有多少个训练集的数据点通过神经网络。一个 epoch 等于一批数据点的一次正向传播和一次反向传播。以批次的方式训练神经网络有两个好处:第一,这样可以防止密集计算,因为算法训练时使用了内存中的少量数据点;第二,这样可以让神经网络更快地进行批处理,因为每个 epoch 中权重会随着每个批次的数据点进行调整——而不是等到整个数据集训练完之后再进行改动。


训练阶段


设置阶段结束后就到了训练阶段了。不需要太多实现,因为所有的基础都已在设置阶段完成。首先,训练阶段可以用分类方法来定义。然后在 deeplearn.js 的数学环境中再次执行。此外,它还使用神经网络实例所有的预定义特性来训练算法。


class ColorAccessibilityModel {  ...  train() {    math.scope(() => {      this.session.train(        this.costTensor,        this.feedEntries,        this.batchSize,        this.optimizer      );    });  } } export default ColorAccessibilityModel;


训练方法是 1 个 epoch 的神经网络训练。因此,从外部调用时,调用必须是迭代的。此外,训练只需要 1 个 epoch。为了多批次训练算法,你必须将该训练方法进行多次迭代运行。

这就是基础的训练阶段。但是根据时间调整学习率可以改善训练。学习率最初很高,但是当算法在每一步过程中逐渐收敛时,学习率会出现下降趋势。


class ColorAccessibilityModel {  ...  train(step) {    let learningRate = this.initialLearningRate * Math.pow(0.90, Math.floor(step / 50));    this.optimizer.setLearningRate(learningRate);    math.scope(() => {      this.session.train(        this.costTensor,        this.feedEntries,        this.batchSize,        this.optimizer      );    }  } } export default ColorAccessibilityModel;


在我们的情况中,学习率每 50 步下降 10%。下面,我们需要获取训练阶段的损失,来验证它是否随着时间下降。损失可在每一次迭代时返回,不过这样会导致较低的计算效率。神经网络每次请求返回损失,就必须通过 GPU 才能实现返回请求。因此,我们在多次迭代后仅要求返回一次损失来验证其是否下降。如果没有请求返回损失,则训练的损失下降常量被定义为 NONE(之前默认设置)。


import {  Array1D,  InCPUMemoryShuffledInputProviderBuilder,  Graph,  Session,  SGDOptimizer,  NDArrayMathGPU,  CostReduction, } from 'deeplearn'; class ColorAccessibilityModel {  ...  train(step, computeCost) {    let learningRate = this.initialLearningRate * Math.pow(0.90, Math.floor(step / 50));    this.optimizer.setLearningRate(learningRate);    let costValue;    math.scope(() => {      const cost = this.session.train(        this.costTensor,        this.feedEntries,        this.batchSize,        this.optimizer,        computeCost ? CostReduction.MEAN : CostReduction.NONE,      );      if (computeCost) {        costValue = cost.get();      }    });    return costValue;  } } export default ColorAccessibilityModel;


最后,这就是训练阶段。现在仅需要在训练集上进行会话设置后从外部进行迭代执行。外部的执行取决于训练方法是否返回损失。


推断阶段


最后一个阶段是推断阶段,该阶段使用测试集来验证训练算法的性能。输入是背景颜色中的 RGB 颜色,输出是算法为字体颜色是黑是白进行的 [ 0, 1 ] 或 [ 1, 0 ] 分类预测。由于输入数据点经过归一化,因此不要忘记在这一步也对颜色进行归一化。


class ColorAccessibilityModel {  ...  predict(rgb) {    let classifier = [];    math.scope(() => {      const mapping = [{        tensor: this.inputTensor,        data: Array1D.new(this.normalizeColor(rgb)),      }];      classifier = this.session.eval(this.predictionTensor, mapping).getValues();    });    return [ ...classifier ];  } } export default ColorAccessibilityModel;


该方法在数学环境中再次运行性能关键部分,需要定义一个映射,该映射最终可作为会话评估的输入。记住,预测方法不是一定得在训练阶段后运行。它可以在训练阶段中使用,来输出测试集的验证。至此,神经网络已经经历了设置、训练和推断阶段。


在 JavaScript 中可视化学习神经网络


现在是时候使用神经网络进行训练和验证/测试了。简单的过程为建立一个神经网络,使用一个训练集运行训练阶段,代价函数取得最小值之后,使用一个测试集进行预测。所有的过程只需要使用网页浏览器上的开发者控制台的几个 console.log statements 就可以完成。然而,由于该神经网络是关于颜色预测的,并且 deeplearn.js 是在浏览器上运行,从而可以轻松地对神经网络的训练阶段和测试阶段进行可视化。


至此,你可以自主决定你运行中的神经网络的可视化方式。使用一个 canvas 和 repuestAnimationFrame API 可以使 JavaScript 代码更简单。但就这篇文章来说,我会使用 React.js 进行展示,因为我在博客上写过 React.js。


因此在使用 create-react-app 设置完项目后,App 组件可成为我们可视化的进入点。首先,导入神经网络类别和函数,从你的文件中生成数据集。进而,为训练集大小、测试集大小和训练迭代次数添加若干个常量。


import React, { Component } from 'react'; import './App.css'; import generateColorSet from './data'; import ColorAccessibilityModel from './neuralNetwork'; const ITERATIONS = 750; const TRAINING_SET_SIZE = 1500; const TEST_SET_SIZE = 10; class App extends Component {  ... } export default App;


App 的组件包括生成数据集(训练集和测试集)、通过传递训练集建立神经网络会话、定义组件的初始状态。在训练阶段的时间内,代价函数的值和迭代次数会在控制台上显示,它也表示了组件的状态。


import React, { Component } from 'react'; import './App.css'; import generateColorSet from './data'; import ColorAccessibilityModel from './neuralNetwork'; const ITERATIONS = 750; const TRAINING_SET_SIZE = 1500; const TEST_SET_SIZE = 10; class App extends Component {  testSet;  trainingSet;  colorAccessibilityModel;  constructor() {    super();    this.testSet = generateColorSet(TEST_SET_SIZE);    this.trainingSet = generateColorSet(TRAINING_SET_SIZE);    this.colorAccessibilityModel = new ColorAccessibilityModel();    this.colorAccessibilityModel.setupSession(this.trainingSet);    this.state = {      currentIteration: 0,      cost: -42,    };  }  ... } export default App;


接下来,设置了神经网络会话之后,就可以迭代地训练神经网络了。最简单的版本只需要一直运行 React 的一个 for 循环就可以了。


class App extends Component {  ...  componentDidMount () {    for (let i = 0; i <= ITERATIONS; i++) {      this.colorAccessibilityModel.train(i);    }  }; } export default App;


然而,以上代码不会在 React 的训练阶段提供(render)输出,因为组件不会在神经网络阻塞单个 JavaScript 线程的时候 reRender。这也正是 React 使用 requestAnimationFrame 的时候。与其自己定义一个 for 循环,每一个请求的浏览器的动画帧都可以被用于运行一次训练迭代。


class App extends Component {  ...  componentDidMount () {    requestAnimationFrame(this.tick);  };  tick = () => {    this.setState((state) => ({      currentIteration: state.currentIteration + 1    }));    if (this.state.currentIteration < ITERATIONS) {      requestAnimationFrame(this.tick);      this.colorAccessibilityModel.train(this.state.currentIteration);    }  }; } export default App;


此外,代价函数可以每 5 步进行一次计算。如前所述,需要访问 GPU 来检索代价函数。因此需要防止神经网络训练过快。


class App extends Component {  ...  componentDidMount () {    requestAnimationFrame(this.tick);  };  tick = () => {    this.setState((state) => ({      currentIteration: state.currentIteration + 1    }));    if (this.state.currentIteration < ITERATIONS) {      requestAnimationFrame(this.tick);      let computeCost = !(this.state.currentIteration % 5);      let cost = this.colorAccessibilityModel.train(        this.state.currentIteration,        computeCost      );      if (cost > 0) {        this.setState(() => ({ cost }));      }    }  }; } export default App;


一旦组件装载好训练阶段就可以开始运行。现在是使用程序化计算输出和预测输出提供测试集的时候了。经过时间推移,预测输出应该变得和程序化计算输出一样。而训练集本身并未被可视化。


class App extends Component {  ...  render() {    const { currentIteration, cost } = this.state;    return (      

Neural Network for Font Color Accessibility

Iterations: {currentIteration}

Cost: {cost}

); } } const ActualTable = ({ testSet }) =>

Programmatically Computed

const InferenceTable = ({ testSet, model }) =>

Neural Network Computed

export default App;


实际的表格会随着测试集的不断输入不断地展示每一个输入和输出的颜色。测试集包括输入颜色(背景颜色)和输出颜色(字体颜色)。由于生成数据集的时候输出颜色被分类为黑色 [0,1] 和白色 [1,0] 向量,它们需要再次被转换为真实的颜色。


const ActualTable = ({ testSet }) =>  <div>    <p>Programmatically Computedp>    {Array(TEST_SET_SIZE).fill(0).map((v, i) =>      <ColorBox        key={i}        rgbInput={testSet.rawInputs[i]}        rgbTarget={fromClassifierToRgb(testSet.rawTargets[i])}      />    )}  div> const fromClassifierToRgb = (classifier) =>  classifier[0] > classifier[1]    ? [ 255, 255, 255 ]    : [ 0, 0, 0 ]


ColorBox 组件是一个通用组件,以输入颜色(背景颜色)和目标颜色(字体颜色)为输入。它能简单地用一个矩形展示输入颜色的类型、输入颜色的 RGB 代码字符串,并用字体的 RGB 代码将给定的目标颜色上色。


const ColorBox = ({ rgbInput, rgbTarget }) =>  <div className="color-box" style=>    <span style=>      <RgbString rgb={rgbInput} />    span>  div> const RgbString = ({ rgb }) =>  `rgb(${rgb.toString()})` const getRgbStyle = (rgb) =>  `rgb(${rgb[0]}, ${rgb[1]}, ${rgb[2]})`


最后但重要的是,在推理表格中可视化预测颜色的激动人心的部分。它使用的也是 color box,但提供了一些不同的小道具。


const InferenceTable = ({ testSet, model }) =>  <div>    <p>Neural Network Computedp>    {Array(TEST_SET_SIZE).fill(0).map((v, i) =>      <ColorBox        key={i}        rgbInput={testSet.rawInputs[i]}        rgbTarget={fromClassifierToRgb(model.predict(testSet.rawInputs[i]))}      />    )}  div>


输入颜色仍然是测试集中定义的颜色,但目标颜色并不是测试集中的目标色。任务的关键是利用神经网络的预测方法预测目标颜色——它需要输入的颜色,并应在训练阶段预测目标颜色。


最后,当你开启应用时,你需要观察神经网络是否被启用。而实际的表格从开始就在使用固定测试集,在训练阶段推理表格应该改变它的字体颜色。事实上,当 ActualTable 组件显示实际测试集时,InferenceTable 显示测试集的输入数据点,但输出是使用神经网络预测的。


本文向你展示了如何使用 deeplearn.js 在 JavaScript 上为机器学习构建神经网络,希望对大家有所帮助。如果你有任何改进的建议,欢迎留言并在 GitHub 上做出自己的贡献。React 渲染部分的可视化动图可以在 GitHub 上看到:http://ift.tt/2nvz1Bz



]]> 原文: http://ift.tt/2zS1frX
RSS Feed

机器知心

IFTTT

从修正Adam到理解泛化:概览2017年深度学习优化算法的最新研究进展

Sebastian Ruder 的这篇博客总结了 2017 年深度学习优化算法的最新进展,他主要从Adam算法的局限性与提升方法、学习率衰减方案、超参数搜索、怎样学习优化和理解泛化性能等角度向我们展示近来研究者对最优化方法的思考与探索。


深度学习终究是寻找一个使泛化性能足够好的(损失函数)极小值过程,它并不一定要求能搜索到非凸函数的最小值点,而需要模型的损失能得到显著性地降低,以收敛到一个可接受的极小值点。随机梯度下降(SGD)已经有 60 多年的历史(Robbins and Monro, 1951)[1],通过应用于反向传播过程,它是当前深度学习算法最基本的组成部分。


近年来人们提出了多种优化算法,使用不同的方程更新模型的参数。Adam(Kingma and Ba, 2015)[18] 在 2015 年被提出,可以认为其在今天仍然是最常用的算法。因此从机器学习从业者的角度看来,深度学习最好的优化算法开发近年来基本没有太大的突破。


然而,今年我们开发了好几种新的方法被,它们有望优于当前最佳的方法,并用于未来复杂模型的优化中。在这篇博客中,我将介绍深度学习优化算法中几个最有意义的进展以及最有潜力的方向。这篇博客假定读者熟悉 SGD 和适应性学习率方法,如 Adam。如果想快速入门,可以查看 Ruder 以前的博客以概览当前已有的梯度下降优化算法:深度解读最流行的优化算法:梯度下降,或参见更加基础与入门的文章:目标函数的经典优化算法介绍


提升 Adam 方法


尽管如 Adam 那样的适应性学习率方法仍然是实际应用中绝对的主流,但如目标识别(Huang et al., 2017)[17] 或机器翻译(Wu et al., 2016)[3] 等计算机视觉和自然语言处理任务的最优结果仍然是由带动量的 SGD 算法实现。最近的理论(Wilson et al., 2017)[15] 为此提供了一些理由,他们的研究表明适应性学习率方法相对于带动量的 SGD 会收敛到不同或次优的极小值。从经验上来说,适应性学习率方法一般在目标识别、字符级语言建模和句法分析任务中要比带动量的 SGD 方法所搜索到的极小值差。这似乎是反直觉的,因为 Adam 一般保证了优良的收敛性,它的适应性学习率也比标准 SGD 的固定或指数衰减学习率更有优势。然而,Adam 和其它适应性学习率方法并不是没有缺陷的。


去耦合指数衰减


权重衰减因素可以部分解释 Adam 方法在一些数据集上比带动量的 SGD 方法泛化性能更差的原因。权重衰减广泛应用于图像分类问题中,它一般在参数更新后乘以一个稍微小于 1 的数值 w_t 而令权重 θ_t 得到衰减:


这样的过程可以避免权重的值增长过快,因此,它也可以理解为依赖于权重衰减率 w_t 的 L2 正则项:


权重衰减在许多神经网络库中都有实现,一般它们都是作为上述的正则化项或直接应用于修正梯度。由于梯度在动量法和 Adam 更新方程(通过将衰减项与梯度相乘)中都有修改,因此权重衰减不再等同于 L2 正则项。Loshchilov 和 Hutter(2017)[19] 因此提出解耦合权重衰减方法,该方法通过将梯度更新添加到参数更新步骤之后而实现原定义中的权重衰减。带有动量和权重衰减的随机梯度下降(SGDW)的更新规则如下所示: 


其中 η 为学习率,第二个方程式的第三项为解耦合权重衰减。同样,带权重衰减的 Adam 方法(AdamW)可以表示为:


其中 m_t 和 m_t hat 、v_t 和 v_t hat 分别为一阶矩与二阶矩的有偏和偏差修正后的估计,β_1 和 β_2 分别为它们的衰减率,相同的权重衰减项也会添加到其中。作者还表示,这大大加强了 Adam 算法的泛化性能,且允许它在图像分类任务中获得像带动量的 SGD 方法那样的性能。


另外,Adam 方法可以解耦合学习率与权重衰减,即超参数之间不再相互依赖,这使得超参数优化更加优秀。它还将优化器的实现和权重衰减的实现分离开,因此能实现更简明与可复用的代码。


修正指数滑动平均


近来一些论文 (Dozat and Manning, 2017; Laine and Aila, 2017) [13,16] 经验性地发现较低的β_2 值 0.90 在各自的应用中要比默认值 0.999 更有效,β_2 即控制 Adam 算法中梯度平方的指数滑动平均值,这也就表明指数滑动平均模型可能会存在一些问题。


在 ICLR 2018 中,一份提交论文形式化地提出了这个问题,他们表示 Adam、RMSprop 和 Adadelta 等方法都是基于使用前面迭代所产生梯度平方的指数滑动平均值,在对该滑动平均值取平方根后用于缩放当前梯度以更新权重。指数均值的贡献是积极的:这种方法应该防止学习率在学习过程中变得逼近无穷小,这也是 Adagrad 算法关键的缺点。然而,这种梯度的短期记忆能力也成为了其它情况的障碍。


在 Adam 算法收敛到次优解的过程中,它已经观察到一些小批量数据提供了大量且具有信息的梯度,但是由于这些小批量数据发生地非常少,指数平均将降低它们的影响,这也就造成了 Adam 只能收敛到次优的极小值点。作者提供了一个简单的凸优化案例,其中 ADAM 方法并不能收敛到非常好的最优解。


为了解决这个问题,作者提出了一个新算法 AMSGrad,该算法使用过去梯度平方的最大值以替代指数平均值来更新参数。不带偏差修正估计的 AMSGrad 更新规则可以表示为:


作者观察到该算法在 CIFAR-10 小数据集上的性能优于 Adam 方法。


调整学习率


在很多案例中,需要提高和调整的通常不是模型,而是超参数。最新的语言建模案例表明调整 LSTM 的参数(Melis 等,2017)[20] 和正则化参数(Merity 等,2017)[21] 可以获得与复杂模型相当的当前最佳结果。


优化深度学习的一个重要参数是学习率 η。实际上,SGD 已被证明需要结合学习率退火方案以收敛到极小值。人们通常认为适应性学习率方法例如 Adam 对不同的学习率有更好的鲁棒性。然而即使对这些方法,一个好的学习率和最优的学习率也有很大的不同。


Zhang 等人(2017)[2] 证明了 SGD 结合学习率退火方案和动量参数不仅可以取得和 Adam 算法相当的结果,其收敛速度还更快。另一方面,我们可能认为 Adam 学习率的适应性和学习率退火类似,但一个显式的退火方案仍然是有利的:如果添加 SGD 形式的学习率退火到 Adam 上,它能收敛得更快,并超越 SGD 在机器翻译上的性能(Denkowski 和 Neubig, 2017)[4]。


实际上,学习率退火方案工程可以当成一种新的特征工程,因为我们通常都能找到高度调优的(能提升模型最终收敛性能的)学习率退火方案。一个有趣的案例是 Vaswani 等(2017)[14]。虽然通常模型的超参数受大规模的超参数优化支配,实际上这些学习率退火方案对细节的相同关注也是很有趣的:作者使用的 Adam 超参数为 β_1=0.9,(非默认)β_2=0.98,ϵ=10^-9,以及可认为是最复杂的学习率退火方案的学习率设置:


其中 d_model 是模型的参数数量,warmup_steps=4000。


另外一篇最新的由 Smith 等(2017)[5] 写的论文证明了学习率和批量大小之间的有趣关系,过去通常认为这两个参数是互相独立的。他们证明了衰减学习率等价于增加批量大小,而后者可以增加训练的并行度。相反地,我们可以通过增大学习率和减小批量大小,从而减少模型的更新频率以加快训练过程。这对大规模的深度学习有显著的效果,从而可以使我们重复利用已有的训练方案而不需要调整超参数。


热启动


SGD 结合热启动


另外一个有效的最新进展是 SGDR(Loshchilov and Hutter, 2017)[6],这是一种使用热启动取代学习率衰减的 SGD 变体。每一次重启后,学习率被初始化为某些值,并按计划衰减。重要的是,这个重启属于热启动,因为优化过程不会再次从零开始,而是从模型在最后一步收敛的参数开始。其中的关键是学习率使用一种「激进的」余弦衰减方案,它会快速地降低学习率,如下所示:


其中 η^i_min 和η^i_max 是在第 i 次迭代中学习率的取值范围,T_cur 表示自最后一次重启后的 epoch 数,T_i 表示下一次重启时的 epoch 数。热启动方案 T_i=50、T_i=100、T_i=200 和常规的学习率衰减的对比如图 1 所示。


图 1:结合热启动的学习率衰减方案(Loshchilov and Hutter, 2017)


经过重启后的初始学习率基本作用是将参数从上次收敛到的极小值中重新「发散」出去,并到达损失曲面的另一个区域。激进的衰减方案允许模型快速收敛到一个新的更优解。作者通过经验发现 SGD 结合热启动需要的 epoch 数比学习率衰减少 2 到 4 倍,并能获得相当的结果。


学习率衰减结合热启动也被称为周期性学习率,由 Smith(2017)[22] 首次提出。


Snapshot 集成


Snapshot 集成(Snapshot ensembles,Huang 等,2017)[7] 是一种最新的巧妙技术,其使用热启动以在训练单个模型的时候不需要额外的代价就能集合多组参数。该方法训练单个模型直到使用余弦退火方案达到收敛(如上所述),然后保存模型参数,进行一次热启动,再重复这些过程 M 次。最后,所有保存的模型副本被集成起来。图 2 展示了常用的 SGD 优化和Snapshot 集成在误差曲面上的行为的对比。


图 2:SGD vs. snapshot 集成(Huang et al., 2017)


集成的成功通常依赖于集成中单个模型的多样性。因此,snapshot 集成依赖于余弦退火程序的能力,使该模型在每次重启后收敛至不同的局部最优。论文作者展示了这在实践中证明是合理的,在 CIFAR-10、CIFAR-100 和 SVHN 数据集上实现了顶尖结果。


具备热启动的 Adam


热启动最初不能与 Adam 共同使用的,因其不正常的权重衰减。在权重衰减修复之后,Loshchilov 和 Hutter(2017)扩展 Adam,使其可以与热启动共同使用。他们的设置为 ,且这些变量都服从:


他们推荐开始时使用较小的 T_i 值(epoch 总数在 11 和 1010 之间),然后每次重启时使 T_i 乘 T_mult 的值(如 T_mult=2)。


学习如何优化


去年最有趣的论文之一(同时也是「Best paper name of 2016」的获奖者)是由 Andrychowicz 等人写的「Learning to learn by gradient descent by gradient descent」[23],他们训练了一个 LSTM 优化器以在训练过程中更新主要的模型。不幸的是,学习一个分离的 LSTM 优化器或甚至使用一个预训练的 LSTM 优化器用于优化会大大增加模型模型训练过程的复杂度。


另外一个今年来很有影响力的学会学习的论文使用一个 LSTM 生成一个特定领域语言的模型架构(Zoph 和 Quoc, 2017)[24]。尽管搜索过程需要消耗大量的资源,其所发现的架构能达到替换已有架构的性能。该搜索过程被证明具备有效性,并且能找到达到当前最佳结果的语言建模架构,以及能找到和在 CIFAR-10 上获得的当前最佳结果相当的架构。


同样的搜索理论可以应用于任何其它关键过程已被人工预定义的领域,其中一个是深度学习中的优化算法。正如我们之前所看到的,优化算法之间其实很相似:所有的算法都结合了过去梯度的指数加权平均(如动量算法),以及过去梯度平方的指数加权平均(如 Adadelta、RMSprop 和 Adam)(Ruder,2016)[25]。Bello 等人(2017)[8] 定义了一种特定领域的语言,其由用于优化算法的(例如以上介绍的各种指数加权平均法)原词组成。然后,他们从可能更新规则的空间中采样一个更新规则,使用这个更新规则去训练一个模型,并基于已训练模型在测试集上的性能更新 RNN 控制器。完整的过程如图 3 所示。


图 3:神经优化器搜索(Bello 等,2017)


特别地,他们发现了两个更新等式,PowerSign 和 AddSign。PowerSign 的更新等式如下所示:


其中 α 是一个超参数,通常设为 e 或 2。f(t) 等于 1 或者表示线性、周期性的衰减函数,或者基于时间步的衰减和重启。m_t 是过去梯度的移动平均数。通常情况下设定 α=e 和无衰减。通过该等式我们可以观察到梯度通过 α^f(t) 或 1/α^f(t) 被缩放,增大还是减小取决于使用 sign 函数判断梯度和移动平均数的正负。这表明这种类动量算法关于当前梯度和过去梯度的关系是优化深度学习模型的关键部分。


而 AddSign 的更新等式如下所示:


其中 α 通常设为 1 或 2。和 PowerSign 类似,梯度的缩放同样取决于梯度的方向。作者证明了 PowerSign 和 AddSign 超过了 Adam、RMSprop 和动量法在 CIFAR-10 的优化性能,并能很好地迁移到其它任务比如 ImageNet 分类和机器翻译等。


理解泛化


优化与泛化密切相关,因为模型可收敛至的极小值决定了该模型的泛化性能。因此,优化方面的进步与更深入地理解深度学习中的泛化密切相关。


但是,我们对深度神经网络中的泛化的理解仍然比较粗浅。近期的研究表明局部极小值数量随参数数量呈指数级增长(Kawaguchi, 2016)。即使当前深度学习架构具备大量参数,那它收敛至泛化效果好的解决方案仍然很难,尤其是此类模型可以完全存储随机输入(Zhang et al., 2017)。


Keskar et al.(2017)认为极小值的尖锐程度或陡峭程度是泛化性能不好的原因:尤其是,他们认为批量梯度下降导致的尖锐性极小值(近似尖点)存在很高的泛化误差。这给人的直观感觉是:正如我们通常希望函数比较平滑,尖锐性极小值代表对应误差曲面的高度不规则性。但是,更多近期研究发现泛化性能较好的局部极小值的尖锐程度可以是随机的,因此尖锐程度可能并非合适的指标(Dinh et al., 2017)。


正在接受 ICLR 2018 盲审的论文《On the importance of single directions for generalization》通过一系列对照分析证明模型的可靠性在于激活空间中的单个维度,即单个单元或特征图的激活是评估泛化性能的合适指标。此外,他们还发现 dropout 对此没有帮助,而批归一化降低了单向可靠性。


尽管这些发现表明我们对深度学习中的泛化仍然存在很多未知,但现在很多研究者在进行收敛保证和大量针对凸优化的研究,且现有的很多想法和见解都可以一定程度地用于非凸优化。


参考文献详见原文,原文地址:http://ift.tt/2As8ZBO


]]> 原文: http://ift.tt/2irQHbR
RSS Feed

机器知心

IFTTT

NIPS举办了第一场记者发布会:请媒体警惕这波AI热潮

面对记者,NIPS 大会传达了很明确的信息——请不要妖魔化机器学习。


今年落户长滩的 NIPS(神经信息处理系统进展大会)做出了很多新的尝试——开设了五个比赛单元;增加除 Oral 和 Poster 之外的 Spotlight 环节;更多企业和初创公司进入到 NIPS 大会开设展台;以及,NIPS 首次邀请了记者参会。


美国时间周二,七位正襟危坐的学者,和来自美国各大主流报媒的记者,组成了 NIPS 有史以来的第一次记者发布会。


但是,这场记者发布会的氛围格外的……奇怪。


这种奇怪的感觉或许源于一种极其不自然的交流:一边是埋头呆在实验室里的机器学习研究员,另一边是急于挖掘人工智能大新闻的记者,他们的背景不同,想法不同,在这场记者发布会上交流的内容也不尽相同。


平心而论,学者们其实有很多话想要在记者面前倾诉。在大会主席 Isabelle Guyon 和 Ulrike von Luxburg 介绍完 NIPS 的基本信息后,发布会也邀请了五位参会的学者分别对自己论文进行解读。这些由大会精心挑选出来的论文,尽管不是获奖论文,但都通过机器学习的方法,解决了非常重要的问题。比如由 Matt Kusner 和 Joshua Loftus 提出的 Casual Model 能够解决机器学习模型中存在的偏见:为什么面部识别更容易识别白人而不是黑人,又或者自然语言系统出现针对女性的性别歧视言论。


然而,并没有多少记者对论文的内容和其影响提问;相反,记者们更愿意关心机器学习或者大众所理解的人工智能是否会对社会、经济、工作、移民等方面产生深远的影响。「深度学习会如何影响工作和经济?」「GPU 和深度学习到底能改变什么?」这些问题又超出了学者们的研究范围。


于是,字里行间,冲突、偏见、矛盾、交锋,都出现在这场 NIPS 记者发布会上。


AlphaGo 只是完成了目标


机器学习没有魔法,目前的机器学习也没有产生革命性的影响,这是大会主席 Isabelle Guyon 所坚守的观点。


这位来自法国 Paris-Saclay 大学、研究机器学习和生物学的教授,非常警惕如今的这波 AI 热潮:这是一场泡沫,而且迟早会破灭。


「目前所应用的大部分算法,20 年前都已经有了。只不过我们很幸运,赶上了算力达到了一定的标准,让很多需要大量数据的算法有了实现的可能。」


而另一位参加记者发布会的学者、获得今年 NIPS Tme of Award(时间检验奖)的加州大学伯克利分校教授 Benjamin Recht 则直接拿起了 AlphaGo 开涮,来说明人们对人工智能的过分高估。他提到了多年前的一个小插曲:在 2007 年的 ICML 大会上,当时还没有创立 DeepMind 的 David Silver 就曾说解决围棋电脑只需要 10 年时间,那时候,深度学习、强化学习都还没有进入大众的视野。


显然,Silver 的时间掐得很准。2016 年,来自 DeepMind 的 AlphaGo 一战成名,在首尔击败了曾经的世界第一围棋高手李世石。而第二年,AlaphGo 的进化体 Master 又击败了前世界第一柯洁(柯洁最近刚刚失去了世界第一的宝座)。但在 Recht 看来,DeepMind 只是完成了既定目标罢了。


「我依然记得当年深蓝击败国际象棋大师 Garry Kasparov,那很震撼。」Recht 回忆道。但画风一转,他说,「这么多年人工智能一直在游戏里击败人类,但似乎没有什么事情发生改变。」


学者们和媒体的冲突


Recht 不喜欢像 NIPS 这样的学术大会举办记者发布会。


发布会上,Recht 拿出了一篇来自纽约时报 1958 年的报道。这篇文章主要讲述了美国海军透露了目前电子计算机的胚胎,预计将能够对话、走路;他们能够复制自身,并且可以意识到自己的存在;他们将构建第一台能够读写的感知机,预计将在一年内完成,成本为十万美元。


50 年前,纽约时报就在报道人类能发明拥有高等智能的机器;如今,你依然在各大媒体上能够看到这些内容。人类不断地在研发高等智能,但是不断的失败。这当然有机器学习技术本身的局限性,但 Recht 认为媒体的夸大说辞也需要承担一部分责任。


与其说是媒体人背锅,不如说是这两个群体天生的信息不对称。


学者们不知道记者对于机器学习和人工智能的认识有多久,这成为了发布会上显而易见的「偏见」。在另一位大会主席 Ulrike von Luxburg 短短三分钟的演讲里,她提到了三次「机器学习不是人工智能,尽管他们在某种程度上很接近。」


同样,记者所想要的答案也并非是这些学者能够回答。当来自经济学人的记者提出「你能说服我深度学习是否能真正改变社会和经济「的问题时,台上的学者面面相觑,Guyon 甚至尴尬地笑着说「你能再问一个更好的问题吗」。显然,他们的任务是研究机器学习在某一个特定问题上如何取得更好的效果,而不是来研究这些技术到底会对社会产生怎么样的经济影响。


这种信息不对称,造成了答非所问,造成了记者和学者之间的交锋。记者希望获得直接明了的答案,而往往用尽数十年来证明某个算法是否有效的学者们最忌讳给出简单的答案。

NIPS 似乎还没有做好迎接媒体进入大会的准备。


敞开大门的 NIPS,有利有弊


而在今年大会上,另一个令人关心的问题是:包括 Facebook、Amazon、Intel、Nvidia,以及来自中国的百度、腾讯、阿里巴巴都入驻 NIPS 大会,不少非学术圈的人也来到了 NIPS,这极大地改变了 NIPS 设立的初衷。学者们对此是怎么看的?NIPS 委员会又该如何平衡商业化操作和学术会议的环境。


四年前在美国内华达 Lake Tahoe 举办的 NIPS 大会不过 2000 人,而今年已经涨到了 8000 多人。根据 NIPS 委员会的计算,按照这个趋势,到了 2035 年,参加 NIPS 大会的人会超过世界的总人口。不少学者都或多或少地「抱怨」,看 poster(论文海报)的大厅人山人海,入选 NIPS 的 679 篇论文哪里扫的过来。



Dynamic Routing Between Capsules 的论文海报前,人满为患。


对不少年轻的学者来说,这是一件好事。参加发布会的、来自纽约大学的助理教授 Joshua Loftus 就直言,他很喜欢工业界的人愿意关心他的工作,这让他的论文可以有更大的影响力。

「我们和那些真正部署应用的公司进行交流,让他们能够用我们的技术做出一些工具,解决工业的问题。」


同样,Gugyon 也很欣喜地看到工业界对如今生物学、认知科学和机器学习的热情。人工智能在历史上经历过两次大的起伏,而 Gugyon 经历过 80 年代人工智能的热潮和 90 年代无人问津的惨况,这让她特别珍惜工业界所带来的机会。


但 Recht 持保守意见。「我对这些公司的权力感到震惊,其中一些公司塑造或主导了辩论。我感到惊讶的是他们觉得他们只是想在某种意义上购买学术人才,以此减少学术界的影响,我认为这是非常目光短浅。同时,他们似乎不关心他们早期部署的机器学习技术会带来什么后果。我很担心这些在公共场合宣传的人工智能会转移机器学习领域的科学家们真正需要解决的问题。」


Recht 很在意机器学习的方法是不是真的能够解决问题而不是误导一些研究方向。今年,他的一篇论文《The Marginal Value of Adaptive Gradient Methods in Machine Learning》被 NIPS 收录,这篇论文研究了在训练深度神经网络中非常流行的自适应优化方法(adaptive optimization methods),在比较了几种最先进的深度学习模型中自适应方法的经验泛化能力。他发现,自适应方法找到的解决方案普遍比 SGD 更差(通常明显更差),即使这些解决方案具有更好的培训效果。


NIPS 大会正在做出改变,这个位于象牙塔的学术会议正在一步步打开它的大门,让更多非学术圈的人士接触最前沿的科研进展。这种转变势必带来一些曲折,比如这场记者发布会。学者们害怕这场 NIPS 大会也成为了媒体笔下的又一个通往通用人工智能的大会。


发布会结束后,机器之心记者有幸和一旁的来自 MIT Technology Review 的 Will Knight 聊了两句。「有趣的是这里的人似乎不知道人工智能究竟带来了怎么样的增长,而在中国,没有人觉得人工智能是个伪命题。」


常年在中国报道人工智能相关故事 Knight 见证了中国人工智能力量的发展,就在今年,他撰写了一篇China's AI Awakening 中国人工智能的崛起 。相比特朗普政府在美国科技圈的无作为,甚至是对移民和签证的更加严苛,中国政府的大力支持让他非常惊讶和好奇。


「也许这(这场记者发布会)是一个非常独特的西方玩意儿。」Knight 开玩笑地说。


]]> 原文: http://ift.tt/2jWT0E4
RSS Feed

机器知心

IFTTT

LangChain 彻底重写:从开源副业到独角兽,一次“核心迁移”干到 12.5 亿估值 -InfoQ 每周精要No.899期

「每周精要」 NO. 899 2025/10/25 头条 HEADLINE LangChain 彻底重写:从开源副业到独角兽,一次"核心迁移"干到 12.5 亿估值 精选 SELECTED 1000 行代码手搓 OpenAI gpt-oss 推理引...