原文:KDNuggets
使用 R 进行 H2O 中的深度学习
评论
这篇文章介绍了如何在 R 中使用 H2O 包进行深度学习。
H2O 是一个开源的人工智能平台,允许我们使用机器学习技术,如朴素贝叶斯、K 均值、PCA、深度学习、使用深度学习的自编码器等。使用 H2O,我们可以在 R、Python、Scala 等编程环境中构建预测模型,还可以通过一个称为 Flow 的基于 Web 的 UI 进行操作。
I. 深度学习:背景
深度学习是受人脑和神经系统功能启发的机器学习算法的一个分支。输入数据被固定到深度网络的输入层。网络随后使用层次化的隐藏层,逐步生成输入数据的紧凑、更高级的抽象(表示)。因此,它生成输入特征的伪特征。具有3 层或更多层的神经网络被认为是“深度”的。
作为一个例子,对于面部检测任务,原始输入通常是一个像素值向量。第一次抽象可能识别光影像素;第二次抽象可能识别边缘和形状;第三次抽象可能将这些边缘和形状组合成眼睛、鼻子等部分;下一个抽象可能将这些部分组合成一个面孔。因此,通过简单表示的组合来学习复杂的表示。
在输出层,计算网络误差(成本)。这个成本通过一种称为随机梯度下降的方法逐步最小化,并通过一种称为反向传播的算法向后传播到输入层。这会导致网络中权重和偏置的重新校准。使用新的权重,新的表示被向前传播到输出层,并再次检查网络误差。前向和后向传播的过程会持续进行,直到权重被调整到准确预测输出为止。

图 1:示意深度学习的金字塔 (来源)
对于图 1,我们考虑一个 150 * 12000 维的输入数据集(150 行,12000 列)。我们创建一个具有 4 个隐藏层的深度网络,包含 4000、750、200、30 个神经元。输入层中的所有 12000 个数据点都用于构建第一个隐藏层的 4000 个伪特征。由于这里网络的规模逐渐减小到最后一个隐藏层,它形成了一个金字塔。图中显示的 5 个步骤如下所述。
步骤 1: 将输入记录(150* 12000)输入到网络中。
步骤 2: 深度学习算法开始学习数据集中的固有模式。它通过将权重和偏置关联到从输入层和隐藏层形成的每个特征来实现。这是模型构建阶段。随着它通过每个连续的隐藏层,它形成了数据的更窄的抽象。每个抽象将前一层的抽象作为输入。
Dropout 是在模型构建阶段指定的超参数。
步骤 3: 经过最后一个隐藏层后,形成了 150* 30 特征的抽象。类别标签(150* 1)暴露于此抽象中。到目前为止,它仍然是一个前馈神经网络。
步骤 4: 类别标签帮助模型将结果与为每个输入记录创建的模式相关联。因此,现在可以调整权重和偏置,以更好地匹配标签并最小化成本(记录的预测输出与实际输出之间的差异)。
随机梯度下降使用随机训练集样本迭代以最小化成本。这是通过从输出层向输入层反向传播来实现的,称为反向传播。反向传播训练深度网络,使用随机梯度下降算法。
步骤 5: 反向传播发生了 n 次,其中 n = 纪元数,或者直到权重没有变化为止。
II. H2O 中的深度学习:
H2O 中的深度学习本地实现为多层感知器(MLP)。但是,H2O 还允许我们构建自编码器(自编码器是一个神经网络,它接受一组输入,对其进行压缩和编码,然后尝试尽可能准确地重建输入)。可以通过 H2O 的 Deep Water 项目 通过其他深度学习库(如 Caffe 和 TensorFlow)的第三方集成来构建递归神经网络和卷积神经网络。
用户需要指定深度学习模型的超参数值。参数指的是深度学习模型的权重和偏置。超参数是设计神经网络所需的选项,如层数、每层的节点数、激活函数、正则化器的选择等。
全局模型参数的计算可以在单个节点或多节点集群上运行。对于多节点集群,全局模型参数的副本在计算节点的本地数据上进行训练,通过多线程和分布式并行计算。模型在网络中进行平均,每个计算节点定期对全局模型做出贡献。
H2O 深度学习模型的一些特性包括:
1) 自动 ‘adaptive learning rate:
ADADELTA 算法(‘adaptive_rate’ 超参数)用于加快收敛速度和减少在峡谷周围的振荡,提供一个名为 ‘rate_annealing’ 的可选值,以在模型接近优化空间中的最小值时减慢学习率。
2) 模型正则化:
为了避免过拟合,H2O 的深度学习使用 l1 和 l2 正则化,并且使用 ‘dropouts’ 的概念。
-
l1: l1 约束权重的绝对值。它使许多权重变为 0。
-
l2: l2 约束权重的平方和。它使许多权重变得很小。
-
input_dropout_ratio: input_dropout_ratio 指每个训练记录中要丢弃/省略的特征的比例,以提高泛化能力。例如,‘ input_dropout_ratio = 0.1’ 表示 10% 的输入特征被丢弃。
-
hidden_dropout_ratios: hidden_dropout_ratios 指每个隐藏层中要丢弃/省略的特征的比例,以提高模型的泛化能力。例如,‘ hidden_dropout_ratios = c( 0.1, 0.1)’ 表示在一个有两个隐藏层的深度学习模型中,每个隐藏层中有 10% 的隐藏特征被丢弃。
3) 模型检查点:
检查点(使用其键 = ‘model_id’)用于在更多数据、更改超参数等情况下恢复先前保存模型的训练。
4) 网格搜索:
为了比较模型的性能并调整超参数值,网格搜索模型训练了通过组合超参数集合获得的所有可能模型。
下面的示例 (source) 显示了 3 种不同的隐藏层拓扑结构和神经元数量,2 种不同的 l1 正则化值。因此,模型 Model_Grid1 训练了 6 种不同的模型。
- H2O 还允许对 training_frame 执行交叉验证,并且还可以实现 GBM 方法(梯度提升机)。
III. 深度学习的常见 R 命令:
从 这个来源:
-
library(h2o): 导入 H2O R 包。
-
h2o.init(): 连接到(或启动)H2O 集群。
-
h2o.shutdown(): 关闭 H2O 集群。
-
h2o.importFile(path): 将文件导入 H2O。
-
h2o.deeplearning(x,y,training frame,hidden,epochs): 创建一个深度学习模型。
-
h2o.grid(algorithm,grid id,…,hyper params = list()): 启动 H2O 网格支持并给出结果。
-
h2o.predict(model, newdata): 从 H2O 模型生成对测试集的预测。
IV. R 脚本:
我使用了 UCI 机器学习的’Pima Indians’数据集。
相关:
-
基于 H2O 的物联网深度学习
-
深度学习和其他机器学习分类器的决策边界
-
访谈:Arno Candel,H20.ai 谈如何快速启动 H2O 深度学习
我们的前三个课程推荐
1. 谷歌网络安全证书 - 快速进入网络安全职业生涯。
2. 谷歌数据分析专业证书 - 提升你的数据分析水平
3. 谷歌 IT 支持专业证书 - 支持组织的 IT 需求
更多相关话题
深度学习 – 学习和理解的重要资源
原文:
www.kdnuggets.com/2014/08/deep-learning-important-resources-learning-understanding.html
作者:Gregory Piatetsky,@kdnuggets,2014 年 8 月 21 日
深度学习是目前最热门的机器学习方法,并且因取得显著成果而频频上新闻。在最近的大规模视觉识别挑战赛 (结果,纽约时报文章) 中,准确率几乎翻了一番(从 22.5% 提升至 43.9%),错误率则从 11.7% 降至仅 6.6%。
值得注意的是,几乎所有参赛者都使用了一种称为卷积神经网络的变体方法 (ConvNet),这种方法最初由 NYU 教授 Yann LeCun 在 1998 年进行了完善,LeCun 最近被聘为 Facebook 人工智能研究中心的负责人。
这里有更多资源帮助你了解深度学习和卷积神经网络
-
我的文章 在哪里学习深度学习 - 课程、教程、软件
-
KDnuggets 独家 与 Yann LeCun 的访谈,第一部分,以及 第二部分
深度学习 书稿,作者:Yoshua Bengio、Ian Goodfellow 和 Aaron Courville
软件:
-
cuda-convnet,一个快速的 C++ 实现卷积神经网络(或者更一般的,前馈神经网络)
-
pylearn2 GitHub 页面,一个 Python 机器学习库,包含 Deep Learning 的 maxout 代码
-
视觉特征层次学习
-
使用机器学习构建人工视觉系统
-
PCMI 夏季学校的 5 节讲座:介绍、基于能量的学习、多阶段学习、卷积网络、无监督深度学习等
深度学习的基础论文 - 来自 Yoshua Bengio 的 Quora 回答。
这里是精选论文:
-
快速学习算法用于深度信念网络,作者:Geoff Hinton 等
-
在 MNIST 数字上训练深度自编码器或分类器,由 Ruslan Salakhutdinov 和 Geoff Hinton 编写的代码
-
深度玻尔兹曼机,由 Ruslan Salakhutdinov 和 Geoff Hinton 编写
-
学习深度玻尔兹曼机,由 Ruslan Salakhutdinov 编写的代码
-
Maxout 网络,由 Ian Goodfellow 等人编写
优秀的深度学习简介:从感知机到深度网络,由 Toptal 的 Ivan Vasilev 提供
另一个优秀的演示文稿是在 Hadoop 下一代 YARN 框架上进行并行迭代深度学习介绍,由 Adam Gibson 和 Josh Patterson 制作。
相关:
-
深度学习是否存在深层缺陷?
-
学习深度学习的去处 - 课程、教程、软件
-
KDnuggets 独家:采访 Yann LeCun,深度学习专家,Facebook AI 实验室主任
-
KDnuggets 独家采访 Yann LeCun,第二部分
-
深度学习分析如何模拟大脑
我们的三大课程推荐
1. Google 网络安全证书 - 快速开启网络安全职业生涯。
2. Google 数据分析专业证书 - 提升你的数据分析能力
3. Google IT 支持专业证书 - 支持你的组织进行 IT
更多相关内容
深度学习关键术语解释
原文:
www.kdnuggets.com/2016/10/deep-learning-key-terms-explained.html
深度学习因其在多个领域取得了令人瞩目的成功而研究和产业上都在快速发展。深度学习是应用深度神经网络技术——即具有多个隐藏层的神经网络架构——来解决问题的过程。深度学习是一个过程,类似于数据挖掘,它使用深度神经网络架构,这些架构是特定类型的机器学习算法。

我们的前三大课程推荐
1. 谷歌网络安全证书 - 快速进入网络安全职业生涯。
2. 谷歌数据分析专业证书 - 提升你的数据分析技能
3. 谷歌 IT 支持专业证书 - 支持你的组织的 IT 需求
深度学习在过去几年中取得了令人印象深刻的成就。鉴于此,至少在我看来,重要的是要记住以下几点:
-
深度学习不是灵丹妙药 - 它不是一个适用于所有问题的简单解决方案。
-
它不是传说中的万能算法 - 深度学习不会取代所有其他机器学习算法和数据科学技术,或者至少,它尚未证明如此。
-
适度的期望是必要的 - 尽管在所有类型的分类问题中,特别是计算机视觉和自然语言处理以及强化学习和其他领域,最近取得了巨大进展,但当代深度学习并不能解决诸如“解决世界和平”等非常复杂的问题。
-
深度学习和人工智能不是同义词
-
深度学习可以为数据科学提供大量的额外过程和工具来帮助解决问题,从这个角度看,深度学习是数据科学领域的一个非常有价值的补充。
那么,让我们看看一些与深度学习相关的术语,专注于简明扼要的定义。
1. 深度学习
如上所定义,深度学习是应用深度神经网络技术来解决问题的过程。深度神经网络是具有至少一个隐藏层的神经网络(见下文)。类似于数据挖掘,深度学习指的是一种过程,它采用深度神经网络架构,这些架构是特定类型的机器学习算法。
2. 人工神经网络
机器学习架构最初是受生物大脑(特别是神经元)的启发,从而实现深度学习。实际上,人工神经网络(ANNs)本身(非深度类型)已经存在很长时间,并且历史上能够解决某些类型的问题。然而,相对较近的时间内,神经网络架构被设计出来,包含了隐藏神经元层(不仅仅是输入层和输出层),这种附加的复杂性使得深度学习成为可能,并提供了一套更强大的问题解决工具。
ANNs 的架构实际上变化很大,因此没有明确的神经网络定义。所有 ANNs 通常引用的两个特征是具有适应性权重集和近似神经元输入的非线性函数的能力。
3. 生物神经元
通常会强调生物神经网络与人工神经网络之间的明确联系。流行的出版物传播的观点是,人工神经网络在某种程度上是对人类(或其他生物)大脑发生的情况的精确复制。这显然是不准确的;充其量,早期的人工神经网络受到生物学的启发。这两者之间的抽象关系不比原子组成与太阳系功能之间的抽象比较更为明确。
话虽如此,了解生物神经元在很高层次上的工作方式对我们还是有益的,至少可以帮助我们理解人工神经网络的灵感来源。

图片来源:维基百科
对我们感兴趣的生物神经元的主要组件有:
-
细胞核储存遗传信息(即 DNA)
-
细胞体处理输入激活并将其转换为输出激活
-
树突接收来自其他神经元的激活
-
轴突将激活传输到其他神经元
-
轴突末端与相邻的树突一起形成神经元之间的突触
化学物质称为神经递质,然后扩散穿过突触间隙,在轴突末端和相邻的树突之间形成神经递质传输。神经元的基本操作是,激活通过树突流入神经元,经过处理后,通过轴突及其轴突末端重新传输,在这里穿过突触间隙,达到许多接收神经元的树突,过程重复进行。
4. 感知器
感知器是一种简单的线性二分类器。感知器接收输入和相关的权重(表示相对输入的重要性),并将它们组合生成输出,然后用于分类。感知器存在了很长时间,早期的实现可以追溯到 1950 年代,其中的第一个实现涉及早期的 ANN 实现。
5. 多层感知机
多层感知机(MLP)是几个完全相邻连接的感知机层的实现,形成一个简单的前馈神经网络(见下文)。这个多层感知机具有非线性激活函数的额外优点,这是单层感知机所不具备的。
6. 前馈神经网络
前馈神经网络是最简单的神经网络架构形式,其中连接是非周期性的。原始的人工神经网络中,信息在前馈网络中单向从输入节点流向输出节点,经过任何隐藏层;没有循环。前馈网络与后来的循环网络架构不同(见下文),后者中的连接形成一个有向循环。
7. 循环神经网络
与上述前馈神经网络相对的是,循环神经网络的连接形成一个有向循环。这种双向流动允许内部时间状态的表示,这反过来允许序列处理,并且,值得注意的是,提供了识别语音和手写的必要能力。
8. 激活函数
在神经网络中,激活函数通过结合网络的加权输入来生成输出决策边界。激活函数的范围从恒等函数(线性)到 sigmoid 函数(逻辑函数或软阶跃)再到双曲正切函数及其他。为了使用反向传播(见下文),网络必须使用可微的激活函数。
9. 反向传播
我见过的最简明的基本反向传播定义来自数据科学家Mikio L. Braun,他在Quora上给出了如下回答,我将其逐字转述,以保持其简单的完美:
反向传播只是对个别错误的梯度下降。你将神经网络的预测与期望输出进行比较,然后计算错误相对于神经网络权重的梯度。这为你提供了在参数权重空间中使错误变小的方向。
10. 成本函数
训练神经网络时,必须评估网络输出的正确性。由于我们知道训练数据的期望正确输出,可以对比训练输出。成本函数衡量实际输出与期望输出之间的差异。如果实际输出与期望输出之间的成本为零,则表示网络已经以可能的最佳方式进行训练;这显然是理想的。
那么,成本函数是通过什么机制进行调整的,以实现最小化的目标呢?
11. 梯度下降
梯度下降是一种优化算法,用于寻找函数的局部极小值。虽然它不能保证全局最小值,但梯度下降对于那些难以通过解析方法精确求解的函数尤其有用,比如设置导数为零并求解。

如上所述,在神经网络的背景下,随机梯度下降用于对网络的参数进行有信息的调整,目标是最小化成本函数,从而使网络的实际输出逐步接近预期输出。这种迭代的最小化使用了微积分,特别是微分。在每次训练步骤后,网络权重根据成本函数的梯度和网络当前的权重进行更新,以便下一次训练步骤的结果可能更接近正确(通过较小的成本函数来衡量)。反向传播(误差的反向传播)是用于将这些更新分配到网络的方法。
12. 消失梯度问题
反向传播使用链式法则来计算梯度(通过微分),即在* n* 层神经网络的“前面”(输入)层,其小数量的更新梯度值会被乘以n次,然后将这一稳定值用作更新。这意味着梯度会呈指数级减少,这是较大值的n的一个问题,前面层需要更长时间才能有效训练。
13. 卷积神经网络
通常与计算机视觉和图像识别相关,卷积神经网络(CNNs)运用卷积的数学概念来模拟生物视觉皮层的神经连接网。
首先,卷积如 Denny Britz 详尽描述的那样,可以被视为在图像的矩阵表示上滑动的窗口(见下文)。这允许松散地模拟生物视觉场的重叠铺排。

图片来源:Analytics Vidhya
在神经网络架构中实施这一概念会导致专门处理图像部分的神经元集合,至少在计算机视觉中是这样。当在其他领域使用时,如自然语言处理,同样的方法可以应用,因为输入(单词、句子等)可以被排列成矩阵,并以类似的方式处理。
14. 长短期记忆网络
长短期记忆网络(LSTM)是一种递归神经网络,优化用于学习和处理时间相关的数据,这些数据可能在相关事件之间有不确定或未知的时间间隔。它们特有的架构允许持久性,为人工神经网络提供了“记忆”。最近在手写识别和自动语音识别领域的突破受益于 LSTM 网络。

图片来源: 克里斯托弗·奥拉赫
这显然只是深度学习术语的一个小子集,许多额外的概念,从基础到高级,等待着你在深入了解当前领先的机器学习研究领域时去探索。
马修·梅约 (@mattmayo13)是一名数据科学家,同时也是 KDnuggets 的总编辑,KDnuggets 是一个开创性的在线数据科学和机器学习资源。他的兴趣领域包括自然语言处理、算法设计与优化、无监督学习、神经网络以及机器学习的自动化方法。马修拥有计算机科学硕士学位和数据挖掘研究生文凭。他可以通过 editor1 at kdnuggets[dot]com 联系到。
更多相关内容
深度学习会取代机器学习,使其他算法过时吗?
原文:
www.kdnuggets.com/2014/10/deep-learning-make-machine-learning-algorithms-obsolete.html
深度学习迅速发展,并以惊人的经验结果让我们感到惊讶。关于深度学习是否会使其他机器学习算法过时,在 Quora 上有讨论。具体来说,像反向传播、HMM 这样的相关算法是否会像感知机一样过时?
哦,很难回答。Jack Rae 提供了一个有趣的回答,他说
过去几年的经验结果表明,当数据集足够大时,深度学习提供了最佳的预测能力。这是真的吗?我不知道在过去一年中是否有超过一亿行数据的预测能力被击败的例子。
他认为,深度学习将把其他学习算法推向灭绝的边缘,这是因为深度学习在中到大型数据集上的无与伦比的预测能力。其他算法会在人们开始将深度学习视为一些问题(如模式识别)的首选解决方案时变得过时。
另一方面,大多数人仍然相信深度学习不会取代所有其他模型和算法。Jacob Steinhart 的观点获得了最多的赞同。他写道
1. 对于许多应用来说,像逻辑回归或支持向量机这样的简单算法就足够了,而使用深度信念网络只会让事情变得复杂。
2. 虽然深度信念网络是最好的领域无关算法之一,但如果有人具备领域知识,那么许多其他算法(如用于语音识别的 HMM、用于图像的波形等)可以超越它们。虽然正在进行一些将领域知识融入神经网络模型的工作,但显然还不够,无法完全替代所有其他模型和算法。

上面是由 Eren Golge 创建的机器学习时间轴。
深度学习将成为主流,就像支持向量机(SVM)一样,后者在 2000 年代初期得到了迅速改进。然而,深度学习的复杂性及其对大量数据的需求仍然需要解决,才能使深度学习成为机器学习算法的首选。
Ran Bi 是纽约大学数据科学项目的硕士生。在 NYU 学习期间,她参与了多个机器学习、深度学习以及大数据分析的项目。
相关链接:
-
深度学习 – 学习和理解的重要资源
-
深度学习是否存在深层缺陷?
-
CuDNN – 一个新的深度学习库
我们的前三推荐课程
1. Google 网络安全证书 - 快速进入网络安全职业生涯。
2. Google 数据分析专业证书 - 提升你的数据分析技能
3. Google IT 支持专业证书 - 支持你的组织的 IT
相关主题
大众的深度学习(……以及语义层)
原文:https://www.kdnuggets.com/2018/11/deep-learning-masses-semantic-layer.html

深度学习介绍
本文的范围并不是介绍深度学习,我在其他文章中已经做过了,你可以在这里找到:
[一个“奇怪”的深度学习介绍
*有许多令人惊叹的深度学习介绍、课程和博客文章。但这是一种不同类型的介绍……*towardsdatascience.com](https://towardsdatascience.com/a-weird-introduction-to-deep-learning-7828803693b0)
[我进入深度学习的旅程
*在这篇文章中,我将分享我如何学习深度学习以及如何用它解决数据科学问题。这是一个……*towardsdatascience.com](https://towardsdatascience.com/my-journey-into-deep-learning-c66e6ef2a317)
[关于深度学习的对话
*有人偷听到两个人谈论深度学习,并把每个细节都告诉了我。其中一个人完全是……*towardsdatascience.com](https://towardsdatascience.com/a-conversation-about-deep-learning-9a915983107)
但如果你想从这里尝试一下,我可以这样告诉你:
…深度学习是利用不同种类的神经网络[深度神经网络]进行表示学习,并优化网络的超参数,以获得(学习)最佳的数据表示。
如果你想知道这从哪里来,阅读上述文章。
深度学习并不那么难

这更难
目前,对于组织而言,深度学习并不是那么难。我不是说深度学习整体上很简单,研究这个领域需要大量的数学、微积分、统计学、机器学习、计算等知识。你可以从我之前制作的时间线上看到深度学习的来源。

从那里我可以说,反向传播、网络参数的更好初始化、更好的激活函数、Dropout 概念以及卷积神经网络、残差网络、区域基础 CNN、递归神经网络和生成对抗网络等一些网络类型,是我们在深度学习领域取得的最重要进展之一。
但你现在怎么使用深度学习呢?

hehe
数据优先

哦,你可能会想成为他们。对吧?或者可能不是,我不知道。
你想知道秘密吗?那些大科技公司使用的秘密武器?这不仅仅是深度学习(也许根本不是深度学习)
我不会在这里做完整的演讲,但一切都从数据开始。正如你可以想象的那样,数据现在是公司最重要的资产(也许是最重要的)。所以,在你能应用机器学习或深度学习之前,你需要拥有数据,知道你拥有的是什么,理解它,管理它,清理它,分析它,标准化它(也许还要更多),然后你才能考虑如何使用它。
从 Brian Godsey 的精彩 文章 中可以看出:
无论何种形式,数据现在无处不在,与其说它只是分析师用来得出结论的工具,不如说它已经成为自身的目的。公司现在似乎将数据视为最终目标,而非手段,尽管许多公司声称计划在未来使用这些数据。独立于信息时代的其他定义特征,数据获得了自己的角色、自己的组织和自己的价值。
所以你可以看到,这不仅仅是将最新的算法应用于你的数据,而是能够将数据以良好的格式呈现出来,并理解它,然后再使用它。
语义层

这些层次是有意义的。不过,这不是语义层。继续阅读。
这对我来说是很不寻常的,但我做了很多调查,并与几家公司合作,它们似乎都有相同的问题:它们的数据。
数据的可用性、数据质量、数据摄取、数据集成等常见问题,不仅会影响数据科学实践,还会影响整个组织。
清理数据并为机器学习做好准备的方法有很多,也有很棒的工具和方法论,你可以在这里阅读更多信息:
[宣布 Optimus v2——敏捷数据科学工作流简化版]
寻找一个可以显著提高你作为数据科学家生产力的库?快来看看这个! towardsdatascience.com
但这假设你已经有了摄取和集成数据的流程。现在有很棒的工具用于 AutoML,我之前已经讨论过这个问题:
[Auto-Keras,或如何在 4 行代码中创建深度学习模型]
自动化机器学习是新来的,它将长期存在。它帮助我们不断创造更好的… www.kdnuggets.com
以及像 DataRobot 这样的其他商业工具:
[用于预测建模的自动化机器学习 | DataRobot]
DataRobot 的自动化机器学习平台使构建和部署准确的预测模型变得快速而简单… www.datarobot.com
那么自动化摄取和集成呢?
这就是语义层的惊人好处之一。但到底什么是语义层呢?
语义一词本身意味着意义或理解。因此,语义层与数据相关的是其含义,而不是数据的结构。
理解是一个非常重要的过程,我之前已经提到过:
在这篇文章中,我将展示数据科学如何通过 AI 实现智能。 towardsdatascience.com
在这里我提到(来自 Lex Fridman):
理解是将复杂信息转化为简单*、有用**信息的能力。*
当我们理解时,我们是在解码构成这一复杂事物的部分,并将最初获得的原始数据转化为有用且易于理解的东西。我们通过建模来实现这一点。正如你可以想象的那样,我们需要这样的模型来理解数据的意义。
链接数据和知识图谱

我们需要做的第一件事是链接数据。链接数据的目标是以一种结构化的方式发布数据,使其能够被轻松地消耗并与其他链接数据结合。
链接数据是 Web 上数据发布和互操作性的新的事实标准,也正在进入企业。像 Google、Facebook、Amazon 和 Microsoft 这样的巨头,已经采用了其中的一些原则。
数据链接的过程是一个称为知识图谱的开端。知识图谱是一种高级的方式,用于映射某一特定主题的所有知识,以填补数据如何关联的空白,或数据库中的虫洞。
知识图谱由集成的数据和信息集合组成,这些集合还包含了大量不同数据之间的链接。
关键在于,在这种新模型下,我们不是寻找可能的答案,而是在寻求一个答案。我们需要的是事实——这些事实的来源并不那么重要。
这里的数据可以代表概念、对象、事物、人,实际上你脑海中的任何东西。图谱填补了这些概念之间的关系和连接。
这里是 Google 在 6 年前(对,就是 6 年)对知识图谱的一个惊人介绍:
知识图谱对你和你的公司意味着什么?
以旧式方式,数据仓库中的数据模型虽然是一个了不起的成就,但无法吸收涌向我们的庞大数据量。创建关系数据模型的过程实在跟不上。此外,用于推动数据发现的数据提取也过于有限。
基于 Hadoop 或云存储的数据湖因此已经变成了数据沼泽——缺乏必要的管理和治理能力。

https://timoelliott.com/blog/2014/12/from-data-lakes-to-data-swamps.html
你是否问过你的数据工程师和科学家,他们是否理解你们组织拥有的所有数据?请这么做。
分析你拥有的所有数据是极其困难的。并理解背后的关系是什么。
因为它们是图形,知识图谱更为直观。人们不会以表格的形式思考,但他们可以立刻理解图形。当你在白板上画出知识图谱的结构时,大多数人能立即明白它的意义。
知识图谱还允许你为图谱中的关系创建结构。你可以告诉图谱父母有孩子,父母可以是孩子,孩子可以是兄弟或姐妹,这些都是人。提供这样的描述信息允许从图谱中推断出新的信息,比如如果两个人有相同的父母,他们必须是兄弟姐妹。
我们的前三大课程推荐
1. 谷歌网络安全证书 - 快速进入网络安全职业生涯。
2. 谷歌数据分析专业证书 - 提升你的数据分析技能
3. 谷歌IT支持专业证书 - 支持你的组织IT需求
更多相关话题
-
关于语义分割注释的误解
持你的组织进行 IT 工作
更多相关话题
在手机上进行深度学习:用于移动平台的 PyTorch C++ API
原文:
www.kdnuggets.com/2021/11/deep-learning-mobile-phone-pytorch-c-api.html
评论
作者:Dhruv Matani,Meta(Facebook)的软件工程师。

我们的前三个课程推荐
1. Google 网络安全证书 - 快速进入网络安全职业生涯。
2. Google 数据分析专业证书 - 提升您的数据分析技能
3. Google IT 支持专业证书 - 支持您的组织在 IT 方面
PyTorch 是一个用于训练和运行机器学习(ML)模型的深度学习框架,加快了从研究到生产的速度。
PyTorch C++ API 可以用来编写紧凑的、对性能敏感的代码,具有深度学习能力,在移动平台上执行 ML 推理。有关如何将 PyTorch 模型部署到生产环境的一般介绍,请参见 这篇文章。
PyTorch Mobile 当前支持在 Android 和 iOS 平台上部署预训练模型进行推理。
高级步骤
-
训练一个模型(或获取一个预训练的模型),并保存为 lite-interpreter 格式。PyTorch 模型的 lite-interpreter 格式使模型兼容于移动平台运行。本文未涵盖此步骤。
-
下载 PyTorch 源代码,并 从源代码构建 PyTorch。这对于移动部署是推荐的。
-
创建一个 .cpp 文件,包含加载模型、使用 forward() 运行推理并打印结果的代码。
-
构建 .cpp 文件,并链接到 PyTorch 共享对象文件。
-
运行文件并查看输出。
-
获利!
详细步骤
从源代码下载并安装 PyTorch 到 Linux 机器上。
对于其他平台,请参见 这个链接。
# Setup conda and install dependencies needed by PyTorch
conda install astunparse numpy ninja pyyaml mkl mkl-include setuptools cmake cffi typing_extensions future six requests dataclasses
# Get the PyTorch source code from github
cd /home/$USER/
# Repo will be cloned into /home/$USER/pytorch/
git clone --recursive https://github.com/pytorch/pytorch
cd pytorch
# if you are updating an existing checkout
git submodule sync
git submodule update --init --recursive --jobs 0
# Build PyTorch
export CMAKE_PREFIX_PATH=${CONDA_PREFIX:-"$(dirname $(which conda))/../"}
python setup.py install
创建源代码 .cpp 文件
将 .cpp 文件存储在与您的 AddTensorsModelOptimized.ptl 文件相同的文件夹中。我们称这个 C++ 源文件为 PTDemo.cpp。我们称这个目录为 /home/$USER/ptdemo/。
#include <ATen/ATen.h>
#include <torch/library.h>
#include <torch/csrc/jit/mobile/import.h>
#include
using namespace std;
int main() {
// Load the PyTorch model in lite interpreter format.
torch::jit::mobile::Module model = torch::jit::_load_for_mobile(
"AddTensorsModelOptimized.ptl");
std::vector inputs;
// Create 2 float vectors with values for the 2 input tensors.
std::vector v1 = {1.0, 5.0, -11.0};
std::vector v2 = {10.0, -15.0, 9.0};
// Create tensors efficiently from the float vector using the
// from_blob() API.
std::vector dims{static_cast(v1.size())};
at::Tensor t1 = at::from_blob(
v1.data(), at::IntArrayRef(dims), at::kFloat);
at::Tensor t2 = at::from_blob(
v2.data(), at::IntArrayRef(dims), at::kFloat);
// Add tensors to inputs vector.
inputs.push_back(t1);
inputs.push_back(t2);
// Run the model and capture results in 'ret'.
c10::IValue ret = model.forward(inputs);
// Print the return value.
std::cout << "Return Value:\n" << ret << std::endl;
// You can also convert the return value into a tensor and
// fetch the underlying values using the data_ptr() method.
float *data = ret.toTensor().data_ptr();
const int numel = ret.toTensor().numel();
// Print the data buffer.
std::cout << "\nData Buffer: ";
for (int i = 0; i < numel; ++i) {
std::cout << data[i];
if (i != numel - 1) {
std::cout << ", ";
}
}
std::cout << std::endl;
}
注意:我们使用来自*at::命名空间的符号,而不是torch::*命名空间(这是 PyTorch 网站教程中使用的),因为对于移动构建,我们不会包含完整的 jit(TorchScript)解释器。相反,我们将仅访问 lite-interpreter。
构建和链接
# This is where your PTDemo.cpp file is
cd /home/$USER/ptdemo/
# Set LD_LIBRARY_PATH so that the runtime linker can
# find the .so files
LD_LIBRARY_PATH=/home/$USER/pytorch/build/lib/
export LD_LIBRARY_PATH
# Compile the PTDemo.cpp file. The command below should
# produce a file named 'a.out'
g++ PTDemo.cpp \
-I/home/$USER/pytorch/torch/include/ \
-L/home/$USER/pytorch/build/lib/ \
-lc10 -ltorch_cpu -ltorch
运行应用程序
./a.out
命令应输出以下内容:
Return Value:
11
-5
8
[ CPUFloatType{3} ]
Data Buffer: 11, -5, 8
结论
在本文中,我们看到如何使用跨平台的 C++ PyTorch API 加载一个经过训练的 lite-interpreter 模型,并使用该模型进行推理。所使用的 C++代码是平台无关的,可以在所有支持 PyTorch 的移动平台上构建和运行。
参考文献
简介: Dhruv Matani 是 Meta(Facebook)的软件工程师,他领导与 PyTorch(开源 AI 框架)相关的项目。他是 PyTorch 内部结构、PyTorch Mobile 的专家,并且是 PyTorch 的重要贡献者。他的工作影响着全球数十亿用户。他在为 Facebook 数据平台构建和扩展基础设施方面有着丰富的经验。值得注意的是,他对 Facebook 实时数据分析平台 Scuba 的贡献,该平台用于快速获取产品和系统洞察。他拥有石溪大学计算机科学硕士学位。
相关:
更多相关主题
深度学习与 NLP:使用 Keras 创建聊天机器人!
原文:
www.kdnuggets.com/2019/08/deep-learning-nlp-creating-chatbot-keras.html
评论
由 Jaime Zornoza,马德里理工大学

在上一篇文章中,我们了解了人工神经网络和深度学习是什么。还介绍了一些用于处理序列数据(如文本或音频)的神经网络结构。如果你还没有阅读那篇文章,你应该放松一下,拿杯咖啡,慢慢享受它。它可以在这里找到。
这篇新文章将讲解如何使用 Keras,这是一个非常流行的神经网络库来构建聊天机器人。将解释该库的主要概念,然后我们将逐步指南如何使用它来创建一个“是/否回答机器人”的 Python 示例。我们将利用 Keras 的简便性来实现来自 Sukhbaatar 等人论文中的 RNN 结构(你可以在这里找到)。
这很有趣,因为在定义了一个任务或应用(创建一个“是/否”聊天机器人以回答特定问题)之后,我们将学习如何将研究工作中的洞察转化为实际模型,然后我们可以使用这个模型来实现我们的应用目标。
如果这是你第一次实现一个 NLP 模型,不要感到害怕;我会逐步讲解每一步,并在最后提供代码的链接。为了获得最佳学习体验,我建议你先阅读文章,然后在查看代码的同时,浏览与之相关的文章部分。
那我们开始吧!
Keras:Python 中的简单神经网络
Keras 是一个开源的高级库,用于开发神经网络模型。它由 Google 的深度学习研究员 François Chollet 开发。它的核心原则是使构建神经网络、训练它,然后使用它进行预测的过程对任何具有基础编程知识的人都简单易用,同时仍允许开发者完全自定义 ANN 的参数。
基本上,Keras 实际上只是一个可以运行在不同深度学习框架之上的接口,比如CNTK、Tensorflow 或 Theano。无论使用哪个后端,它的工作方式都是一样的。

Keras API 的分层结构。如图所示,它可以无缝运行在不同的框架之上。
正如我们在上一篇文章中提到的,在神经网络中,每个特定层的节点都会对来自上一层的输出进行加权求和,应用数学函数,然后将结果传递到下一层。
使用 Keras,我们可以创建一个表示每一层的模块,其中这些数学操作和层中的节点数量可以轻松定义。这些不同的层可以通过输入直观的单行代码来创建。
创建 Keras 模型的步骤如下:
步骤 1: 首先,我们必须定义一个网络模型,大多数时候,这将是顺序模型:网络将被定义为一系列层,每层具有其自定义大小和激活函数。在这些模型中,第一层将是输入层,我们需要定义将输入到网络中的输入大小。之后,可以添加更多层并进行自定义,直到达到最终的输出层。
#Define Sequential Model
model = Sequential()
#Create input layer
model.add(Dense(32, input_dim=784))
#Create hidden layer
model.add(Activation('relu'))
#Create Output layer
model.add(Activation('sigmoid'))
步骤 2: 在以这种方式创建网络结构之后,我们需要编译它,这将简单的层序列转变为复杂的矩阵运算组,这些运算组决定了网络的行为。在这里,我们必须定义将用于训练网络的优化算法,并选择需要最小化的损失函数。
#Compiling the model with a mean squared error loss and RMSProp #optimizer
model.compile(optimizer='rmsprop',loss='mse')
步骤 3: 一旦完成,我们可以训练或拟合网络,这将使用上一篇文章中提到的反向传播算法完成。
*# Train the model, iterating on the data in batches of 32 samples* model.fit(data, labels, epochs=10, batch_size=32)
步骤 4: 太棒了!我们的网络已经训练好了。现在我们可以用它对新数据进行预测。
正如你所看到的,使用 Keras 构建网络非常简单,所以让我们开始并使用它来创建我们的聊天机器人吧!上述代码块并不代表实际的具体神经网络模型,它们只是帮助说明如何使用 Keras API 简单地构建神经网络的每一步的示例。
你可以在其官方网站上找到所有关于 Keras 的文档以及如何安装它的信息。
项目:使用递归神经网络构建一个聊天机器人
现在我们知道了所有这些不同类型的神经网络,让我们使用它们来构建一个聊天机器人,它可以回答我们的一些问题!
大多数时候,神经网络的结构比标准的输入-隐藏层-输出更复杂。有时我们可能会想要自己设计一个神经网络,并尝试不同的节点或层组合。此外,在某些情况下,我们可能会想要实现我们在某处看到的模型,比如在科学论文中。
在这篇文章中,我们将通过一个例子来说明这种第二种情况,并**构建来自论文“端到端记忆网络”**的神经模型,由 Sukhbaatar 等人编写(你可以在这里找到)。
我们还将看到如何保存训练好的模型,以便在使用我们构建的模型进行预测时无需每次都重新训练网络。那么我们开始吧!
模型:灵感
如前所述,本篇文章中使用的 RNN 来源于论文“End to End Memory Networks”,因此建议你在继续之前先查看一下,尽管我会在接下来的内容中解释最相关的部分。
本文实现了一个类似 RNN 的结构,使用注意力模型来弥补我们在前一篇文章中讨论的 RNN 的长期记忆问题。
不知道什么是注意力模型?不用担心,我会用简单的术语来解释。注意力模型引起了很多关注,因为它们在机器翻译等任务中取得了很好的结果。它们解决了之前提到的长序列和 RNN 的短期记忆问题。
为了获取注意力的直观理解,想象一下一个人类如何翻译一个长句子从一种语言到另一种语言。而不是一次性翻译整句话,你会将句子拆分成更小的部分,然后逐一翻译这些小块。我们逐部分处理句子,因为一次性记住整个句子真的很困难。

人类如何将上面的文本从英语翻译成西班牙语
注意力机制正是实现了这一点。在每个时间步,t模型会在输出中对输入句子中与任务相关性更高的部分赋予更大的权重。这就是名字的由来:它关注重要的部分。上面的例子很好的说明了这一点;为了翻译句子的第一部分,查看整个句子或最后一部分几乎没有意义。
下图展示了RNN 与 Attention 模型在输入句子长度增加时的表现。当面对一个非常长的句子并要求执行特定任务时,RNN 在处理完所有句子后可能已经忘记了最初的输入。

RNN 和注意力模型的性能与句子长度的关系。
好了,现在我们知道什么是注意力模型了,我们来详细看看我们将使用的模型结构。这个模型接收输入 xi(一个句子),一个查询 q关于这个句子的,并输出一个是/否的答案 a。

左侧(a)是模型单层的表示。右侧(b)是堆叠在一起的 3 层。
在之前图像的左侧部分,我们可以看到该模型的单层表示。每个句子计算两个不同的嵌入,A 和 C。同时,查询或问题 q 也被嵌入,使用 B 嵌入。
A 嵌入的 mi,然后通过与问题嵌入 u 的内积计算(这是进行注意力机制的部分,通过计算这些嵌入之间的内积,我们实际上是在寻找查询和句子中的词汇匹配,然后使用Softmax 函数对点积结果进行加权)。
最后,我们使用来自 C 的嵌入 (ci) 和从点积获得的权重或概率 pi 计算输出向量 o。有了这个输出向量 o、权重矩阵 W 和问题的嵌入 u,我们最终可以计算预测答案 a hat。
为了构建整个网络,我们只需在不同层上重复这些过程,使用一个层的预测输出作为下一个层的输入。这在之前图像的右侧部分展示了。
如果所有这些内容对你来说来得太快,不用担心,希望在我们通过不同步骤在 Python 中实现这个模型时,你会有更好、更完整的理解。
数据:故事、问题和答案
2015 年,Facebook 提出了bAbI 数据集及 20 个用于测试文本理解和推理的任务,这些任务在 bAbI 项目中进行。任务的详细描述可以在论文中找到这里。**
每个任务的目标是挑战机器文本相关活动的独特方面,测试学习模型的不同能力。在这篇文章中,我们将面临其中一个任务,特别是“具有单一支持事实的 QA”。
下方的块展示了这种 QA 机器人期望的行为示例:
FACT: Sandra went back to the hallway. Sandra moved to the office. QUESTION: Is Sandra in the office?ANSWER: yes
数据集已分为训练数据(10k 实例) 和 测试数据(1k 实例),每个实例包含一个事实、一个问题和对该问题的“是/否”答案。
现在我们已经了解了数据的结构,我们需要构建一个词汇表。在自然语言处理模型中,词汇表基本上是一个模型了解并能够理解的词汇集合。如果在构建词汇表后,模型在句子中看到一个词不在词汇表中,它将给该词在句子向量中的值设为 0,或者将其表示为未知。
VOCABULARY:
'.', '?', 'Daniel', 'Is', 'John', 'Mary', 'Sandra', 'apple','back','bathroom', 'bedroom', 'discarded', 'down','dropped','football', 'garden', 'got', 'grabbed', 'hallway','in', 'journeyed', 'kitchen', 'left', 'milk', 'moved','no', 'office', 'picked', 'put', 'the', 'there', 'to','took', 'travelled', 'up', 'went', 'yes'
由于我们的训练数据变化不大(大多数问题使用相同的动词和名词,但组合不同),我们的词汇表不是很大,但在中等规模的 NLP 项目中,词汇表可能非常庞大。
请注意,为了构建词汇表,我们大多数时候只应该使用训练数据;测试数据应该从一开始就与训练数据分开,直到评估所选择和调整的模型性能时才触碰。
构建词汇表后,我们需要向量化我们的数据。由于我们使用的是普通单词作为模型的输入,而计算机在底层只能处理数字,我们需要一种方式来表示我们的句子,即单词组,作为数字向量。向量化就是做这件事的。
向量化句子的方式有很多种,比如词袋模型或Tf-Idf,然而,为了简便,我们将只使用一种索引向量化技术,即给词汇表中的每个单词分配一个从 1 到词汇表长度的唯一索引。
VECTORIZATION INDEX:
'the': 1, 'bedroom': 2, 'bathroom': 3, 'took': 4, 'no': 5, 'hallway': 6, '.': 7, 'went': 8, 'is': 9, 'picked': 10, 'yes': 11, 'journeyed': 12, 'back': 13, 'down': 14, 'discarded': 15, 'office': 16, 'football': 17, 'daniel': 18, 'travelled': 19, 'mary': 20, 'sandra': 21, 'up': 22, 'dropped': 23, 'to': 24, '?': 25, 'milk': 26, 'got': 27, 'in': 28, 'there': 29, 'moved': 30, 'garden': 31, 'apple': 32, 'grabbed': 33, 'kitchen': 34, 'put': 35, 'left': 36, 'john': 37}
请注意,这种向量化是使用随机种子开始的,因此即使你使用与我相同的数据,你可能会得到每个单词的不同索引。不要担心;这不会影响项目的结果。此外,我们的词汇表中的单词有大写和小写;在进行这种向量化时,为了统一性,所有单词都被转为小写。
在这之后,由于 Keras 的工作方式,我们需要对句子进行填充。这是什么意思?这意味着我们需要找到最长句子的长度,将每个句子转换为该长度的向量,并用零填充每个句子的单词数量与最长句子的单词数量之间的差距。
完成后,数据集中的一个随机句子应该是这样的:
FIRST TRAINING SENTENCE VECTORIZED AND PADDED:
array([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 20, 30, 24, 1, 3, 7, 21, 12, 24, 1, 2, 7])
如我们所见,它到处都是零,除了末尾(这个句子比最长句子短很多),那里有一些数字。这些数字是什么?嗯,它们是代表句子中不同单词的索引:20 是代表单词Mary的索引,30 是moved,24 是to*,1 是the,3 代表bathroom,依此类推。实际句子是:
FIRST TRAINING SENTENCE:
"Mary moved to the bathroom . Sandra journeyed to the bedroom ."
好的,既然我们已经准备好了数据,我们现在可以开始构建我们的神经网络了!
神经网络:构建模型
创建网络的第一步是在 Keras 中创建被称为占位符的输入,在我们的案例中是故事和问题。简单来说,这些占位符是容器,批量的训练数据会被放置在这些容器中,然后再输入到模型中。
*#Example of a Placeholder
question = Input((max_question_len,batch_size))*
它们必须具有与将要输入的数据相同的维度,并且还可以定义一个批量大小,尽管如果在创建占位符时不知道这个值,我们可以留空。
现在我们需要创建论文中提到的嵌入,A, C 和 B。嵌入将一个整数(在本例中是单词的索引)转换为d维向量,其中考虑了上下文。单词嵌入在自然语言处理(NLP)中被广泛使用,并且是近年来使这一领域取得显著进展的技术之一。
#Create input encoder A:
input_encoder_m = Sequential()
input_encoder_m.add(Embedding(input_dim=vocab_len,output_dim = 64))
input_encoder_m.add(Dropout(0.3))#Outputs: (Samples, story_maxlen,embedding_dim) -- Gives a list of #the lenght of the samples where each item has the
#lenght of the max story lenght and every word is embedded in the embbeding dimension
上面的代码是论文中完成的一个嵌入(A 嵌入)的示例。像往常一样,在Keras中,我们首先定义模型(Sequential),然后添加嵌入层和一个丢弃层,通过触发网络节点的关闭来减少模型过拟合的机会。
一旦我们创建了输入句子的两个嵌入和问题的嵌入,我们可以开始定义模型中发生的操作。如前所述,我们通过计算问题的嵌入和故事嵌入之间的点积来计算注意力,然后进行 softmax。下面的代码块展示了如何实现这一点:
match = dot([input_encoded_m,question_encoded], axes = (2,2))
match = Activation('softmax')(match)
接下来,我们需要计算输出o,将匹配矩阵与第二个输入向量序列相加,然后使用这个输出和编码的问题来计算响应。
response = add([match,input_encoded_c])
response = Permute((2,1))(response)
answer = concatenate([response, question_encoded])
最后,完成这一过程后,我们将添加模型的其余层,包括一个LSTM层(而不是像论文中提到的 RNN)、一个丢弃层和一个最终的 softmax 来计算输出。
answer = LSTM(32)(answer)
answer = Dropout(0.5)(answer)
#Output layer:
answer = Dense(vocab_len)(answer)
#Output shape: (Samples, Vocab_size) #Yes or no and all 0s
answer = Activation('softmax')(answer)
请注意,这里的输出是一个词汇表大小的向量(即模型已知的单词数量的长度),其中所有位置应该是零,除了**‘yes’ 和 ‘no’**的索引位置。
从数据中学习:训练模型
现在我们准备好编译模型并进行训练了!
model = Model([input_sequence,question], answer)
model.compile(optimizer='rmsprop', loss = 'categorical_crossentropy', metrics = ['accuracy'])
使用这两行代码我们构建最终模型并编译它,也就是通过指定一个优化器、一个损失函数和一个度量标准来定义后台的所有数学运算。
现在是训练模型的时候,在这里我们需要定义训练的输入(即输入故事、问题和答案)、批量大小(即一次输入的数量)和训练轮数(即模型将通过训练数据的次数以更新权重)。我使用了 1000 轮训练,并获得了 98%的准确率,但即使使用 100 到 200 轮,你也应该能获得相当不错的结果。
请注意,根据你的硬件,这个训练可能需要一段时间。放轻松,坐下来,继续阅读 Medium,等到训练完成。
训练完成后,你可能会想*“每次使用模型时我都需要等待这么久吗?”* 明显的答案是,不。Keras 允许开发者保存特定的模型,包括权重和所有配置。下面的代码块展示了如何实现这一点。
filename = 'medium_chatbot_1000_epochs.h5'
model.save(filename)
现在,当我们想要使用模型时,可以像这样加载它:
model.load_weights('medium_chatbot_1000_epochs.h5')
很酷。现在我们已经训练了模型,让我们看看它在新数据上的表现,并玩一玩吧!
看到结果:测试和玩耍
让我们看看我们的模型在测试数据上的表现吧!
pred_results = model.predict(([inputs_test,questions_test]))
这些结果是一个数组,如前所述,包含每个词汇位置的概率,表示每个词是问题答案的概率。如果我们查看这个数组的第一个元素,我们会看到一个词汇表大小的向量,其中所有的值接近 0,除了对应于yes 或 no的值。
从这些中,如果我们选择数组中最大值的索引,然后查看它对应的单词,我们应该找出答案是肯定的还是否定的。
现在我们可以做一件有趣的事,那就是创建我们自己的故事和问题,并将其输入到机器人中,看看它会怎么说!
my_story = 'Sandra picked up the milk . Mary travelled left . '
my_story.split()
my_question = 'Sandra got the milk ?'
my_question.split()
我创建了一个故事和一个问题,某种程度上类似于我们的小机器人之前见过的内容,并在将其调整为神经网络希望的格式后,机器人回答了‘yes’(虽然是小写的,他不像我那样热情)。
我们换点不同的东西试试:
my_story = 'Medium is cool . Jaime really likes it. '
my_story.split()
my_question = 'Does Jaime like Medium ?'
my_question.split()
这次的回答是:‘当然了,谁不呢?’
只是开个玩笑,我没有尝试那个故事/问题组合,因为包含的许多词汇不在我们小回答机器的词汇表中。而且,它只会说‘yes’和‘no’,通常不会给出其他答案。不过,通过更多的训练数据和一些变通方法,这是可以轻松实现的。
今天就到这里!我希望你们阅读这篇文章和我写它时一样开心。祝你们一天愉快,保重,并享受人工智能!
你可以在我的Github页面找到代码和数据。
其他资源:
如果你想深入了解注意力模型,或者理解我提到的一些词向量化技术,查看我为你整理的这些额外资源吧。祝好运!
随时可以在LinkedIn上与我联系,或在 Twitter 上关注我@jaimezorno。同时,你也可以查看我在数据科学和机器学习方面的其他文章这里。阅读愉快!
简介:Jaime Zornoza 是一位工业工程师,拥有电子学学士学位和计算机科学硕士学位。
原文。经许可转载。
相关:
-
深度学习 NLP:ANNs、RNNs 和 LSTMs 解释!
-
训练神经网络以模仿洛夫克拉夫特风格写作
-
适配器:一种紧凑且可扩展的 NLP 转移学习方法
我们的前三大课程推荐
1. Google 网络安全证书 - 快速进入网络安全职业生涯。
2. Google 数据分析专业证书 - 提升你的数据分析技能
3. Google IT 支持专业证书 - 支持你的组织的 IT 部门
更多相关话题
几分钟内使用这个预配置的 Python VM 镜像进行深度学习
原文:
www.kdnuggets.com/2017/05/deep-learning-pre-configured-python-vm-image.html
Adam Geitgey在他的博客中撰写有关机器学习、深度学习、图像和语音识别及相关主题的文章。他既讲理论也讲实践,并重点介绍了开发者如何快速开始使用这些技术。Geitgey 表示:
但我收到的最常见问题是“我到底怎么才能在我的计算机上安装并运行所有这些开源库?”

为此,Geitgey 整理了一个虚拟机镜像,他在这篇近期文章中进行了介绍。基于 Ubuntu Linux Desktop 16.04 LTS 64-bit,这个镜像包括了以下工具和库:
-
Python 3.5
-
带有 Python 3 绑定的 OpenCV 3.2
-
带有 Python 3 绑定的 dlib 19.4
-
Python 3 的 TensorFlow 1.0
-
Keras 2.0 for Python 3
-
Theano
-
Python 3 的 face_recognition(用于人脸识别的玩耍)
它还包括了一些预制的项目,以便立即上手:
如果你从左侧边栏启动 PyCharm Community Edition,将会看到几个预创建的项目可以打开。尝试运行 face_recognition、OpenCV 或 Keras 项目的一些演示。在代码窗口上右键点击并选择“运行”,以在 PyCharm 中运行当前文件。
阅读关于这个镜像的更多信息这里 – 包括下载和安装说明、用户名和密码信息,以及一些使用技巧 – 并从这里直接获取镜像。
一旦你启动了虚拟机,开始的一个很好的地方就是 Geitgey 的“机器学习是有趣的”系列文章:
相关:
-
一台深度学习虚拟机统治一切
-
如何在 TensorFlow 中构建递归神经网络
-
与 Python 机器学习的游击指南
我们的前三大课程推荐
1. 谷歌网络安全证书 - 加速你的网络安全职业生涯。
2. 谷歌数据分析专业证书 - 提升你的数据分析技能
3. 谷歌 IT 支持专业证书 - 支持你的组织的 IT 需求
了解更多相关话题
使用 R 进行深度学习

图片来源于 Bing 图片创作者
介绍
我们的前三个课程推荐
1. 谷歌网络安全证书 - 快速进入网络安全职业生涯
2. 谷歌数据分析专业证书 - 提升你的数据分析技能
3. 谷歌 IT 支持专业证书 - 支持你组织的 IT 需求
谁没有被特别是 人工智能 的技术进步所吸引,从 Alexa 到特斯拉的自动驾驶汽车以及无数其他创新?我每天都对这些进展感到惊叹,但更有趣的是,当你了解支撑这些创新的基础时。欢迎来到 人工智能 和 深度学习 的无限可能。如果你一直在想这是什么,那么你来对地方了。
在本教程中,我将深入剖析术语,并带你了解如何在 R 中执行深度学习任务。需要注意的是,本文假设你对 机器学习 概念有一些基础了解,例如 回归、分类和 聚类。
让我们从一些围绕深度学习概念的术语定义开始:
深度学习 是机器学习的一个分支,教会计算机模拟人脑的认知功能。这是通过使用人工神经网络来解开数据集中的复杂模式来实现的。通过深度学习,计算机可以对声音、图像甚至文本进行分类。
在深入了解深度学习的细节之前,了解机器学习和人工智能是什么以及这三者如何相互关联是很有帮助的。
人工智能:这是计算机科学的一个分支,关注开发模拟人脑功能的机器。
机器学习:这是人工智能的一个子集,使计算机能够从数据中学习。
根据以上定义,我们现在对深度学习如何与人工智能和机器学习相关有了一个概念。
下面的图示将帮助展示这些关系。

关于深度学习,有两个关键点需要注意:
-
需要大量的数据
-
需要高性能的计算能力
神经网络
这些是深度学习模型的构建块。正如名称所示,神经一词来源于神经元,就像人脑中的神经元一样。实际上,深度神经网络的结构灵感来自于人脑的结构。
一个神经网络有一个输入层、一个隐藏层和一个输出层。这个网络被称为浅层神经网络。当我们有多个隐藏层时,它就成为了深层神经网络,其中层数可以多达 100 层。
下图展示了神经网络的样子。

这就引出了一个问题:如何在 R 中构建深度学习模型?答案是 kera!
Keras是一个开源深度学习库,使得在机器学习中使用神经网络变得简单。这个库是一个包装器,使用TensorFlow作为后端引擎。然而,也有其他后端选项,如 Theano 或 CNTK。
现在让我们安装TensorFlow和 Keras。
从使用 reticulate 创建虚拟环境开始
library(reticulate)
virtualenv_create("virtualenv", python = "/path/to/your/python3")
install.packages(“tensorflow”) #This is only done once!
library(tensorflow)
install_tensorflow(envname = "/path/to/your/virtualenv", version = "cpu")
install.packages(“keras”) #do this once!
library(keras)
install_keras(envname = "/path/to/your/virtualenv")
# confirm the installation was successful
tf$constant("Hello TensorFlow!")
现在我们的配置已经设置好,我们可以开始探讨如何使用深度学习解决分类问题。
数据简介
我将用于本教程的数据来自一个正在进行的薪资调查,该调查由www.askamanager.org进行。
表单中主要询问的是你赚多少钱,另外还有一些细节,比如行业、年龄、工作经验年数等。这些细节被收集到一个 Google 表单中,我从中获取了数据。
我们希望解决的问题是能够构建一个深度学习模型,该模型可以根据年龄、性别、工作经验年数和最高学历等信息预测某人的潜在收入。
加载我们需要的库。
library(dplyr)
library(keras)
library(caTools)
导入数据
url <- “https://raw.githubusercontent.com/oyogo/salary_dashboard/master/data/salary_data_cleaned.csv”
salary_data <- read.csv(url)
选择我们需要的列
salary_data <- salary_data %>% select(age,professional_experience_years,gender,highest_edu_level,annual_salary)
数据清理
还记得计算机科学中的 GIGO 概念吗?(垃圾进,垃圾出)。这个概念在这里同样适用,就像在其他领域一样。我们的训练结果在很大程度上依赖于我们使用的数据质量。这就是为什么数据清理和转换在任何数据科学项目中都至关重要。
数据清理旨在解决的一些关键问题包括;一致性、缺失值、拼写问题、异常值和数据类型。我不会详细讲解这些问题是如何处理的,这只是为了避免偏离本文的主题。因此,我将使用清理后的数据版本,但如果你有兴趣了解清理的处理方法,可以查看这篇文章。
数据转换
人工神经网络仅接受数值变量,而由于我们的一些变量是分类性质的,我们需要将这些变量编码为数字。这是 数据预处理 步骤的一部分,因为通常情况下,你不会得到已经准备好建模的数据。
# create an encoder function
encode_ordinal <- function(x, order = unique(x)) {
x <- as.numeric(factor(x, levels = order, exclude = NULL))
}
salary_data <- salary_data %>% mutate(
highest_edu_level = encode_ordinal(highest_edu_level, order = c("High School","College degree","Master's degree","Professional degree (MD, JD, etc.)","PhD")),
professional_experience_years = encode_ordinal(professional_experience_years,
order = c("1 year or less", "2 - 4 years","5-7 years", "8 - 10 years", "11 - 20 years", "21 - 30 years", "31 - 40 years", "41 years or more")),
age = encode_ordinal(age, order = c( "under 18", "18-24","25-34", "35-44", "45-54", "55-64","65 or over")),
gender = case_when(gender== "Woman" ~ 0,
gender == "Man" ~ 1))
看到我们想要解决一个分类问题,我们需要将年薪分成两类,以便将其作为响应变量使用。
salary_data <- salary_data %>%
mutate(categories = case_when(
annual_salary <= 100000 ~ 0,
annual_salary > 100000 ~ 1))
salary_data <- salary_data %>% select(-annual_salary)
切分数据
与基本的机器学习方法(回归、分类和聚类)一样,我们需要将数据分成训练集和测试集。我们使用 80-20 规则,即将 80% 的数据集用于训练,20% 用于测试。这并不是一成不变的,你可以根据需要选择任何拆分比例,但请记住,训练集应该占有足够的百分比。
set.seed(123)
sample_split <- sample.split(Y = salary_data$categories, SplitRatio = 0.7)
train_set <- subset(x=salary_data, sample_split == TRUE)
test_set <- subset(x = salary_data, sample_split == FALSE)
y_train <- train_set$categories
y_test <- test_set$categories
x_train <- train_set %>% select(-categories)
x_test <- test_set %>% select(-categories)
Keras 接受矩阵或数组形式的输入。我们使用 as.matrix 函数进行转换。此外,我们需要缩放预测变量,然后将响应变量转换为分类数据类型。
x <- as.matrix(apply(x_train, 2, function(x) (x-min(x))/(max(x) - min(x))))
y <- to_categorical(y_train, num_classes = 2)
实例化模型
创建一个顺序模型,然后我们将使用管道操作符添加层。
model = keras_model_sequential()
配置层
input_shape 指定输入数据的形状。在我们的情况下,我们使用 ncol 函数获得了这一点。activation:在这里我们指定激活函数;这是一个将输出转换为所需非线性格式的数学函数,然后传递到下一层。
units:神经网络每层中的神经元数量。
model %>%
layer_dense(input_shape = ncol(x), units = 10, activation = "relu") %>%
layer_dense(units = 10, activation = "relu") %>%
layer_dense(units = 2, activation = "sigmoid")
配置模型学习过程
我们使用 compile 方法来完成这项工作。该函数接受三个参数;
optimizer:该对象指定训练过程。loss:这是优化过程中要最小化的函数。可选项有 mse(均方误差)、binary_crossentropy 和 categorical_crossentropy。
metrics:我们用来监控训练的指标。分类问题的准确率。
model %>%
compile(
loss = "binary_crossentropy",
optimizer = "adagrad",
metrics = "accuracy"
)
模型拟合
我们现在可以使用 Keras 的 fit 方法来拟合模型。fit 接受的一些参数包括:
epochs:一个 epoch 是对训练数据集的迭代。
batch_size:模型将传递给它的矩阵/数组切成更小的批次,然后在训练期间进行迭代。
validation_split:Keras 需要切分一部分训练数据,以获取用于评估模型每个周期性能的验证集。
shuffle:在这里你可以指示是否希望在每个周期之前打乱训练数据。
fit = model %>%
fit(
x = x,
y = y,
shuffle = T,
validation_split = 0.2,
epochs = 100,
batch_size = 5
)
评估模型
要获取模型的准确度值,请使用以下的 evaluate 函数。
y_test <- to_categorical(y_test, num_classes = 2)
model %>% evaluate(as.matrix(x_test),y_test)
预测
要对新数据进行预测,请使用 keras 库中的 predict_classes 函数,如下所示。
model %>% predict(as.matrix(x_test))
结论
本文向你介绍了使用 Keras 在 R 中进行深度学习的基础知识。你可以深入学习以获得更好的理解,尝试调整参数,动手进行数据准备,或许还可以通过利用云计算的力量来扩展计算。
Clinton Oyogo 是 Saturn Cloud 的作者,他认为分析数据以获取可操作的见解是他日常工作中的关键部分。凭借在数据可视化、数据处理和机器学习方面的技能,他为自己作为数据科学家的工作感到自豪。
原文。经许可转载。
进一步阅读
为什么深度学习与机器学习截然不同
原文:
www.kdnuggets.com/2016/12/deep-learning-radically-different-machine-learning.html
评论

现在关于人工智能(AI)、机器学习(ML)和深度学习(DL)的混淆很多。确实,关于 AI 作为一种竞争性游戏改变者的文章急剧增加,企业应该开始认真探索这些机会。对于这些领域的从业者来说,AI、ML 和 DL 之间的区别非常明确。AI 是一个涵盖从传统人工智能(GOFAI)到类似深度学习的连接主义架构的全包范围。ML 是 AI 的一个子领域,涵盖了与通过数据训练学习算法研究相关的一切。多年来,已经开发出大量的技术,例如线性回归、K-means、决策树、随机森林、PCA、SVM,最后是人工神经网络(ANN)。人工神经网络是深度学习领域的起源所在。
一些具有人工神经网络(ANN)先验经验的 ML 从业者,毕竟它是在 60 年代初发明的,最初会认为深度学习不过是具有多层的 ANN。进一步说,DL 的成功更多地归因于数据的增加以及像图形处理单元(GPU)这样更强大的计算引擎的出现。这当然是正确的,DL 的出现确实归功于这两项进步,然而将 DL 仅仅视为比 SVM 或决策树更好的算法,就像只看到树木而看不到森林一样。
引用 Andreesen 的话“软件正在吞噬世界”,可以说“深度学习正在吞噬机器学习”。来自不同机器学习领域的从业者的两篇出版物最恰当地总结了为什么 DL 正在占领世界。NLP 领域的专家 Chris Manning 写道 “深度学习的巨浪”:
深度学习的波涛已经冲击了计算语言学的海岸多年,但 2015 年似乎是巨浪全面袭击主要自然语言处理(NLP)会议的一年。然而,一些专家预测最终的损害可能会更严重。
Nicholas Paragios 在 “计算机视觉研究:深度的低谷” 中写道:
这可能仅仅是因为深度学习在高度复杂、自由度极高的图上,一旦拥有大量标注数据和近期才出现的不可思议的计算能力,就可以解决所有计算机视觉问题。如果是这样,那么行业(似乎已经是这种情况)接管只是时间问题,计算机视觉研究将成为边缘的学术目标,该领域将沿着计算机图形学(在活动和学术研究量方面)的发展路径前进。
这两篇文章确实强调了深度学习领域对传统机器学习实践的根本性颠覆。当然,它在商业世界中也应该同样具有颠覆性。然而,我对即使是 Gartner 也未能识别机器学习与深度学习之间的区别感到震惊和困惑。以下是 Gartner 2016 年 8 月的炒作周期图,深度学习甚至没有被提及:

真是个悲剧!他们的客户对机器学习有狭隘的看法,结果将被深度学习盲目冲击,这几乎是犯罪。
不管怎样,尽管被忽视,深度学习(DL)依然持续被炒作。目前的深度学习炒作倾向于认为我们拥有这些商品化的机器,只要有足够的数据和训练时间,就能自我学习。这当然要么是对最先进技术能力的夸张,要么是对实际深度学习实践的过度简化。在过去几年里,深度学习催生了大量以前未知或被认为不可行的思想和技术。最初,这些概念似乎是零散和不相关的。然而,随着时间的推移,模式和方法开始显现,我们正拼命尝试在“深度学习设计模式”中覆盖这些领域。

现今的深度学习不仅仅是多层感知机,而是用于构建可组合的可微分架构的一系列技术和方法。这些是极其强大的机器学习系统,我们现在只是看到了冰山一角。关键在于,深度学习今天可能看起来像炼金术,但我们最终会学会像化学一样实践它。也就是说,我们将拥有更坚实的基础,以便能够以更大的可预测性构建我们的学习机器。
顺便提一下,如果你有兴趣了解深度学习如何帮助你的工作,请随时在此留下你的电子邮件:www.intuitionmachine.com 或加入 Facebook 讨论:www.facebook.com/groups/deeplearningpatterns/
个人简介:Carlos Perez 是一名软件开发人员,目前正在撰写一本关于“深度学习设计模式”的书。这是他从中获取博客文章灵感的来源。
原文。经许可转载。
相关:
-
深度学习的不足之处
-
深度学习研究回顾:强化学习
-
预测科学与数据科学
我们的前三个课程推荐
1. 谷歌网络安全证书 - 快速进入网络安全职业轨道。
2. 谷歌数据分析专业证书 - 提升你的数据分析技能
3. 谷歌 IT 支持专业证书 - 支持你的组织的 IT 工作
更多相关内容
深度学习阅读组:图像识别中的深度残差学习
原文:
www.kdnuggets.com/2016/09/deep-learning-reading-group-deep-residual-learning-image-recognition.html

今天的论文提出了一种新的卷积网络架构。这篇论文由微软研究院的 He、Zhang、Ren 和 Sun 撰写。我要在开始之前警告你:这篇论文非常古老。它发布于 2015 年底深度学习的黑暗时代,我相当确定它的原始格式是莎草纸;幸运的是,有人扫描了它,以便未来几代人可以阅读。然而,它仍然值得抹去尘土并翻阅,因为它提出的架构已经被反复使用,包括在我们之前阅读的一些论文中:具有随机深度的深度网络。
He et al. 开始时指出了一个看似矛盾的情况:非常深的网络表现比中等深度的网络更差,也就是说,尽管增加网络的层数通常会提高性能,但在某些点之后,新层开始阻碍网络。他们将这种效应称为网络降级。
如果你一直关注我们的之前的帖子,这不会让你感到惊讶;随着网络变得更深,诸如梯度消失等训练问题会变得更严重,因此你会期望更多的层会在某个点之后使网络表现变差。但作者预见了这种推理,并指出几种其他深度学习方法,如批量归一化(参见我们的帖子的总结),基本上解决了这些训练问题,但网络的表现仍然随着深度的增加而变得越来越差。例如,他们比较了 20 层和 56 层的网络,并发现 56 层网络表现远不如 20 层;见下图。

20 层和 56 层网络在 CIFAR-10 上的比较。注意 56 层网络在训练和测试中的表现都较差。
然后作者设立了一个思想实验(或者说思想实验如果你像我一样是一个恢复中的物理学家)来证明更深的网络应该总是表现更好。他们的论点如下:
-
从一个表现良好的网络开始;
-
添加强制为恒等函数的额外层,即,它们只是传递到达它们的任何信息而不进行更改;
-
这个网络更深,但必须与原始网络具有相同的性能,因为新层没有做任何事情。
-
网络中的层可以学习恒等函数,因此如果它是最优的,它们应该能够准确复制这个深层网络的性能。
这个思想实验促使他们提出了深度残差学习架构。他们构建了他们所谓的残差构建块网络。下图展示了其中一个这样的块。这些块被称为 ResBlocks。

一个 ResBlock;顶部学习一个残差函数 f(x),而底部的信息保持不变。图像改编自黄等人的随机深度论文。
ResBlock 由普通网络层构建,这些层通过线性整流单元(ReLUs)连接,并且在下面有一个通过的连接,保持来自先前层的信息不变。ResBlock 的网络部分可以包含任意数量的层,但最简单的情况是两层。
要了解 ResBlock 背后的数学:假设一组层如果学习一个特定的函数h(x),将表现最好。作者指出,可以学习残差f(x) = h(x) − x,然后将其与原始输入结合,以恢复h(x),如下所示:h(x) = f(x) + x。这可以通过向网络中添加一个*+x*组件来实现,回想一下我们的思想实验,这只是恒等函数。作者希望将这种“传递”添加到他们的层中将有助于训练。与大多数深度学习一样,这种方法只有直观的支持,而没有更深层次的理解。然而,正如作者所展示的,它确实有效,而这正是许多从业者所关心的唯一问题。
论文还探讨了对 ResBlock 的一些修改。第一个是创建具有三层的瓶颈块,其中中间层通过使用较少的输入和输出来限制信息流。第二个是测试不同类型的传递连接,包括学习完整的投影矩阵。尽管更复杂的传递连接性能更好,但只是略微提高,而且训练时间成本更高。
论文的其余部分测试了网络的性能。作者发现,他们的网络在使用通行功能后表现优于没有通行功能的相同网络;请参见下图的绘图以了解这一点。他们还发现,能够训练更深层的网络,并且仍然表现出改进的性能,最终训练了一个 152 层的 ResNet,表现优于较浅的网络。他们甚至训练了一个 1202 层的网络以证明其可行性,但发现其性能不如论文中检查的其他网络。

两个网络性能的比较:左侧的网络不使用 ResBlocks,而右侧的网络使用了。注意 34 层的网络比 18 层的网络表现更好,但仅在使用 ResBlocks 时。
就这样!他 et al. 提出了一个新的架构,受到思想实验的启发,并希望它能比以前的架构表现更好。他们构建了几个网络,包括一些非常深的网络,发现他们的新架构确实改善了网络的性能。虽然我们对深度学习的基本原理没有获得进一步的理解,但我们确实获得了一种使网络表现更好的新方法,最终也许这已经足够好。
亚历山大·古德 目前是 Lab41 的数据科学家,研究推荐系统算法。他拥有加州大学伯克利分校的物理学学士学位和明尼苏达大学双城分校的基础粒子物理学博士学位。
Lab41 是一个“挑战实验室”,美国情报界与学术界、工业界以及 In-Q-Tel 的同行共同合作,解决大数据问题。它允许来自不同背景的参与者接触思想、人才和技术,以探索数据分析中有效和无效的方面。作为一个开放、协作的环境,Lab41 促进了参与者之间的宝贵关系。
原文。经许可转载。
相关内容:
-
在深度学习中,架构工程是新的特征工程
-
深度学习进展:七月更新
-
深度学习网络为何会扩展?
我们的前三个课程推荐
1. 谷歌网络安全证书 - 快速入门网络安全职业。
2. 谷歌数据分析专业证书 - 提升你的数据分析能力
3. 谷歌 IT 支持专业证书 - 支持你的组织的 IT 需求
更多相关内容
深度学习阅读小组:SqueezeNet
原文:
www.kdnuggets.com/2016/09/deep-learning-reading-group-squeezenet.html
作者:Abhinav Ganesh,Lab41。

下一篇论文来自我们的阅读小组,由 Forrest N. Iandola、Matthew W. Moskewicz、Khalid Ashraf、Song Han、William J. Dally 和 Kurt Keutzer 共同撰写。该论文介绍了一种名为“SqueezeNet”的小型 CNN 架构,在 ImageNet 上实现了与 AlexNet 相当的准确率,但参数数量减少了 50 倍。正如你可能已经注意到的,我们对神经网络架构的压缩非常感兴趣,这篇论文确实很突出。
深度学习的难点之一就是参数调优的地狱。这篇论文提倡增加对卷积神经网络设计领域的研究,以大幅减少你需要处理的参数数量。与我们之前的关于“深度压缩”的帖子不同,这篇论文建议通过从更智能的设计开始来缩小网络规模,而不是使用巧妙的压缩方案。作者概述了减少参数大小而最大化准确性的三种主要策略。我现在将为你介绍这些策略。
策略 1. 通过用 1x1 卷积核替换 3x3 卷积核来缩小网络
这个策略通过将一堆 3x3 卷积核替换为 1x1 卷积核,从而减少了参数的数量,减少了 9 倍。最初这让我感到非常困惑。我以为移动 1x1 卷积核在图像上时,每个卷积核看到的信息会更少,因此性能会更差,但事实似乎并非如此!通常较大的 3x3 卷积核捕捉的是彼此接近的像素的空间信息。另一方面,1x1 卷积核专注于单个像素,并捕捉其通道之间的关系,而不是邻近像素之间的关系。如果你想了解更多关于 1x1 卷积核的使用,可以查看这篇博客文章。
策略 2. 减少剩余 3x3 卷积核的输入数量
这个策略通过基本上使用更少的卷积核来减少参数数量。这是通过将“压缩”层输入到他们称之为“扩展”层中系统地完成的,如下所示:

“Fire 模块”。图片来源于论文
现在是定义一些仅在这篇论文中出现的术语的时候了!正如你在上面看到的,“squeeze”层是由仅包含 1x1 滤波器的卷积层组成,“expand”层是包含 1x1 和 3x3 滤波器混合的卷积层。通过减少“squeeze”层中进入“expand”层的滤波器数量,他们减少了进入这些 3x3 滤波器的连接数量,从而减少了总参数数量。论文的作者将这种特定的架构称为“火焰模块”,它作为 SqueezeNet 架构的基本构建块。
策略 3. 在网络的后期进行下采样,以便卷积层具有大的激活图。
现在我们已经讨论了减少我们正在处理的参数数量的方法,那么如何充分利用剩余的较小参数集呢?作者认为,通过在后续卷积层中减小步幅,从而在网络后期创建更大的激活/特征图,分类准确性实际上会提高。在网络末尾拥有更大的激活图,与像 VGG这样的网络形成了鲜明对比,在这些网络中,激活图在接近网络末端时会变得更小。这种不同的方法非常有趣,他们引用了一篇 K. He 和 H. Sun 的论文,该论文类似地应用了延迟下采样,从而提高了分类准确性。
那么,这一切是如何结合在一起的呢?
SqueezeNet 利用上述的“火焰模块”,将这些模块串联在一起,从而实现了一个更小的模型。以下是他们论文中展示的这种串联过程的一些变体:

左侧:SqueezeNet;中间:带有简单旁路的 SqueezeNet;右侧:带有复杂旁路的 SqueezeNet。图片来自论文。
我发现这个架构令人惊讶的一点是缺乏全连接层。令人吃惊的是,通常在像 VGG这样的网络中,后期的全连接层学习的是 CNN 早期高层特征与网络试图识别的类别之间的关系。也就是说,全连接层学习的是鼻子和耳朵组成一个脸,而车轮和灯光指示车辆。然而,在这个架构中,这一步额外的学习似乎嵌入在不同“火焰模块”之间的转换中。作者从 NiN 架构中获得了这一想法的灵感。
够详细了!这表现如何?
论文的作者展示了一些令人印象深刻的结果。

SqueezeNet 对比其他 CNN 架构的基准测试。图像来自论文。
他们的 SqueezeNet 架构在模型大小上实现了比 AlexNet 减少 50 倍的效果,同时达到了或超过了 AlexNet 的 Top-1 和 Top-5 准确率。但这篇论文最有趣的部分可能是他们将深度压缩(在我们之前的帖子中进行了讲解)应用于他们已经更小的模型。这种深度压缩的应用使得模型比 AlexNet 小了 510 倍!这些结果非常鼓舞人心,因为它展示了结合不同压缩方法的潜力。作为下一步,我很希望看到这种设计思维如何应用于其他神经网络架构和深度学习应用。
如果这篇论文对你有兴趣,绝对要查看他们在 Github 上的开源代码。我只有时间介绍要点,但他们的论文中充满了关于参数减少 CNN 设计的深入讨论。
Abhinav Ganesh 目前是 Lab41 的工程师,致力于将机器学习应用于网络安全。他拥有卡内基梅隆大学电气与计算机工程的学士和硕士学位。
Lab41 是一个“挑战实验室”,美国情报界与学术界、工业界和 In-Q-Tel 的同行汇聚在一起,解决大数据问题。它允许来自不同背景的参与者获取想法、人才和技术,以探索数据分析中的有效性和不足之处。Lab41 提供了一个开放、协作的环境,促进了参与者之间的宝贵关系。
原文。经许可转载。
相关:
-
深度学习阅读小组:用于图像识别的深度残差学习
-
深入了解深度学习:七月更新
-
理解深度学习的 7 个步骤
我们的前 3 名课程推荐
1. Google 网络安全证书 - 快速进入网络安全职业的快车道。
2. Google 数据分析专业证书 - 提升你的数据分析能力
3. Google IT 支持专业证书 - 支持你的组织在 IT 领域
更多相关内容
深度学习研究综述:强化学习
原文:
www.kdnuggets.com/2016/11/deep-learning-research-review-reinforcement-learning.html/2
DQN 强化学习** (使用 Atari 游戏的 RL)**

介绍
这篇论文由 Google Deepmind 于 2015 年 2 月发表,并登上了世界著名科学周刊《自然》的封面。这是将深度神经网络与强化学习结合起来的首次成功尝试之一(这篇 是 Deepmind 的原始论文)。论文表明,他们的系统能够在 49 款游戏中以与专业游戏测试员相当的水平玩 Atari 游戏。让我们深入了解他们是如何做到的。
方法
好了,记住我们在帖子开头的介绍教程中停留在哪里了吗?我们刚刚描述了优化我们的动作价值函数 Q 的主要目标。Deepmind 的团队通过一个深度 Q 网络,或称 DQN,来处理这个任务。这个网络能够根据来自游戏屏幕的像素和当前分数的输入,制定出优化 Q 的成功策略。
网络架构
让我们更仔细地看看这个 DQN 的输入是什么。考虑 Breakout 游戏,并取当前游戏中的 4 帧最近的图像。每一帧最初是一个 210 x 160 x 3 的图像(因为宽度和高度分别为 210 和 160 像素,是彩色图像)。然后,进行一些预处理,将图像缩放到 84 x 84(了解具体过程并不极其重要,但请查看第 6 页了解详细信息)。所以,现在我们有了一个 84 x 84 x 4 的输入体积。这个体积将被输入到一个卷积神经网络中(教程),经过一系列卷积和 ReLU 层处理。网络的输出是一个 18 维的向量,每个数字是用户可以采取的每个可能动作的 Q 值(向上移动、向下移动、向左移动等)。

好的,让我们稍微退一步,弄清楚如何训练这个网络,使其能够预测准确的 Q 值。首先,让我们回顾一下我们要优化的内容。

这与我们之前看到的 Q 函数形式相同,只不过这个表示的是所有 Q 的最大值 Q*。让我们来研究一下如何获得这个 Q*。现在,记住我们只需要 Q* 的一个近似值,这就是我们的函数逼近器(我们的 Qhats)会派上用场的地方。请在我们稍作转变时保持这个想法。
为了找到最佳策略,我们想要将问题框定为某种监督学习问题,其中预测的 Q 函数与期望的 Q 函数进行比较,然后朝正确的方向调整。为了做到这一点,我们需要一组训练样本。在我们的案例中,我们将需要创建一组经验,这些经验存储了每个时间步的代理状态、动作、奖励和下一个状态。让我们更正式地说明一下。我们有一个回放记忆D,其中包含了(st, at, rt, st+1)的一组不同时间步数据。随着代理与环境的互动增多,这个数据集会逐渐建立。现在,我们将随机抽取这一数据的一个批次(比如 64 个时间步的数据),计算它们的损失函数,然后按照梯度来改进我们的 Q 函数近似。

因此,正如你所见,损失函数旨在优化 Q 网络函数近似(Q(s,a,theta))与Q 学习目标之间的均方误差(MSE)。让我快速解释一下这些。这个 Q 学习目标是奖励 r 加上你可以从某个动作 a’中获得的最大 Q 值(在下一个时间步)。
一旦计算了损失函数,就会对 theta 值(或 w 向量)进行求导。然后更新这些值以最小化损失函数。
结论
这篇论文中我最喜欢的部分之一是它在游戏的某些时刻提供的值函数可视化。

正如你所记得的,值函数基本上是衡量“处于特定情况有多好”的指标。如果你查看#4,你可以看到,根据球的轨迹和砖块的位置,我们可以获得大量的分数,高值函数很好地代表了这一点。
所有 49 个 Atari 游戏使用了相同的网络架构、算法和超参数,这对强化学习方法的稳健性是一个令人印象深刻的见证。深度网络与传统强化学习策略(如 Q 学习)的结合,在为…
掌握 AlphaGo 与 RL

介绍
4-1。这是 Deepmind 的强化学习代理在与世界顶级围棋选手李世石对局时的记录。万一你不知道的话,围棋是一种在棋盘上争夺领土的抽象策略游戏。由于游戏情境和移动方式的数量极为庞大,围棋被认为是世界上最难的 AI 游戏之一。论文开始时对围棋与象棋和跳棋等常见棋盘游戏进行了比较。虽然可以用变体的树搜索算法来攻击这些游戏,但围棋却完全不同,因为在一局游戏中大约有 250150 种不同的移动序列。显然需要强化学习,因此让我们看看 AlphaGo 是如何战胜困难的。
方法
AlphaGo 背后的基础是评估和选择的理念。在任何强化学习问题中(尤其是在棋盘游戏中),你需要一种评估环境或当前棋盘位置的方法。这将是我们的价值网络。然后,你需要一种通过策略网络选择行动的方法。我们确实对这两个术语——价值和策略——有一定的经验。
网络架构
让我们来看一下这两个网络的输入是什么。棋盘位置作为一个 19 x 19 的图像传入,并经过一系列卷积层,以构建当前状态的良好表示。首先,让我们看看我们的 SL(监督学习)策略网络。这个网络将图像作为输入,然后输出一个代理可以采取的所有合法动作的概率分布。这个网络在实际游戏之前已经在 3000 万个不同的围棋棋盘位置上进行了预训练。这些棋盘位置中的每一个都标记了在该情况下专家的最佳移动。团队还训练了一个较小但更快速的回合策略网络。
现在,卷积神经网络(CNN)在给定当前棋盘的表示时,能预测你应该采取的正确动作的能力是有限的。这时,强化学习发挥作用。我们将通过一个叫做策略梯度的过程来改进这个策略网络。还记得在上一篇论文中,我们希望优化我们的动作价值函数 Q 吗?现在,我们直接优化我们的策略(策略梯度的解释比较复杂,但 David Silver 在第七讲中讲得很好)。从高层次来看,策略通过模拟当前策略网络与网络的先前迭代之间的对局来改进。奖励信号为赢得比赛 +1,输掉比赛 -1,因此我们可以通过正常的梯度下降来改进网络。

好的,现在我们有了一个相当不错的网络,它告诉我们最佳的行动步骤。下一步是拥有一个价值网络,预测在棋盘位置 S 上的游戏结果,其中两个玩家都使用策略 P。

为了获得最佳的 V*,我们将使用我们熟悉的带有权重 W 的函数逼近器。这些权重由价值网络训练,训练数据基于状态、结果对(类似于我们在上一篇论文中看到的情况)。
现在我们有了这两个主要网络,我们的最后一步是使用蒙特卡洛树搜索将一切整合起来。MCTS 的基本思想是通过前瞻搜索选择最佳动作,其中树中的每条边存储一个动作值 Q、一个访问计数和一个先验概率。根据这些信息,MCTS 算法将从当前状态中选择最佳动作 A。系统的这一部分略显传统 AI 而少于 RL,因此如果你想了解更多细节,绝对可以查看论文,它会更好地总结这一部分。
结论
一台计算机系统刚刚击败了世界上最优秀的选手,赢得了最难的棋盘游戏之一。谁还需要结论呢?
特别感谢 David Silver 提供方程式和出色的强化学习讲座课程
简历:Adit Deshpande 目前是加州大学洛杉矶分校计算机科学专业的二年级本科生,同时辅修生物信息学。他热衷于将自己在机器学习和计算机视觉方面的知识应用到医疗领域,为医生和患者提供更好的解决方案。
原文。已获授权转载。
相关:
-
深度学习研究综述:生成对抗网络
-
神经网络中的深度学习:概述
-
9 篇关键深度学习论文,解释详解
我们的前三个课程推荐
1. 谷歌网络安全证书 - 快速进入网络安全职业的捷径。
2. 谷歌数据分析专业证书 - 提升你的数据分析能力
3. 谷歌 IT 支持专业证书 - 支持你的组织的 IT 需求
相关主题
深度学习研究回顾:自然语言处理
原文:
www.kdnuggets.com/2017/01/deep-learning-review-natural-language-processing.html/3
记忆网络
简介
我们将讨论的第一篇论文是问答子领域中非常有影响力的出版物。由 Jason Weston、Sumit Chopra 和 Antoine Bordes 撰写,这篇论文介绍了一类称为记忆网络的模型。
直观的想法是,为了准确回答关于一段文本的问题,你需要以某种方式存储给定的信息。如果我问你“RNN 代表什么”,(假设你已经完全阅读了这篇文章 J)你会能够给出答案,因为你通过阅读这篇文章的第一部分吸收的信息被存储在你的记忆中。你只需花几秒钟找到这些信息并用语言表达出来。现在,我不知道大脑是如何做到这一点的,但拥有一个存储这些信息的地方的想法依然存在。
论文中描述的记忆网络是独特的,因为它具有一个可以读写的关联记忆。值得注意的是,我们在 CNNs 或 Q-Networks(用于强化学习)或传统神经网络中没有这种类型的记忆。这部分是因为问答任务非常依赖于能够建模或跟踪长期依赖关系,例如跟踪故事中的角色或事件的时间线。在 CNNs 和 Q-Networks 中,“记忆”在网络的权重中内建,因为它们学习不同的滤波器或从状态到动作的映射。乍一看,RNNs 和 LSTMs 可能会被使用,但它们通常不能记住或记忆过去的输入(在问答中这一点是相当关键的)。
网络架构
好的,现在让我们看看这个网络是如何处理它收到的初始文本的。像大多数机器学习算法一样,第一步是将输入转换为特征表示。这可能涉及使用词向量、词性标注、解析等。具体如何做完全取决于程序员。

下一步是将特征表示 I(x) 与我们的记忆 m 更新,以反映我们收到的新输入 x。

你可以将记忆 m 视为由单个记忆 m[i]组成的数组。每个单独的记忆 m[i]可以是记忆 m 整体、特征表示 I(x)和/或自身的函数。这个函数 G 可以简单地是将整个表示 I(x)存储在单个记忆单元 m[i]中。你可以修改这个函数 G,以基于新输入更新过去的记忆。第 3^(rd)和第 4^(th)步涉及根据问题从记忆中读取以获取特征表示 o,然后解码以输出最终答案 r。

函数 R 可以是一个 RNN,用于将来自记忆的特征表示转换为对问题的可读且准确的回答。
现在,让我们更详细地看一下第 3 步。我们希望这个 O 模块输出一个最能匹配给定问题 x 的可能答案的特征表示。现在这个问题将与每个单独的记忆单元进行比较,并根据记忆单元对问题的支持程度进行“评分”。

我们取评分函数的最大值以找到最能支持问题的输出表示(你也可以选择多个最高评分单元,不必限制为 1)。评分函数计算问题和所选记忆单元之间不同嵌入的矩阵积(详细信息请查阅论文)。你可以将其视为在计算两个词向量的相似度时的乘法。这个输出表示 o 随后会被送入 RNN、LSTM 或其他评分函数,以输出可读答案。
这个网络以监督方式进行训练,其中训练数据包括原始文本、问题、支持句子和真实答案。这里是目标函数。

对于感兴趣的人,这里有一些基于这种记忆网络方法的论文
树形 LSTM 用于情感分析
简介
下一篇论文研究了情感分析的进展,即确定短语是否具有积极或消极的含义/意义。更正式地说,情感可以定义为“对某个情况或事件的看法或态度”。当时,LSTM 是情感分析网络中最常用的单元。由凯·盛·泰、理查德·索彻和克里斯托弗·曼宁撰写,这篇论文介绍了一种在非线性结构中将 LSTM 串联在一起的新方法。
这种非线性排列的动机在于自然语言的特性,即词语序列成为短语。这些短语根据词语的顺序,可以具有不同于其原始词汇组件的含义。为了表示这一特性,LSTM 单元的网络必须被安排成树形结构,其中不同的单元受到其子节点的影响。
网络架构
Tree-LSTM 和标准 LSTM 之间的一个区别在于,后者的隐藏状态是当前输入和前一个时间步的隐藏状态的函数。然而,Tree-LSTM 的隐藏状态是当前输入和其子单元的隐藏状态的函数。

使用这种新的树形结构,一些数学变化包括子单元具有遗忘门。对于那些对细节感兴趣的人,可以查看论文以获取更多信息。然而,我想关注的是理解为什么这些模型比线性 LSTM 表现更好。
使用 Tree-LSTM,一个单元能够整合其所有子节点的隐藏状态。这很有趣,因为一个单元能够对每个子节点赋予不同的权重。在训练过程中,网络可以意识到某个特定词(可能是“not”或“very”在情感分析中)对句子的整体情感非常重要。提高该节点的权重为网络提供了很大的灵活性,并可能提高性能。
神经机器翻译
介绍
今天我们要看的最后一篇论文描述了一种机器翻译任务的方法。由 Google ML 的远见者杰夫·迪恩、格雷格·科拉多、奥里尔·维尼亚尔斯等人撰写,这篇论文介绍了一个机器翻译系统,这个系统成为了 Google 流行翻译服务的核心。与 Google 之前使用的生产系统相比,该系统将翻译错误减少了平均 60%。
传统的自动翻译方法包括短语匹配的变体。这种方法需要大量的语言领域知识,最终其设计证明过于脆弱,缺乏泛化能力。传统方法的问题之一是它试图逐块翻译输入句子。事实证明,更有效的方法(NMT 使用的方法)是一次翻译整个句子,从而允许更广泛的上下文和更自然的词语重排。
网络架构
论文中的作者介绍了一种深度 LSTM 网络,该网络可以通过 8 个编码器和解码器层进行端到端训练。我们可以将系统分为三个组件:编码器 RNN、解码器 RNN 和注意力模块。从高层次来看,编码器负责将输入句子转换为向量表示,解码器生成输出表示,然后注意力模块告诉解码器在解码任务中应关注什么(这就是利用整个句子上下文的想法所在)。

论文的其余部分主要集中在大规模部署此类服务所面临的挑战上。讨论了计算资源的数量、延迟以及高量级部署等主题。
结论
有了这些,我们结束了关于深度学习如何促进自然语言处理任务的讨论。在我看来,未来该领域的一些目标可能包括改善客户服务聊天机器人,完善机器翻译,并希望使问答系统能够更深入地理解非结构化或冗长的文本(例如维基百科页面)。
特别感谢 Richard Socher 和斯坦福 CS 224D的工作人员。精彩的幻灯片(大部分图片归功于他们的幻灯片)和精彩的讲座。
简介:Adit Deshpande 目前是加州大学洛杉矶分校计算机科学专业的二年级本科生,同时辅修生物信息学。他对将机器学习和计算机视觉的知识应用于医疗保健领域充满热情,以便为医生和患者工程出更好的解决方案。
原文。经许可转载。
相关:
-
深度学习研究回顾:强化学习
-
深度学习研究回顾:生成对抗网络
-
KDnuggets 顶级博主:与深度学习爱好者 Adit Deshpande 的访谈
我们的前三个课程推荐
1. Google 网络安全证书 - 快速进入网络安全职业轨道
2. Google 数据分析专业证书 - 提升你的数据分析技能
3. Google IT 支持专业证书 - 支持你所在组织的 IT 需求
更多相关主题
深度学习的扩展是可预测的,经验上
原文:
www.kdnuggets.com/2018/05/deep-learning-scaling-predictable-empirically.html
评论
深度学习的扩展是可预测的,经验上 Hestness 等人,arXiv,2017 年 12 月
感谢 Nathan Benaich 在他的优秀2018 年第一季度 AI 世界总结中突出了这篇论文
这是一项非常出色的研究,具有深远的影响,甚至可能在某些情况下影响公司战略。研究始于一个简单的问题:“我们如何改进深度学习的最新技术?”我们有三条主要攻击线:
-
我们可以寻找改进的模型架构。
-
我们可以扩展计算。
-
我们可以创建更大的训练数据集。
随着 DL 应用领域的增长,我们希望更深入地理解训练集规模、计算规模和模型准确性改进之间的关系,以推动技术的前沿。
寻找更好的模型架构通常依赖于“不可依赖的顿悟”,正如结果所示,与增加可用数据量相比,影响有限。当然,我们已经知道这一点,包括从 2009 年的 Google 论文中,‘数据的非理性有效性’。今天的论文结果帮助我们量化了在各种深度学习应用中的数据优势。理解的关键在于以下方程:

这表明一般化误差
作为训练数据量
的函数,遵循具有指数
的幂律。经验上,
通常在-0.07 到-0.35 之间。误差当然是,较低更好,因此为负指数。我们通常在对数-对数图上绘制幂律,其中它们结果为直线,梯度表示指数。
制作更好的模型可以将 y 截距降低(直到达到不可约错误水平),但似乎不会影响幂律系数。另一方面,更多的数据将使我们沿着改进的幂律路径前进。

三个学习区域
实际应用的学习曲线可以分为三个区域:

-
小数据区域是模型在数据不足的情况下挣扎学习的地方,模型的表现只能和“最佳”或“随机”猜测一样好。
-
中间区域是幂律区域,在该区域,幂律指数定义了曲线的陡峭程度(对数对数尺度上的斜率)。这个指数是模型表示数据生成函数的难度指标。
“本文的结果表明,幂律指数不容易通过先验理论来预测,并且可能依赖于问题领域或数据分布的某些方面。”
-
不可减少误差区域是指模型无法改进的非零下界误差。对于足够大的训练集,模型在这个区域会达到饱和。
关于模型大小
我们预期模型参数的数量与数据集的适配应遵循
,其中
是适应大小为
的训练集所需的模型大小,而
。
最佳拟合模型在训练分片大小上以次线性增长。较高的
值表明模型在较大的数据集上对额外参数的使用效果较差。尽管模型大小扩展存在差异,“对于给定的模型架构,我们可以准确预测能够最好地适应越来越大数据集的模型大小。”
幂律的影响
可预测的学习曲线和模型大小扩展表明,深度学习可能会有一些重要的影响。对于机器学习从业者和研究人员而言,可预测的扩展可以帮助模型和优化调试以及迭代时间,并提供估计提高模型准确性的最有影响力的下一步的方法。在操作上,可预测的曲线可以指导是否以及如何增长数据集或计算。
一个有趣的结果是,模型探索可以在较小的数据集上进行(因此更快/更便宜)。数据集需要足够大,以显示曲线的幂律区域的准确性。然后,可以将最有前景的模型扩展到更大的数据集上,以确保相应的准确性提升。这是因为扩展训练集和模型很可能会在模型之间带来相同的相对增益。在建立公司时,我们在扩展业务之前会寻找产品市场匹配。在深度学习中,似乎类比为在扩展之前寻找模型问题匹配,即先搜索再扩展的策略:

如果你需要对投资更多数据收集的投资回报率或可能的准确性提升做出商业决策,幂律可以帮助你预测回报:

相反,如果在幂律区域内的泛化误差偏离幂律预测,这表明增加模型规模可能会有所帮助,或者更广泛的超参数搜索(即更多的计算)可能会有所帮助:

…可预测的学习和模型规模曲线可能提供了一种预测达到特定准确度水平的计算需求的方法。
你能超越幂律吗?
模型架构改进(例如,增加模型深度)似乎仅仅是将学习曲线向下移动,但不会改善幂律指数。
我们尚未找到影响幂律指数的因素。要在增加数据集规模时超越幂律,模型需要用逐渐减少的数据学习更多的概念。换句话说,模型必须从每个额外的训练样本中提取更多的边际信息。
如果我们能够找到改进幂律指数的方法,那么某些问题领域的潜在准确性提升是“巨大的”。
实证数据
支持这些的实证数据是通过在多个不同领域使用最新深度学习模型测试各种训练数据大小(以 2 的幂次方)收集的。
这是神经机器翻译的学习曲线。右侧可以看到每个训练集大小的最佳拟合模型的结果。随着训练集大小的增加,实证误差偏离幂律趋势,可能需要更全面的超参数搜索来将其重新对齐。

下一个领域是词语言模型。虽然使用了各种模型架构,它们的差异很大,但都表现出相同的学习曲线特征,由幂律指数表征。

这是字符语言模型的结果:

在图像分类中,当数据不足以学习出良好的分类器时,我们可以在图中看到“数据稀少区域”出现:

最后,这里是语音识别:

我们实证验证了,随着在四个机器学习领域(机器翻译、语言建模、图像处理和语音识别)中为最先进(SOTA)模型架构增加训练集,DL 模型的准确性按幂律增长。这些幂律学习曲线在所有测试领域、模型架构、优化器和损失函数中都存在。
原文。转载经许可。
相关内容:
-
如何让 AI 更易获得
-
高级 API 是否让机器学习变得更简单?
-
逐步推导卷积神经网络与全连接网络的关系
我们的前三个课程推荐
1. Google 网络安全证书 - 快速入门网络安全职业生涯。
2. Google 数据分析专业证书 - 提升你的数据分析技能
3. Google IT 支持专业证书 - 支持你的组织的 IT 工作
更多相关话题
深度学习是银弹吗?
原文:
www.kdnuggets.com/2017/02/deep-learning-silver-bullet.html
评论
由丹尼尔·勒梅尔,魁北克大学撰写。
在 2016 年,我们看到了涉及人工智能的广泛突破,特别是深度学习。谷歌、脸书和百度宣布了几个使用深度学习的突破。谷歌还击败了围棋。
深度学习是一类特定的机器学习算法。它有着悠久的历史,起源于计算机科学的早期阶段。然而,并非所有的机器学习都是深度学习。

我们现在是 2017 年,刚刚 1 月,人工智能领域的突破不断被宣布。这些天,我们听说顶级人类扑克玩家被击败。
特别是,卡内基梅隆大学的一个系统叫做Libratus似乎取得了很多成功。
关于 Libratus 的详细信息很少。引起我注意的是提到它使用了“反事实遗憾最小化”,这是一种传统的机器学习方法,并非深度学习的一种形式。
鉴于对深度学习的所有炒作,我发现这几乎让人惊讶……真的还有人工智能研究者在研究深度学习之外的技术吗?(我半开玩笑地说。)
去年,我参加了一个关于算法及其对加拿大文化的影响的讨论小组。组织者事后将小组名称更改为“我们是否通过深度学习算法推动了加拿大内容?”然而,小组并未专门讨论深度学习。深度学习的成功如此显著,以至于“深度学习”已经成为“算法”的同义词。
我最近在一个研究生奖学金委员会上……似乎每个聪明的年轻计算机科学家都计划从事深度学习。也许我有点夸张,但几乎没有。我见过将深度学习应用于各种领域的提案,从识别癌细胞到辅导孩子。
商业领域也在进行类似的过程。如果你是一家从事人工智能的初创公司,而且你没有专注于深度学习,你必须解释一下自己。
当然,机器学习是一个广阔的领域,包含许多技术类别。然而,人们几乎有一种印象,所有主要问题都将通过深度学习解决。实际上,一些深度学习的倡导者几乎明确提出了这一点……他们通常承认其他技术可能会在小问题上表现良好……但他们常常强调,对于大问题,深度学习必定会获胜。
我们将继续看到各种技术战胜非常困难的问题,这些技术往往与深度学习无关。如果我没错的话,这意味着那些涌向深度学习的年轻计算机科学家和创业者应该保持警惕。他们可能会陷入一个过于拥挤的领域,从而错过在其他地方发生的重要突破。
预测未来是困难的。也许深度学习确实是灵丹妙药,我们将很快通过深度学习“解决智能”……所有问题都将通过深度学习的变体得到解决……或者也可能是研究人员很快会遇到收益递减的情况。他们需要为了更小的进步而更加努力。
深度学习存在显著的局限性。例如,当我审查奖学金申请时……许多试图用深度学习解决困难问题的年轻计算机科学家并没有相应的大量数据来源。拥有几乎无限的数据供应是一种奢侈,只有少数人能负担得起。
我认为一个未被明确说明的假设是必须存在一种通用算法。一定存在某种技术可以以通用的方式使软件智能化。也就是说,我们可以“解决智能”……我们可以以通用的方式构建软件来解决所有其他问题。
我对通用智能的概念持怀疑态度。Kevin Kelly 在他的最新书籍中提出了没有这种东西的观点。所有智能都是专门化的。我们的智能对我们来说“感觉”是通用的,但这是一种错觉。我们认为自己擅长解决大多数问题,但实际上并不是这样。
例如,人脑在高级数学方面显示出其极限。经过大量训练和专注,我们中的一些人可以在没有错误的情况下编写形式化证明。然而,我们在这方面的效率非常低下。我预测,再过十年或二十年,未经辅助的人脑将被认定为在高级数学研究中过时。那位在黑板上做数学的老者?那将显得很古怪。
因此,我们的大脑并不是解决智能问题的灵丹妙药,因此我不相信任何一种机器学习技术可以成为灵丹妙药。
我应该说明我的观点。可能存在一个总体的“算法”。马特·里德利在他的新书中指出 一切都是通过类似于自然选择的过程进化的。自然获得了一袋不断被改进的技巧。实际上,有一个总体的试错过程。这确实很普遍,但有一个主要的权衡:它很昂贵。我们的生物学进化了,但地球生态系统花费了数百万年才产生出智人。我们的技术在进化,但需要人类文明的全部力量来维持它。它也不是万无一失的。经常会发生灭绝事件。
致谢:感谢马丁·布鲁克斯(Martin Brooks)启发了这篇博客文章。
进一步阅读: DeepStack:无上限扑克中的专家级人工智能。西蒙·芬克(Simon Funk)的欢迎来到人工智能。
简介:丹尼尔·莱梅尔 是魁北克大学的计算机科学教授。他的研究重点是软件性能和索引。他是技术乐观主义者。
原文。经许可转载。
相关:
-
数据科学难题,回顾
-
2026 年人工智能中的常识?
-
创建好奇的机器:构建信息搜寻代理
我们的三大课程推荐
1. 谷歌网络安全证书 - 快速进入网络安全职业生涯。
2. 谷歌数据分析专业证书 - 提升你的数据分析技能
3. 谷歌 IT 支持专业证书 - 支持你的组织 IT
更多相关主题
深度学习与经验主义的胜利
评论
深度学习 现在是许多监督机器学习任务的标准代表。也可以说,深度学习在过去几十年中在无监督机器学习中产生了最实用的算法。这些进展所带来的兴奋促使了大量的研究和记者的耸人听闻的头条新闻。虽然我对这种炒作持谨慎态度,但我也发现这项技术令人兴奋,并且最近加入了这个阵营,发布了 关于递归神经网络(RNNs)在序列学习中的 30 页批评性评审。

但机器学习研究社区中的许多人并不对深度情有独钟。事实上,对于那些努力通过将人工智能研究基于数学语言并用理论保证来复兴人工智能研究的人来说,深度学习代表了一种时尚。更糟糕的是,对于一些人来说,它可能看起来像是一种倒退。¹
我们的前 3 个课程推荐
1. 谷歌网络安全证书 - 快速进入网络安全职业。
2. 谷歌数据分析专业证书 - 提升你的数据分析能力
3. 谷歌 IT 支持专业证书 - 支持你的组织 IT 部门
在这篇文章中,我将尝试提供对理论保证有用性的高层次和公正的分析,并解释为什么它们可能并不总是从实践上有用,而从智力上却值得回报。更重要的是,我将提供论据来解释为什么在经过多年的统计上逐渐可靠的机器学习之后,今天许多表现最佳的算法没有理论保证。
保证什么?
保证是关于算法的行为、性能或复杂性,可以以数学确定性作出的声明。其他条件相同的情况下,我们希望说,在足够的时间内,我们的算法 A 可以从某个模型类{H1, H2, …}中找到一个分类器 H,其性能不低于 H*,其中 H是该类中最好的分类器。当然,这是相对于某个固定的损失函数 L。若无此绝对界限,我们希望能够通过某个常量来界定 H 和 H之间的性能差异或比率。在没有这种绝对界限的情况下,我们希望能够证明,以高概率 H 和 H*在运行我们算法一段固定时间后会给出相似的值。
许多现有算法提供了强有力的统计保证。线性回归允许精确解。逻辑回归保证随着时间的推移会收敛。深度学习算法一般没有任何保证。给定一个任意糟糕的起点,我不知道有哪个理论证明某种变体的 SGD 训练的神经网络会在时间上逐步改进,并且不会陷入局部最小值。最近有大量工作合理地表明,神经网络的误差面上鞍点的数量超过了局部最小值(一个 m 维面,其中 m 是学习参数的数量,通常是节点之间边的权重)。然而,这并不等同于证明局部最小值不存在或它们不能任意糟糕。
保证的问题
可证明的数学性质显然是受欢迎的。它们甚至可能在人工智能领域尚不明确、承诺过高和未达标的时期拯救了机器学习。然而,许多今天最好的算法并没有提供任何保证。这怎么可能呢?
我将在接下来的段落中解释几个原因。其中包括:
-
保证通常相对于一个较小的假设类。
-
保证通常仅限于最坏情况分析,但现实世界很少出现最坏情况。
-
保证通常基于对数据的不正确假设。
从弱池中选择赢家
首先,理论保证通常保证一个假设接近于某个给定类中的最佳假设。这并不保证在给定类中存在一个能够令人满意地执行的假设。
这里有一个比较直白的例子:我希望一个人工编辑来协助我撰写文档。拼写检查可能提供关于其行为的保证。它将以 100%的准确率识别某些拼写错误。但现有的自动校对工具无法提供智能人类所能提供的洞察力。当然,人类没有数学上的保证。人类可能会打瞌睡,忽视我的电子邮件,或者做出无意义的回应。尽管如此,人类能够表达比 Clippy 更广泛的有用想法。
一种愤世嫉俗的观点可能是,有两种方法可以改进理论保证。一种是改进算法。另一种是削弱它所属的假设类。尽管神经网络几乎没有提供理论保证,但它们提供了一组比大多数更好理解的机器学习模型丰富得多的潜在假设。随着启发式学习技术和更强大的计算机消除了有效学习的障碍,显然对于许多模型来说,这种增强的表现能力对做出实际有用的预测至关重要。
最坏的情况可能无关紧要
保证通常是在最坏情况下给出的。通过保证结果在最优结果的一个 epsilon 因子内,我们说最坏情况不会比 epsilon 因子更糟。但在实际中,最坏情况可能从未发生。现实世界的数据通常高度结构化,最坏情况可能具有这样的结构,以至于典型数据集与病态数据集之间没有重叠。在这些情况下,最坏情况的界限仍然有效,但可能所有算法的表现都要好得多。没有理由相信,具有更好最坏情况保证的算法在典型情况下的表现会更好。
基于明显错误的假设
另一个原因是理论上健全的模型可能无法转化为实际的表现,是因为生成理论结果所需的数据假设往往是错误的。例如,考虑潜在狄利克雷分配(LDA),这是一种对话题建模非常了解且非常有用的算法。关于 LDA 的许多理论证明都基于这样一个假设:一个文档与一个话题分布相关。每个话题又与词汇表中所有单词的分布相关。生成过程如下进行。对于文档中的每个单词,首先根据每个话题的相对概率随机选择一个话题。然后,根据所选话题,按照该话题的单词分布选择一个单词。这个过程重复进行,直到所有单词都被选择。
显然,这一假设在任何真实世界的自然语言数据集中都不成立。在真实文档中,词汇的选择是有上下文的,并且高度依赖于它们所在的句子。此外,文档长度不是任意预定的,尽管在本科课程中可能是如此。然而,鉴于这种生成过程的假设,关于 LDA 的许多优雅证明是成立的。
需要明确的是,LDA 确实是一种广泛有用、最先进的算法。此外,我确信对算法特性的理论研究,即使在不切实际的假设下,也是提升我们理解并为后续更普遍和强大的定理奠定基础的有价值且必要的步骤。在本文中,我仅旨在阐明许多已知理论的性质,并向数据科学从业者提供直觉,解释为什么具有最有利理论性质的算法不总是表现最好的。
经验主义的胜利
有人可能会问,如果不完全依赖理论,是什么让像深度学习这样的的方法能够取得成功? 进一步的,为什么那些依靠直觉的经验方法现在如此广泛成功,即使这些方法在几十年前曾一度失宠?
对于这些问题,我相信像 ImageNet 这样的大规模标注数据集的存在是启发式方法复兴的原因。给定足够大的数据集,过拟合的风险较低。此外,对测试数据的验证提供了一种处理典型情况的方法,而不是专注于最坏情况。此外,平行计算和内存容量的进步使得同时跟进许多假设的实证实验成为可能。由强大直觉支持的经验研究提供了一条前进的道路,当我们达到形式理解的极限时。
警示事项
尽管深度学习在机器感知和自然语言处理中的成功不容忽视,但可以合理地认为,到目前为止,最有价值的三种机器学习算法是线性回归、逻辑回归和 k 均值聚类,这些算法在理论上都得到了很好的理解。对经验主义胜利的合理反驳可能是,迄今为止,最好的算法都是理论上有动机和基础的,而经验主义仅负责最新的突破,而不是最重要的突破。
少数事物是有保证的
当可获得时,理论保证是美丽的。它们反映了清晰的思维,并对问题的结构提供了深刻的洞察。给定一个有效的算法,解释其性能的理论加深了理解,并为进一步的直觉提供了基础。即便没有有效的算法,理论也提供了攻击的路径。
然而,具有坚实基础的直觉与严格的实证研究相结合,能够产生持续有效的系统,这些系统在许多重要任务上优于更为理解的模型,有时甚至优于人类。这种实证主义为那些形式分析受到限制的应用提供了一条前进的路径,并有可能开辟新的方向,最终在未来可能获得更深层次的理论理解。
¹是的,这是一个老套的双关语。
扎卡里·蔡斯·利普顿 是加州大学圣地亚哥分校计算机科学工程系的博士生。他的研究得到了生物医学信息学部门的资助,对机器学习的理论基础和应用都有浓厚的兴趣。除了在 UCSD 的工作,他还曾在微软研究院实习过。
相关:
-
慢一点:质疑深度学习智商结果
-
模型可解释性的神话
-
(深度学习的深层缺陷)
-
数据科学中最常用、最混淆和滥用的术语
-
差分隐私:如何使隐私和数据挖掘兼容
更多相关话题
深度学习来自魔鬼吗?
原文:
www.kdnuggets.com/2015/10/deep-learning-vapnik-einstein-devil-yandex-conference.html
评论
在过去一周的柏林,我参加了“机器学习:前景与应用”会议,这是一个来自学术机器学习社区的邀请讲者会议。由俄罗斯最大搜索引擎 Yandex 组织,会议显著地突出深度学习和智能学习这两个常常被认为对立的概念。尽管我以深度学习小组的讲者和参与者身份参加了会议,但会议的亮点是见证了许多领先理论家和从业者表达的经验主义与数学之间的哲学冲突。
第一日的深度学习主题结束时,进行了一个晚间小组讨论。由李登博士主持,该讨论挑战了深度学习社区的讲者,包括我自己,解释机器学习的数学基础,并展望其未来。关于模型可解释性的问题,这是我在之前的帖子中讨论的一个话题,尤其是针对医学应用的问题特别多。在周三,举行了第二晚的讨论。在这里,支持向量机的共同发明者、被广泛认为是统计学习理论奠基人的弗拉基米尔·瓦普尼克阐述了他的知识传递理论,并提供了涉及机器学习、数学和智能源的哲学视角。或许最具争议的是,他对深度学习提出了挑战,质疑其特设的方法。

在过去的夏天,我发布了一篇文章,建议深度学习的成功更广泛地反映了经验主义在大数据环境中的胜利。 我认为,若没有过拟合的风险,可在真实数据上验证的方法集合可能远大于那些我们可以从数学第一原则保证有效的方法。会议结束后,我想继续探讨这个话题,特别是那些弗拉基米尔·瓦普尼克在会议上提出的挑战。
为了避免任何混淆,我是一名深度学习研究员。我个人并不否定深度学习,并尊重它的开创者和继承者。但我也相信,我们应该对最终某些数学理论将更全面地解释其成功或指引新的方法持开放态度。显然,理解深度学习方法的论点及其批评观点都有其价值,因此我呈现了一些会议的亮点,特别是来自 Vapnik 教授的讲座。
大数据与深度学习作为蛮力方法
尽管 Vapnik 教授对深度学习有多个角度的看法,但也许最核心的观点是:在关于智能学习的观众讨论中,Vapnik 提到了爱因斯坦的隐喻神的观点。简而言之,Vapnik 认为,想法和直觉要么来自上帝,要么来自魔鬼。他提出的区别是上帝聪明,而魔鬼则不聪明。

在他的数学家和机器学习研究员职业生涯中,Vapnik 表示魔鬼总是以蛮力的形式出现。此外,虽然承认深度学习系统在解决实际问题上的出色表现,但他认为大数据和深度学习都带有蛮力的色彩。有一位观众问 Vapnik 教授是否认为进化(这可能导致了人类智能)是一个蛮力算法。由于明确表示不喜欢猜测,Vapnik 教授拒绝对进化提出任何猜测。还值得一提的是,虽然爱因斯坦关于上帝如何设计宇宙的直觉非常有成效,但并不总是奏效。最著名的是爱因斯坦认为“上帝不掷骰子”的直觉似乎与我们对量子力学的现代理解相冲突(见斯蒂芬·霍金关于这个话题的精彩易读文章)。
虽然我可能不同意深度学习必然等同于蛮力的观点,但我更清楚地看到了对现代大数据态度的反对论点。正如 Vapnik 博士和纳撒尼尔·因特拉托尔教授在特拉维夫大学所建议的,一个婴儿在学习时并不需要数十亿个标注样本。换句话说,虽然使用巨大的标注数据集进行有效学习可能很容易,但依赖这些数据集可能会错过关于学习本质的一些根本问题。也许,如果我们的算法只能通过巨大的数据集进行学习,而这些本应通过数百个样本即可学习的内容,那我们可能已经陷入了懒惰。
深度学习还是深度工程
瓦普尼克教授对深度学习的另一种看法是,它不是科学。具体来说,他表示深度学习偏离了机器学习的核心使命,他认为机器学习的核心在于理解机制。更详细的说,他认为研究机器学习就像是在试图制造一把斯特拉迪瓦里小提琴,而工程解决实际问题更像是成为一名小提琴手。从这个角度来看,小提琴手可以演奏出美妙的音乐,并对如何演奏有直觉,但未必正式理解自己在做什么。由此,他建议许多深度学习从业者对数据和工程有很好的感觉,但同样不真正理解自己在做什么。
人类是否发明了什么?
瓦普尼克教授提出的一个尖锐的观点是,我们是发现还是发明算法和模型。在瓦普尼克看来,我们实际上并没有发明任何东西。他具体对观众说,他“并不聪明到可以发明什么”。由此推测,可能没有其他人也如此聪明。更委婉地说,他认为我们发明的东西(如果有的话),与那些本质上固有的事物相比微不足道,真正的知识来源于对数学的理解。深度学习中模型经常被发明、命名和技术专利,这与更具数学动机的机器学习相比显得有些人为。在这段时间里,他挑战观众提供一个深度学习的定义。大多数观众似乎不愿意提供定义。在其他时候,观众通过引用深度学习的生物学启发来挑战他的观点。对此,瓦普尼克教授问道:“你知道大脑是如何工作的?”
扎克瑞·蔡斯·利普顿 是加州大学圣地亚哥分校计算机科学工程系的博士生。由生物医学信息学部资助,他对机器学习的理论基础和应用都感兴趣。除了在 UCSD 的工作外,他还曾在微软研究院实习,并担任亚马逊的机器学习科学家,是 KDnuggets 的特约编辑,并在 Manning Publications 签约成为作者。
相关:
-
深度学习与经验主义的胜利
-
模型可解释性的神话
-
(深度学习的深层缺陷)
-
数据科学中最常用、最困惑和被滥用的术语
-
差分隐私:如何使隐私与数据挖掘兼容
我们的三大课程推荐
1. Google 网络安全证书 - 快速进入网络安全职业轨道。
2. Google 数据分析专业证书 - 提升你的数据分析水平
3. Google IT 支持专业证书 - 支持你所在组织的 IT 需求
更多相关话题
虚拟试衣服装的深度学习 – 挑战与机遇。
原文:
www.kdnuggets.com/2020/10/deep-learning-virtual-try-clothes.html
评论
作者:Maksym Tatariants,MobiDev 的数据科学工程师。
下述研究由 MobiDev 进行,作为将AR 和 AI 技术用于虚拟试衣间开发的调查的一部分。
我们的前三大课程推荐
1. 谷歌网络安全证书 - 快速进入网络安全职业的快车道。
2. 谷歌数据分析专业证书 - 提升你的数据分析技能。
3. 谷歌 IT 支持专业证书 - 支持组织的 IT 需求。
探索将 2D 服装转移到人物图像上。
在开发虚拟试衣间应用程序时,我们进行了系列实验,尝试了虚拟试衣,并发现 3D 服装模型在人体上的适当渲染仍然是一个挑战。为了实现令人信服的 AR 体验,深度学习模型不仅应该检测到与人体关节对应的基本关键点集合,还应该识别身体的实际三维形状,以便衣物能够适当地贴合身体。
对于这种模型类型的一个示例,我们可以查看 Facebook 研究团队的DensePose(图 1)。然而,这种方法不够准确、对移动设备而言速度较慢且成本高昂。

图 1:使用 DensePose 进行身体网格检测 (来源)。
因此,需要寻找虚拟服装试穿技术的更简单替代方案。
一个受欢迎的选择是,与其使用 3D 服装进行试穿,不如使用 2D 服装和 2D 人体轮廓。这正是Zeekit公司所做的,为用户提供了将多种服装类型(如连衣裙、裤子、衬衫等)应用到他们的照片上的可能性。

图 2:2D 服装试穿,Zeekit (来源, 0:29 - 0:39)。
由于公司使用的布料转移技术除了结合深度学习模型之外尚未披露,我们可以参考相关的科学文章。在审阅了几篇最新的文章(source 1, source 2, source 3)后,发现主要方法是使用生成对抗网络(GANs)结合姿态估计和人体解析模型。利用后两者模型可以帮助识别图像中与特定身体部位对应的区域,并确定身体部位的位置。生成模型的使用有助于生成转移衣物的变形图像并将其应用于人的图像,以减少产生的伪影数量。
选定模型和研究计划
对于这项研究,我们选择了在“Towards Photo-Realistic Virtual Try-On by Adaptively GeneratingPreserving↔Image Content”论文中描述的自适应内容生成与保存网络(ACGPN)模型。为了说明 ACGPN 的工作原理,让我们查看其架构如图 3所示。

图 3:ACGPN 模型的架构(致谢: Yang et al.,2020)。
该模型包括三个主要模块:语义生成、衣物变形和内容融合。
语义生成模块接收目标衣物的图像及其掩膜、人的姿态数据、包含所有身体部位的分割图(手部尤其重要)以及识别出的衣物项目。
语义生成模块中的第一个生成模型(G1)修改了人的分割图,以清楚标识出应该被目标衣物覆盖的身体区域。获取这些信息后,第二个生成模型(G2)将衣物掩膜进行变形,以符合其应占据的区域。
之后,将变形的衣物掩膜传递给衣物变形模块,其中空间变换网络(STN)根据掩膜对衣物图像进行变形。最后,将变形的衣物图像、来自语义生成模块的修改过的分割图和一个人的图像输入到第三个生成模块(G3),并产生最终结果。
为了测试所选模型的能力,我们按照难度递增的顺序进行了以下步骤:
-
在原始数据和我们的预处理模型(简单)的基础上复现了作者的结果。
-
将自定义衣物应用于默认人物图像(中等)。
-
将默认衣物应用于自定义人物图像(困难)。
-
将自定义衣物应用于自定义人物图像(非常困难)。
在原始数据和我们的预处理模型上复制作者的结果
原始论文的作者没有提到他们用于创建人物分割标签和检测人体上的关键点的模型。因此,我们自行选择了模型,并确保了 ACGPN 模型输出的质量与论文中报告的相似。
作为关键点检测器,我们选择了OpenPose模型,因为它提供了适当的关键点顺序(COCO 关键点数据集),并且在其他与虚拟试衣服更换相关的研究中被使用。

图 4: 使用 OpenPose 的 COCO 关键点检测示例。
我们选择了在Self Correction for Human Parsing论文中提出的 SCHP 模型进行身体部位分割。该模型利用了用于人体解析的常见架构CE2P,并对损失函数进行了一些修改。
SCHP 分割模型使用预训练的骨干(编码器)从输入图像中提取特征。然后使用恢复的特征进行边缘分支中的人体轮廓预测和解析分支中的人体分割。这两个分支的输出连同来自编码器的特征图一起输入到融合分支,以提高分割图的质量。

图 5: SCHP 模型(基于 CE2P)的架构,图像来源 – Li 等人
SCHP 模型中的另一个新元素是自我纠正特性,用于迭代地改进模型在噪声地面真值标签上的预测。这些标签通常用于人体解析任务,因为人为标注者可能难以生成分割标签。在此过程中,模型首先在不准确的人体标注上进行训练,并与在从先前训练的模型中获得的伪地面真值掩码上训练的新模型进行聚合。
这个过程会重复几次,直到模型和伪地面真值掩码的准确性达到更好的水平。对于人体解析任务,我们使用了在Look Into Person (LIP)数据集上训练的模型,因为它最适合这个任务。

图 6: 使用 SCHP 模型的人体解析示例(左侧 - 人体,右侧 - 分割)。
最后,当关键点和人体解析模型准备好后,我们使用它们的输出在与作者训练时相同的数据上运行了 ACGPN 模型。在下面的图像中,您可以看到我们从 VITON 数据集中获得的结果。
语义生成模块会修改原始分割,以反映新的服装类型。例如,原始图像上的套头衫有长袖,而目标服装(T 恤)则有短袖。因此,分割掩码需要修改,以便手臂部分更加显露。这个转化后的分割掩码随后被内容融合模块用于修复修改过的身体部位(例如,绘制裸露的手臂),这是系统执行的最具挑战性的任务之一(图 7)。

图 7:ACGPN 模型的输入和输出。
在下面的图像中(图 8),您可以看到使用 ACGPN 模型成功和失败的服装替换结果。我们遇到的最频繁的错误包括修复效果差(B1)、新服装与身体部位重叠(B2)以及边缘缺陷(B3)。

图 8:成功(A1-A3)和失败(B1-B3)的服装替换。伪影用红色矩形标记。
自定义服装应用于默认人物图像
对于这个实验,我们挑选了几件服装(图 9)并将它们应用到 VITON 数据集中人物的图像上。请注意,有些图像不是实际的服装照片,而是 3D 渲染或 2D 绘图。

图 9:用于虚拟试穿的服装图像(A - 项目的照片,B、C - 3D 渲染,D - 2D 绘图)。
继续查看服装替换的结果(图 10),我们可以将其大致分为三组。

图 10:使用自定义服装的替换示例(A 行 - 成功且有少量伪影,B 行 - 中等伪影,C 行 - 大量伪影)。
A 行中的图像没有缺陷,看起来最自然。这可以归因于图像中的人物姿势相似,都是直立面向相机。正如论文的作者所解释的,这种姿势使得模型更容易定义新服装如何被扭曲并应用到人物图像上。
行 B 中的图像展示了模型处理起来更具挑战性的姿势。人物的躯干略微弯曲,手臂部分遮挡了应有服装的身体区域。如图 8所示,弯曲的躯干会导致边缘缺陷。注意到困难的长袖服装(图 9中的项目 C)被正确处理。这是因为袖子需要经过复杂的变换才能与人物的手臂对齐。如果手臂弯曲或其轮廓被原始图像中的服装遮挡,这会非常复杂。
行 C 中的图像展示了模型几乎完全失败的例子。这是预期的行为,因为输入图像中的人物躯干扭曲严重,手臂弯曲到遮挡了几乎一半的腹部和胸部区域。
默认服装应用于定制人物图像
让我们回顾一下模型在自然环境中对非约束图像的应用实验。用于模型训练的 VITON 数据集具有非常静态的光照条件,且相机视角和姿势的变化不多。
在使用真实图像测试模型时,我们意识到训练数据与非约束数据之间的差异显著降低了模型输出的质量。你可以在图 11中看到这个问题的例子。

图 11:服装替换 - 背景与训练数据的不相似性的影响。行 A - 原始背景,行 B - 用与 VITON 数据集中的背景相似的背景替换的背景。
我们找到了一些姿势和相机视角与训练数据集图像相似的人物图像,并且在处理后发现了许多伪影(行 A)。然而,在去除不寻常的背景纹理并用与训练数据集相同的背景颜色填充该区域后,输出质量有所提高(尽管仍有一些伪影存在)。
在使用更多图像测试模型时,我们发现模型在与训练分布相似的图像上表现尚可,而在输入明显不同的图像上则完全失败。你可以在图 12中看到应用模型的更成功的尝试以及我们发现的典型问题。

图 12:在非约束环境中的图像上的服装替换输出(行 A - 小瑕疵,行 B - 中等瑕疵,行 C - 主要瑕疵)。
行 A 中的图像展示了主要缺陷是边缘缺陷的地方的例子。
行 B 中的图像显示了更严重的遮罩错误情况。例如,布料模糊、孔洞以及出现皮肤/服装补丁的位置不应存在这些问题。
行 C 中的图像展示了严重的修补错误,比如手臂绘制不佳和遮罩错误,如身体未遮罩的部分。
将定制服装应用于定制人物图像
在这里,我们测试了模型在处理定制服装和定制人物照片方面的效果,并将结果再次分为三组。

图 13:在不受约束的环境和定制服装图像中替换衣物。
行 A 中的图像显示了我们从模型中获得的最佳结果。定制服装和定制人物图像的组合被证明在处理时难度较大,除非有中等程度的伪影。
行 B 中的图像显示了伪影变得更加丰富的结果。
行 C 中的图像显示了由于变换错误导致的最严重的失真结果。
未来计划
ACGPN 模型有其局限性,例如训练数据必须包含目标衣物和穿着这些特定衣物的人物的配对图像。
考虑到上述所有描述,可能会产生虚拟试穿衣物不可实现的印象,但事实并非如此。虽然现在是一个具有挑战性的任务,但它也为未来基于 AI 的创新提供了机会窗口。而且,已经有新的方法被设计来解决这些问题。另一个重要的事情是,在选择合适的用例场景时,要考虑技术能力。
相关:
,其中
是适应大小为
的训练集所需的模型大小,而
。
918

被折叠的 条评论
为什么被折叠?



