过去十年来,人们对机器学习的兴趣经历了爆炸式的增长。你几乎每天都能在计算机科学程序、行业会议和《华尔街日报》(Wall Street Journal)上看到机器学习的影子。在所有关于机器学习的讨论中,许多人都将机器学习能够做什么,与他们希望机器学习能够做什么混为一谈了。从根本上来说,机器学习就是使用算法从原始数据中提取信息,并在某种类型的模型中表示出来。我们使用这个模型来推断我们尚未建模的其他数据。
神经网络是机器学习中的一种模型;它们已经存在至少有 50 年了。神经网络的基本单元是一个节点,它的灵感源自哺乳动物大脑中的生物神经元。神经元节点之间的连接也模仿了生物大脑,也会像生物大脑那样不断演化(即通过“训练”的方式)。
许多重要的神经网络架构都是在上世纪八十年代中期和九十年代早期完成的。不过,要得到良好的结果,需要大量的时间和数据,当时计算机处理的能力尚不足以满足这些要求,人们因此对机器学习的热情也降低了。这一尴尬的局面直到 21 世纪初期才得以打破:这时候计算能力呈指数级增长。业界目睹了计算技术的“寒武纪大爆发”,而在此之前,这些都是不可想象的。在这十年中,深度学习以机器学习领域的重要竞争者的姿态,在计算能力爆炸式增长中脱颖而出。这种热度直到 2017 年仍未降温。今天,我们在机器学习中的每个角落,都能看到深度学习的身影。
为了能够跟上这一潮流,我选修了 Udacity 的“深度学习”课程(http://u6.gg/e6fJx),这门课程很好地介绍了深度学习的动机、在 TensorFlow 的复杂、大规模数据集中学习的智能系统的设计。在课堂作业中,我使用并开发了用于图像识别的卷积神经网络,用于自然语言处理的嵌入式神经网络,以及使用循环神经网络 / 长短期记忆的字符级文本生成。Jupiter Notebook 中所有代码都可以在这个 GitHub 存储库中找到:http://u6.gg/e6fMD
下图是其中一个作业的结果,词向量的 t-SNE 投影,通过相似性进行聚类。
后来我阅读了这方面的学术论文。据我的研究得出,下面是一些对机器学习领域发展产生巨大影响的出版物:
NYU:《Gradient-Based Learning Applied to Document Recognition》,1998 年。将卷积神经网络引入机器学习领域。http://u6.gg/e6fNP
Toronto:《Deep Boltzmann Machines》,2009 年。为玻尔兹曼机(Boltzmann Machines)提出了一种新的学习算法,该算法包含了许多隐藏变量层。http://u6.gg/e6fPd
Stanford 和 Google:《Building High-Level Features Using Large-Scale Unsupervised Learning》,2012 年。解决了仅从无标记数据构建高级特定类别的特征检测器的问题。http://u6.gg/e6fPr
Berkeley:《DeCAF — A Deep Convolutional Activation Feature for Generic Visual Recognition》,2013。发布了 DeCAF,一种深度卷积激活特征的开源实现,以及所有相关的网络参数,使视觉研究人员能够在一系列视觉概念学习范例中进行深度表征的实验。http://u6.gg/e6fP6
DeepMind:《Playing Atari with Deep Reinforcement Learning》,2016 年。提出了第一个使用强化学习直接从高维感官输入中成功学习控制策略的深度学习模型。http://u6.gg/e6fPT
通过研究和学习这些学术论文,我学到了很多关于深度学习的知识。我想在本分中分享 10 个强大的深度学习的方法,AI 工程师可以将这些方法应用到机器学习的问题中。但首先,让我们先定义什么是深度学习。如何定义深度学习对许多人来说是一个挑战,因为在过去十年,深度学习的形式都在缓慢地发生变化。为了直观地解释深度学习,如下图所示,展示了人工智能、机器学习和深度学习之间关系的概念。
人工智能领域相当广泛,存在已久。深度学习是机器学习领域的一个子集,而机器学习是人工智能的一个子领域。深度学习网络与“典型”前馈多层网络的区别如下:
深度学习网络的神经元比以前的网络更多
深度学习网络的连接层的方式更为复杂
深度学习网络需要像“寒武纪大爆炸”的计算能力进行训练
深度学习网络具备自动特征提取的能力
上文提到的“更多的神经元”,意思是指神经元的数量随着时间的推移而增加,以表达更为复杂的模型。层也从多层网络中完全连接的各层演变为卷积神经网络中各层之间局部连接的神经元片段,以及在递归神经网络中同一神经元的循环链接(除了前一层的连接)。
因此,深度学习可以被定义为以下四个基本网络框架中具有大量参数和层数的神经网络:
无监督预训练网络(Unsupervised Pre-trained Networks)
卷积神经网络(Convolutional Neural Networks)
循环神经网络(Recurrent Neural Networks)
递归神经网络(Recursive Neural Networks)
在本文中,我主要对后三种架构感兴趣。
卷积神经网络(Convolutional Neural Network,CNN)基本上就是一种标准的神经网络,通过使用共享权重在空间中扩展。卷积神经网络旨在通过内部的卷积来识别图像,它可以看到图像上识别对象的边缘。
循环神经网络(Recurrent Neural Network)基本上也是一种标准的神经网络的扩展,它通过下一个时间步骤中,而不是同一个时间步骤中进入下一层。循环神经网络旨在识别序列,例如语音信号或文本。它内部有循环,这意味着网络中存在短时记忆。
递归神经网络(Recursive Neural Network)更像是一个分层网络,其中输入序列实际上没有时间方面,但输入必须以树形方式进行分层处理。
下面提到的 10 个方法可以应用于所有这些架构。
1 — 反向传播
反向传播(Back-prop)简单来说就是计算函数的偏导数(或梯度)的一种方法,它具有函数组合的形式(如神经网络)。当你使用基于梯度的方法(梯度下降法只是其中之一)来解决最优问题时,需要在每次迭代中计算函数梯度。
对神经网络来说,目标函数具有组合的形式。如何计算梯度呢?有两种常见的方法可以计算:
(i) 解析微分:知道函数形式时,只需使用链式法则(基本微积分)计算计算导数。
(ii) 有限差分近似微分:这种方法运算量很大,因为函数求职的个数是 O(N),其中 N 是参数的个数。与解析微分相比,这种方法运算量极大。但是,有限差分通常用于在调试时验证反向传播实现。
2 — 随机梯度下降法
对梯度下降的一种直观理解方法是,想象一条源自山顶向下的河流。梯度下降的目标正是河流努力要达到的目标:到达最低端(山脚处)。
现在,如果山势能够使河流在到达最终目的地之前(即山麓最低处)不必完全停留,这正是我们想要的理想情况。在机器学习中,这相当于是说,我们已经从初始点(山顶)开始找到解决方案的全局最小值(或最优值)。然而,可能由于地形的原因,河道中会形成几个坑洼,会迫使河流陷入困境并停滞不前。在机器学习术语中,这些坑洼被称为局部最小值,都是不可取的。有很多方法可以解决这个问题。限于篇幅,我不打算讨论这个问题。
因此,梯度下降法很容易陷入局部最小值,这取决于地势(或机器学习术语中的函数)。但是,当你有一种特殊的山地地势(比如像一只碗,用机器学习术语称为凸函数)时,算法总是能够保证找到最优解。你可以想象一下一条河流。这些特殊的地形(又称凸函数)对机器学习中的优化总是有好处。此外,你遵循什么样的路径,要取决于你最初是从山顶什么地方开始的(即函数的初始值)。类似的,根据不同的河流速度(即梯度下降算法的学习率或步长),你可能会以不同的方式到达最终目的地。这两个因素都会影响你是否掉坑(局部最小值)或能否避免。
3 — 学习率衰减
调整随机梯度下降优化算法的学习率可以提高性能并缩短训练时间。有时这被称为学习率退火( learning rate annealing)或自适应学习率(adaptive learning rates)。在训练过程中,最简单、也是最常用的适应学习率的方法是逐渐降低学习率的技术。在训练初期使用较大的学习率,可以对学习率进行大幅调整;在训练后期,降低学习率,以一个较小的速率更新权重。这种方法在早期可以快速学习获得较好的权重,并在后期对权重进行微调。
两种常用且易于使用的学习率衰减方法如下:
线性逐步降低学习率。
在特定时点大幅降低学习率。
4 — Dropout
具有大量参数的深度神经网络是非常强大的机器学习系统。然而,在这样的网络中,过拟合是一个严重的问题。大型网络的使用起来也很慢,因此在测试时结合许多不同大型神经网络的预测,很难处理过拟合问题。Dropout 是解决这个问题的一种方法。
关键思想是在训练过程中从神经网络中随机删除单元 (以及它们的连接)。这就防止了单位之间的过度适应。在训练过程中,从指数级不同的“稀疏”网络中抽取 dropout 样本。在测试时,只需使用具有较小权重的单解开网络(single untwined network),就可以很容易地估计出所有这些稀疏网络的平均预测效果。这就大大减少了过拟合,并且对其他正则化方法进行了重大改进。Dropout 已被证明可以改善神经网络在视觉、语音识别、文档分类和计算生物学等监督学习的任务性能,在许多基准数据集上获得了最优秀的结果。
5 — 最大池化
最大池化(Max pooling)是基于采样的离散化过程。目标是对输入表征(如图像、隐藏层输出矩阵等)进行降采样(down-sample),减小其维数,并允许对包含在子区域中的特征进行假设。
这部分是为了通过提供抽象的表征形式来帮助过拟合。同时,通过减少学习参数的数量,降低了计算成本,为内部表征提供了基本的平移不变性。最大池化是通过对初始表征的通常不重叠的子区域应用最大过滤器(Max filter)来实现的。
6 — 批量归一化
当然,包括深度网络的神经网络需要仔细调整权重初始化和学习参数,批量归一化有助于使这一过程稍微轻松些。
权重问题:
无论权重的初始化是什么,不管是随机的还是经验选择的,它们都与学习后的权重相差甚远。考虑一个小批量,在最初的轮数(epoch)中,根据所需的特性激活,会有很多离群值。
深度神经网络本身就是不适定(ill-posed)的,即初始层的一个微小扰动会导致后面的层发生很大的变化。
在反向传播过程中,这些现象会分散梯度的注意力,这意味着梯度必须在学习产生所需输出的权重之前补偿离群值。这就需要额外的轮数来收敛。
批量归一化将这些梯度从分散归一化到离群值,并在一个小批量的范围内朝着共同目标收敛(通过对它们进行归一化)。
学习率问题:一般来说,学习率保持得很小,使得只有一小部分梯度修正了权重,原因是离群值激活的梯度不应该影响学习好的权重。通过批量归一化,这些离群值激活被减少,因此更高的学习率可以用来加速学习过程。
7 — 长短期记忆网络
长短期记忆(Long short-term memory,LSTM)网络与递归神经网络中的普通神经元有以下三个区别:
它可以控制何时让输入进入神经元。
它可以控制决定何时记住在前一个时间步骤中计算的内容。
它可以控制决定何时将输出传递给下一个时间戳。
LSTM 的优点在于:它基于当前输入本身来决定所有这些。因此,如果你看一下如下图表,就会明白了:
当前时间戳上的输入信号 x(t) 决定了以上 3 个点。输入门对第 1 点做出决定。遗忘门在第 2 点做出决定。输出门在第 3 点做出决定。单是输入就能做出这三个决定。这是受我们大脑工作方式的启发,可以根据输入处理突然的上下文切换。
8 — Skip-gram
词嵌入(Word Embedding)模型的目标是学习每个词汇词的高维密集表示,其中嵌入向量之间的相似性表示对应词之间的语义或句法相似性。Skip-gram 是学习词嵌入算法的模型。
skip-gram 模型 (以及许多其他词嵌入模型) 背后的主要思想如下:如果两个词汇具有相似的上下文,那么它们就是相似的。
换句话说,假设你有一个句子,比如“猫是哺乳动物”。如果你用“狗”而不是“猫”这个词,这个句子仍然是一个有意义的句子。因此在这个例子中,“狗”和“猫”可以共享相同的上下文 (即“是哺乳动物”)。
基于上述假设,你可以考虑上下文窗口(包含 k 个连续项的窗口)。然后你应该跳过其中一个单词,试着学习神经网络,它能得到所有的词,除了跳过的那个,并预测跳过的那个。因此,如果两个词在一个大型语料库中重复共享相似的上下文,这些词的嵌入向量就会有相近的向量。
9 - 连续词袋
在自然语言处理问题中,我们希望学习如何将文档中的每个单词表示为数字向量,以便出现在相似上下文中的单词具有彼此接近的向量。在连续词袋(Continuous Bag Of Words)模型中,目标是能够使用特定单词周围的上下文并预测特定单词。
我们通过在大型语料库中抽取大量的句子来做到这一点:每次我们看到一个词,我们就取它周围的词。然后我们将上下文的单词输入到神经网络中,并预测这个上下文中心的词。
当我们有成千上万这样的上下文词和中心词时,我们就有了一个神经网络数据集的实例。我们训练神经网络,最后编码的隐藏层输出表示一个特定词的嵌入。当我们对大量的句子进行训练时,相似上下文中的单词会得到相似的向量。
10 — 迁移学习
让我们考虑图像是如何通过卷积神经网络处理的。假设你有一个图像,你对它应用卷积,你得到像素的组合作为输出。假设它们是边。现在再次应用卷积,现在输出的是边或线的组合。然后再次应用卷积,这时候输出是线的组合,以此类推。你可以把它看作是寻找特定模式的每一层。神经网络的最后一层趋向于变得非常专业化。也许如果你正在使用 ImageNet,你的网络的最后一层将用于寻找孩子、狗、飞机或者其他什么。在后面几层你可能会看到网络在寻找眼睛、耳朵、嘴巴或者*。
深度 CNN 中的每一层都在不断地构建更高层次的特征表征。最后几个层往往专门针对输入到模型中的任何数据。另一方面,前面的层更加通用,在大量的图片中有许多简单的模式。
迁移学习是当你对一个数据集进行卷积神经网络训练时,切掉最后一层,在另一个数据集中重新训练模型最后一层。从直觉上来说,你正在重新训练模型以识别不同的更高级别的特征。因此,当你没有足够的数据或者训练占用了太多的资源时,迁移学习就是一个有用的工具。
本文只展示了这些方法的一般概述。我建议阅读下面的文章以获得更详细的解释:
Andrew Beam:《Deep Learning 101》 :http://u6.gg/e6fX7
Andrey Kurenkov:《A Brief History of Neural Nets and Deep Learning》http://u6.gg/e6fXN
Adit Deshpande:《A Beginner’s Guide to Understanding Convolutional Neural Networks》http://u6.gg/e6fYm
Chris Olah:《Understanding LSTM Networks》http://u6.gg/e6fY2
Algobean:《Artificial Neural Networks》http://u6.gg/e6fYL
Andrej Karpathy:《The Unreasonable Effectiveness of Recurrent Neural Networks》http://u6.gg/e6fYY
深度学习非常注重技术实践。对于每一个新想法都没有太多具体的解释。大多数新想法都是通过实验结果出来的,以证明它们是可行的。深度学习就像玩乐高积木。掌握乐高和其他任何艺术一样具有挑战性,但入门更容易。