不管是AI也好,其他学科也好,学习、研究的过程中不断反思学科的历史,总结学科的发展现状,找出最重要的理念,总能让人能“吾道一以贯之”。软件工程师James Le近期根据他研究的经验总结出了AI研究必须要知道的十种深度学习方法,非常具有启发性。
The 10 Deep Learning Methods AI Practitioners Need to Apply
人们对机器学习的兴趣在过去十年经历了爆炸式的发展。计算机科学项目中、业界会议中、媒体报道中,你都能够看到机器学习的影子。但是似乎所有关于机器学习的讨论中,人们常常会把AI能做什么和他们希望AI能做什么混为一谈。
从根本上来讲,机器学习其实就是使用算法从原始数据中提取信息,并以某种类型的模型表示出来;然后我们使用这个模型来推断我们尚未建模的其他数据。
神经网络作为机器学习的一类模型,它们已经存在了至少50年。神经网络的基本单元是节点,大致上模仿了哺乳动物大脑中的生物神经元的节点;节点之间的链接(也是模仿生物大脑)随着时间的推移(训练)而演化。
在上世纪八十年代中期和九十年代早期,许多重要的神经网络构架都已经做出了,不过要想获得好的结果还需要足够强大的计算能力和大体量的数据集,这些当时在当时很不理想,所以也导致人们对机器学习的热情逐渐冷淡了下来。在21世纪初,计算机的计算能力呈现了指数级的增长——业界见证了计算机技术的“寒武纪大爆发”,这在之前几乎是不可想象的。深度学习作为这个领域中一个重要的架构,在计算能力爆发式增长的十年中,赢得了许多重要的机器学习竞赛。这个红利的热度直到今年仍未降温;今天,我们看到在机器学习的每个角落里都会提到深度学习。
为了更深入地了解这些,我参加了一门“深度学习”课程,并开发了一个图像识别的神经网络以及基于循环神经网络(RNN)和长短项记忆(LSTM)的自然语言处理。可以去我的Github仓库中查看这些代码:
https://github.com/khanhnamle1994/deep-learning
最近,我也开始阅读一些深度学习方面的学术论文。下面这些是我收集到的几篇对深度学习领域的发展有重大影响的几篇论文:
1、Gradient-Based Learning Applied to Document Recognition (1998)
意义:向机器学习世界引进了卷积神经网络
作者:Yann LeCun, Leon Bottou, Yoshua Bengio, and Patrick Haffner
2、Deep Boltzmann Machines (2009)
意义:为玻尔兹曼机提出了一种新的学习算法,其中包含许多隐藏变量层。
作者:Ruslan Salakhutdinov, Geoffrey Hinton
3、Building High-Level Features Using Large-Scale Unsupervised Learning (2012)
意义:解决了仅从未标记的数据构建高层次、特定类别的特征检测器的问题。
作者:Quoc V. Le,Marc’Aurelio Ranzato,Rajat Monga,Matthieu Devin,Kai Chen,Greg S. Corrado,Jeff Dean,Andrew Y. Ng
4、DeCAF — A Deep Convolutional Activation Feature for Generic Visual Recognition (2013)
意义:释放了一个深度卷积激活特征的开源实现——DeCAF,以及所有相关的网络参数,使视觉研究人员能够深入地在一系列视觉概念学习范例中进行实验。
作者:Jeff Donahue,Yangqing Jia,Oriol Vinyals,Judy Hoffman,Ning Zhang,Eric Tzeng,Trevor Darrell
5、Playing Atari with Deep Reinforcement Learning (2016)
意义:提供了第一个可以使用强化学习从高维感官输入中直接学习控制策略的深度学习模型。
作者:
Volodymyr Mnih,Koray Kavukcuoglu,David Silver,Alex Graves,Ioannis Antonoglou,Daan Wierstra,Martin Riedmiller(DeepMind 团队)
在这些学习和研究中,我发现大量非常有意思的知识点。在这里我将分享十个深度学习的方法,AI工程师可能会将这些应用到他们的机器学习问题当中。
不过,首先先让我们来定义一下什么是“深度学习”。对很多人来说,给“深度学习”下一个定义确实很有挑战,因为在过去的十年中,它的形式已经慢慢地发生了很大的变化。
先来在视觉上感受一下“深度学习”的地位。下图是AI、机器学习和深度学习三个概念的一个关系图。
AI的领域要相对较广泛,机器学习是AI的一个子领域,而深度学习是机器学习领域中的一个子集。
深度学习网络与“典型”的前馈多层网络之间是有一些区别的,如下:
深度学习网络比之前的网络有更多的神经元
深度学习网络具有更复杂的连接层的方式
深度学习网络需要用强大的计算能力来训练
深度学习网络能够进行自动特征提取
因此深度学习可以被定义为在以下四个基本网络框架中拥有大量参数和层的神经网络:
无监督预训练网络(Unsupervised Pre-trained Networks)
卷积神经网络(Convolutional Neural Networks)
循环神经网络(Recurrent Neural Networks)
递归神经网络 (Recursive Neural Networks)
在这篇文章中,我主要对后三个框架比较感兴趣。
卷积神经网络 基本上就是用共享权重在空间中进行扩展的标准神经网络。设计CNN主要是为了通过内部卷积来识别图片,内部卷积可以看到待识别物体的边。
循环神经网络 基本上是在时间上进行扩展的标准神经网络,因为边进入下一个时间步,而不是在同一时间步进入下一个层。设计RNN主要是为了识别序列,例如语音信号或者文本。它里面的循环意味着网络中存在短暂的记忆。
递归神经网络 更类似于分层网络,其中输入序列没有真正的时间面,而是输入必须以树状方式分层处理。
以下10种方法可以应用于所有这些体系结构。
反向传播是“误差反向传播”的简称,它是一种计算函数(在神经网络中以函数形式存在)偏微分的方法。当你要用一个基于梯度的方法来解决一个最优问题时(注意梯度下降只是解决这类问题的一种方法),你希望在每一次迭代中计算函数梯度。
对于神经网络而言,目标函数具有合成的形式。那么如何计算梯度呢?一般情况下有两种常见的方法:
微分分析法。当你知道这个函数的形式时,你只需要用链式法则计算导数即可;
用有限差分方法来近似微分。这种方法的计算量很大,因为函数评估的数量是O(N),其中N是参数的数量。与微分分析法相比,这是比较昂贵的。不过,有限差分通常在调试时验证后端实现。
一个直观理解梯度下降的方法是去想象一条溯源山顶的河流。这条河流会沿着山势梯度的方向流向山麓下的最低点。
如果让人来走,可能就不一样了,你可能会先随便选一个方向,然后沿着这个方向的梯度向下走;过一会儿再随机换一个方向向下走;最后你发现自己差不多也到了谷底了。
数学化的理解就是:
随机梯度下降主要用来求解类似于如下求和形式的优化问题:
梯度下降法:
当n很大时,每次迭代计算所有的梯度会非常耗时。
随机梯度下降的想法就是每次在Delta f_i 中随机选取一个计算代替上面的Delta f_i,以这个随机选取的方向作为下降的方向。这样的方法反而比梯度下降能够更快地到达(局部)最优解。
在训练模型的时候,通常会遇到这种情况:我们平衡模型的训练速度和损失(loss)后选择了相对合适的学习率(learning rate),但是训练集的损失下降到一定的程度后就不在下降了,比如training loss一直在0.7和0.9之间来回震荡,不能进一步下降。如下图所示:
遇到这种情况通常可以通过适当降低学习率(learning rate)来实现。但是,降低学习率又会延长训练所需的时间。
学习率衰减(learning rate decay)就是一种可以平衡这两者之间矛盾的解决方案。学习率衰减的基本思想是:学习率随着训练的进行逐渐衰减。
学习率衰减基本有两种实现方法:
线性衰减。例如:每过5个epochs学习率减半;
指数衰减。例如:每过5个epochs将学习率乘以0.1。
在当前的大规模神经网络中有两个缺点:
费时;
容易过拟合
Dropout 可以很好地解决这个问题。Dropout说的简单一点就是在前向传导的时候,让某个神经元的激活值以一定的概率p停止工作,示意图如下:
每次做完dropout,相当于从原始的网络中找到一个更瘦的网络。
Hinton在其论文中做了这样的类比,无性繁殖可以保留大段的优秀基因,而有性繁殖则将基因随机拆了又拆,破坏了大段基因的联合适应性;但是自然选择了有性繁殖,物竞天择,适者生存,可见有性繁殖的强大。dropout 也能达到同样的效果,它强迫一个神经单元,和随机挑选出来的其他神经单元共同工作,消除减弱了神经元节点间的联合适应性,增强了泛化能力。
池化(Pooling)是卷积神经网络中另一个重要的概念,它实际上是一种形式的向下采样。有多种不同形式的非线性池化函数,而其中“最大池化(Max pooling)”是最为常见的。它是将输入的图像划分为若干个矩形区域,对每个子区域输出最大值。
直觉上,这种机制能够有效地原因在于,在发现一个特征之后,它的精确位置远不及它和其他特征的相对位置的关系重要。池化层会不断地减小数据的空间大小,因此参数的数量和计算量也会下降,这在一定程度上也控制了过拟合。通常来说,CNN的卷积层之间都会周期性地插入池化层。
包括深度网络在内的神经网络需要仔细调整权重初始化和学习参数。批标准化使这些变得轻松许多。
权重问题:
无论权重的初始化如何,是随机的还是经验性的选择,它们离学习权重都会很远。考虑一个小批量,初期在所需的特征激活方面会有很多异常值。
深层神经网络本身是病态的,初始层中的微小扰动都会导致后面层的非常大的变化。
在反向传播过程中,这些现象会导致梯度弥散。这就意味着在学习权重产生所需要的输出前,必须对梯度的异常值进行补偿,这将导致需要额外的时段来收敛。
批量归一化使这些梯度从分散到正常值并在小批量范围内流向共同目标(通过归一化)。
学习率问题:一般来说,学习率需要保持较低的值,使得只有一小部分的梯度来校正权重,原因是要使异常激活的梯度不影响已学习到的激活。通过批量标准化,可以减少这些异常激活,因此也就可以使用更高的学习率来加速学习过程。
LSTM网络具有以下三个方面,使其与循环神经网络中的常见神经元不同:
它能够决定何时让输入进入神经元;
它能够决定何时记住上一个时间步中计算的内容;
它决定何时让输出传递到下一个时间步。
LSTM的美妙之处在于它能够根据当前的输入本身来决定所有这些。 所以你看下面的图表:
当前时间的输入信号x(t)决定所有上述3个点。 输入门决定点1,遗忘门决定点2,输出门决定点3。任何一条输入都能够采取所有这三个决定。这种设计其实是受到了我们大脑如何工作的启发,并且可以基于输入来处理突然的上下文切换。
词嵌入模型的目标是为每个词项学习一个高维密集表示,其中嵌入向量之间的相似性显示了相应词之间的语义或句法相似性。 Skip-gram是一个学习词嵌入算法的模型。
skip-gram模型(以及许多其他的词语嵌入模型)背后的主要思想如下:两个词项相似,如果它们共享相似的上下文。
换句话说,假设你有一个句子,例如“猫是哺乳动物”;如果你用“狗”而不是“猫”,这个句子还是一个有意义的句子。
因此在这个例子中,“狗”和“猫”可以共享相同的上下文(即“是哺乳动物”)。
基于上述假设,你可以考虑一个上下文窗口(一个包含k个连续项的窗口),然后你跳过其中一个单词,试着去学习一个能够得到除跳过项外的所有项的神经网络,并预测跳过的这个项。如果两个词在一个大语料库中反复共享相似的语境,则这些词的嵌入向量将具有相近的向量。
在自然语言处理问题中,我们希望学习将文档中的每个单词表示为一个数字的向量,使得出现在相似的上下文中的单词具有彼此接近的向量。在连续的单词模型中,目标是能够使用围绕特定单词的上下文并预测特定单词。
我们通过在一个大的语料库中采取大量的句子来做到这一点,每当我们看到一个单词时,我们就提取周围的单词。 然后,我们将上下文单词输入到一个神经网络,并预测在这个上下文中间的单词。
当我们有成千上万个这样的上下文单词和中间词时,我们就有一个神经网络数据集的实例。 我们训练神经网络,最后编码的隐藏层输出表示了特定单词的嵌入。 恰巧,当我们对大量的句子进行训练时,类似语境中的单词得到相似的向量。
让我们想一下如何在CNN中处理一张图片。假设有一张图片,你对它进行卷积处理,然后你得到的输出是像素的组合,我们姑且称之为“边”吧。我们再次使用卷积,这时候你得到的输出将是边的组合,我们称之为“线”。如果再次使用卷积,那么你将得到线的组合,等等。
每一层都是在寻找相应的特定模式。你的神经网络最后一层一般会给出非常特定的模式。也许你在处理ImageNet,你的网络最后一层可能是在找孩子、狗或飞机或别的任何东西。如果你向前两层看,网络可能是在找眼睛、耳朵、嘴巴或者轮子。
深度卷积神经网络中的每一层的深入都是在构建越来越高层次的特征表示。最后两层会产生你输入模型的数据中的特定模式。换句话说,早期的层提取的特征则广泛得多,在提取的大量的类中有很多简单的模式。
迁移学习就是当你用一个数据集训练CNN时,砍掉最后的一(些)层,再用另一个不同的数据集重新训练最后一(些)层的模型。直观地说,你在重新训练模型来识别不同的高级层次特征。作为结果,训练时间大幅减少。所以当你没有足够的数据或者训练的资源时,迁移学习是非常有用的一个工具。
这篇文章只是展示了这些方法的一般概述。我建议阅读下面这些文章以获得对这些概念更详细的解释:
Andrew Beam’s “Deep Learning 101”
Andrey Kurenkov’s “A Brief History of Neural Nets and Deep Learning”
Adit Deshpande’s “A Beginner’s Guide to Understanding Convolutional Neural Networks”
Chris Olah’s “Understanding LSTM Networks”
Algobean’s “Artificial Neural Networks”
Andrej Karpathy’s “The Unreasonable Effectiveness of Recurrent Neural Networks”
深度学习非常注重技术,而对每一个新的想法却没有太多具体的解释。大多数新的idea只是用实验结果来证明它们的工作。深度学习就像玩乐高,掌握它有一定的挑战性,但是入门还是很容易的。