这是机器学习系列的最后一篇文章,文章的很多数学公式我自己看的都有点不耐烦了。虽说不耐烦,但学到现在却也有不小的成就感,没想到连高数都挂科的人能坚持到现在。通过这几篇文章的写作让自己对AI有了一个系统性的认识,明白了AI的一些基本原理。在机器学习系列结束之后,就开始研究AI的应用技术原理,以及AI整体行业的发展情况和一些落地前沿技术,比如CV或者NLP之类的,在此期间也会重点关注产品经理的思维方式,学会如何AI、PM思维去分析场景应用等等。接下来开始讲深度学习其他两种神经网络受限玻尔兹曼机和自编码器
受限玻尔兹曼机
在前面我们讲到了深度学习的两类神经网络模型的原理,第一类是前向的神经网络,即DNN和CNN。第二类是有反馈的神经网络,即RNN和LSTM。接下来我们就总结下深度学习里的第三类神经网络模型:玻尔兹曼机。主要关注于这类模型中的受限玻尔兹曼机(RBM), RBM模型及其推广在工业界比如推荐系统中得到了广泛的应用。
受限玻尔兹曼机(RBM,Restricted Boltzmann machine)由多伦多大学的 Geoff Hinton 等人提出,它是一种可以用于降维、分类、回归、协同过滤、特征学习以及主题建模的算法。
本文将从受限玻尔兹曼机的关系和历史重要性出发,首先讨论什么是 RBM。随后,我们会使用图表和浅显的语言来描述它们的运行原理。
RBM 是两层神经网络,这些浅层神经网络是 DBN(深度信念网络)的构建块。RBM 的第一层被称为可见层或者输入层,它的第二层叫做隐藏层。
上图中的每个圆圈代表一个类似于神经元的节点,这些节点通常是产生计算的地方。相邻层之间是相连的,但是同层之间的节点是不相连的。
也就是说,不存在层内通信,这就是 RBM 中的限制所在。每一个节点都是处理输入数据的单元,每个节点通过随机决定是否传递输入。随机意味着「随机判断」,这里修改输入的参数都是随机初始化的。
每个输入单元以数据集样本中的低级特征作为输入。例如,对于一个由灰度图组成的数据集,每个输入节点都会接收图像中的一个像素值。MNIST 数据集有 784 个像素点,所以处理它们的神经网络必须有 784 个输入节点。
接下来,让我们看一下多个输入单元是如何结合在一个隐藏节点的。每个 x 乘以一个独立的权重,然后相加后再加一个偏置项,最后将结果传递到激活函数来产生输出。
因为所有可见(或输入)节点的输入都被传递到所有的隐藏节点了,所以 RBM 可以被定义为对称二分图(symmetrical bipartite graph)。
对称意味着每个可见节点都与一个隐藏节点相连(如下所示)。二分则意味着它具有两部分,或者两层。图是一个数学术语,指的是由节点和边组成的网络。
在每一个隐藏节点,每个输入 x 都与对应的权重 w 相乘。也就是说,一个输入 x 会拥有 12 个权重(4 个输入节点×3 个输出节点)。两层之间的权重总会形成一个矩阵,矩阵的行数等于输入节点的个数,列数等于输出节点的个数。
每个隐藏节点会接收 4 个与对应权重相乘的输入。这些乘积的和再一次与偏置相加,并将结果馈送到激活函数中以作为隐藏单元的输出。
如果这两层是更深网络的一部分,那么第一个隐藏层的输出会被传递到第二个隐藏层作为输入,从这里开始就可以有很多隐藏层,直到它们增加到最终的分类层。对于简单的前馈网络,RBM 节点起着自编码器的作用,除此之外,别无其它。
重建(Reconstruction)
但是在本文关于 RBM 的介绍中,我们会集中讨论它们如何以一种无监督的方式通过自身来重建数据,这使得在不涉及更深层网络的情况下,可见层和第一个隐藏层之间会存在数次前向和反向传播。
在重建阶段,第一个隐藏层的激活状态变成了反向传递过程中的输入。它们与每个连接边相同的权重相乘,就像 x 在前向传递的过程中随着权重调节一样。这些乘积的和在每个可见节点处又与可见层的偏置项相加,这些运算的输出就是一次重建,也就是对原始输入的一个逼近。这可以通过下图表达
因为 RBM 的权重是随机初始化的,所以,重建结果和原始输入的差距通常会比较大。你可以将 r 和输入值之间的差值看做重建误差,然后这个误差会沿着 RBM 的权重反向传播,以一个迭代学习的过程不断反向传播,直到达到某个误差最小值。
正如你所看到的,在前向传递过程中,给定权重的情况下 RBM 会使用输入来预测节点的激活值,或者输出的概率 x:p(a|x; w)。
但是在反向传播的过程中,当激活值作为输入并输出原始数据的重建或者预测时,RBM 尝试在给定激活值 a 的情况下估计输入 x 的概率,它具有与前向传递过程中相同的权重参数。这第二个阶段可以被表达为 p(x|a; w)。
这两个概率估计将共同得到关于输入 x 和激活值 a 的联合概率分布,或者 p(x, a)。重建与回归有所不同,也不同于分类。回归基于很多输入来估计一个连续值,分类预测出离散的标签以应用在给定的输入样本上,而重建是在预测原始输入的概率分布。
这种重建被称之为生成学习,它必须跟由分类器执行的判别学习区分开来。判别学习将输入映射到标签上,有效地在数据点与样本之间绘制条件概率。若假设 RBM 的输入数据和重建结果是不同形状的正态曲线,它们只有部分重叠。
为了衡量输入数据的预测概率分布和真实分布之间的距离,RBM 使用 KL 散度来度量两个分布的相似性。KL 散度测量的是两条曲线的非重叠区域或者说发散区域,RBM 的优化算法尝试最小化这些区域,所以当共享权重与第一个隐藏层的激活值相乘时就可以得出原始输入的近似。图的左边是一组输入的概率分布p 及其重构分布 q,图的右侧是它们的差的积分。
迭代地根据它们产生的误差来调节权重,RBM 学会了逼近原始数据。你可以说权重在慢慢地反映输入数据的结构,并通过隐藏层的激活值进行编码,学习过程就像两个概率分布在逐步重合。
概率分布 让我们来讨论一下概率分布。如果你在掷两个骰子,所有结果的概率分布如下:
也就是说,和为 7 的结果是最有可能出现的,因为相比于 2 到 12 等其它结果,有更多的抛掷组合可以得到 7 这个结果(3+4,1+6,2+5)。
或者举另一个例子:语言是字母的特定概率分布,因为每一种语言会使用一些字母较多,而另一些较少。在英语中,字母 e、t 以及 a 是最常见的,然而在冰岛语中,最常见的字母是 a、t 和 n。因此尝试使用基于英语的权重集合来重建冰岛语将会导致较大的差异。
同样,图像数据集拥有像素值的唯一概率分布,这取决于数据集中图像的种类。像素值的分布取决于数据集中的图像类别,例如 MNIST:
或者 Faces in the Wild 数据集中标记的头像:
想象一下仅输入狗和大象图片的 RBM,它只有两个输出节点,每个结点对应一种动物。在前向传递的过程中 RBM 会问自己这样的问题:在给定的这些像素下,我应该向哪个节点发送更强的信号呢,大象节点还是狗的节点?在反向传递的过程中 RBM 的问题是:给定一头大象的时候,应该期望那种像素分布?
那就是联合概率分布:给定 a 时 x 的概率以及给定 x 时 a 的概率,可以根据 RBM 两层之间的共享权重而确定。
从某种意义上而言,学习重建的过程就是学习在给定的图像集合下,哪些像素会倾向于同时出现。由深层网络的隐藏层节点所产生的激活状态表现出来的共现现象:例如,「非线性灰色管+大的、松软的耳朵+皱纹」可以作为一个分布。
在上面的两幅图像中,你看到了用 Deeplearning4j 实现的 RBM。这些重建代表着 RBM 的激活值所「认为」输入数据看起来的样子,Geoff Hinton 将其称为机器「做梦」。当被呈现在神经网络在训练过程时,这种可视化是非常有用的启发,它让人确信 RBM 确实在学习。如果不是,那么它的超参数应该被调整。
最后一点:你会注意到 RBM 有两个偏置项。这是有别于其它自动编码器的一个方面。隐藏层的偏置项有助于 RBM 在前向传递中获得非零激活值,而可见层的偏置有助于 RBM 学习后向传递中的重建。
多层受限玻尔兹曼机
一旦 RBM 学到了与第一隐藏层激活值有关的输入数据的结构,那么数据就会沿着网络向下传递一层。你的第一个隐藏层就成为了新的可见层或输入层。这一层的激活值会和第二个隐藏层的权重相乘,以产生另一组的激活。
这种通过特征分组创建激活值集合序列,并对特征组进行分组的过程是特征层次结构的基础,通过这个过程,神经网络学到了更复杂的、更抽象的数据表征。
对于每一个新的隐藏层,权重都会通过迭代反复调整,直至该层能够逼近来自于前一层的输入。这是贪婪的、逐层的、无监督的预训练。它不需要使用标签来改善网络的权重,这意味着我们可以在无标签的数据集上进行训练,而这些数据没有经过人工处理,这是现实中绝大多数的数据。通常,拥有更多数据的算法会产生更准确的结果,这也是深层学习算法崛起的原因之一。
因为这些权重早已接近数据的特征,所以在使用深度信念网络进行图像分类的时候,后续的监督学习阶段可以更简单地学习。尽管 RBM 有很多用途,但合适的权重初始化以方便以后的分类是其主要优点之一。从某种程度而言,它们完成了某种类似于反向传播的功能:它们很好地调整了权重,以对数据进行更好的建模。你可以说预训练和反向传播是达到相同目的的可替代方法。
为了在一个图中展示受限玻尔兹曼机,我们需要使用对称二分双向图表示:
对于那些对深入研究 RBM 结构感兴趣的人而言,它们是一种无向图模型,也被称作马尔科夫随机场。
自编码器AutoEncoder
一、什么是自编码器(Autoencoder)
自动编码器是一种数据的压缩算法,其中数据的压缩和解压缩函数是数据相关的、有损的、从样本中自动学习的。在大部分提到自动编码器的场合,压缩和解压缩的函数是通过神经网络实现的。
1)自动编码器是数据相关的(data-specific 或 data-dependent),这意味着自动编码器只能压缩那些与训练数据类似的数据。比如,使用人脸训练出来的自动编码器在压缩别的图片,比如树木时性能很差,因为它学习到的特征是与人脸相关的。
2)自动编码器是有损的,意思是解压缩的输出与原来的输入相比是退化的,MP3,JPEG等压缩算法也是如此。这与无损压缩算法不同。
3)自动编码器是从数据样本中自动学习的,这意味着很容易对指定类的输入训练出一种特定的编码器,而不需要完成任何新工作。
搭建一个自动编码器需要完成下面三样工作:搭建编码器,搭建解码器,设定一个损失函数,用以衡量由于压缩而损失掉的信息。编码器和解码器一般都是参数化的方程,并关于损失函数可导,典型情况是使用神经网络。编码器和解码器的参数可以通过最小化损失函数而优化,例如SGD。
自编码器是一个自监督的算法,并不是一个无监督算法。自监督学习是监督学习的一个实例,其标签产生自输入数据。要获得一个自监督的模型,你需要一个靠谱的目标跟一个损失函数,仅仅把目标设定为重构输入可能不是正确的选项。基本上,要求模型在像素级上精确重构输入不是机器学习的兴趣所在,学习到高级的抽象特征才是。事实上,当主要任务是分类、定位之类的任务时,那些对这类任务而言的最好的特征基本上都是重构输入时的最差的那种特征。
目前自编码器的应用主要有两个方面,第一是数据去噪,第二是为进行可视化而降维。配合适当的维度和稀疏约束,自编码器可以学习到比PCA等技术更有意思的数据投影。
对于2D的数据可视化,t-SNE(读作tee-snee)或许是目前最好的算法,但通常还是需要原数据的维度相对低一些。所以,可视化高维数据的一个好办法是首先使用自编码器将维度降低到较低的水平(如32维),然后再使用t-SNE将其投影在2D平面上。
二、几种自编码器
自编码器(autoencoder)是神经网络的一种,经过训练后能尝试将输入复制到输出。自编码器()autoencoder)内部有一个隐藏层 h,可以产生编码(code)表示输入。该网络可以看作由两部分组成:一个由函数 h = f(x) 表示的编码器和一个生成重构的解码器 r = g(h)。如果一个自编码器只是简单地学会将处处设置为 g(f(x)) = x,那么这个自编码器就没什么特别的用处。相反,我们不应该将自编码器设计成输入到输出完全相等。这通常需要向自编码器强加一些约束,使它只能近似地复制,并只能复制与训练数据相似的输入。这些约束强制模型考虑输入数据的哪些部分需要被优先复制,因此它往往能学习到数据的有用特性。
1. 欠完备自编码器
从自编码器获得有用特征的一种方法是限制 h的维度比 x 小,这种编码维度小于输入维度的自编码器称为欠完备(undercomplete)自编码器。学习欠完备的表示将强制自编码器捕捉训练数据中最显著的特征。
学习过程可以简单地描述为最小化一个损失函数L(x,g(f(x))),其中 L 是一个损失函数,惩罚g(f(x)) 与 x 的差异,如均方误差。当解码器是线性的且 L 是均方误差,欠完备的自编码器会学习出与 PCA 相同的生成子空间。这种情况下,自编码器在训练来执行复制任务的同时学到了训据的主元子空间。如果编码器和解码器被赋予过大的容量,自编码器会执行复制任务而捕捉不到任何有关数据分布的有用信息。
2. 正则自编码器
正则自编码器使用的损失函数可以鼓励模型学习其他特性(除了将输入复制到输出),而不必限制使用浅层的编码器和解码器以及小的编码维数来限制模型的容量。这些特性包括稀疏表示、表示的小导数、以及对噪声或输入缺失的鲁棒性。即使模型容量大到足以学习一个无意义的恒等函数,非线性且过完备的正则自编码器仍然能够从数据中学到一些关于数据分布的有用信息。
2.1 稀疏自编码器
稀疏自编码器简单地在训练时结合编码层的稀疏惩罚 Ω(h) 和重构误差:L(x,g(f(x))) + Ω(h),其中 g(h) 是解码器的输出,通常 h 是编码器的输出,即 h = f(x)。稀疏自编码器一般用来学习特征,以便用于像分类这样的任务。稀疏正则化的自编码器必须反映训练数据集的独特统计特征,而不是简单地充当恒等函数。以这种方式训练,执行附带稀疏惩罚的复制任务可以得到能学习有用特征的模型。
2.2 去噪自编码器
去噪自编码器(denoisingautoencoder, DAE)最小化L(x,g(f(˜ x))),其中 ˜ x 是被某种噪声损坏的 x 的副本。因此去噪自编码器必须撤消这些损坏,而不是简单地复制输入。
2.3 收缩自编码器
另一正则化自编码器的策略是使用一个类似稀疏自编码器中的惩罚项 Ω,
这迫使模型学习一个在 x 变化小时目标也没有太大变化的函数。因为这个惩罚只对训练数据适用,它迫使自编码器学习可以反映训练数据分布信息的特征。这样正则化的自编码器被称为收缩自编码器(contractive autoencoder, CAE)。这种方法与去噪自编码器、流形学习和概率模型存在一定理论联系。
3. 表示能力、层的大小和深度
万能近似定理保证至少有一层隐藏层且隐藏单元足够多的前馈神经网络能以任意精度近似任意函数(在很大范围里),这是非平凡深度(至少有一层隐藏层)的一个主要优点。这意味着具有单隐藏层的自编码器在数据域内能表示任意近似数据的恒等函数。但是,从输入到编码的映射是浅层的。这意味这我们不能任意添加约束,比如约束编码稀疏。深度自编码器(编码器至少包含一层额外隐藏层)在给定足够多的隐藏单元的情况下,能以任意精度近似任何从输入到编码的映射。
深度可以指数地降低表示某些函数的计算成本。深度也能指数地减少学习一些函数所需的训练数据量。实验中,深度自编码器能比相应的浅层或线性自编码器产生更好的压缩效率。
训练深度自编码器的普遍策略是训练一堆浅层的自编码器来贪心地预训练相应的深度架构。所以即使最终目标是训练深度自编码器,我们也经常会遇到浅层自编码器。
4. 去噪自编码器
去噪自编码器(denoisingautoencoder, DAE)是一类接受损坏数据作为输入,并训练来预测原始未被损坏数据作为输出的自编码器。
DAE 的训练准则(条件高斯p(x | h))能让自编码器学到能估计数据分布得分的向量场 (g(f(x)) − x) ,这是 DAE 的一个重要特性。
5. 收缩自编码器
收缩自编码器 (Rifai et al.,2011a,b) 在编码 h = f(x) 的基础上添加了显式的正则项,鼓励 f 的导数尽可能小:
惩罚项 Ω(h) 为平方 Frobenius范数(元素平方之和),作用于与编码器的函数相关偏导数的 Jacobian 矩阵。
收缩(contractive)源于 CAE 弯曲空间的方式。具体来说,由于 CAE 训练为抵抗输入扰动,鼓励将输入点邻域映射到输出点处更小的邻域。我们能认为这是将输入的邻域收缩到更小的输出邻域。
人工神经网络的训练
反向传播算法
反向传播算法(Backpropagation)是目前用来训练人工神经网络(Artificial Neural Network,ANN)的最常用且最有效的算法。其主要思想是:
(1)将训练集数据输入到ANN的输入层,经过隐藏层,最后达到输出层并输出结果,这是ANN的前向传播过程;
(2)由于ANN的输出结果与实际结果有误差,则计算估计值与实际值之间的误差,并将该误差从输出层向隐藏层反向传播,直至传播到输入层;
(3)在反向传播的过程中,根据误差调整各种参数的值;不断迭代上述过程,直至收敛。
反向传播的推导过程
神经网络在权重的变化和目标函数的变化之间不再是线性关系。在特定层级的任何扰动(perturbation)将会在连续层级中进一步变化。那么,我们该如何计算神经网络中所有权重的梯度,从而进一步使用梯度下降法(最速下降法)呢?这也就是我们为什么要使用反向传播算法的地方。反向传播算法的核心即对整个网络所有可能的路径重复使用链式法则。反向传播算法真正强大的地方在于它是动态规划的,我们可以重复使用中间结果计算梯度下降。因为它是通过神经网络由后向前传播误差,并优化每一个神经节点之间的权重,所以这种算法就称之为反向传播算法(backpropagation algorithm)。实际上神经网络反向传播与前向传播有紧密的联系,只不过反向传播算法不是通过神经网络由前向后传播数据,而是由后向前传播误差。
大多数反向传播算法的解释都是直接从一般理论推导开始,但是如果从手动计算梯度开始,那么就能很自然地推导出反向传播算法本身。虽然下面的推导部分较长,但我们认为从数学基本理论开始是最好的方式来了解反向传播算法。
下文由单路径神经网络开始,进而推广到存在多层和多个神经元的神经网络,最后再推导出一般的反向传播算法。
反向传播算法的基本原则
我们训练神经网络的最终目标是寻找损失函数关于每一个权重的梯度:
当我们计算出偏导数时就能进一步使用随机梯度下降或小批量梯度下降更新每一层神经网络的权重:
通常在一般神经网络的每一个单元会存在以下几种情况:
- 该神经元有且仅有一个输入和一个输出
- 该神经元有多个输入
- 该神经元有多个输出
- 该神经元有多个输入和输出
因为多输入与多输出是独立的,我们能自由组合输入与输出神经元的数量。
这一部分将从相对简单的结构到多层神经网络,并在这个过程中推导出用于反向传播的一般规则。最后,我们会将这些规则组合成可用于任意神经网络的反向传播算法。
单一输入与单一输出的神经元
在上面的神经网络中,每一个变量都能够准确地写出来。
注意,上面方程式中 x 是输入,w 是权重,Sigamm 是神经元的激活函数。s 是前一个神经元通过权重传递到后一个神经元的数据,它等于前一个神经元的输出乘以两个神经元的连接强度,即权重 w。z 是神经元输入经过激活函数 Sigamma 计算后得到的输出。
对于这样一个简单的案例来说,我们很容易就找到其偏导数项。现在我们将求导后的一部分标以蓝色,然后看看我们是否能推导出可以在迭代算法中使用的模式。首先我们需要了解 k 层到 o 层之间的权重(w_k→o),也可以理解成这两个神经元之间的连接强度。如果我们的输出是线性单元,那么
E 就相当于系统做出的判断与正确标注之间的损失。E 对权重 w 求偏导并最小化,即在损失函数 E 最小的情况下求得权重 w,上述方程式表明需要求得 k 神经元到 o 神经元之间最优权重 w。那么从 j 到 k 和从 i 到 j 的权重更新都是相同的步骤了。
image
上面的推导表达式展示了损失函数对第 j 层和第 k 层之间权重的偏导数,而下面的推导表达式则展示了损失函数对第 i 层和第 j 层之间权重的偏导数:
现在也许我们能总结一个可以使用反向传播算法的权重更新模式。当我们计算神经网络前面层级的权重更新时,我们重复使用了多个数值。具体来说,我们观察到的就是神经网络损失函数的偏导数,上面三个推导表达式可以总结为:
在上述方程式中由后一个神经元向前推导,最后一层的权重更新梯度最简单,而前面层级的更新梯度则需要向前推导,这一推导的过程或者方式就是根据求导的链式法则。
多个输入
可以思考一下稍微复杂一点的神经网络,即一个神经元将有多个输入:
如果一个神经元有多个输入端怎么办,从 j 到 k 的权重更新规则会不会影响从 i 到 k 的权重更新规则?为了弄清这个问题,我们可以对 i 到 k 的权重手动求导。
我们可以从上面看到从 i 到 k 的权重更新是不依赖于从 j 到 k 权重的导数的,因此第一条准测就是损失函数对权重的导数不依赖于同层级神经网络上的其他任何权重的导数,所以神经网络同层级的权重可以独立地更新。同时该法则还存在更新的自然顺序,这种自然顺序仅仅只依赖于神经网络同一层级其他权重的值,这种排序是反向传播算法的计算基础。
多个输出
接下来我们可以思考下有多个输出的隐藏层神经元。
在前面的基础上,唯一和前面权重更新有差别的是输入神经元与 i 神经元之间的求导法则。神经元多输出端的情况就是其有多个直接后继神经元,所以我们必须沿着以神经元 i 为根结点的所有路径来计算误差的总和。接下来我们可以详细地写出损失函数对权重求导而更新的过程,并且我们定义σ(⋅) 就是神经元 i 的激活函数:
现在有两点需要注意,首先就是第二条推导准则:具有多个输出的神经元权重更新依赖于所有可能路径上的导数。
但是更重要地是我们需要看到反向传播算法和正向传播算法之间的联系。在反向传播的过程中,我们会计算神经网络输出端的误差,我们会把这些误差反向传播并且沿着每条路径加权。当我们传播到了一个神经元,可以将经权重反向传播过来的误差乘以神经元的导数,然后就可以同样的方式反向传播误差,一直追溯到输入端。反向传播非常类似于正向传播,是一种递归算法。接下来会介绍误差信号,然后再改写我们的表达式。
误差信号
手动求出所有权重的更新是十分棘手的,特别是在有上百神经元和多层神经网络的情况下。但是我们在最后的几部分看到一种模式,即误差是沿着神经网络向前传播的。因此我们可以定义误差信号为每一个神经元的累积误差,即使用我们定义神经元 j 的迭代误差信号为:
其衡量了随着数据输入到神经元 j,神经网络的误差改变了多少。使用误差信号有很好的性能,也就是我们可以用更紧凑的形式来表达反向传播。为了理解这之间的变化,我们可以展开方程式。
如果神经元 j 是一个输出节点,这也就意味着 (如果神经元 j 的激活函数是 f_j(⋅)),所以 就可以简单地写为 因此就可以求出另外,如果神经元 j 是一个隐藏神经元,那么另一层的神经元 k 属于 j 的输出神经元。我们可以使用链式求导法则进一步解释
注意最后的偏导项 ∂y^ /∂zj,多神经元取决于 z_j,确切的说是所有 k∈outs(j)的神经元。我们在多个输出端的部分中看到,导致具有多个输出神经元的权重确实对这些输出神经元有影响。但对于每个神经元 k,我们有
每个 s_k 不取决于任何其它同层的结点。因此,我们可以再次使用链式规则并对 k∈out(j)的输出结点求和:
将这个方程式带入
我们就能得到:
基于我们对误差信号的定义,我们已经知道
所以如果我们 (y^−y) 放入求和中,我们就能得到以下递归关系:
现在我们能用紧凑的方程式表征反向传播误差。
反向传播算法的普遍形式
先回忆下第一部分的简单神经网络:
我们能使用 δ_i 的定义导出整个神经网络的所有误差信号:
在这一个神经网络中,准确的权重更新模式是以下方程式:
如果使用误差信号代替,我们可以得到以下形式:
还有另外一个复杂一点的神经网络,即有多个输出神经元:
同样我们能得出所有的误差信号:
然后我们再一次将误差代入到权重更新方程式中:
现在也许我们就可以推导出权重更新的简单通用形式:
最后我们需要考虑的是我们要不要使用小批量梯度下降。因为我们将每一个 y_i 都看成独立的,所以我们可以将所有训练样本求和来计算完整的权重更新。对每一个独立的训练样本 y_i,我们加上一个上标表示(y_i)表示随每一个训练样本而改变的参数值,因此通用的更新形式可以写为:
最后,反向传播算法更新权重的一般形式可以表示为以下几个步骤:
2. 对于所有的神经元 j 和每一个训练样本 y_i 计算误差信号
如果 j 是输出神经元,那么有:
如果 j 不是输出神经元,那么有:
3. 通过以下更新法则更新权重:
上面是一般反向传播算法的推导和建立过程,我们从最简单与直觉的概念一步步完善并推导出最后的更新规则。虽然反向传播算法有着很多的局限性与不足,并且也有学者提出如解耦方法等理论解决反向传播算法的不足,但反向传播算法仍然是目前神经网络中最主流与强大的最优化方法。最后我们同样期待 Hinton 等人所提出的capsule能对反向传播算法有本质上的提升!
神经网络的优化
反向传播是神经网络工作的基本方式,它是大多数神经网络的基础。但是会工作还不够,有时候还会出现诸多故障,这个时候就需要对神经网络进行优化,使其工作运行的更好。
我们将要在本章介绍的技术包含:选取更好的代价函数,就是被称为交叉熵代价函数(the cross-entropy cost function);四种正则化方法(L1和L2正则、dropout、训练数据的扩展),这能让我们的网络适应更广泛的数据;一种更好的初始化权重(weight)的方法;一系列更具启发式的方法用来帮助我们选择网络的超参数(hyper-parameters)。我也会简单介绍一下其它的技术。这些讨论的内容之间是独立的,因此你可以跳跃着阅读。我们也会用代码实现这些技术去改进我们第一章的手写数字识别的结果。
当然了,我们也只是涉及了神经网络众多技术的一部分。但是万变不离其宗,我们只需要掌握一些核心的技术就行。掌握这些核心的技术不仅仅是因为它们好用,更重要的是它们能够帮助你深入理解使用神经网络时可能遇到的问题,也能帮助你很快上手其它的技术。
但是,深层网络架构的学习要求大量数据,对计算能力的要求很高。神经元和参数之间的大量连接需要通过梯度下降及其变体以迭代的方式不断调整。此外,有些架构可能因为强大的表征力而产生测试数据过拟合等现象。这时我们可以使用正则化和优化技术来解决这两个问题。
梯度下降是一种优化技术,它通过最小化代价函数的误差而决定参数的最优值,进而提升网络的性能。尽管梯度下降是参数优化的自然选择,但它在处理高度非凸函数和搜索全局最小值时也存在很多局限性。
正则化技术令参数数量多于输入数据量的网络避免产生过拟合现象。正则化通过避免训练完美拟合数据样本的系数而有助于算法的泛化。为了防止过拟合,增加训练样本是一个好的解决方案。此外,还可使用数据增强、L1 正则化、L2 正则化、Dropout等。
增加输入数据、数据增强、早停、dropout 及其变体是深度神经网络中常用的调整方法。
卷积神经网络(ConvNet)在一些复杂的机器学习任务中性能表现非常好。ConvNet 架构需要大量数据和参数,因此其学习过程需要消耗大量算力,向全局最小值的收敛过程较慢,容易掉入局部极小值的陷阱导致预测结果不好。在一些案例中,ConvNet 架构与数据产生过拟合,致使架构难以泛化至新样本。为了解决这些问题,近年来研究者开发了多种正则化和优化策略。此外,研究显示这些技术能够大幅提升网络性能,同时减少算力消耗。使用这些技术的前提是全面了解该技术提升网络表达能力的理论原理,本论文旨在介绍开发 ConvNet 架构最常用策略的理论概念和数学公式。
正则化技术
正则化技术是保证算法泛化能力的有效工具,因此算法正则化的研究成为机器学习中主要的研究主题 。此外,正则化还是训练参数数量大于训练数据集的深度学习模型的关键步骤。正则化可以避免算法过拟合,过拟合通常发生在算法学习的输入数据无法反应真实的分布且存在一些噪声的情况。过去数年,研究者提出和开发了多种适合机器学习算法的正则化方法,如数据增强、L2 正则化(权重衰减)、L1 正则化、Dropout等。
除了泛化原因,奥卡姆剃刀原理和贝叶斯估计也都支持着正则化。根据奥卡姆剃刀原理,在所有可能选择的模型中,能很好解释已知数据,并且十分简单的模型才是较好的模型。而从贝叶斯估计的角度来看,正则化项对应于模型的先验概率。
数据增强
数据增强是提升算法性能、满足深度学习模型对大量数据的需求的重要工具。数据增强通过向训练数据添加转换或扰动来人工增加训练数据集。数据增强技术如水平或垂直翻转图像、裁剪、色彩变换、扩展和旋转通常应用在视觉表象和图像分类中。
L1 和 L2 正则化
L1 和 L2 正则化是最常用的正则化方法。L1 正则化向目标函数添加正则化项,以减少参数的值总和;而 L2 正则化中,添加正则化项的目的在于减少参数平方的总和。根据之前的研究,L1 正则化中的很多参数向量是稀疏向量,因为很多模型导致参数趋近于 0,因此它常用于特征选择设置中。机器学习中最常用的正则化方法是对权重施加 L2 范数约束。
标准正则化代价函数如下:
其中正则化项 R(w) 是:
另一种惩罚权重的值总和的方法是 L1 正则化:
L1 正则化在零点不可微,因此权重以趋近于零的常数因子增长。很多神经网络在权重衰减公式中使用一阶步骤来解决非凸 L1 正则化问题 [19]。L1 范数的近似变体是:
另一个正则化方法是混合 L1 和 L2 正则化。
在深度学习中,参数范数惩罚 L2 正则化能让深度学习算法「感知」到具有较高方差的输入 x,因此与输出目标的协方差较小(相对增加方差)的特征权重将会收缩。而 L1 正则化会因为在方向 i 上 J(w; X, y) 对 J(w; X, y) hat 的贡献被抵消而使 w_i 的值变为 0(J(w; X, y) hat 为 J(w; X, y) 加上 L1 正则项)。此外,参数的范数正则化也可以作为约束条件。对于 L2 范数来说,权重会被约束在一个 L2 范数的球体中,而对于 L1 范数,权重将被限制在 L1 所确定的范围内。
Dropout
Bagging 是通过结合多个模型降低泛化误差的技术,主要的做法是分别训练几个不同的模型,然后让所有模型表决测试样例的输出。而 Dropout 可以被认为是集成了大量深层神经网络的 Bagging 方法,因此它提供了一种廉价的 Bagging 集成近似方法,能够训练和评估值数据数量的神经网络。
Dropout 指暂时丢弃一部分神经元及其连接。随机丢弃神经元可以防止过拟合,同时指数级、高效地连接不同网络架构。神经元被丢弃的概率为 1 − p,减少神经元之间的共适应。隐藏层通常以 0.5 的概率丢弃神经元。使用完整网络(每个节点的输出权重为 p)对所有 2^n 个 dropout 神经元的样本平均值进行近似计算。Dropout 显著降低了过拟合,同时通过避免在训练数据上的训练节点提高了算法的学习速度。
以上就是机器学习和深度学习的全部,图中大多都是借鉴别人的文章,因为自身水平有限,无法写出高质量的文章,但是在写作的过程中,整理这些文章也花了我不少的时间,从而让我有了一个系统的思维结构,让我对机器学习有了更深的了解。若文章有侵权所在,请联系我,我将进行删除。接下来开始进入下一个专题的写作,PM思维以及NLP和CV技术的了解,在此期间也会分享关于AI发展的一些思考,有兴趣的可以看一下。
网友评论