>科技>>正文

超实用总结:AI实践者需要用到的10个深度学习方法

原标题:超实用总结:AI实践者需要用到的10个深度学习方法

大数据文摘作品

编译:小鱼、肖依月、高宁、Aileen

在过去十年里,大众对机器学习的兴趣与日俱增。几乎每天都可以在计算机科学程序、行业会议和华尔街日报上看到机器学习的身影。在所有关于机器学习的讨论中,很多都将“机器学习的作用”和“人类希望机器学习能够做什么”这两个观念混为一谈。从根本上说,机器学习是使用算法从原始数据中提取信息,并用某种模型进行表示,然后对于一些我们尚未建模的数据,使用模型来进行推断。

神经网络是机器学习模型的一种,而且已经存在了至少50年了。神经网络的基本单元是节点,源于哺乳动物大脑中的生物神经元。神经元之间的联系也是基本生物大脑建立的,这些联系随着时间的推移不断进化(即“训练”)。

在二十世纪八十年代中期和九十年代初期,神经网络有了许多重要的发展。然而,为了获得较好结果需要大量的时间和数据,这减缓了神经网络发展的速度,也降低了当时人们的关注度。在二十一世纪初,计算能力呈指数级增长,业界认为计算技术的发展比“寒武纪爆炸”都来的迅猛。在计算能力爆炸式增长的十年中,作为神经网络领域的一个重要角色,深度学习出现了,赢得了许多重要的机器学习竞赛。2017年,深度学习的热度仍然不减。今天,在机器学习的出现的地方都可以看到深度学习的身影。

最近,我已经开始阅读关于深度学习的学术论文。根据我的个人研究,下列出版内容对这个领域的发展产生了巨大的影响:

NYU在1998年发表的文章《基于梯度学习的文档识别》(Gradient-Based Learning Applied to Document Recognition)中,介绍了卷积神经网络在机器学习中的应用。

Toronto在2009年发表的文章《深度波兹曼机器》(Deep Boltzmann Machines)中,提出了一种新的算法,波兹曼机器中有众多层中包含隐藏变量。

Stanford和Google在2012年联合发表的文章《使用大规模非监督学习构建高层特征》(Building High-Level Features Using Large-Scale Unsupervised Learning)中,解决了仅利用未标记的数据构建高级、特定类的特征检测器的问题。

Berkeley在2013年发表的文章《用于一般视觉识别的深层卷积激活特征》(DeCAF — A Deep Convolutional Activation Feature for Generic Visual Recognition)中,发布了名为DeCAF的算法,是深度卷积激活特征实现的一个开源方法,使用相关的网络参数,视觉研究人员能够利用一系列视觉概念学习范例进行深度表征实验。

DeepMind在2016年发表的文章《用深度强化学习玩Atari》(Playing Atari with Deep Reinforcement Learning)中,提出了第一个可以成功地通过强化学习直接从高维感官输入中学习控制策略的深度学习模型 。

通过研究和学习,关于深度学习相关知识我收获颇丰。在这里,我想分享AI工程师用于解决机器学习问题的10个强大的深度学习方法。但首先,我们需要定义什么是深度学习。 定义深度学习是很多人面临的一个挑战,因为它的形式在过去的十年中已经慢慢地发生了改变。为了在视觉上定义深度学习,下图展示了人工智能AI,机器学习和深度学习之间的关系。

人工智能领域广泛且存在时间较长。深度学习是机器学习领域的一个子集,而机器学习是AI领域的一个子集。一般将深度学习网络与“典型”前馈多层网络从如下方面进行区分:

深度学习比前馈网络有更多的神经元

深度学习中层之间的连接方式比前馈网络更复杂

训练深度学习需要有像“寒武纪大爆发”式的计算能力

深度学习可以自动提取特征

上述 “更多的神经元”,是指近年来神经元的数量不断增加,深度学习就可以表示更为复杂的模型。层也从多层网络中每一层的完全连接,进化成卷积神经网络中神经元片段的局部连接,以及与递归神经网络中的同一神经元的循环连接(与前一层的连接除外)。

在四种基本网络架构中,深度学习可以被定义为具有大量参数和层数的神经网络:

无监督预训练网络(Unsupervised Pre-trained Networks)

卷积神经网络(Convolutional Neural Networks)

循环神经网络(Recurrent Neural Networks)

递归神经网络(Recursive Neural Networks)

在这篇文章中,我主要关注后三种网络架构。卷积神经网络基本上是一个使用共享权重扩展空间的标准神经网络。CNN通过在内部卷积来识别图像,它可以看到图像上识别对象的边缘。递归神经网络基本上是一个使用时间延伸扩展空间的标准神经网络,它提取进入下一时间步的边沿,而不是在同一时间进入下一层。RNN进行序列识别,例如语音或文本信号,因其内部具有循环,意味着在RNN网络中存在短时记忆。递归神经网络更类似于分层网络,其中输入序列实际上与时间无关,但输入必须以树状方式分层处理。以下10种方法适用于上述所有的网络架构。

1—反向传播(Back-Propagation)

反向传播是一种简单计算函数的偏导数(或梯度)的方法,它的形式是函数组合(如神经网络)。当你使用基于梯度的方法求解最优化问题(梯度下降只是其中之一)时,你想在每次迭代中计算函数梯度。

对于一个神经网络,其目标函数是组合形式。如何计算梯度?有2种常规方法:(i)分析微分法。函数形式已知,你只需要用链式法则(基本微积分)计算导数。(ii)有限差分近似微分。这种方法计算成本昂贵,因为评估函数的数量是O(N),其中N是参数的个数。与解析微分相比,这种方法花费代价更大。然而在调试时,通常使用有限差分验证反向传播的执行效果。

2—随机梯度下降法(Stochasitc Gradient Descent)

理解梯度下降的一种直观的方式是,想象一条源于山顶的河流的路径。梯度下降的目标正是河流努力实现的目标—即从山顶流到最底点(在山麓处)。

现在,如果山的地形是这样一种形状,即河流在到达最终目的地(山麓的最低点)之前不会停留,这也是我们所希望的理想情况。在机器学习中,是指从初始点(山顶)开始,我们已经找到了全局最小值(或最优值)的方案。然而,可能由于地形性质,导致河流路径出现若干的坑洼,会迫使河流困住和停滞。在机器学习方面,这种坑洼被称为局部最优解,这是我们不想要的情况。当然有很多方法可以解决局部最优解问题,这里我不打算进一步讨论。

因此,由于地形的性质(或机器学习中函数的性质),梯度下降很容易卡在局部最小值。但是,当你找到一个特殊的山地形状(像一个碗,在机器学习的术语中称为凸函数),那么算法始终能够找到最优值。你可以将想象的这条河流可视化。在机器学习中,这些特殊的地形(也称为凸函数)总是需要优化。另外,你从山顶开始(即函数的初始值)的位置不同,最终你到达山底的路径也完全不同。同样,根据河流的流淌速度(即梯度下降算法的学习速率或步长),你可能会以不同的方式到达目的地。你是否会陷入或避免一个坑(局部最小),都会被这两个标准影响。

3—学习速率衰减(Learning Rate Decay)

调整学习速率来进行随机梯度下降中的过程优化,可以提高性能并减少训练时间。有时这被称为学习速率退火或自适应学习速率。随着时间的推移而降低学习速率是训练过程中最简单也是最常用的自适应学习速率技术。在训练初期使用较大的学习速率值,可以对学习速率进行大幅调整;在训练后期,降低学习速率,使模型以一个较小的速率进行权重的更新。这种技术在早期可以快速学习获得一些较好的权重,并在后期对权重进行微调。

两个流行和简单的学习速率衰减方法如下:

在每个环节逐步降低学习速率

在特定时期进行标记,使用大幅下降来降低学习速率

4-Dropout

拥有大量参数的深度神经网络是非常强大的机器学习系统。然而,在这样的网络中过度拟合是一个很严重的问题。并且大型网络的运行速度很慢,使得在测试阶段,通过结合多个不同的大型神经网络的预测来解决过拟合问题是很困难的。Dropout技术可以用来解决这个问题。

其关键的思想是,在训练过程中随机地从神经网络中删除单元(以及相应的连接),进而防止单元间的过度适应。在训练过程中,在指数级的不同“稀疏”网络中剔除样本。在测试阶段,很容易通过使用有较小权重的单解开网络(untwinednetwork),将这些稀疏网络的预测取平均进而逼近结果。这能有效地避免过拟合,并且相比其它的正则化方法能得到更大的性能提升。中,Dropout技术已经被证明在计算机视觉、语音识别、文本分类和计算生物学等领域的监督学习任务中能提升神经网络的性能,并在多个基准测试数据集中达到顶尖结果。

5-最大池化

最大池化是一种基于样本的离散化方法。目标是对输入表征(图像、隐藏层的输出矩阵等)进行下采样,降低维度并且允许对包括在子区域中的特征进行假设。

通过提供表征的抽象形式,这种方法在某种程度上有助于解决过拟合。同样,它也通过减少学习参数的数量和提供基本的内部表征的转换不变性来减少计算量。最大池化是通过将最大过滤器应用于通常不重叠的初始表征子区域来完成的。

6-批量归一化(Batch Normalization)

当然,包括深度网络在内的神经网络需要仔细调整权重初始化和学习参数。批量归一化能使这个过程更简单。

权重问题:

无论哪种权重初始化,比如:随机或按经验选择,这些权重值都和学习权重差别很大。考虑一个小批量的数据集,在最初时,对于所需的特征激活可能会有很多异常值。

深度神经网络本身就具有病态性,即初始层的微小变动就会导致下一层的巨大变化。

在反向传播过程中,这些现象会导致梯度的偏移,这意味着在学习权重以产生所需输出之前,梯度必须补偿异常值。而这将导致需要额外的时间才能收敛。

批量归一化使这些梯度从离散到正常值,并在小批量范围内(通过归一化)向共同目标流动。

学习率问题:

通常来说,学习率保持较低,使得只有一小部分的梯度用来校正权重,原因是异常激活的梯度不应该影响已经学习好的权重。通过批量归一化,这些异常值激活的可能性会被降低,从而可以使用更大的学习率加速学习过程。

7-长短期记忆(Long short-Term Memory)

长短期记忆网络(LSTM network)的神经元和其他递归神经网络(recurrent neural network)中常用神经元在以下三个方面有所不同:

它对神经元的输入有决定权;

它对上一个时间步中计算内容的存储有决定权;

它对将输出传递到下一个时间步的时间有决定权。

LSTM的强大在于它能只基于当前的输入就决定以上所有的值。请看下方的图表:

当前时间标记处的输入信号x(t)决定了上述所有3个点。输入门(input gate)决定了第1点,遗忘门(forget gate)决定了第2点,输出门(output gate)决定了第3点。只依赖输入就能完成所有这三项决定。这受到了大脑工作机制的启发,大脑可以基于输入来处理突然的上下文切换。

8-Skip-gram

词嵌入模型的目标是为每个词汇项学习一个高维密集表征,其中嵌入向量之间的相似性显示了相应词语之间的语义或句法相似性。Skip-gram是一种学习词嵌入算法的模型。

skip-gram 模型(和很多其它词嵌入模型)背后的主要思想是:如果两个词汇项有相似的上下文,则它们是相似的。

换种说法,假设你有一个句子,比如“cats are mammals“,如果用”dogs“替换”cats“,该句子仍然是有意义的。因此在这个例子中,”dogs“和”cats“有相似的上下文(即”are mammals“)。

基于上述假设,我们可以考虑一个上下文的窗口(一个包含K个连续项的窗口)。那么你应该跳过其中一个词,试着学习一个除了跳过的这个词以外,还可以预测跳过的词的神经网络。因此,如果两个词在大语料库中反复共享相似的上下文,那么这些词的嵌入向量将具有相似的向量。

9-连续词袋模型(Continuous Bag of Words)

在自然语言处理中,我们希望学习将文档中的每一个单词表示为一个数值向量,使得出现在相似上下文中的单词有非常相似或相近的向量。在连续词袋模型中,我们的目标是能利用围绕一个特定单词的上下文,预测这个特定单词。

我们通过在一个大的语料库中抽取大量的句子来做到这一点,每次看到一个单词时,我们同时抽取它的上下文。然后我们将上下文单词输入到一个神经网络,并预测在这个上下文中心的单词。

当我们有成千上万个这样的上下文词汇和中心词时,我们就有了一个神经网络数据集的实例。我们训练这个神经网络,在经过编码的隐藏层的最终输出中,我们得到了表示特定单词的嵌入式表达。当我们对大量的句子进行训练时也能发现,类似语境中的单词恰巧得到相似的向量。

10-迁移学习(Transfer Learning)

让我们考虑图像到底是如何流经卷积神经网络的。假设你有一张图像,对其应用卷积,并得到像素的组合作为输出。假设这些输出是边缘,再次应用卷积,那么现在输出将是边或线的组合。然后再次应用卷积,此时的输出将是线的组合,以此类推……你可以把它看作是在每一层寻找一个特定的模式。神经网络的最后一层往往会变得非常特异化。如果你基于ImageNet进行训练,那么神经网络的最后一层大概就是在寻找儿童、狗或者飞机等整体图案。再往后倒退几层,你可能会看到网络在寻找眼睛、耳朵、嘴巴或者轮子等组成部件。

深度卷积神经网络中的每一层都逐步建立起越来越高层次的特征表征,最后几层往往是专门针对模型输入端的任何数据。另一方面,前面的层则更为通用,是在一个大类图片中有找到许多简单的模式。

迁移学习就是当你在一个数据集上训练CNN时,切掉最后一层,在不同的数据集上重新训练模型的最后一层。直观地说,你正在重新训练模型以识别不同的高级特征。因此,训练时间会减少很多,所以当你没有足够的数据或者训练需要太多的资源时,迁移学习是一个有用的工具。

这篇文章简单介绍了深度学习的一些方法,如果你想要了解更多、更深层次的东西,建议你继续阅读以下资料:

Andrew Beam’s “Deep Learning 101” (深度学习基本) :

http://beamandrew.github.io/deeplearning/2017/02/23/deep_learning_101_part1.html

Andrey Kurenkov’s “A Brief History of Neural Nets and Deep Learning”(神经网络和深度学习简史):

http://www.andreykurenkov.com/writing/a-brief-history-of-neural-nets-and-deep-learning/

Adit Deshpande’s “A Beginner’s Guide to Understanding Convolutional Neural Networks”(理解卷积神经网络的入门指南):

https://adeshpande3.github.io/adeshpande3.github.io/A-Beginner%27s-Guide-To-Understanding-Convolutional-Neural-Networks/

Chris Olah’s “Understanding LSTM Networks”(了解长短期记忆LSTM神经网络):

http://colah.github.io/posts/2015-08-Understanding-LSTMs/

Algobean’s “Artificial Neural Networks”(人工神经网络):

https://algobeans.com/2016/03/13/how-do-computers-recognise-handwriting-using-artificial-neural-networks/

Andrej Karpathy’s “The Unreasonable Effectiveness of Recurrent Neural Networks”(递归神经网络的神奇有效性):

http://karpathy.github.io/2015/05/21/rnn-effectiveness/

深度学习是非常注重技术实践的。本文中对每一个新想法都没有太多具体的解释,对于大多数新想法都附带了实验结果来证明它们能够运作。学习深度学习就像玩乐高,掌握乐高和掌握其他艺术一样具有挑战性,但是入门乐高可是相对容易很多的。返回搜狐,查看更多

责任编辑:

声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
阅读 ()
投诉
免费获取
今日推荐