机器学习笔记-Deep Learning

林轩田机器学习技法关于特征学习系列,其中涉及到 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
      • dropout
      • denoising
  • 有很多局部最优解,很难于最佳化
    • 由于初始权重的设置对最终的结果有很大的影响,所以通过谨慎的选择初始权重可以有效的避免陷入局部最优解,关于如何选择好的起始点这样的方法称为 pre - training
  • 计算复杂度很大
    • mini batch with GPU

其中各种各样不同的 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(l1) 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 的,即在该权重下经过转换得到的特征保留了原始特征的信息,这样的愿景可以通过如下的浅层神经网络实现,


这里写图片描述

这个神经网络的结构为: dd~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

一个基本的编码器就是一个结构为 dd~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(l1) fixed
    这里写图片描述
    by training basic autoencoders on {x(l1)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)=1Nn=1NxnWWTxn2(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~ 个非零元,表明有多于 dd~ 个零元,该操作将 d×1 相应位置上的元素变为 0 ,其他的位置上的元素进行了缩放
  • V() (d×d)×(d×1) ,和第一步的操作互逆,即将向量换回原始的坐标系。

直观上讲可以看到 (3) 式的过程其实就是将原始的特征 xn 进行旋转,将某些维度置为 0 ,其他维度进行缩放,然后再反向旋转回原始坐标下,然后和原来的特征xn求取 square error

通过这样的操作我们就将 W 的最佳化问题转换为Γ,V的最佳化问题,如果可以求到最佳的 Γ,V ,就可以得到最佳的 W

首先求解 Γ 的最佳化问题:

minVminΓ1Nn=1NVIVTxnxnVΓVTxnWWTxn2

这个时候 V 可以看成是一个常数不做考虑, 去掉一些对结果不影响的项,目前的最佳化问题其实是:

minΓV(IΓ)VTxn2(4)

想要最小化 (4) 我们就要想办法从 (IΓ) 中得到更多的 0 。所以最理想的 Γ 应该是一个对角矩阵,并且对角线上的元素为 1 ,但是由于rank(Γ)d~, 不失一般性所以最佳的 Γ 的行使如下:

Γopt=[Id~000]

现在通过分析我们得到了最佳的 Γ 的形式,接下来分析在这样的最佳的 Γ 下,如何求解最佳的 V 正如前面所分析的,(4)式中的第一个 V 所对应的操作是进行旋转,不影响向量的长度,所以在这里可以把式子中的V去掉,并且需要注意的是, 此时 Γ 的形式已经确定, 所以最佳化的问题变为:

minVn=1N[000Idd~]1ΓoptVTxn2

转换为最大化问题:

maxVn=1N[Id~000]VTxn2(5)

d~=1 的时候,那么其实就只有 VT 中的第一行 vT 起作用, (5) 式子变为

maxvn=1NvTxnxTxvs.t.vTv=1(6)

等式约束的最优化问题可以得到如下的拉格朗日函数:
L(v,λ)=n=1NvTxnxTxv+λ(vTv1)

对变量 v 求偏导数可得:
Lv=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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值