林轩田机器学习技法关于特征学习系列,其中涉及到Neural Network,Backpropagation Algorithm,Deep Learning,Autoencoder,
PCA,Radial Basis Function Network,K-Means,Matrix Factorization 等。
在上一篇的介绍中我们看到在Neural network中有一层一层的神经元,它们的作用就是帮助我们识别出资料中的模式pattern,将这些模式当成是特征。通过BP算法可以帮助我们计算梯度,这样就可以利用GD类算法来更新每一个权重,最终得到神经网络中每一个神经元的权重 w(l)ij。所以神经网路的核心就是这些一层一层的神经元,还有神经元之间的连接权重,那么如何来决定神经网络的结构呢?这是神经网络中一个非常核心也非常困难的问题。
Deep Neural Network
Shallow neural network and deep neural network
在本篇中,我们使用一种非常粗略的方法按照神经网络中hidden layer的层数将其划分为两类:shallow neural network和deep neural network。对于shallow neural network来说,由于隐藏层的个数比较少,所以forward和backward的计算都会比较有效率,有关结构的决定也会比较简单,并且有理论可以证明当有足够多的神经元和足够多的连接的时候,浅层的神经网络就可以拟合任意复杂的函数。对于deep neural network来说,在参数的训练和结构的决定方面相比于shallow neural network来说就更有难度一些。既然是这样的,那么为什么还要使用deep neural network呢?其中的一个原因是,因为大家相信通过deep neural network我们可以得到比较有物理意义的特征。最近deep learning在图像处理和语音识别方面的流行, 正式由于这样deep的结构可以帮助我们得到隐藏在图像和声音中的有用的特征。
Meaningfulness of deep learning
下面通过一个例子来对deep network的工作做出简单的解释,我们现在想要做的是识别手写数字 1 和 5 。
当我们想要辨识 1 和 5 的时候,我们可能需要首先利用第一层神经元识别出其中一些很小如下图所示的笔画:
比如与 ϕ2 相连的神经元可能要识别出长的像“|”的东西,也就是说如果某一个输入其垂直方向上居中位置的像素值比较低(是黑色)的话,那么与ϕ2相连的这个神经元就会被**,或者说这样的输入会和ϕ2“模式匹配”。
下一层会基于上一层提取的非常简单的特征再提取稍复杂一些的特征,下下一层又会在这些稍微复杂的特征的基础上再提取更为复杂的一些特征,⋯,等到特征足够复杂的时候就可以根据这些特征轻易的来做识别的工作。
这样的每一层可能都可以代表不同的物理意义, 例如一张数字 1 的图片在预测时可能会**与 ϕ1,ϕ2,ϕ3 相连的神经元, 或者说在训练时与 ϕ1,ϕ2,ϕ3 相连的神经元会提取出三个特征:
所以识别 1 的神经元 z1 在与 ϕ1,ϕ2,ϕ3 相连的神经元都**的情况下会被**。 可以想象如果层数越多的话,每一层需要做的事情就越简单,相比只有一层hidden layer的网络来说,可能会有更多的物理意义上的解释。
所以deep neural network对于原始特征是raw feature的学习任务来说会比较有用, 例如对于图像来说,这些raw feature是一个一个的pixel值,每一个pixel的值可能只有一丁点的物理含义,但是我们最终想要的是一个非常复杂的分类模型:区分1和5,这对于计算机来说是很难的。基于原始的特征这很难一步做到,而通过deep neural network这样在每一层做一些简单处理, 层数足够多的话就可以完成这个很复杂的分类任务。 类似于图像的还有音频这样的资料,同样也是raw feature,要做识别是很困难的任务,但是同样可以通过这样一层一层的学习, 学习了足够层数之后就可以解决。总结下, 在图片和语音这样的领域,由于给出的资料都非常的原始, 通常没有什么好的办法可以做特征的提取和转换, 所以只能是通过deep learning这样的架构自主的从数据中学习有利于进行识别的特征从而完成很复杂的任务。
Challenges and keys techniques for deep learning
这里概略的对深度学习中遇到的困难和解决的方法给出介绍。
- 模型的架构很难决定
- 结合对专业领域的了解, 例如用于图像处理的CNN。
- 模型的复杂度很高
- 当有足够多的数据时,这个问题通常是不需要太过于担心的。
-
regularization
- 有很多局部最优解,很难于最佳化
- 由于初始权重的设置对最终的结果有很大的影响,所以通过谨慎的选择初始权重可以有效的避免陷入局部最优解,关于如何选择好的起始点这样的方法称为pre-training。
- 计算复杂度很大
其中各种各样不同的regularization和initialization的思路使得我们可以实现更深层的网络。
A two-step deep learning framework
介绍一个简单的深度学习的架构,如上面所谈论的, 网络最终的表现和初始的权重值设置有很大的关系,那么如何选定一个好的权重起始点呢?一个方法是,在正式训练模型之前分别选择好每一层的权重,具体做法是,先通过一定的方法选择好第一层的权重,然后固定第一层的权重,选择好第二层的权重,⋯。这样的过程称之为pre-train,然后在train阶段使用pre-train得到的权重作为初始权重利用bp算法进行训练对所有的权重进行微调。
Simple deep learning
1.for l=1,2,⋯,L, pre train{w(l)ij} assuming w1∗,⋯,w(l−1)∗ fixed

2.train with backprop on pre trained NNet to fine tune all {w(l)ij}
下一节会在这个架构下讲解如何进行pre-train,即如何得到不错的初始权重值,并且介绍在这个过程中如何使用regularization来限制模型的复杂度。
Autoencoder
上一小节介绍了一个基本的深度学习的架构,这一小节介绍如何进行pre-train,也就是如何进行初始权重的决定。
在神经网络和深度学习中,权重可以理解为代表了做特征转换或者抽取的方式,或者是如何将特征换成另一种不同的表现形式。在得到了不同的特征的表现形式之后,再决定要如何学习。但是,假设当我们使用一定的方法得到了第一层的初始权重,进而得到在这些权重作用下经过转换的特征之后,我们是不清楚这些特征在后面的隐藏层中是怎么被使用的。既然这样的话, 那么我们认为好的权重就是那些能够保存原始资料特征的权重, 直观上说也就是在经过这样的权重将资料转换之后不会得到面目全非的特征,而是原来的资料能告诉我们的信息在新的资料中也可以得到类似的结果, 只是更加简练或者是抽象了而已。
例如在上一小节中我们提到的1和5的识别,第一个hidden layer将原始的像素特征转换为 6 个笔画的特征, 可以很直观的看出我们是能够通过这6个笔画的组合得到原始的信息的,例如当权重取(1,1,1,0,0,0)的时候可以组合得到1;权重取(0,0,1,1,1,1)的时候可以组合得到5。
也就是说在deep learning的pre training的时候,我们希望得到的初始的权重是information preserving的,即在该权重下经过转换得到的特征保留了原始特征的信息,这样的愿景可以通过如下的浅层神经网络实现,
这个神经网络的结构为:d⟶d~⟶d, 其特别之处在于,输出层神经元的个数等于输入层神经元的个数,并且我们期望输出等于输入:gi(x)≈xi, 这样的神经网络被称为autoencoder,其目的是将原始的特征编码为d~维的新的特征, 然后解码为与原始特征相似的输出。
usefulness
通过这样的方式可能可以得到隐藏在数据中的潜藏结构hidden structures。这样就可以利用这些hidden structures做特征转换,其中得到的 w(1)ij 可以认为是一个很好的权重的起始点, 同时可以得到原始数据的informative(无损)的特征表示。
-
learning informative representation of data
在无监督学习中,autoencoder可以用来做异常点检测outlier detection,因为在异常点上编码器的表现会差,而合群的点由于数据量多编码器的表现会好。所以我们可以认为autoencoder能够筛选典型的资料。
-
learning typical representation of data
所以autoencoder看似在学习一个简单的identity function g(x)=x,实则我们想要的是中间隐藏层所得到的原始数据的具有代表性的(typical)或者说是无损的(informative)的数据表示方法(representation of data)。这样得到了大部分资料的表现方式之后,可以做更有用的事情。
Basic Autoencoder
一个基本的编码器就是一个结构为d−d~−d的浅层神经网络, 通常其error function为:
∑i=1d(gi(x)−xi)2
可以利用backproporgation算法进行最佳化。并且一般我们关心d~<d的情形, 这样就做到了特征降维。训练的资料是{(x1,y1=x1),(x2,y2=x2),⋯,(xN,yN=xN)},可以看到由于并不需要 label 值的参与,所以通常会被归为无监督学习方法。很多时候在这样的神经网络中会限制编码的权重w(1)ij和解码的权重w(2)ji相同。
Pre-Training with Autoencoders
这样autoencoder通常用于deep learning的pre training。或者说deep learning中pre training的一个合理的方式是autoencoders
Deep learning with autoencoders
-
1.for l=1,2,⋯,L, pre train{w(l)ij} assuming w1∗,⋯,w(l−1)∗ fixed

by training basic autoencoders on {x(l−1)n} with d~=dl
-
2.train with backprop on pre trained NNet to fine tune all {w(l)ij}
具体的过程是:当要决定神经网络中第一层的初始权重值时,利用神经网络的输入来训练一个autoencoder,其中autoencoder中间层的神经元的个数为神经网络第一层hidden layer中神经元的个数。当autoencoder训练完毕之后,固定神经网络中第一层的权重,并计算第一个hidden layer的输出,利用该输出作为第二个autoencoder的输入,用于训练第二层的初始权重,⋯。
Denoising Autoencoder
上一小节使用autoencoders解决了deep learning中pre training的问题,这一小节简单介绍下autoencoder中用于控制模型复杂度的一种regularization的方法。
上图是上一篇中给出的神经网络的示意图,之前也提到因为有这么多的神经元和连接(权重),所以这样的模型很容易过拟合。由于模型的复杂度很高,所以我们需要正则化regularization,一些常见的方法有:
-
structural decisions:例如在CNN中不使用全连接。
- 使用正则化项:weight decay,weight elimination。
-
early stopping:提前停止 bp 算法可能会得到更好的结果。
Dealing with noise
接下来介绍一个在deep learning和autoencoder中都非常有用的regularization的方式。在此之前先来简单的回顾下overfitting的成因是什么,
上图中横轴表示样本的数量,纵轴表示噪声。颜色越红表示overfitting越严重,可以看到当资料量越少,噪声越多的时候,越容易overfitting。
当模型复杂度和资料量已经确定的时候, 可以看到noise是影响overfitting的一个很重要的原因。为了避免overfitting一个直接的做法是进行数据处理:data cleaning/pruning,但是这通常是艰难的工作,我们提出一个特别的方法,既然没有办法将noise或者是有noise的资料清除掉,那么不然就把noise加入到原来的资料当中。为什么可以这么做呢?
使用autoencoder为例来解释,一个好的编码器能够做的是:g(x)≈x,即对某个输入经过编码解码之后得到的输出和输入要差不多。我们想要一个更好的编码器,这个编码器可以做到:当输入是有噪声的 x ,记为 x~, 自动编码器依然能够输出 x , 即 g(x~)≈x。例如当我们输入一张写的很不规范的数字 1 的图片,或者譬如写 1 的纸是脏的,等等存在噪声的输入的时候, 我们希望这个很robust的autoencoder依然可以通过编码解码之后输出一个正常的1的图片, 而不是一个像原来那样被污染的,或者是更差的结果。
现在我们想要编码器不仅仅有编码的能力, 还要有能够去噪声的能力,我们将这样的编码器称之为denoising autoencoder,这样的编码器可以通过如下的方式得到:
denoising autoencoder
run basic autoencoder with data {(x1~,y1=x1),(x2~,y2=x2),⋯,(xN~,yN=xN)},where xn~=xn+artificial noise
即我们要求编码器的输出依然等于输入,但是编码器的输入不再是干净的资料,而是加了噪声的变脏的输入。通过这样的方式得到的deep learning初始权重,不仅仅能够把干净的资料编码为干净的资料,还可以把脏的资料编码为干净的资料。可以想到的这样的方法的一个应用就是为照片去除噪声。
所以如果某个网络有去噪声的功能,那么该网络就能避免noise的影响,再结合我们之前讨论的noise对overfitting的“重要贡献”,这样就能到达像regularization那样避免overfitting的效果。而这样一个有去噪声功能的网络怎么得到呢?总结来说就是通过喂给编码器有噪声的资料并要求其拟合无噪声的结果从而得到一个可以去除噪声的(初始)权重。
添加artificial noise不仅仅可以用于autoencoder而且可以用于其他的机器学习和深度学习的方法中。
Principal Component Analysis(PCA)
上一小节介绍了利用神经网络构建autoencoder,由于该模型中有tanh函数的存在, 所以该模型是一个非线性的模型。这一节介绍autoencoder的线性版本,线性模型有一些好处,例如比较有效率, 不容易过拟合, 模型的复杂度低等。之所以没有先介绍线性的,再介绍非线性的(这样是比较正常的思路)是因为在深度学习的框架下非线性的autoencoder更加适合。如果现在我们想用线性的来对资料做些处理(降维),那么应该如何做呢?
考虑output layer中第 k 个神经元的输出, 将如下非线性的autoencoder:
hk(x)=∑j=0d~w(2)jk tanh(∑i=1dw(1)ijxi)
变为线性的autoencoder,即去掉非线性的函数tanh, 得到如下的表达方式:
hk(x)=∑j=0d~w(2)jk (∑i=1dw(1)ijxi)(1)
在这里我们考虑 w(1)ij=w(2)ji 这种特殊情况(可以认为这样的限制是在做regularization,或者是为了简单)。那么(1)式可以写为:
hk(x)=∑j=0d~wkj (∑i=1dwijxi)(2)
因为我们主要是为了对数据进行降维,所以这里考虑的情况是d~<d。
记 W=[wij]d×d~, 那么可以得到(2)的向量形式:
h(x)=WWTx
其中:
W=⎡⎣⎢⎢⎢⎢⎢⎢⎢w11 w12 ⋯ w1d~w21 w22 ⋯ w2d~w31 w32 ⋯ w3d~⋯wd1 wd2 ⋯ wdd~⎤⎦⎥⎥⎥⎥⎥⎥⎥
Linear autoencoder error function
我们的目的依然是为了让编码器的输出和输入尽可能的相似,因此定义如下的error function:
Ein(h)=Ein(W)=1N∑n=1N∥xn−WWTxn∥2(3)
现在我们的目标就是要寻找最佳的W来使得Ein(W)最小, 因为是square error,所以我们接下来推导其解析解。
因为WWT是一个半正定的矩阵,经过eigen value decompose可以得到WWT=VΓVT, 其中:
-
VVT=VTV=Id,V是维度为d×d的单位正交阵orthogonal。
-
Γ 是一个对角线矩阵,其对角线上的元素为WWT的特征值,根据rank(ab)≤min{rank(a),rank(b)},可知rank(Γ)≤d~
所以(3)式中的WWTxn可以变为VΓVTxn, 这里首先来简单看一下VΓVTxn的物理意思是什么?
-
VT(xn):(d×d)×(d×1), 表示对xn在基VT下进行旋转或者是镜像变换,向量的长度没有变化,只是坐标系统改变了
-
Γ(◯):(d×d)×(d×1),Γ矩阵的对角线上最多只有d~个非零元,表明有多于d−d~个零元,该操作将◯d×1相应位置上的元素变为0,其他的位置上的元素进行了缩放
-
V(⊗):(d×d)×(d×1),和第一步的操作互逆,即将向量换回原始的坐标系。
直观上讲可以看到(3)式的过程其实就是将原始的特征xn进行旋转,将某些维度置为0,其他维度进行缩放,然后再反向旋转回原始坐标下,然后和原来的特征xn求取square error。
通过这样的操作我们就将W的最佳化问题转换为Γ,V的最佳化问题,如果可以求到最佳的Γ,V,就可以得到最佳的W。
首先求解 Γ 的最佳化问题:
minVminΓ1N∑n=1N∥VIVTxnxn−VΓVTxnWWTxn∥2
这个时候V可以看成是一个常数不做考虑, 去掉一些对结果不影响的项,目前的最佳化问题其实是:
minΓ∑∥V(I−Γ)VTxn∥2(4)
想要最小化(4)我们就要想办法从(I−Γ)中得到更多的0。所以最理想的 Γ 应该是一个对角矩阵,并且对角线上的元素为1,但是由于rank(Γ)≤d~, 不失一般性所以最佳的Γ的行使如下:
Γopt=[Id~000]
现在通过分析我们得到了最佳的Γ的形式,接下来分析在这样的最佳的Γ下,如何求解最佳的 V ,正如前面所分析的,(4)式中的第一个V所对应的操作是进行旋转,不影响向量的长度,所以在这里可以把式子中的V去掉,并且需要注意的是, 此时Γ 的形式已经确定, 所以最佳化的问题变为:
minV∑n=1N∣∣∣∣∣∣[000Id−d~]1−ΓoptVTxn∣∣∣∣∣∣2
转换为最大化问题:
maxV∑n=1N∣∣∣∣∣∣[Id~000]VTxn∣∣∣∣∣∣2(5)
当d~=1的时候,那么其实就只有VT中的第一行vT起作用,(5)式子变为
maxv∑n=1NvTxnxTxvs.t.vTv=1(6)
等式约束的最优化问题可以得到如下的拉格朗日函数:
L(v,λ)=∑n=1NvTxnxTxv+λ(vTv−1)
对变量 v 求偏导数可得:
∂L∂v=∑n=1NxnxTnv+λv
所以最佳的 v 需要满足的条件是:
∑n=1NxnxTnv=λv
到这里我们发现 v 是特征值 λ 所对应的特征向量,如果想要(6)式中的target function最大, 那么λ就要是XTX最大的特征值,这时 λ 所对应的特征向量 v 就是上述最优化问题(6)的最优解vopt,这样就求得了矩阵V中的第一行。
对于一般的d~,{vj}d~j=1是矩阵XTX的最大的d~个特征值所对应的特征向量。
可以得到最佳的w是:{wj}=top eigenvectors
PCA更详细好懂的讲解见:http://blog.codinglabs.org/articles/pca-tutorial.html
小结
本篇简单的介绍了deep learning, 可以将其看做是nerual network的延伸。主要介绍了其中涉及到的两个问题,一个是autoencoder,用于预训练网络的初始权重,或者可以认为该方法是在找数据最好的表现方式;一个是denoising autoencoder,用于得到更加robust的模型。最后介绍了非线性的autoencoder如果退化为为线性的,那么就得到了著名的降维方法PCA。