2017年10月5日星期四

面对三星的「反叛」与亚马逊的「围剿」,谷歌正赌上全部自尊心来做硬件

撰文 | 宇多田


你可能会认为,统治着搜索与电子邮箱市场,经营着全球最大的广告业务,创建了 Chrome,收购了 Youtube,售卖着 Google Home,外加正在紧锣密鼓推进自己的云计算服务,这些已经足够让 Google 忙活起来。


然而就在上个月,Google 再次用一场收购来告诉你,这帮喜欢在山景城埋头搞技术的工程师们,真的下决心要闯荡智能手机市场了。


很显然,这是一个足够成熟的市场。若干年来,无数大小厂商都试图在这个市场中杀出一条血路,但现实就是,除了三星与苹果,很少有人能在这个市场赚到大钱。特别是对于国内厂商,「营收虽多,但毛利很低」,已经成为了一种默认的事实。



然而,从 2016 年 10 月 Google 在硬件大会上推出「亲儿子」Pixel 开始,这家从来都是以技术征服世界的科技巨头,就开启了自己撸起袖子一通到底的「变硬之路」。


因此,在今年 4 月向 LG 投资 1 万亿韩元来提升 OLED 屏产能,8 月推出增强现实开发者平台 ARcore,9 月全面收购 HTC 手机业务,就显得水到渠成了。


甚至就在明天(美国时间 10 月 4 日),在Google今年最重要的一场大会上,这家用软件征服了世界的科技公司,将推出从设计到出厂,完全亲力亲为的第二代智能手机 Pixel2 与 Pixel2 XL。


与此同时,还会有一款基于 Chome OS 系统的新型笔记本电脑 Pixelbook,一个迷你版的 Google Home 与一副基于 Daydream VR 平台的可穿戴设备问世。与 1 年前一样,依旧是 Google 诚意满满的「五大件」。


因此话又说会来,到底是因为什么,让 2015 年拆分后一股脑把硬件板块都甩给「Other Bets」(Google 2015 年 8 重组后建立母公司 Alphabet,并将业务拆分成两个部分,一个是 Google,一个是 Other Bets)的 Google,开始从智能音箱 Google Home 开始,一件一件把硬件业务又重新「拣」了回来?


从内而外,一定要自己做软硬件


如果说 Google Home 证明了 Google 做硬件的能力(仅次于亚马逊 Echo 的美国市场销量),那么成型于 2015 年之前的 Nexus 系列,Chromebooks(平板),Chromecast(电视棒)与 Google OnHub(路由器)则证明 Google 有着做硬件的丰富经验。


这些硬件虽然由不同的团队打造,但所有团队都隶属于 Google 的先进技术与产品部门 ATAP。


此外,这些产品其实都有一个共同的目标:自己的诞生不是为了赢得市场,而是要向开发者与用户证明——「瞧瞧,只要运行在正确的硬件上,你应该能知道我们的软件是多么优秀」。


因此,它们被标注为在小范围内传播的「限定产品」,很难引领市场级的「围观」与创新。


不过,从推出 Google Home 开始,Google 似乎已经被某些东西给触动了。某种意义上,进入 2016 年,这家以技术闻名全球的公司终于坚定了将命运掌握在自己手中的决心:


一定做硬件,而且从内到外,从软到硬,都必须是自己亲手来做


这就如同 2016 年 10 月 4 日 Google 硬件主管 Rick Osterloh 在讲台上,一边展示手里的那部 Pixel,一边反复向台下观众强调的内容一样:


「这个项目都是我们自己在进行库存管理,与运营商建立合作关系,亲自采购组件;同时也在处理分销商及供应链的相关事宜。我们甚至还在制造手机配件,包括充电器与连接线等。」


Google 硬件部门主管 Rick Osterloh


Osterloh 认为,做硬件是个难度极高且赚不了什么钱的活计,但却依然是一项 Google 非常重要的业务。在 Google 自己的大楼里开发硬件,除了给自己一个超越所有安卓合作伙伴的机会。更重要的是,这项业务给了 Google 一个在不确定的时间里掌控自己命运的机会。


在 Google 看来,移动时代并没有过去,当下呈现出的其实是一种 AI、AR 等新技术与手机相互融合,互相作用的多维度并存的新形势。而市场调研机构 GlobalData 的设备与平台分析师 Avi Greengart 认为,在这种情形下,Google 更希望由一款完全由自己掌控的高水平大众性硬件把自己所有技术优势都展现出来。


「无论是 Google Assistant(语音助手),还是 Tango(AR 平台)和 Daydream(VR 平台),你会发现这些还不错的软件触及用户的渠道都非常窄。」


三星的「反叛」与亚马逊的「围剿」


实际上,在 Google 发布第一代 Pixel 以来,几乎所有人都将 Google 这一系列动作理解为「对标苹果」,想在高端手机市场与后者一争高下。的确,除了 Pixel 的定价几乎向 iPhone 看齐以外,苹果也的确让 Google 认识到,硬件才是与客户最重要的接触点。


但是,在移动与 AI 共同主导的时代里,我们忽略了让 Google 明显感受到威胁的另外两家公司:三星与亚马逊。


没错,过去借助于安卓的力量,Google 在手机市场已经变得无处不在。但取得这项成就的前提中有不可忽视的一个事实:


谷歌用安卓系统打开市场,离不开其他硬件厂商的支持。特别是三星电子,对安卓迅速占领市场提供了巨大的帮助。


「Google 需要三星,它也很喜欢三星,但是作为一个平台驱动者,它不想完全依赖三星。」Greengart 这样认为。



著名商业媒体 Wired 把三星比作是 Google 的"一场危险游戏」。一方面,三星的 Galaxy 系列手机已经成为迄今为止最受欢迎的安卓产品;而另一方面,你可以在近两年感受到三星正在试图逐渐拉远与 Google 的距离:

  • 开发出语音助手 Bixby 作为自己硬件的首要基础配置,与 Google Assistant 直接展开正面竞争
  • 三星也创建了自己的电子邮件客户端、浏览器与短信 app
  • 三星的 VR 头盔 Gear VR 在移动 VR 领域占据绝对地位,也聪明地避开了 Google 的 VR 平台 Daydream;而后者虽然面向众多安卓手机厂商开放,却唯独需要与三星合作定制一款支持 Daydream 的手机
  • 2014 年三星收购智能家居平台 Smartthings 以后,就开始建立自己的家居生态,与 Alphabet 旗下的智能家居品牌 Nest 以及其他基于安卓的智能家居产品展开了正面竞争。
  • 从 2016 年开始,三星就开始在多个自家的可穿戴设备中尝试嵌入完全由自己开发的操作系统 Tizen,试图摆脱安卓的控制。

很明显,除了 Play Store 中不可复制的海量 app,以上动作都可以证明三星几乎完全不需要安卓了。


其实 Google 并不是没有针对这种趋势采取积极策略。在安卓壮大以后,Google 选择不断地与 HTC 与 LG 建立更加紧密的联系,与他们共同建立「安卓智能机」的雏形,共同开发语音助手,试图为三星培养更多的竞争对手。


然而,这套策略似乎最后没发挥什么作用——Google 多年来努力尝试利用 Nexus 系统来激励和说服其他厂商制造更加优质、纯粹而且强大的安卓手机,但最后却发现,人人都喜欢买 Galaxies。



而这仅仅是来自安卓内部的「瓦解趋势」,就像刚才所说的,在 AI 时代中,还有一些正在蔓延的东西一定会削弱安卓的力量。譬如像 Alexa 语音开发平台这样的存在,就被彭博社喻为「正在对 Google 构成生死存亡的威胁」。


凭借着较为超前的战略布局, 尤其是与安卓相似的开源策略, 亚马逊 Alexa 已经建立了接入上万种技能的生态系统,形成了一个潜力巨大的系统入口。不仅如此,它还给Alexa制作了一个不错的外壳——Echo。


想想哪一天,你可以直接通过「命令 Alexa」来查 Google 地图或者是其他地图app;你也可以通过 Alexa 直接听 Spotify 的歌,隔离了Google Play的生态……以上这些需求可能只需要你买一个 Echo 或 Echo Show 就能实现。对于 Google 来说,这可能会意味着什么?


你会慢慢不再使用 Google 的一些东西,逐渐忘记它,甚至连你自己都没有意识到。


而「被大众遗忘」,往往是一家公司衰落的开始。这也就能解释,为何前几天在毫无预警之下,Google 就「拔掉」了亚马逊 Echo Show 的 YouTube 服务接口。



因此,这就是不做硬件的危险。而这个危险,Google 看到了,国内的阿里看到了,越来越多的巨头正在意识到,在 AI 时代中,自己做硬件的重要性。


看看苹果,在过去十年中,这家公司把「垂直整合」的理念发挥到了极致。除了设计与组装自己的手机,CPU 与 GPU 等关键部件以及数据中心运用、iTunes 及 App Store 等服务平台,都由苹果自己把关。


Fast Company 认为,在嵌入了自己研发的 A11 仿生芯片后,最新款的苹果手机已经成为市场上最强大的智能手机。换句话说,在其他厂商在性能指标上逐渐趋同,让「一个好手机」的定义逐渐大众化的时候,苹果再一次跃升至一个完全不同的水平线上。同样这也能说明,为何苹果的 AR 程序能在手机上运行地如此之好的原因。


更重要的是,随着 AI 逐渐找到更多的落地场景,新一阶段的技术逐步进入市场,这种对硬件力量的把控就变得愈加重要。这就如同通用在上个月推出自己首款可量产的无人驾驶汽车时,其负责人对他们造车遭遇的新挑战有这样一番理解:


「汽车由上千个部件组成,本身就是一件极其复杂的产品。但是加入了这么多新技术,你会发现汽车的电池以及各种零部件,与传感器以及新的技术模块需要重新磨合,一切都不一样了。这需要我们做更多十分具体而复杂的组装工作。」


而推出了软件与硬件完全由阿里一手打造的智能音箱"天猫精灵"后,其人工智能实验室也曾向机器之能陈述过一个相似的观点:


「这不仅仅是一个生态和入口,而是我们想知道在做硬件过程中,开发者究竟需要 AI 提供什么,消费者究竟需要 AI 提供什么。你不亲自上手做一做,你永远不知道市场需要什么样的 AI 产品。」


即便是 Google,「做硬件」也有不可预料的风险


当然,「兴奋地宣布我是一家硬件公司」与「能够成为一家成功的硬件公司」是两种截然不同的事情。


这就像 HTC 近几年来跌宕起伏的命运一样,「用功」做了 10 年手机,却因为一些针对运营商渠道的排他性决策与糟糕的营销计划等因素而迅速陨落。


诚然,Pixel 是一款很棒的手机,也是一款让 Google 技术粉充满期待的作品。但从目前来看,它还没有任何席卷全球的迹象。


实际上,在去年信心满满地推出以 Pixel 为核心的「五大件」后,硬件主管 Rick Osterloh 在接受采访时说了这样一段话:

「我十分期待消费者对 Google 新款智能手机 Pixel 的持有量能达到 iPhone7 的高度。」


但 3 个月过去后,Pixel 的销售额却遭到当地媒体今日美国的披露:在 2016 年第四季度里,Pixel 的销量其实还不到 56 万部。而对比 Pixel,苹果在同一个季度中售出的 7800 万部手机着实给了 Pixel 一些教训。


截止目前,Google 也从来没有公布过确切的销量,但有分析师根据 Google Play 中的「Pixel Launcher」(仅Pixel 和 Pixel XL 两部手机才能下载 Pixel Launcher)下载量,估算出Pixel 的销量可能仅有 100 多万部;也有其他分析师得出「销量应该在 300~500 万之间」这个结论。


但无论是哪个数字,Greengart 都认为 Pixel 目前的表现肯定还没有在高端手机市场上取得一席之地:


「在中国,它可能根本玩不转儿。我还看不到华为、小米或者是 Oppo 在因为 Pixel 的出现而担忧,而苹果和三星也没有什么反应。」



The Verge 在分析 Pixel 销售预冷的原因时,曾重点提到了 Google 与运营商的糟糕关系。在美国运营商中,只有 Verizon 一家支持谷歌,而这就是 Google 在铺设销售渠道中遇到的最大问题。


需要注意的是,在美国智能手机市场,掌握话语权的并不是手机厂商,而是四大通信运营商,如果得不到他们的支持,那么无论如何都不可能在美国市场获得成功。其实这也是为何华为等国产手机一直打不通美国市场的重要原因。


除了这个原因,也有分析师认为 Google 面临的另一个问题是供货管理。由于经常出现缺货现象,而网友也时常在网上抱怨根本订不到 Pixel,因此 Google 可能并没有把真实的市场需求转化为实际销量。


但无论如何,Google 必须要尝试,而且已经在赌上了自己的一切自尊心来做这样一款硬件。历史告诉我们,最好的产品一定来自于「软件与硬件两手抓」的公司,而一方的优化与完善一定会优化和改进另一方的工作。


Wired 认为,随着我们进入技术的另一个阶段,随着智能手机逐渐为智能音箱、智能电灯泡以及无人驾驶汽车让路,已经没有什么多余空间可以承载庞大且运作低效的软件,而赢家一定是那些聚焦于「如何做好每一件事」的公司:硬件、软件、市场以及所有的一切。


「苹果把自己『钉』在了手机上,然后成为了世界上最有钱的公司;而下一个机会,正在赶来的路上。」



是对还是错,是聪明还是愚蠢,无论如何,Google 现在都是一家标准的硬件公司了。


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

机器知心

IFTTT

还在担心自己的岗位会被 AI 取代吗?Gartner 说你可能有新的机会

来源 | Forbes

作者 | Louis Columbus

编译 | 不定项


IT 调研与咨询服务公司 Gartner 每年都会举办技术峰会 Symposium/ITxpo,与会的行业管理人员在数百场分会场中分享对于 IT 未来的预测和看法,会议中的判断和总结可以说是行业的「风向标」。



今年的 Symposium/ITxpo 2017 会议上,Gartner 对未来几年的 IT 发展做出了十点预测。这些预测,以及支撑预测的假设和论证,都表明首席信息官(CIO)首先应当是商业布局的专家,然而才是技术专家。从明年起,行业的管理者将比以往任何时候都要注重利用新兴的科学技术,创造利润以及新的商业模式。


以下是 Gartner 对未来几年 IT 行业趋势做出的 10 点预测:


1.提前在网站等入口布局图像搜索、语音搜索的公司,其数字商业的营收到 2021 年将增长 30%。Gartner 发现,在移动端的搜索类型中,语音搜索的增幅最大。在未来几年,语音和视觉搜索还将加大移动端的交易量。对于许多大型电商来说,目前移动端的交易量已达到了总量的 50%,新的技术将加速这场变革。苹果、Facebook、谷歌和微软在人工智能和机器学习领域的布局,是未来两年语音和图像技术快速发展的证据。


2.到 2020 年,在包括阿里巴巴、亚马逊、苹果、百度、脸书、谷歌、微软和腾讯在内的科技巨头中,将有五家企业执着于寻找新的变革点,成为下一轮创新浪潮的领导地位。这种变革的例子,包括亚马逊 AWS Lambda 对传统云计算虚拟机的替代,语音助手 Alexa 对基于屏幕的电子商务的颠覆,苹果的 Face ID 对 Touch ID 的变革。


3.到 2020 年,随着基于区块链的加密数字货币普遍使用,银行业将新增 10 亿美元的价值。Gartner 估计,截至 2017 年 10 月,在全世界流通的加密数字货币总值为 1550 亿美元,随着虚拟货币数量的增长以及市场兴趣的提升,这一价值将持续增长。根据 Gartner 的预测研究,到 2023 年年底,加密货币将占到全球区块链价值的一半以上。


4.到 2022 年,成熟经济体中的大多数人面临的虚假信息将比真实信息多。Gartner 警告说,尽管人工智能非常高效地创造新的信息,但它同样可以生产大量的虚假信息。Gartne 预测,在 2020 年之前,将会发生一场由虚假信息造成的重大金融欺诈事件,同时将没有任何一家互联网公司能够成功地解决这个问题。再过三年,将有一个主导的国家通过新的监管政策或者法律,遏制 AI 产生的虚假信息的传播。


5.到 2020 年,自动化的检测手段,将无法大规模地有效识别基于人工智能的虚假内容,这将引发一轮数字信息的信任危机。如今,人工智能和机器学习系统能够比人类更快、更准确地对图像内容进行分类。Gartner 警告称,到 2018 年,当假视频被误以为真的时,会引发一系列的政治辩论。根据预测研究,在明年,检测虚假新闻的商业项目将增加十倍以上。


6.到 2021 年,超过 50% 的企业每年在机器人和聊天机器人上的投入将超过传统的移动应用。Gartner 预测,到 2020 年,55% 的大型企业将会部署至少一款机器人或者聊天机器人。得益于自然语言处理技术的快速发展,如今的聊天机器人比前几代更善于识别用户的意图。根据 Gartner 的预测研究,自然语言处理技术将被用于决定聊天机器人决策树的起点,但其余部分的决策树中,仍将使用脚本化的响应。


7.到 2021 年,40% 的 IT 员工将会拥有多项技能,就任多个岗位,其中大部分是与商业有关的业务,而不是与技术相关的。到 2029 年,IT 技术专家的招聘人数将减少 5%。Gartner 预测,50% 的企业会将多技能岗位的描述规范化,20% 的 IT 企业将雇佣多技能人才,扩大数字商业的业务量。总体而言,IT 技术专业人才量将减少到只有 2017 年的 75%。


8.到 2020 年,人工智能会促进人们的就业,虽然它将减少 180 万个工作岗位,但会创造 230 万个新的工作岗位。到 2020 年,与人工智能相关的就业机会将大幅增,这一数字将在 2025 年达到 200 万。2018 年,全球 IT 服务公司将进行大规模职业转型,新增 10 万个工作岗位,同时裁剪 8 万人。Gartner 预测,到 2021 年,人工智能将创造 2.9 万亿美元的商业价值。


9.到 2020 年,物联网技术将被应用到 95% 的新产品设计中。Gartner 预计,支持智能手机激活的物联网设备将在 2019 年初问世。


10.到 2022 年,物联网安全预算的一半将用于故障修复及召回等。Gartner 预测,随着安全模式的升级,物联网支出的复合年均增长率将达到 50%。与此同时,物联网安全市场将呈指数级增长,到 2020 年该领域的全球消费将超过 50 亿美元。




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

机器知心

IFTTT

谷歌开发者机器学习词汇表:纵览机器学习基本词汇与概念

选自Google Developers

机器之心编译

机器之心曾开放过人工智能术语集 ,该术语库项目目前收集了人工智能领域 700 多个专业术语,但仍需要与各位读者共同完善与修正。本文编译自谷歌开发者机器学习术语表项目,介绍了该项目所有的术语与基本解释。之后,我们也将表内术语更新到了机器之心 GitHub 项目中。本文由浙江大学博士生杨海宏推荐,他的研究方向为知识图谱问答。

机器之心人工智能术语项目:http://ift.tt/2sVnduo



A

准确率(accuracy)

分类模型预测准确的比例。在多类别分类中,准确率定义如下:

在二分类中,准确率定义为:

激活函数(Activation function)

一种函数(例如 ReLU 或 Sigmoid),将前一层所有神经元激活值的加权和输入到一个非线性函数中,然后向下一层传递该函数的输出值(典型的非线性)。

AdaGrad

一种复杂的梯度下降算法,重新调节每个参数的梯度,高效地给每个参数一个单独的学习率。详见论文:http://ift.tt/2y0F5oE

AUC(曲线下面积)

一种考虑到所有可能的分类阈值的评估标准。ROC 曲线下面积代表分类器随机预测真正类(Ture Positives)要比假正类(False Positives)概率大的确信度。



B

反向传播(Backpropagation)

神经网络中完成梯度下降的重要算法。首先,在前向传播的过程中计算每个节点的输出值。然后,在反向传播的过程中计算与每个参数对应的误差的偏导数。

基线(Baseline)

被用为对比模型表现参考点的简单模型。基线帮助模型开发者量化模型在特定问题上的预期表现。

批量

模型训练中一个迭代(指一次梯度更新)使用的样本集。

批量大小(batch size)

一个批量中样本的数量。例如,SGD 的批量大小为 1,而 mini-batch 的批量大小通常在 10-1000 之间。批量大小通常在训练与推理的过程中确定,然而 TensorFlow 不允许动态批量大小。

偏置(bias)

与原点的截距或偏移量。偏置(也称偏置项)被称为机器学习模型中的 b 或者 w0。例如,偏置项是以下公式中的 b:y′=b+w_1x_1+w_2x_2+…w_nx_n。

注意不要和预测偏差混淆。

二元分类器(binary classification)

一类分类任务,输出两个互斥(不相交)类别中的一个。例如,一个评估邮件信息并输出「垃圾邮件」或「非垃圾邮件」的机器学习模型就是一个二元分类器。

binning/bucketing

根据值的范围将一个连续特征转换成多个称为 buckets 或者 bins 二元特征,称为 buckets 或者 bins。例如,将温度表示为单一的浮点特征,可以将温度范围切割为几个离散的 bins。假如给定的温度的敏感度为十分之一度,那么分布在 0.0 度和 15.0 度之间的温度可以放入一个 bin 中,15.1 度到 30.0 度放入第二个 bin,30.1 度到 45.0 度放入第三个 bin。



C

标定层(calibration layer)

一种调整后期预测的结构,通常用于解释预测偏差。调整后的预期和概率必须匹配一个观察标签集的分布。

候选采样(candidate sampling)

一种优化训练时间的,使用 Softmax 等算法计算所有正标签的概率,同时只计算一些随机取样的负标签的概率。例如,有一个样本标记为「小猎兔狗」和「狗」,候选取样将计算预测概率,和与「小猎兔狗」和「狗」类别输出(以及剩余的类别的随机子集,比如「猫」、「棒棒糖」、「栅栏」)相关的损失项。这个想法的思路是,负类别可以通过频率更低的负强化(negative reinforcement)进行学习,而正类别经常能得到适当的正强化,实际观察确实如此。候选取样的动力是计算有效性从所有负类别的非计算预测的得益。

检查点(checkpoint)

在特定的时刻标记模型的变量的状态的数据。检查点允许输出模型的权重,也允许通过多个阶段训练模型。检查点还允许跳过错误继续进行(例如,抢占作业)。注意其自身的图式并不包含于检查点内。

类别(class)

所有同类属性的目标值作为一个标签。例如,在一个检测垃圾邮件的二元分类模型中,这两个类别分别是垃圾邮件和非垃圾邮件。而一个多类别分类模型将区分狗的种类,其中的类别可以是贵宾狗、小猎兔狗、哈巴狗等等。

类别不平衡数据集(class-imbalanced data set)

这是一个二元分类问题,其中两个类别的标签的分布频率有很大的差异。比如,一个疾病数据集中若 0.01% 的样本有正标签,而 99.99% 的样本有负标签,那么这就是一个类别不平衡数据集。但对于一个足球比赛预测器数据集,若其中 51% 的样本标记一队胜利,而 49% 的样本标记其它队伍胜利,那么这就不是一个类别不平衡数据集。

分类模型(classification)

机器学习模型的一种,将数据分离为两个或多个离散类别。例如,一个自然语言处理分类模型可以将一句话归类为法语、西班牙语或意大利语。分类模型与回归模型(regression model)成对比。

分类阈值(classification threshold)

应用于模型的预测分数以分离正类别和负类别的一种标量值标准。当需要将 logistic 回归的结果映射到二元分类模型中时就需要使用分类阈值。例如,考虑一个确定给定邮件为垃圾邮件的概率的 logistic 回归模型,如果分类阈值是 0.9,那么 logistic 回归值在 0.9 以上的被归为垃圾邮件,而在 0.9 以下的被归为非垃圾邮件。

混淆矩阵(confusion matrix)

总结分类模型的预测结果的表现水平(即,标签和模型分类的匹配程度)的 NxN 表格。混淆矩阵的一个轴列出模型预测的标签,另一个轴列出实际的标签。N 表示类别的数量。在一个二元分类模型中,N=2。例如,以下为一个二元分类问题的简单的混淆矩阵:

上述混淆矩阵展示了在 19 个确实为肿瘤的样本中,有 18 个被模型正确的归类(18 个真正),有 1 个被错误的归类为非肿瘤(1 个假负类)。类似的,在 458 个确实为非肿瘤的样本中,有 452 个被模型正确的归类(452 个真负类),有 6 个被错误的归类(6 个假正类)。

多类别分类的混淆矩阵可以帮助发现错误出现的模式。例如,一个混淆矩阵揭示了一个识别手写数字体的模型倾向于将 4 识别为 9,或者将 7 识别为 1。混淆矩阵包含了足够多的信息可以计算很多的模型表现度量,比如精度(precision)和召回(recall)率。

连续特征(continuous feature)

拥有无限个取值点的浮点特征。和离散特征(discrete feature)相反。

收敛(convergence)

训练过程达到的某种状态,其中训练损失和验证损失在经过了确定的迭代次数后,在每一次迭代中,改变很小或完全不变。换句话说就是,当对当前数据继续训练而无法再提升模型的表现水平的时候,就称模型已经收敛。在深度学习中,损失值下降之前,有时候经过多次迭代仍保持常量或者接近常量,会造成模型已经收敛的错觉。

凸函数(concex function)

一种形状大致呈字母 U 形或碗形的函数。然而,在退化情形中,凸函数的形状就像一条线。例如,以下几个函数都是凸函数:

  • L2 损失函数
  • Log 损失函数
  • L1 正则化函数
  • L2 正则化函数

凸函数是很常用的损失函数。因为当一个函数有最小值的时候(通常就是这样),梯度下降的各种变化都能保证找到接近函数最小值的点。类似的,随机梯度下降的各种变化有很大的概率(虽然无法保证)找到接近函数最小值的点。

两个凸函数相加(比如,L2 损失函数+L1 正则化函数)后仍然是凸函数。

深度模型通常是非凸的。出乎意料的是,以凸优化的形式设计的算法通常都能在深度网络上工作的很好,虽然很少能找到最小值。

成本(cost)

loss 的同义词。

交叉熵(cross-entropy)

多类别分类问题中对 Log 损失函数的推广。交叉熵量化两个概率分布之间的区别。参见困惑度(perplexity)。



D

数据集(data set)

样本的集合。

决策边界(decision boundary)

在一个二元分类或多类别分类问题中模型学习的类别之间的分离器。例如,下图就展示了一个二元分类问题,决策边界即橙点类和蓝点类的边界。

深度模型(deep model)

一种包含多个隐藏层的神经网络。深度模型依赖于其可训练的非线性性质。和宽度模型对照(wide model)。

密集特征(dense feature)

大多数取值为非零的一种特征,通常用取浮点值的张量(tensor)表示。和稀疏特征(sparse feature)相反。

派生特征(derived feature)

合成特征(synthetic feature)的同义词。

离散特征(discrete feature)

只有有限个可能取值的一种特征。例如,一个取值只包括动物、蔬菜或矿物的特征就是离散(或类别)特征。和连续特征(continuous feature)对照。

dropout 正则化(dropout regularization)

训练神经网络时一种有用的正则化方法。dropout 正则化的过程是在单次梯度计算中删去一层网络中随机选取的固定数量的单元。删去的单元越多,正则化越强。

动态模型(dynamic model)

以连续更新的方式在线训练的模型。即数据连续不断的输入模型。



E

早期停止法(early stopping)

一种正则化方法,在训练损失完成下降之前停止模型训练过程。当验证数据集(validation data set)的损失开始上升的时候,即泛化表现变差的时候,就该使用早期停止法了。

嵌入(embeddings)

一类表示为连续值特征的明确的特征。嵌入通常指将高维向量转换到低维空间中。例如,将一个英语句子中的单词以以下任何一种方式表示:

  • 拥有百万数量级(高维)的元素的稀疏向量,其中所有的元素都是整数。向量的每一个单元表示一个单独的英语单词,单元中的数字表示该单词在一个句子中出现的次数。由于一个句子中的单词通常不会超过 50 个,向量中几乎所有的单元都是 0。少量的非零的单元将取一个小的整数值(通常为 1)表示句子中一个单词的出现次数。
  • 拥有数百个(低维)元素的密集向量,其中每一个元素取 0 到 1 之间的浮点数。

在 TensorFlow 中,嵌入是通过反向传播损失训练的,正如神经网络的其它参量一样。

经验风险最小化(empirical risk minimization,ERM)

选择能最小化训练数据的损失的模型函数的过程。和结构风险最小化(structual risk minimization)对照。

集成(ensemble)

多个模型预测的综合考虑。可以通过以下一种或几种方法创建一个集成方法:

  • 设置不同的初始化;
  • 设置不同的超参量;
  • 设置不同的总体结构。

深度和广度模型是一种集成。

评估器(Estimator)

 tf.Estimator 类的一个例子,封装 logic 以建立一个 TensorFlow 图并运行一个 TensorFlow session。你可以通过以下方式创建自己的评估器:http://ift.tt/2mVfSaT

样本(example)

一个数据集的一行内容。一个样本包含了一个或多个特征,也可能是一个标签。参见标注样本(labeled example)和无标注样本(unlabeled example)。



F

假负类(false negative,FN)

被模型错误的预测为负类的样本。例如,模型推断一封邮件为非垃圾邮件(负类),但实际上这封邮件是垃圾邮件。

假正类(false positive,FP)

被模型错误的预测为正类的样本。例如,模型推断一封邮件为垃圾邮件(正类),但实际上这封邮件是非垃圾邮件。

假正类率(false positive rate,FP rate)

ROC 曲线(ROC curve)中的 x 轴。FP 率的定义是:假正率=假正类数/(假正类数+真负类数)

特征(feature)

输入变量,用于做出预测。

特征列(feature columns/FeatureColumn)

具有相关性的特征的集合,比如用户可能居住的所有可能的国家的集合。一个样本的一个特征列中可能会有一个或者多个特征。

TensorFlow 中的特征列还可以压缩元数据比如下列情况:

  • 特征的数据类型;
  • 一个特征是固定长度的或应该转换为嵌入。
  • 一个特征列可以仅包含一个特征。「特征列」是谷歌专用的术语。在 VW 系统(Yahoo/Microsoft)中特征列的意义是「命名空间」(namespace),或者场(field)。

特征交叉(feature cross)

将特征进行交叉(乘积或者笛卡尔乘积)运算后得到的合成特征。特征交叉有助于表示非线性关系。

特征工程(feature engineering)

在训练模型的时候,决定哪些特征是有用的,然后将记录文件和其它来源的原始数据转换成上述特征的过程。在 TensorFlow 中特征工程通常意味着将原始记录文件输入 tf.Example 协议缓存中。参见 tf.Transform。特征工程有时候也称为特征提取。

特征集(feature set)

机器学习模型训练的时候使用的特征群。比如,邮政编码,面积要求和物业状况可以组成一个简单的特征集,使模型能预测房价。

特征定义(feature spec)

描述所需的信息从 tf.Example 协议缓存中提取特征数据。因为 tf.Example 协议缓存只是数据的容器,必须明确以下信息:

  • 需要提取的数据(即特征的关键信息)
  • 数据类型(比如,浮点数还是整数)
  • 数据长度(固定的或者变化的)

Estimator API 提供了从一群特征列中生成一个特征定义的工具。

完全 softmax(full softmax)

参见 softmax。和候选采样对照。



G

泛化(generalization)

指模型利用新的没见过的数据而不是用于训练的数据作出正确的预测的能力。

广义线性模型(generalized linear model)

最小二乘回归模型的推广/泛化,基于高斯噪声,相对于其它类型的模型(基于其它类型的噪声,比如泊松噪声,或类别噪声)。广义线性模型的例子包括:

  • logistic 回归
  • 多分类回归
  • 最小二乘回归

广义线性模型的参数可以通过凸优化得到,它具有以下性质:

  • 最理想的最小二乘回归模型的平均预测结果等于训练数据的平均标签。
  • 最理想的 logistic 回归模型的平均概率的预测结果等于训练数据的平均标签。

广义线性模型的能力局限于其特征的性质。和深度模型不同,一个广义线性模型无法「学习新的特征」。

梯度(gradient)

所有变量的偏导数的向量。在机器学习中,梯度是模型函数的偏导数向量。梯度指向最陡峭的上升路线。

梯度截断(gradient clipping)

在应用梯度之前先修饰数值,梯度截断有助于确保数值稳定性,防止梯度爆炸出现。

梯度下降(gradient descent)

通过计算模型的相关参量和损失函数的梯度最小化损失函数,值取决于训练数据。梯度下降迭代地调整参量,逐渐靠近权重和偏置的最佳组合,从而最小化损失函数。

图(graph)

在 TensorFlow 中的一种计算过程展示。图中的节点表示操作。节点的连线是有指向性的,表示传递一个操作(一个张量)的结果(作为一个操作数)给另一个操作。使用 TensorBoard 能可视化计算图。



H

启发式(heuristic)

一个问题的实际的和非最优的解,但能从学习经验中获得足够多的进步。

隐藏层(hidden layer)

神经网络中位于输入层(即特征)和输出层(即预测)之间的合成层。一个神经网络包含一个或多个隐藏层。

折页损失函数(Hinge loss)

损失函数的一个类型,用于分类模型以寻找距离每个样本的距离最大的决策边界,即最大化样本和边界之间的边缘。KSVMs 使用 hinge 损失函数(或相关的函数,比如平方 hinge 函数)。在二元分类中,hinge 损失函数按以下方式定义:

loss=max(0,1−(y′∗y))

其中 y'是分类器模型的列输出:

y′=b+w_1x_1+w_2x_2+…w_nx_n

y 是真实的标签,-1 或+1。

因此,hinge 损失将是下图所示的样子:

测试数据(holdout data)

有意不用于训练的样本。验证数据集(validation data set)和测试数据集(test data set)是测试数据(holdout data)的两个例子。测试数据帮助评估模型泛化到除了训练数据之外的数据的能力。测试集的损失比训练集的损失提供了对未知数据集的损失更好的估计。

超参数(hyperparameter)

连续训练模型的过程中可以拧动的「旋钮」。例如,相对于模型自动更新的参数,学习率(learning rate)是一个超参数。和参量对照。



I

独立同分布(independently and identically distributed,i.i.d)

从不会改变的分布中获取的数据,且获取的每个值不依赖于之前获取的值。i.i.d. 是机器学习的理想情况——一种有用但在现实世界中几乎找不到的数学构建。例如,网页访客的分布可能是短暂时间窗口上的 i.i.d;即分布不会在该时间窗口发生改变,每个人的访问都与其他人的访问独立。但是,如果你扩展了时间窗口,则会出现网页访客的季节性差异。

推断(inference)

在机器学习中,通常指将训练模型应用到无标注样本来进行预测的过程。在统计学中,推断指在观察到的数据的基础上拟合分布参数的过程。

输入层(input layer)

神经网络的第一层(接收输入数据)。

评分者间一致性(inter-rater agreement)

用来衡量一项任务中人类评分者意见一致的指标。如果意见不一致,则任务说明可能需要改进。有时也叫标注者间信度(inter-annotator agreement)或评分者间信度(inter-rater reliability)。



K

Kernel 支持向量机(Kernel Support Vector Machines/KSVM)

一种分类算法,旨在通过将输入数据向量映射到更高维度的空间使正类和负类之间的边际最大化。例如,考虑一个输入数据集包含一百个特征的分类问题。为了使正类和负类之间的间隔最大化,KSVM 从内部将特征映射到百万维度的空间。KSVM 使用的损失函数叫作 hinge 损失。



L

L1 损失函数(L1 loss)

损失函数基于模型对标签的预测值和真实值的差的绝对值而定义。L1 损失函数比起 L2 损失函数对异常值的敏感度更小。

L1 正则化(L1 regularization)

一种正则化,按照权重绝对值总和的比例进行惩罚。在依赖稀疏特征的模型中,L1 正则化帮助促使(几乎)不相关的特征的权重趋近于 0,从而从模型中移除这些特征。

L2 损失(L2 loss)

参见平方损失。

L2 正则化(L2 regularization)

一种正则化,按照权重平方的总和的比例进行惩罚。L2 正则化帮助促使异常值权重更接近 0 而不趋近于 0。(可与 L1 正则化对照阅读。)L2 正则化通常改善线性模型的泛化效果。

标签(label)

在监督式学习中,样本的「答案」或「结果」。标注数据集中的每个样本包含一或多个特征和一个标签。比如,在房屋数据集中,特征可能包括卧室数量、卫生间数量、房龄,而标签可能就是房子的价格。在垃圾邮件检测数据集中,特征可能包括主题、发出者何邮件本身,而标签可能是「垃圾邮件」或「非垃圾邮件」。

标注样本(labeled example)

包含特征和标签的样本。在监督式训练中,模型从标注样本中进行学习。

lambda

正则化率的同义词。(该术语有多种含义。这里,我们主要关注正则化中的定义。)

层(layer)

神经网络中的神经元序列,可以处理输入特征序列或神经元的输出。

它也是 TensorFlow 的一种抽象化概念。层是将张量和配置选项作为输入、输出其他张量的 Python 函数。一旦必要的张量出现,用户就可以通过模型函数将结果转换成估计器。

学习率(learning rate)

通过梯度下降训练模型时使用的一个标量。每次迭代中,梯度下降算法使学习率乘以梯度,乘积叫作 gradient step。

学习率是一个重要的超参数。

最小二乘回归(least squares regression)

通过 L2 损失最小化进行训练的线性回归模型。

线性回归(linear regression)

对输入特征的线性连接输出连续值的一种回归模型。

logistic 回归(logistic regression)

将 sigmoid 函数应用于线性预测,在分类问题中为每个可能的离散标签值生成概率的模型。尽管 logistic 回归常用于二元分类问题,但它也用于多类别分类问题(这种情况下,logistic 回归叫作「多类别 logistic 回归」或「多项式 回归」。

对数损失函数(Log Loss)

二元 logistic 回归模型中使用的损失函数。

损失

度量模型预测与标签距离的指标,它是度量一个模型有多糟糕的指标。为了确定损失值,模型必须定义损失函数。例如,线性回归模型通常使用均方差作为损失函数,而 logistic 回归模型使用对数损失函数。



M

机器学习(machine learning)

利用输入数据构建(训练)预测模型的项目或系统。该系统使用学习的模型对与训练数据相同分布的新数据进行有用的预测。机器学习还指与这些项目或系统相关的研究领域。

均方误差(Mean Squared Error/MSE)

每个样本的平均平方损失。MSE 可以通过平方损失除以样本数量来计算。TensorFlow Playground 展示「训练损失」和「测试损失」的值是 MSE。

小批量(mini-batch)

在训练或推断的一个迭代中运行的整批样本的一个小的随机选择的子集。小批量的大小通常在 10 到 1000 之间。在小批量数据上计算损失比在全部训练数据上计算损失要高效的多。

小批量随机梯度下降(mini-batch stochastic gradient descent)

使用小批量的梯度下降算法。也就是,小批量随机梯度下降基于训练数据的子集对 梯度进行评估。Vanilla SGD 使用 size 为 1 的小批量。

模型(model)

机器学习系统从训练数据中所学内容的表示。该术语有多个含义,包括以下两个相关含义:

  • TensorFlow 图,显示如何计算预测的结构。
  • TensorFlow 图的特定权重和偏差,由训练决定。

模型训练(model training)

确定最佳模型的过程。

动量(Momentum)

一种复杂的梯度下降算法,其中的学习步不只依赖于当前步的导数,还依赖于先于它的步。动量包括随着时间计算梯度的指数加权移动平均数,类似于物理学中的动量。动量有时可以阻止学习陷于局部最小值。

多类别(multi-class)

在多于两类的类别中进行分类的分类问题。例如,有约 128 种枫树,那么分类枫树品种的模型就是多类别的。反之,把电子邮件分成两个类别(垃圾邮件和非垃圾邮件)的模型是二元分类器模型。



N

NaN trap

训练过程中,如果模型中的一个数字变成了 NaN,则模型中的很多或所有其他数字最终都变成 NaN。NaN 是「Not a Number」的缩写。

负类(negative class)

在二元分类中,一个类别是正类,另外一个是负类。正类就是我们要找的目标,负类是另外一种可能性。例如,医疗测试中的负类可能是「非肿瘤」,电子邮件分类器中的负类可能是「非垃圾邮件」。

神经网络(neural network)

该模型从大脑中获取灵感,由多个层组成(其中至少有一个是隐藏层),每个层包含简单的连接单元或神经元,其后是非线性。

神经元(neuron)

神经网络中的节点,通常输入多个值,生成一个输出值。神经元通过将激活函数(非线性转换)应用到输入值的加权和来计算输出值。

归一化(normalization)

将值的实际区间转化为标准区间的过程,标准区间通常是-1 到+1 或 0 到 1。例如,假设某个特征的自然区间是 800 到 6000。通过减法和分割,你可以把那些值标准化到区间-1 到+1。参见缩放。

numpy

Python 中提供高效数组运算的开源数学库。pandas 基于 numpy 构建。



O

目标(objective)

算法尝试优化的目标函数。

离线推断(offline inference)

生成一组预测并存储,然后按需检索那些预测。可与在线推断对照阅读。

one-hot 编码(one-hot encoding)

一个稀疏向量,其中:

  • 一个元素设置为 1。
  • 所有其他的元素设置为 0。

独热编码常用于表示有有限可能值集合的字符串或标识符。例如,假设一个记录了 15000 个不同品种的植物数据集,每一个用独特的字符串标识符来表示。作为特征工程的一部分,你可能将那些字符串标识符进行独热编码,每个向量的大小为 15000。

一对多(one-vs.-all)

给出一个有 N 个可能解决方案的分类问题,一对多解决方案包括 N 个独立的二元分类器——每个可能的结果都有一个二元分类器。例如,一个模型将样本分为动物、蔬菜或矿物,则一对多的解决方案将提供以下三种独立的二元分类器:

  • 动物和非动物
  • 蔬菜和非蔬菜
  • 矿物和非矿物

在线推断(online inference)

按需生成预测。可与离线推断对照阅读。

运算(Operation/op)

TensorFlow 图中的一个节点。在 TensorFlow 中,任何创建、控制或损坏张量的步骤都是运算。例如,矩阵乘法是一个把两个张量作为输入、生成一个张量作为输出的运算。

优化器(optimizer)

梯度下降算法的特定实现。TensorFlow 的基类优化器是 tf.train.Optimizer。不同的优化器(tf.train.Optimizer 的子类)对应不同的概念,如:

  • 动量(Momentum)
  • 更新频率(AdaGrad = ADAptive GRADient descent;Adam = ADAptive with Momentum;RMSProp)
  • 稀疏性/正则化(Ftrl)
  • 更复杂的数学(Proximal 及其他)

你甚至可以想象 NN-driven optimizer。

异常值(outlier)

与大多数值差别很大的值。在机器学习中,下列都是异常值:

  • 高绝对值的权重。
  • 与实际值差距过大的预测值。
  • 比平均值多大约 3 个标准差的输入数据的值。

异常值往往使模型训练中出现问题。

输出层(output layer)

神经网络的「最后」一层。这一层包含整个·模型所寻求的答案。

过拟合(overfitting)

创建的模型与训练数据非常匹配,以至于模型无法对新数据进行正确的预测。



P

pandas

一种基于列的数据分析 API。很多机器学习框架,包括 TensorFlow,支持 pandas 数据结构作为输入。参见 pandas 文档。

参数(parameter)

机器学习系统自行训练的模型的变量。例如,权重是参数,它的值是机器学习系统通过连续的训练迭代逐渐学习到的。可与超参数对照阅读。

参数服务器(Parameter Server/PS)

用于在分布式设置中跟踪模型参数。

参数更新(parameter update)

在训练过程中调整模型参数的操作,通常在梯度下降的单个迭代中进行。

偏导数(partial derivative)

一个多变量函数的偏导数是它关于其中一个变量的导数,而保持其他变量恒定。例如,f(x, y) 对于 x 的偏导数就是 f(x) 的导数,y 保持恒定。x 的偏导数中只有 x 是变化的,公式中其他的变量都不用变化。

分区策略(partitioning strategy)

在多个参数服务器中分割变量的算法。

性能(performance)

具有多种含义:

  • 在软件工程中的传统含义:软件运行速度有多快/高效?
  • 在机器学习中的含义:模型的准确率如何?即,模型的预测结果有多好?

困惑度(perplexity)

对模型完成任务的程度的一种度量指标。例如,假设你的任务是阅读用户在智能手机上输入的单词的头几个字母,并提供可能的完整单词列表。该任务的困惑度(perplexity,P)是为了列出包含用户实际想输入单词的列表你需要进行的猜测数量。

困惑度和交叉熵的关系如下:

流程(pipeline)

机器学习算法的基础架构。管道包括收集数据、将数据放入训练数据文件中、训练一或多个模型,以及最终输出模型。

正类(positive class)

在二元分类中,有两种类别:正类和负类。正类是我们测试的目标。(不过必须承认,我们同时测试两种结果,但其中一种不是重点。)例如,医疗测试中正类可能是「肿瘤」,电子邮件分类器中的正类可能是「垃圾邮件」。可与负类对照阅读。

精度(precision)

分类模型的一种指标。准确率指模型预测正类时预测正确的频率。即:

预测(prediction)

模型在输入样本后的输出结果。

预测偏差(prediction bias)

揭示预测的平均值与数据集中标签的平均值的差距。

预制评估器(pre-made Estimator)

已经构建好的评估器。TensorFlow 提供多个预制评估器,包括 DNNClassifier、DNNRegressor 和 LinearClassifier。你可以根据指导(http://ift.tt/2gdr7GC

预训练模型(pre-trained model)

已经训练好的模型或模型组件(如嵌入)。有时,你将预训练嵌入馈送至神经网络。其他时候,你的模型自行训练嵌入,而不是依赖于预训练嵌入。

先验信念(prior belief)

训练开始之前你对数据的信念。例如,L2 正则化依赖于权重值很小且正常分布在 0 周围的信念。



Q

队列(queue)

实现队列数据结构的 TensorFlow 操作。通常在输入/输出(I/O)中使用。



R

秩(rank)

机器学习领域中包含多种含义的术语:

  • 张量中的维度数量。比如,标量有 1 个秩,向量有 1 个秩,矩阵有 2 个秩。(注:在这个词汇表中,「秩」的概念和线性代数中「秩」的概念不一样,例如三阶可逆矩阵的秩为 3。)
  • 机器学习问题中类别的序数位置,按从高到低的顺序给类别分类。比如,行为排序系统可以把狗的奖励按从高(牛排)到低(甘蓝)排序。

评分者(rater)

为样本提供标签的人,有时也叫「标注者」。

召回率(recall)

分类模型的一个指标,可以回答这个问题:模型能够准确识别多少正标签?即:

修正线性单元(Rectified Linear Unit/ReLU)

一种具备以下规则的激活函数:

  • 如果输入为负或零,则输出为 0。
  • 如果输入为正,则输出与输入相同。

回归模型(regression model)

一种输出持续值(通常是浮点数)的模型。而分类模型输出的是离散值,如「day lily」或「tiger lily」。

正则化(regularization)

对模型复杂度的惩罚。正则化帮助防止过拟合。正则化包括不同种类:

  • L1 正则化
  • L2 正则化
  • dropout 正则化
  • early stopping(这不是正式的正则化方法,但可以高效限制过拟合)

正则化率(regularization rate)

一种标量级,用 lambda 来表示,指正则函数的相对重要性。从下面这个简化的损失公式可以看出正则化率的作用:

minimize(loss function + λ(regularization function))

提高正则化率能够降低过拟合,但可能会使模型准确率降低。

表征

将数据映射到有用特征的过程。

受试者工作特征曲线(receiver operating characteristic/ROC Curve)

反映在不同的分类阈值上,真正类率和假正类率的比值的曲线。参见 AUC。

根目录(root directory)

指定放置 TensorFlow 检查点文件子目录和多个模型的事件文件的目录。

均方根误差(Root Mean Squared Error/RMSE)

均方误差的平方根。



S

Saver

负责存储模型检查点文件的 TensorFlow 对象。

缩放(scaling)

特征工程中常用的操作,用于控制特征值区间,使之与数据集中其他特征的区间匹配。例如,假设你想使数据集中所有的浮点特征的区间为 0 到 1。给定一个特征区间是 0 到 500,那么你可以通过将每个值除以 500,缩放特征值区间。还可参见正则化。

scikit-learn

一种流行的开源机器学习平台。网址:www.scikit-learn.org

序列模型(sequence model)

输入具有序列依赖性的模型。例如,根据之前观看过的视频序列对下一个视频进行预测。

会话(session)

保持 TensorFlow 程序的状态(如变量)。

Sigmoid 函数(sigmoid function)

把 logistic 或多项式回归输出(对数几率)映射到概率的函数,返回的值在 0 到 1 之间。sigmoid 函数的公式如下:

其中σ在 logistic 回归问题中只是简单的:

在有些神经网络中,sigmoid 函数和激活函数一样。

softmax

为多类别分类模型中每个可能的类提供概率的函数。概率加起来的总和是 1.0。例如,softmax 可能检测到某个图像是一只狗的概率为 0.9,是一只猫的概率为 0.08,是一匹马的概率为 0.02。(也叫作 full softmax)。

稀疏特征(sparse feature)

值主要为 0 或空的特征向量。比如,一个向量的值有 1 个 1,、一百万个 0,则该向量为稀疏向量。再比如,搜索查询中的单词也是稀疏向量:在一种语言中有很多可以用的单词,但给定的查询中只用了其中的一些。

可与稠密特征对照阅读。

平方损失(squared loss)

线性回归中使用的损失函数(也叫作 L2 Loss)。该函数计算模型对标注样本的预测值和标签真正值之间差的平方。在平方之后,该损失函数扩大了不良预测的影响。即,平方损失比 L1 Loss 对异常值(outlier)的反应更加强烈。

静态模型(static model)

离线训练的模型。

稳态(stationarity)

数据集中的一种数据属性,数据分布在一或多个维度中保持不变。通常情况下,维度是时间,意味着具备平稳性的数据不会随着时间发生变化。比如,具备平稳性的数据从 9 月到 12 月不会改变。

步(step)

一个批量中的前向和后向评估。

步长(step size)

学习速率(learning rate)乘以偏导数的值,即梯度下降中的步长。

随机梯度下降(stochastic gradient descent/SGD)

批量大小为 1 的梯度下降算法。也就是说,SGD 依赖于从数据集中随机均匀选择出的一个样本,以评估每一步的梯度。

结构风险最小化(structural risk minimization/SRM)

这种算法平衡两个目标:

  • 构建预测性最强的模型(如最低损失)。
  • 使模型尽量保持简单(如强正则化)。

比如,在训练集上的损失最小化 + 正则化的模型函数就是结构风险最小化算法。更多信息,参见 http://ift.tt/2gdzzpr

摘要(summary)

在 TensorFlow 中,特定步计算的值或值的集合,通常用于跟踪训练过程中的模型指标。

监督式机器学习(supervised machine learning)

利用输入数据及其对应标签来训练模型。监督式机器学习类似学生通过研究问题和对应答案进行学习。在掌握问题和答案之间的映射之后,学生就可以提供同样主题的新问题的答案了。可与非监督机器学习对照阅读。

合成特征(synthetic feature)

不在输入特征中,而是从一个或多个输入特征中派生出的特征。合成特征的类型包括:

  • 特征与自己或其他特征相乘(叫作特征交叉)。
  • 两个特征相除。
  • 将连续的特征放进 range bin 中。

由归一化或缩放单独创建的特征不是合成特征。



T

张量(tensor)

TensorFlow 项目的主要数据结构。张量是 N 维数据结构(N 的值很大),经常是标量、向量或矩阵。张量可以包括整数、浮点或字符串值。

张量处理单元(Tensor Processing Unit,TPU)

优化 TensorFlow 性能的 ASIC(application-specific integrated circuit,专用集成电路)。

张量形状(Tensor shape)

张量的元素数量包含在不同维度中。比如,[5, 10] 张量在一个维度中形状为 5,在另一个维度中形状为 10。

张量大小(Tensor size)

张量包含的标量总数。比如,[5, 10] 张量的大小就是 50。

TensorBoard

展示一个或多个 TensorFlow 项目运行过程中保存的摘要数据的控制面板。

TensorFlow

大型分布式机器学习平台。该术语还指 TensorFlow 堆栈中的基础 API 层,支持数据流图上的通用计算。

尽管 TensorFlow 主要用于机器学习,但是它也适用于要求使用数据流图进行数值运算的非机器学习任务。

TensorFlow Playground

一个可以看到不同超参数对模型(主要是神经网络)训练的影响的平台。前往 http://ift.tt/2y1bNpZ TensorFlow Playground。

TensorFlow Serving

帮助训练模型使之可部署到产品中的平台。

测试集(test set)

数据集的子集。模型经过验证集初步测试之后,使用测试集对模型进行测试。可与训练集和验证集对照阅读。

tf.Example

一种标准 protocol buffer,用于描述机器学习模型训练或推断的输入数据。

训练(training)

确定组成模型的完美参数的流程。

训练集(training set)

数据集子集,用于训练模型。可与验证集和测试集对照阅读。

真负类(true negative,TN)

被模型正确地预测为负类的样本。例如,模型推断某封电子邮件不是垃圾邮件,然后该电邮真的不是垃圾邮件。

真正类(true positive,TP)

被模型正确地预测为正类的样本。例如,模型推断某封电子邮件是垃圾邮件,结果该电邮真的是垃圾邮件。

真正类率(true positive rate,TP rate)

召回率(recall)的同义词。即:

TruePositiveRate=TruePositives/(TruePositives+FalseNegatives)

真正类率是 ROC 曲线的 y 轴。



U

无标签样本(unlabeled example)

包含特征但没有标签的样本。无标签样本是推断的输入。在半监督学习和无监督学习的训练过程中,通常使用无标签样本。

无监督机器学习(unsupervised machine learning)

训练一个模型寻找数据集(通常是无标签数据集)中的模式。

无监督机器学习最常用于将数据分成几组类似的样本。例如,无监督机器学习算法可以根据音乐的各种属性聚类数据。用这种方式收集的数据可以作为其他机器学习算法(如音乐推荐服务)的输入。聚类在难以获取真正标签的情景中非常有用。例如,在反欺诈和反滥用的情景中,聚类可以帮助人类更好地理解数据。

无监督机器学习的另一个例子是主成分分析(principal component analysis,PCA)。如,将 PCA 应用于包含数百万购物车内容的数据集中时,就有可能发现有柠檬的购物车往往也有解酸剂。可与监督式机器学习对照阅读。



V

验证集(validation set)

数据集的一个子集(与训练集不同),可用于调整超参数。可与训练集和测试集对照阅读。



W

权重(weight)

线性模型中的特征系数,或者深度网络中的边缘。线性模型的训练目标是为每个特征确定一个完美的权重。如果权重为 0,则对应的特征对模型而言是无用的。

宽模型(wide model)

线性模型通常具备很多稀疏输入特征。我们称之为「宽」模型,因其具有大量与输出节点直接连接的输入,是一种特殊类型的神经网络。宽模型通常比深度模型更容易调试(debug)和检查。尽管宽模型无法通过隐藏层表达非线性,但它们可以使用特征交叉和 bucketization 等转换用不同方式对非线性建模。可与深度模型对照阅读。

原文链接:http://ift.tt/2y0GPhO



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

机器知心

IFTTT

2017年10月4日星期三

历经一年,DeepMind WaveNet语音合成技术正式产品化

昨日,谷歌发布了一系列新的产品,从音箱到手机,让我们看到了其产品全面 AI 化的趋势。而 DeepMind 一年前宣布的语音合成技术 WaveNet 也正式产品化,融入谷歌助手之中。本文对升级后的 WaveNet 技术做了解读。


就在一年前,谷歌 DeepMind 发布了 WaveNet,这是一种新的深度神经网络,能生成新的声音信号波形,并且比起其它现有技术,其生成的语音拥有更加逼真的音效。当时这个模型还只处于研究雏形阶段,对于消费性产品而言,模型的计算消耗量太大。


经过 12 个月的努力而大大提升了模型运行的速度和质量之后,谷歌 DeepMind 现在已经推出了 WaveNet 的更新版本,可以在所有的平台上生成美式英语和日语的谷歌助手语音。


使用新的 WaveNet 模型可以使谷歌助手生成一系列更加自然逼真的声音。


为什么 WaveNet 的性能如此高效并可以超越现有的最先进技术水平呢?首先需要理解今天的「文本到语音」(text-to-speech,TTS)系统或语音合成(speech synthesis)系统的工作方式。

大部分系统都是基于所谓的连续式 TTS,即使用大型的高质量录音的数据库,收集单个人数小时的声音记录。这些录音将被分成小块然后组合或成串连接以合成完整的所需的发音。但是这些系统生成的语音通常都是不自然的而且很难调整,因为只要出现了一系列变化,比如需要表达新的情绪或语调的情况,就得建立一个新的数据库记录。


为了解决这些问题,有时候会用一种替代模型,称为参量 TTS。这个模型不需要使用一系列规则和语法、嘴唇动作的参量成串连接声音,而引导计算机生成语音。虽然这个方法更加经济,计算速度也更快,但生成的语音不自然。


WaveNet 采取了完全不同的方法。在相关论文中,作者描述了一种深度生成模型,可以从头开始生成单独的信号波形,每次生成一个样本,每秒生成 16000 个样本,并且在单独的声音之间是无缝过渡的。



在原始的 WaveNet 模型上强化的卷积神经网络结构


WaveNet 使用一个卷积神经网络构建,并在大型的语音样本的数据库中训练。在训练过程中,网络将决定语音的潜在结构,比如哪些音调相互依存,以及哪些信号波形是现实的(哪些又不是现实的)。训练后的网络将每一次合成一个语音样本,而每一个样本都和上一个样本的特性相关。最后生成的语音包含自然的语调以及其它的特征比如咂嘴声,其「口音」依赖于用于训练的语音,为从混合数据集中创造任意数量的独特的声音开辟了可能性。正如其它所有的 TTS 系统一样,WaveNet 使用一个文本输入告诉系统在回答问题的时候,应该生成什么词。


从原始模型中生成如此高保真的声音波形需要消耗相当大的计算量,这意味着 WaveNet 虽然有潜力但是还无法在现实世界中应用。不过经过了 12 个月的努力,谷歌已经开发出了能快速生成信号波形的新模型。它还可以大规模运行,并且是在谷歌最新的 TPU 云基础架构上运行的第一个产品。


WaveNet 的研究团队未来将公布新模型的研究细节。最新改进的 WaveNet 模型仍然能生成新的信号波形但是是以原始模型的 1000 倍的速度生成,意味着它只需要 50ms 就可以生成 1 秒的语音。实际上,该模型不只是快,而且保真度很高,可以在一秒内生成 24000 个信号波形的样本。而且每一个样本的分辨率也从 8bit 提高到了 16bit(和光碟一样的分辨率)。


这将使模型在人类听众测试中给出更加自然的听感。例如,最新的 US English voice I,在 1-5 scale 的测试中得到了 4.347 的平均意见分数(mean-opinion-score,MOS),而即使是人类语音也只能得到 4.667 的分数。




新模型同样保留了原始模型的灵活性,可以在训练过程中更好的利用大量的数据。具体来说就是,可以使用多种语音训练网络。从而,即使对于所需输出的语音只有少量的训练数据,仍然可以生成高质量、细致入微的语音。DeepMind 表示这只是 WaveNet 的开始,他们有信心在未来,语音界面的强大功能将对全世界的语言开放。


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

机器知心

IFTTT

NEAT学习:教机器自我编程

本文介绍了一种机器学习方法:通过增强拓扑的进化神经网络(Evolving Neural Networks through Augmenting Topologies,NEAT)。该方法受到进化过程的启发,能够将复杂问题分解,进而解决问题。



在这篇文章中我要阐述一种机器学习方法,叫作「通过增强拓扑的进化神经网络」(Evolving Neural Networks through Augmenting Topologies,NEAT)。


引言


我爱学习。翻开关于我不了解的话题的书或论文,并且尝试着去理解,真是太令人兴奋了。有些人喜欢在闲暇的时候玩一下字谜游戏、数独或者猜谜游戏来活跃思维,而我喜欢阅读论文并且试着实现文中提出的算法。虽然热爱学习,但是我不可能将喜欢的东西全部学完,所以我特别着迷于如何让计算机为我学习,并向我呈现可能最大化我的学习效率的一些有趣的信息。这些有助于将复杂的信息结构化的算法是「专家系统」的一部分。所以这些算法的目标就是「创造」一个我在做决策的时候能够随时向其咨询的「专家」。让我们站在一个比较高的视角看看这个能够帮助创造这些「专家」的模型 NEAT。本文将介绍这一概念。


NEAT 是什么?


NEAT 指「Networks through Augmented Topologies」(通过增强拓扑的进化神经网络),描述了自学习机器的算法概念,这些算法概念受启发于进化过程中的遗传修饰(genetic modification)。


生命本身就是很有魅力的。每当我观察自然界的时候,我都会看到一个存在于所有的生命体中的共同特征,它叫作信息。信息似乎就是繁殖的核心遗传特征。自然界在过去的 37 亿年里能够优化信息,创造很多共存的不同物种。达尔文的「适者生存、不适者淘汰」的理念启迪了我们对物种进化的理解。进化计算机科学家的目标就是构建能够模仿自然进化来解决复杂问题的系统。


描述 NEAT 工作原理的最简单、最容易的方式就是举例。如果你必须设计一个以最佳方式为你玩游戏的专家系统,那么相关的因素会是什么呢?


首先,为「玩家」定义所有允许他们执行的潜在操作是非常重要的。以超级玛丽为例,它能够跳跃、躲闪、向左走、向右走、转动、快跑等等。如果我们将一台机器与这些动作联系起来,并且允许它来执行这些动作,那么它将有能力做这些事。


第二,要给计算机制定一个目标。NEAT 使用一个叫做「适应度评分(Fitness Score)」的变量。适应度评分是一个能够对成功做出奖励的数学函数。在类似《超级玛丽》的游戏中,适应度评分就是玩家朝着终点线不断前进。适应度评分包含很多类似的变量,例如收集的硬币数、击败的敌人数,或者完成游戏所需的时间。


第三,定义进化的规则非常重要。NEAT 允许节点突变、节点之间产生新的连接,以及在新的后代中继承最合适的神经网络。此外,NEAT 确保不同的「物种」可以共存,直至它们为了生成新的、更适合的后代而进行彼此之间的竞争。为了保证适者生存,已经被尝试过的神经网络不会进行重复,而现存的神经网络会进行自我优化,NEAT 为每一个作为历史记录者的基因都添加了一个新的数字。




上图展示了通过添加一个连接和添加一个节点所形成的突变。上面的例子中从 2 到 4 的连接被取消了,另外还建立了一个新的从 3 到 5 的连接。下面的例子中是节点的突变,你可以看到从 2 到 4 的连接被取消了,并且引入了一个新的节点 6,然后生成了从 3 到 6、从 6 到 4 的新连接。



上图展示了进化是如何发生的。parent 1 和 parent 2 在节点和连接上有着相似的结构,但是它们也有区别。机器现在使用二元逻辑来增加或去除节点/连接。基本的决策机制基于同真为真,真假为假,同假为假(true and true is true, true and false is false, false and false is false)-真与真是真,真与假是假,假与假是假-。这种方式能够确保后代的继承信息对适应度评分是有效的,新生后代中会采用新的进化节点和/或连接,已经被取消的父节点仍保持被取消的状态。「匹配的基因是随机遗传的,不相交基因(中间阶段不匹配)和过剩基因(最后阶段不匹配)是从更加适合的 parent 继承的。在这种情况下,假设它们有着相等的适应度评分,那么不相交基因(disjoint gene)和过剩基因(excess gene)也是随机继承的。被取消的基因或许在未来的后代中重新被激活:有一个预置条件就是,如果继承的基因在一个 parent 中被取消,那么这个基因就会被取消。」[Stanley, Miikkulainen, Page 109, NEAT]


现在所有的东西已经差不多清楚了,NEAT 可以通过迭代和进化新的神经网络的方式在游戏中运行,以达到最佳的适应度评分。我特别推荐阅读一下这篇论文(论文摘要见下文),文章写得很棒,只要稍微 google 以下,新手也能够理解。但是如果你要来一个从头开始的课程,那你也可以看一下这个精彩视频:


NEAT 将复杂的问题分割成较小的、能够被优化的问题,来解决复杂问题,这真的很棒。NEAT 智能体可以开发来解决多种不同的子任务,然后联合起来解决更加复杂的问题。使用 NEAT 的一个例子就是新药品的创造:首先列出所有可能被用到的原子;然后,定义一个能够使仿真结果理解奖励系统的适应度函数;最后定义一套进化规则。另一个 NEAT 可以被用来选择生产新药物的制造技术。一旦这两个系统被结合在一起,一个促进成本效率优化的适应度函数就能创造出生产新药物的最佳方法。这在理论上听起来很棒,但是很明显,这在研发中是一个很复杂的问题,需要花费很多功夫。


论文:Evolving Neural Networks through Augmenting Topologies


地址:http://ift.tt/1ecaJ69


摘要:神经进化领域的一个重要问题是如何利用带有权重的进化神经网络拓扑。我们展示了一种方法,即通过增强拓扑的进化神经网络(NeuroEvolu- tion of Augmenting Topologies,NEAT),该方法在有挑战性的基准强化学习任务中的表现优于最好的固定拓扑(fixed-topology)方法。我们认为效率提升原因在于(1)部署一种不同拓扑交叉的方法,(2)使用物种形成(speciation)保护结构化创新,(3)从最小结构渐进增长。我们通过一系列烧蚀研究论证这一观点,这些研究表明每个模块对整个系统以及其他模块都是必需的。结果就是显著加快的学习。NEAT 还对 GA 有很大的贡献,因为它展示了进化既可以优化解决方案,也可以使之复杂化,这使得逐代进化出更加复杂的解决方案成为可能,并且强化了与生物进化的类比。


原文链接:http://ift.tt/2tEkQJ7


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

机器知心

IFTTT

详解Wassertein GAN:使用Keras在MNIST上的实现

在阅读论文 Wassertein GAN 时,我发现理解它最好的办法就是用代码来实现其内容。于是在本文中我将用自己的在 Keras 上的代码来向大家简要介绍一下这篇文章。


何为 GAN?


GAN,亦称为生成对抗网络(Generative Adversarial Network),它是生成模型中的一类——即一种能够通过观察来自特定分布的训练数据,进而尝试对这个分布进行预测的模型。这个模型新获取的样本「看起来」会和最初的训练样本类似。有些生成模型只会去学习训练数据分布的参数,有一些模型则只能从训练数据分布中提取样本,而有一些则可以二者兼顾。


目前,已经存在了很多种类的生成模型:全可见信念网络(Fully Visible Belief Network)、变分自编码器(Variational Autoencoder)、玻尔兹曼机(Boltzmann Machine),生成随机网络(Generative Stochastic Network),像素递归神经网络(PixelRNN)等等。以上的模型都因其所表征或接近的训练数据密度而有所区别。一些模型会去精细的表征训练数据,另一些则会以某种方式去和训练数据进行互动——比如说生成模型。GAN 就是这里所说的后者。大部分生成模型的学习原则都可被概括为「最大化相似度预测」——即让模型的参数能够尽可能地与训练数据相似。


GAN 的工作方式可以看成一个由两部分构成的游戏:生成器(Generator/G)和判别器(Discriminator/D)(一般而言,这两者都由神经网络构成)。生成器随机将一个噪声作为自己的输入,然后尝试去生成一个样本,目的是让判别器无法判断这个样本是来自训练数据还是来自生成器的。在判别器这里,我们让它以监督学习方式来工作,具体而言就是让它观察真实样本和生成器生成的样本,并且同时用标签告诉它这些样本分别来自哪里。在某种意义上,判别器可以代替固定的损失函数,并且尝试学习与训练数据分布相关的模式。


何为 Wasserstein GAN?


就其本质而言,任何生成模型的目标都是让模型(习得地)的分布与真实数据之间的差异达到最小。然而,传统 GAN 中的判别器 D 并不会当模型与真实的分布重叠度不够时去提供足够的信息来估计这个差异度——这导致生成器得不到一个强有力的反馈信息(特别是在训练之初),此外生成器的稳定性也普遍不足。


Wasserstein GAN 在原来的基础之上添加了一些新的方法,让判别器 D 去拟合模型与真实分布之间的 Wasserstein 距离。Wassersterin 距离会大致估计出「调整一个分布去匹配另一个分布还需要多少工作」。此外,其定义的方式十分值得注意,它甚至可以适用于非重叠的分布。


为了让判别器 D 可以有效地拟合 Wasserstein 距离:


  • 其权重必须在紧致空间(compact space)之内。为了达到这个目的,其权重需要在每步训练之后,被调整到-0.01 到+0.01 的闭区间上。然而,论文作者承认,虽然这对于裁剪间距的选择并不是理想且高敏感的(highly sensitive),但是它在实践中却是有效的。更多信息可参见论文 6 到 7 页。
  • 由于判别器被训练到了更好的状态上,所以它可以为生成器提供一个有用的梯度。
  • 判别器顶层需要有线性激活。
  • 它需要一个本质上不会修改判别器输出的价值函数。

K.mean(y_true * y_pred)

以 keras 这段损失函数为例:


  •  这里采用 mean 来适应不同的批大小以及乘积。
  •  预测的值通过乘上 element(可使用的真值)来最大化输出结果(优化器通常会将损失函数的值最小化)。


论文作者表示,与 vanlillaGAN 相比,WGAN 有一下优点:


  • 有意义的损失指标。判别器 D 的损失可以与生成样本(这些样本使得可以更少地监控训练过程)的质量很好地关联起来。
  • 稳定性得到改进。当判别器 D 的训练达到了最佳,它便可以为生成器 G 的训练提供一个有用的损失。这意味着,对判别器 D 和生成器 G 的训练不必在样本数量上保持平衡(相反,在 Vanilla GAN 方法中而这是平衡的)。此外,作者也表示,在实验中,他们的 WGAN 模型没有发生过一次崩溃的情况。


开始编程!


我们会在 Keras 上实现 ACGAN 的 Wasserstein variety。在 ACGAN 这种生成对抗网络中,其判别器 D 不仅可以预测样本的真实与否,同时还可以将其进行归类。


下方代码附有部分解释。


[1] 导入库文件:

import os  import matplotlib.pyplot as plt %matplotlib inline %config InlineBackend.figure_format = 'retina' # enable hi-res output  import numpy as np import tensorflow as tf  import keras.backend as K from keras.datasets import mnist from keras.layers import * from keras.models import * from keras.optimizers import * from keras.initializers import * from keras.callbacks import * from keras.utils.generic_utils import Progbar

[2].Runtime 配置

# random seed RND = 777  # output settings RUN = 'B' OUT_DIR = 'out/' + RUN TENSORBOARD_DIR = '/tensorboard/wgans/' + RUN SAVE_SAMPLE_IMAGES = False  # GPU # to run on GPU = "0"  BATCH_SIZE = 100 ITERATIONS = 20000  # size of the random vector used to initialize G Z_SIZE = 100

[3]生成器 G 每进行一次迭代,判别器 D 都需要进行 D_ITERS 次迭代。


  • 由于在 WGAN 中让判别器质量能够优化这件事更加重要,所以判别器 D 与生成器 G 在训练次数上呈非对称比例。
  • 在论文的 v2 版本中,判别器 D 在生成器 G 每 1000 次迭代的前 25 次都会训练 100 次,此外,判别器也会当生成器每进行了 500 次迭代以后训练 100 次。

D_ITERS = 5

[4]其它准备:

# create output dir if not os.path.isdir(OUT_DIR): os.makedirs(OUT_DIR)  # make only specific GPU to be utilized os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" os.environ["CUDA_VISIBLE_DEVICES"] = GPU  # seed random generator for repeatability np.random.seed(RND)  # force Keras to use last dimension for image channels K.set_image_dim_ordering('tf')

[5]判别器的损失函数:


  • 由于判别器 D 一方面力图在训练数据分布与生成器 G 生成的数据之间习得一个 Wasserstein 距离的拟合,另一方面判别器 D 又是线性激活的,所以这里我们不需要去修改它的输出结果。
  • 由于已经使用了损失函数 Mean,所以我们可以在不同的批大小之间比较输出结果。
  • 预测结果等于真值(true value)与元素的点乘(element-wise multiplication),为了让判别器 D 的输出能够最大化(通常,优化器都力图去让损失函数的值达到最小),真值需要取-1。

def d_loss(y_true, y_pred):     return K.mean(y_true * y_pred)

[6].创建判别器 D


判别器将图像作为输入,然后给出两个输出:

  • 用线性激活来评价生成图像的「虚假度」(最大化以用于生成图像)。
  •  用 softmax 激活来对图像种类进行预测。
  • 由于权重是从标准差为 0.02 的正态分布中初始化出来的,所以最初的剪裁不会去掉所有的权重。


 def create_D():

     # weights are initlaized from normal distribution with below params     weight_init = RandomNormal(mean=0., stddev=0.02)      input_image = Input(shape=(28, 28, 1), name='input_image')      x = Conv2D(         32, (3, 3),         padding='same',         name='conv_1',         kernel_initializer=weight_init)(input_image)     x = LeakyReLU()(x)     x = MaxPool2D(pool_size=2)(x)     x = Dropout(0.3)(x)      x = Conv2D(         64, (3, 3),         padding='same',         name='conv_2',         kernel_initializer=weight_init)(x)     x = MaxPool2D(pool_size=1)(x)     x = LeakyReLU()(x)     x = Dropout(0.3)(x)      x = Conv2D(         128, (3, 3),         padding='same',         name='conv_3',         kernel_initializer=weight_init)(x)     x = MaxPool2D(pool_size=2)(x)     x = LeakyReLU()(x)     x = Dropout(0.3)(x)      x = Conv2D(         256, (3, 3),         padding='same',         name='coonv_4',         kernel_initializer=weight_init)(x)     x = MaxPool2D(pool_size=1)(x)     x = LeakyReLU()(x)     x = Dropout(0.3)(x)      features = Flatten()(x)      output_is_fake = Dense(         1, activation='linear', name='output_is_fake')(features)      output_class = Dense(         10, activation='softmax', name='output_class')(features)      return Model(         inputs=[input_image], outputs=[output_is_fake, output_class], name='D')


[7].创建生成器


生成器有两个输入:


  • 一个尺寸为Z_SIZE的潜在随机变量。
  • 我们希望生成的数字类型(integer o 到 9)。


为了加入这些输入(input),integer 类型会在内部转换成一个1 x DICT_LEN(在本例中DICT_LEN = 10)的稀疏向量,然后乘上嵌入的维度为 DICT_LEN x Z_SIZE的矩阵,结果得到一个维度为1 x Z_SIZE的密集向量。然后该向量乘上(点 乘)可能的输入(input),经过多个上菜样和卷积层,最后其维度就可以和训练图像的维度匹配了。

def create_G(Z_SIZE=Z_SIZE):     DICT_LEN = 10     EMBEDDING_LEN = Z_SIZE      # weights are initialized from normal distribution with below params     weight_init = RandomNormal(mean=0., stddev=0.02)      # class#     input_class = Input(shape=(1, ), dtype='int32', name='input_class')     # encode class# to the same size as Z to use hadamard multiplication later on     e = Embedding(         DICT_LEN, EMBEDDING_LEN,         embeddings_initializer='glorot_uniform')(input_class)     embedded_class = Flatten(name='embedded_class')(e)      # latent var     input_z = Input(shape=(Z_SIZE, ), name='input_z')      # hadamard product     h = multiply([input_z, embedded_class], name='h')      # cnn part     x = Dense(1024)(h)     x = LeakyReLU()(x)      x = Dense(128 * 7 * 7)(x)     x = LeakyReLU()(x)     x = Reshape((7, 7, 128))(x)      x = UpSampling2D(size=(2, 2))(x)     x = Conv2D(256, (5, 5), padding='same', kernel_initializer=weight_init)(x)     x = LeakyReLU()(x)      x = UpSampling2D(size=(2, 2))(x)     x = Conv2D(128, (5, 5), padding='same', kernel_initializer=weight_init)(x)     x = LeakyReLU()(x)      x = Conv2D(         1, (2, 2),         padding='same',         activation='tanh',         name='output_generated_image',         kernel_initializer=weight_init)(x)      return Model(inputs=[input_z, input_class], outputs=x, name='G')

[8].将判别器 D 和生成器 G 整合到一个模型中:

D = create_D()  D.compile(     optimizer=RMSprop(lr=0.00005),     loss=[d_loss, 'sparse_categorical_crossentropy'])  input_z = Input(shape=(Z_SIZE, ), name='input_z_') input_class = Input(shape=(1, ),name='input_class_', dtype='int32')  G = create_G()  # create combined D(G) model output_is_fake, output_class = D(G(inputs=[input_z, input_class])) DG = Model(inputs=[input_z, input_class], outputs=[output_is_fake, output_class])  DG.compile(     optimizer=RMSprop(lr=0.00005),     loss=[d_loss, 'sparse_categorical_crossentropy'] )


[9].加载 MNIST 数据集:

# load mnist data (X_train, y_train), (X_test, y_test) = mnist.load_data()  # use all available 70k samples from both train and test sets X_train = np.concatenate((X_train, X_test)) y_train = np.concatenate((y_train, y_test))  # convert to -1..1 range, reshape to (sample_i, 28, 28, 1) X_train = (X_train.astype(np.float32) - 127.5) / 127.5 X_train = np.expand_dims(X_train, axis=3)

[10].生成样本以及将指标和图像发送到 TensorBorad 的实用工具:

# save 10x10 sample of generated images def generate_samples(n=0, save=True):      zz = np.random.normal(0., 1., (100, Z_SIZE))     generated_classes = np.array(list(range(0, 10)) * 10)     generated_images = G.predict([zz, generated_classes.reshape(-1, 1)])      rr = []     for c in range(10):         rr.append(             np.concatenate(generated_images[c * 10:(1 + c) * 10]).reshape(                 280, 28))     img = np.hstack(rr)      if save:         plt.imsave(OUT_DIR + '/samples_%07d.png' % n, img, cmap=plt.cm.gray)      return img  # write tensorboard summaries sw = tf.summary.FileWriter(TENSORBOARD_DIR) def update_tb_summary(step, write_sample_images=True):      s = tf.Summary()      # losses as is     for names, vals in zip((('D_real_is_fake', 'D_real_class'),                             ('D_fake_is_fake', 'D_fake_class'), ('DG_is_fake',                                                                  'DG_class')),                            (D_true_losses, D_fake_losses, DG_losses)):          v = s.value.add()         v.simple_value = vals[-1][1]         v.tag = names[0]          v = s.value.add()         v.simple_value = vals[-1][2]         v.tag = names[1]      # D loss: -1*D_true_is_fake - D_fake_is_fake     v = s.value.add()     v.simple_value = -D_true_losses[-1][1] - D_fake_losses[-1][1]     v.tag = 'D loss (-1*D_real_is_fake - D_fake_is_fake)'      # generated image     if write_sample_images:         img = generate_samples(step, save=True)         s.MergeFromString(tf.Session().run(             tf.summary.image('samples_%07d' % step,                              img.reshape([1, *img.shape, 1]))))      sw.add_summary(s, step)     sw.flush() 


[11].训练


训练过程包含了以下步骤:


1、解除对判别器 D 权重的控制,让它们变得可学习。

2、调整判别器的权重(调整到-0.01 到+0.01 闭区间上)。

3、向判别器 D 提供真实的样本,通过在损失函数中将其乘上-1 来尽可能最大化它的输出,最小化它的值。

4、向判别器 D 提供假的样本试图最小化其输出。

5、按照上文讲述的判别器迭代训练方法重复步骤 3 和 4。

6、固定判别器 D 的权重。

7、训练一对判别器和生成器,尽力去最小化其输出。由于这种手段优化了生成器 G 的权重,所以前面已经训练好了的权重固定的判别器才会将生成的假样本判断为真图像。


progress_bar = Progbar(target=ITERATIONS)  DG_losses = [] D_true_losses = [] D_fake_losses = []  for it in range(ITERATIONS):      if len(D_true_losses) > 0:         progress_bar.update(             it,             values=[ # avg of 5 most recent                     ('D_real_is_fake', np.mean(D_true_losses[-5:], axis=0)[1]),                     ('D_real_class', np.mean(D_true_losses[-5:], axis=0)[2]),                     ('D_fake_is_fake', np.mean(D_fake_losses[-5:], axis=0)[1]),                     ('D_fake_class', np.mean(D_fake_losses[-5:], axis=0)[2]),                     ('D(G)_is_fake', np.mean(DG_losses[-5:],axis=0)[1]),                     ('D(G)_class', np.mean(DG_losses[-5:],axis=0)[2])             ]         )              else:         progress_bar.update(it)      # 1: train D on real+generated images      if (it % 1000) < 25 or it % 500 == 0: # 25 times in 1000, every 500th         d_iters = 100     else:         d_iters = D_ITERS      for d_it in range(d_iters):          # unfreeze D         D.trainable = True         for l in D.layers: l.trainable = True          # clip D weights          for l in D.layers:             weights = l.get_weights()             weights = [np.clip(w, -0.01, 0.01) for w in weights]             l.set_weights(weights)          # 1.1: maximize D output on reals === minimize -1*(D(real))          # draw random samples from real images         index = np.random.choice(len(X_train), BATCH_SIZE, replace=False)         real_images = X_train[index]         real_images_classes = y_train[index]          D_loss = D.train_on_batch(real_images, [-np.ones(BATCH_SIZE),            real_images_classes])         D_true_losses.append(D_loss)          # 1.2: minimize D output on fakes           zz = np.random.normal(0., 1., (BATCH_SIZE, Z_SIZE))         generated_classes = np.random.randint(0, 10, BATCH_SIZE)         generated_images = G.predict([zz, generated_classes.reshape(-1, 1)])          D_loss = D.train_on_batch(generated_images, [np.ones(BATCH_SIZE),           generated_classes])         D_fake_losses.append(D_loss)      # 2: train D(G) (D is frozen)     # minimize D output while supplying it with fakes,      # telling it that they are reals (-1)      # freeze D     D.trainable = False     for l in D.layers: l.trainable = False      zz = np.random.normal(0., 1., (BATCH_SIZE, Z_SIZE))      generated_classes = np.random.randint(0, 10, BATCH_SIZE)      DG_loss = DG.train_on_batch(         [zz, generated_classes.reshape((-1, 1))],         [-np.ones(BATCH_SIZE), generated_classes])      DG_losses.append(DG_loss)      if it % 10 == 0:         update_tb_summary(it, write_sample_images=(it % 250 == 0))


结论


视频的每一秒都是 250 次训练迭代。使用 Wasserstein GAN 的一个好处就是它有着损失与样本质量之间的关系。如我们在下方看到的损失图,当进行了约 8000 次训练之后,损失开始逼近 0,在视频中 32 秒位置时,我们已经开始可以看到像样的图像了。




附论文地址:http://ift.tt/2phuvGh


参考文献

1. Wasserstein GAN paper (http://ift.tt/2phuvGh) – Martin Arjovsky, Soumith Chintala, Léon Bottou

2. NIPS 2016 Tutorial: Generative Adversarial Networks (http://ift.tt/2i2wZAB) – Ian Goodfellow

3. Original PyTorch code for the Wasserstein GAN paper (http://ift.tt/2kOCS6C)

4. Conditional Image Synthesis with Auxiliary Classifier GANs (http://ift.tt/2y0fhch) – Augustus Odena, Christopher Olah, Jonathon Shlens

5. Keras ACGAN implementation (http://ift.tt/2xV2bvv) – Luke de Oliveira

6. Code for the article (http://ift.tt/2y0zzm6)


原文链接:http://ift.tt/2hsV2yp


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

机器知心

IFTTT

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

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