AI有道
一个有情怀的公众号
1
Deep Neural Network
总的来说,根据神经网络模型的层数、神经元个数、模型复杂度不同,大致可分为两类:Shallow Neural Networks和Deep Neural Networks。上节课介绍的神经网络模型层数较少,属于Shallow Neural Networks,而本节课将着重介绍Deep Neural Networks。首先,比较一下二者之间的优缺点有哪些:
值得一提的是,近些年来,deep learning越来越火,尤其在电脑视觉和语音识别等领域都有非常广泛的应用。原因在于一层一层的神经网络有助于提取图像或者语音的一些物理特征,即pattern feature extraction,从而帮助人们掌握这些问题的本质,建立准确的模型。
下面举个例子,来看一下深度学习是如何提取出问题潜在的特征从而建立准确的模型的。如下图所示,这是一个手写识别的问题,简单地识别数字1和数字5。
如何进行准确的手写识别呢?我们可以将写上数字的图片分解提取出一块一块不同部位的特征。例如左边三幅图每张图代表了数字1的某个部位的特征,三幅图片组合起来就是完整的数字1。右边四幅图也是一样,每张图代表了数字5的某个部位的特征,五幅图组合起来就是完整的数字5。对计算机来说,图片由许多像素点组成。要达到识别的目的,每层神经网络从原始像素中提取出更复杂的特征,再由这些特征对图片内容进行匹配和识别。层数越多,提取特征的个数和深度就越大,同时解决复杂问题的能量就越强,其中每一层都具有相应的物理意义。以上就是深度学习的作用和意义。
深度学习很强大,同时它也面临很多挑战和困难:
- difficult structural decisions
- high model complexity
- hard optimization problem
- huge computational complexity
面对以上深度学习的4个困难,有相应的技术和解决的办法:
其中,最关键的技术就是regularization和initialization。
深度学习中,权重的初始化选择很重要,好的初始值能够帮助避免出现局部最优解的出现。常用的方法就是pre-train,即先权重进行初始值的选择,选择之后再使用backprop算法训练模型,得到最佳的权重值。在接下来的部分,我们将重点研究pre-training的方法。
2
Autoencoder
我们已经介绍了深度学习的架构,那么从算法模型上来说,如何进行pre-training,得到较好的权重初始值呢?首先,我们来看看,权重是什么?神经网络模型中,权重代表了特征转换(feature transform)。从另一个方面也可以说,权重表示一种编码(encoding),就是把数据编码成另外一些数据来表示。因为神经网络是一层一层进行的,有先后顺序,所以就单一层来看,好的权重初始值应该是尽可能地包含了该层输入数据的所有特征,即类似于information-preserving encoding。也就是说,能够把第i层的输入数据的特征传输到第i+1层,再把第i+1层的输入数据的特征传输到第i+2层,一层一层进行下去。这样,每层的权重初始值起到了对该层输入数据的编码作用,能够最大限度地保持其特征。
举个例子,上一小节我们讲了简单的手写识别的例子。从原始的一张像素图片转换到分解的不同笔画特征,那么反过来,这几个笔画特征也可以组合成原来的数字。这种可逆的转换被称为information-preserving,即转换后的特征保留了原输入的特征,而且转换是可逆的。这正是pre-train希望做到的,通过encoding将输入转换为一些特征,而这些特征又可以复原原输入x,实现information-preserving。所以,pre-training得到的权重初始值就应该满足这样的information-preserving特性。
如何在pre-training中得到这样的权重初始值(即转换特征)呢?方法是建立一个简单的三层神经网络(一个输入层、一个隐藏层、一个输出层),如下图所示。
那么为什么要使用这样的结构来逼近identity function,有什么好处呢?首先对于监督式学习(supervised learning),这种d−d˘−d的NNet结构中含有隐藏层。隐藏层的输出实际上就是对原始数据合理的特征转换ϕ(x),例如手写识别中隐藏层分解的各个笔画,包含了有用的信息。这样就可以从数据中学习得到一些有用的具有代表性的信息。然后,对于非监督式学习(unsupervised learning),autoencoder也可以用来做density estimation。如果网络最终的输出g(x)≈x,则表示密度较大;如果g(x)与x相差甚远,则表示密度较小。也就是说可以根据g(x)与x的接近程度来估计测试数据是落在密度较大的地方还是密度较小的地方。这种方法同样适用于outlier detection,异常检测。这样就可以从数据中学习得到一些典型的具有代表性的信息,找出哪些是典型资料,哪些不是典型资料。所以说,通过autoencoder不断逼近identity function,对监督式学习和非监督式学习都具有深刻的物理意义和非常广泛的应用。
以上就是basic autoencoder的结构和一些限定条件。深度学习中,basic autoencoder的过程也就对应着pre-training的过程,使用这种方法,对无label的原始数据进行编码和解码,得到的编码权重就可以作为pre-trained的比较不错的初始化权重,也就是作为深度学习中层与层之间的初始化权重。
当然,除了basic autoencoder之外还有许多其它表现不错的pre-training方法。这些方法大都采用不同的结构和正则化技巧来得到不同的’fancier’ autoencoders,这里不再赘述。
3
Denoising Autoencoder
上一部分,我们使用autoencoder解决了deep learning中pre-training的问题。接下来,我们将讨论deep learning中有什么样的regularization方式来控制模型的复杂度。
由于深度学习网络中神经元和权重的个数非常多,相应的模型复杂度就会很大,因此,regularization非常必要。之前我门也介绍过一些regularization的方法,包括:
- structural decisions/constraints
- weight decay or weight elimination regularizers
- early stopping
下面我们将介绍另外一种regularization的方式,它在deep learning和autoencoder中都有很好的效果。
首先我们来复习一下之前介绍的overfitting产生的原因有哪些。如下图所示,我们知道overfitting与样本数量、噪声大小都有关系,数据量减少或者noise增大都会造成overfitting。如果数据量是固定的,那么noise的影响就非常大,此时,实现regularization的一个方法就是消除noise的影响。
去除noise的一个简单方法就是对数据进行cleaning/pruning的操作。但是,这种方法通常比较麻烦,费时费力。此处,有一种比较“疯狂”的方法,就是往数据中添加一些noise。注意是添加noise!下面我们来解释这样做到底有什么作用。
这种做法的idea来自于如何建立一个健壮(robust)的autoencoder。在autoencoder中,编码解码后的输出g(x)会非常接近真实样本值x。此时,如果对原始输入加入一些noise,对于健壮的autoencoder,编码解码后的输出g(x)同样会与真实样本值x很接近。举个例子,手写识别中,通常情况下,写的很规范的数字1经过autoencoder后能够复原为数字1。如果原始图片数字1歪斜或加入噪声,经过autoencoder后应该仍然能够解码为数字1。这表明该autoencoder是robust的,一定程度上起到了抗噪声和regularization的作用,这正是我们希望看到的。
所以,这就引出了denoising autoencoder的概念。denoising autoencoder不仅能实现编码和解码的功能,还能起到去噪声、抗干扰的效果,即输入一些混入noise的数据,经过autoencoder之后能够得到较纯净的数据。这样,autoencoder的样本集为:
autoencoder训练的目的就是让x˘n经过编码解码后能够复原为纯净的样本xn。那么,在deep learning的pre-training中,如果使用这种denoising autoencoder,不仅能从纯净的样本中编解码得到纯净的样本,还能从混入noise的样本中编解码得到纯净的样本。这样得到的权重初始值更好,因为它具有更好的抗噪声能力,即健壮性好。实际应用中,denoising autoencoder非常有用,在训练过程中,输入混入人工noise,输出纯净信号,让模型本身具有抗噪声的效果,让模型健壮性更强,最关键的是起到了regularization的作用。
4
Principal Component Analysis
刚刚我们介绍的autoencoder是非线性的,因为其神经网络模型中包含了tanh()函数。这部分我们将介绍linear autoencoder。nonlinear autoencoder通常比较复杂,多应用于深度学习中;而linear autoencoder通常比较简单,我们熟知的主成分分析(Principal Component Analysis,PCA),其实跟linear autoencoder有很大的关系。
对于一个linear autoencoder,它的第k层输出不包含tanh()函数,可表示为:
其实,linear autoencoder hypothesis就应该近似于原始输入x的值,即h(x)=x。根据这个,我们可以写出它的error function:
我们的目的是计算出Ein(h)最小化时对应的W。根据线性代数知识,首先进行特征值分解:
其中,I是单位矩阵,维度为dxd。这样,通过特征值分解我们就把对W的优化问题转换成对Γ和V的优化问题。
首先,我们来优化Γ值,表达式如下:
那么,Γ的最优解已经得出,表达式变成:
这里的最小化问题似乎有点复杂,我们可以做一些转换,把它变成最大化问题求解,转换后的表达式为:
引入拉格朗日因子λ,表达式的微分与条件微分应该是平行的,且由λ联系起来,即:
经过以上分析,我们得到了Γ和V的最优解。这就是linear autoencoder的编解码推导过程。
值得一提的是,linear autoencoder与PCA推导过程十分相似。但有一点不同的是,一般情况下,PCA会对原始数据x进行处理,即减去其平均值。这是为了在推导过程中的便利。这两种算法的计算流程大致如下:
linear autoencoder与PCA也有差别,PCA是基于统计学分析得到的。一般我们认为,将高维数据投影(降维)到低维空间中,应该保证数据本身的方差越大越好,而噪声方差越小越好,而PCA正是基于此原理推导的。linear autoencoder与PCA都可以用来进行数据压缩,但是PCA应用更加广泛一些。
以上关于PCA的推导基本上是从几何的角度,而没有从代数角度进行详细的数学推导。网上关于PCA的资料很多,这里附上一篇个人觉得讲解得通俗易懂的PCA原理介绍:
http://blog.codinglabs.org/articles/pca-tutorial.html
有兴趣的朋友可以看一看。
5
Summary
本文主要介绍了深度学习(deep learning)的数学模型,也是上节课讲的神经网络的延伸。由于深度学习网络的复杂性,其建模优化是比较困难的。通常,我们可以从pre-training和regularization的角度来解决这些困难。首先,autoencoder可以得到比较不错的初始化权重,起到pre-training的效果。然后,denoising autoencoder通过引入人工噪声,训练得到初始化权重,从而使模型本身抗噪声能力更强,更具有健壮性,起到了regularization的效果。最后,我们介绍了linear autoencoder并从几何角度详述了其推导过程。linear autoencoder与PCA十分类似,都可以用来进行数据压缩和数据降维处理。