Deeplearning常用的模型以及方法

来源:互联网 发布:上海德语培训班知乎 编辑:程序博客网 时间:2024/05/28 22:08

声明:

1)该Deep Learning的学习系列是整理自网上很大牛和机器学习专家所无私奉献的资料的。

2)根据看的论文以及博客总结了深度学习常用的方法和模型,便于以后自己回顾,记性太猪了,唉大哭,快赐予我过目不忘的本领吧。

3)文中部分参考了某些博主的内容,觉得没人家总结的好,会表明出处,还望博主海涵。@zouxy09

4)如果有什么错误的地方希望大家一起讨论,自己还是个菜鸟,请多多指教。

5)本文内容对于很多知识点没有很详尽的描述,只是提供个框架,只是整理下常用方法。

目录:

一: MultiLayer Perceptron(多层感知器)

二:Convolutional  Neural Networks(卷积神经网络)

三:Autoencoders||Denoising Autoencoders(DA)||Stacked Denoising Autoencoders(SDA)(自动编码器||降燥自动编码器||降燥自动编码器

四:Restricted Boltzmann Machines(RBM受限波尔茨曼机)

五:Deep Belief Networks(DBNs深度信念网络)

前言:

deep learning训练过程

       2006年,hinton提出了在非监督数据上建立多层神经网络的一个有效方法,简单的说,分为两步,一是每次训练一层网络,二是调优,使原始表示x向上生成的高级表示r和该高级表示r向下生成的x'尽可能一致。方法是:

1)首先逐层构建单层神经元,这样每次都是训练一个单层网络。

2)当所有层训练完后,Hinton使用wake-sleep算法进行调优。

       将除最顶层的其它层间的权重变为双向的,这样最顶层仍然是一个单层神经网络,而其它层则变为了图模型。向上的权重用于“认知”,向下的权重用于“生成”。然后使用Wake-Sleep算法调整所有的权重。让认知和生成达成一致,也就是保证生成的最顶层表示能够尽可能正确的复原底层的结点。比如顶层的一个结点表示人脸,那么所有人脸的图像应该激活这个结点,并且这个结果向下生成的图像应该能够表现为一个大概的人脸图像。Wake-Sleep算法分为醒(wake)和睡(sleep)两个部分。

1)wake阶段:认知过程,通过外界的特征和向上的权重(认知权重)产生每一层的抽象表示(结点状态),并且使用梯度下降修改层间的下行权重(生成权重)。也就是“如果现实跟我想象的不一样,改变我的权重使得我想象的东西就是这样的”。

2)sleep阶段:生成过程,通过顶层表示(醒时学得的概念)和向下权重,生成底层的状态,同时修改层间向上的权重。也就是“如果梦中的景象不是我脑中的相应概念,改变我的认知权重使得这种景象在我看来就是这个概念”。

 

deep learning训练过程具体如下:

1)使用自下上升非监督学习(就是从底层开始,一层一层的往顶层训练):

       采用无标定数据(有标定数据也可)分层训练各层参数,这一步可以看作是一个无监督训练过程,是和传统神经网络区别最大的部分(这个过程可以看作是feature learning过程):

       具体的,先用无标定数据训练第一层,训练时先学习第一层的参数(这一层可以看作是得到一个使得输出和输入差别最小的三层神经网络的隐层),由于模型capacity的限制以及稀疏性约束,使得得到的模型能够学习到数据本身的结构,从而得到比输入更具有表示能力的特征;在学习得到第n-1层后,将n-1层的输出作为第n层的输入,训练第n层,由此分别得到各层的参数;

2)自顶向下的监督学习(就是通过带标签的数据去训练,误差自顶向下传输,对网络进行微调):

       基于第一步得到的各层参数进一步fine-tune整个多层模型的参数,这一步是一个有监督训练过程;第一步类似神经网络的随机初始化初值过程,由于DL的第一步不是随机初始化,而是通过学习输入数据的结构得到的,因而这个初值更接近全局最优,从而能够取得更好的效果;所以deep learning效果好很大程度上归功于第一步的feature learning过程。



一:MultiLayer Perceptron(多层感知器)

        这里我们介绍的是只有一层隐含层的多层感知器(感觉辜负了多层,哈哈,拥有多隐含层的MLP才更具有深度学习的基本特性,感觉深度学习就体现在深度二字上,深度=多层),这个单隐含层的MLP可以看做是一个逻辑回归分类器,(其实多隐含层的话,每层也可以看做是逻辑回归分类器)这个分类器的输入要经过非线性学习转换函数处理(就是常用的activition function函数或者叫transform function),它将输入数据映射到一个线性可分的空间里。中间的一层是隐含层。

     1 模型

      

                                                            _images/mlp.png
  

      通常,拥有一层隐含层的多层分类器可以用以下函数表示:f: R^D \rightarrowR^LD是输入向量x的size,那么L自然就是输出向量f(x)的size了,那么用矩阵表示法就是: f(x) = G( b^{(2)} + W^{(2)}( s( b^{(1)} + W^{(1)} x))),b^{(1)}b^{(2)}分别为输入层到隐含层的偏置项和隐含层到输出层的偏置项,W^{(1)}W^{(2)}为对应的权重矩阵,Gs为为激活函数。h(x) = \Phi(x) = s(b^{(1)} + W^{(1)} x)构成了隐含层,W^{(1)} \in R^{D \times D_h},每一列W^{(1)}_{\cdot i}表示输入单元与第i个隐含单元之间的权重。激活函数通常采用tanh或者sigmoid函数,后来又出现了ReLu,等激活函数,其中的效果还没有验证。输出由函数o(x) = G(b^{(2)} + W^{(2)} h(x))得到。

训练过程:

   ① 先逐层训练每层神经网络,得到每层的激活函数值,权重矩阵,偏置向量,代价函数

   ②利用梯度下降法最小化代价函数,经典的就是用BP算法来求解梯度使得代价函数最小。

     反向传播算法的思路如下:给定一个样例 \textstyle (x,y),我们首先进行“前向传导”运算,计算出网络中所有的激活值,包括\textstyle h_{W,b}(x)       的输出值。之后,针对第\textstyle l 层的每一个节点\textstyle i,我们计算出其“残差”\textstyle \delta^{(l)}_i,该残差表明了该节点对最终输出值的残差产生了多少影响。如果知道了网络的本层误差\textstyle \delta^{(l)}_i,那么\textstyle \delta^{(l)}_i对Wn和Xn-1的导数就可以通过反向传播得到。

反向传播算法可表示为以下几个步骤:

  1. 进行前馈传导计算,利用前向传导公式,得到 \textstyle L_2, L_3, \ldots直到输出层\textstyle L_{n_l} 的激活值。
  2. 对输出层(第 \textstyle n_l 层),计算:
     \begin{align}\delta^{(n_l)}= - (y - a^{(n_l)}) \bullet f'(z^{(n_l)})\end{align}
  3. 对于 \textstyle l = n_l-1, n_l-2, n_l-3, \ldots, 2 的各层,计算:
     \begin{align}\delta^{(l)} = \left((W^{(l)})^T \delta^{(l+1)}\right) \bullet f'(z^{(l)})\end{align}
  4. 计算最终需要的偏导数值:
     \begin{align}\nabla_{W^{(l)}} J(W,b;x,y) &= \delta^{(l+1)} (a^{(l)})^T, \\\nabla_{b^{(l)}} J(W,b;x,y) &= \delta^{(l+1)}.\end{align}
最后,我们将对梯度下降算法做个全面总结。在下面的伪代码中,\textstyle \Delta W^{(l)} 是一个与矩阵\textstyle W^{(l)} 维度相同的矩阵,\textstyle \Delta b^{(l)} 是一个与\textstyle b^{(l)} 维度相同的向量。注意这里“\textstyle \Delta W^{(l)}”是一个矩阵,而不是“\textstyle \Delta\textstyle W^{(l)} 相乘”。下面,我们实现批量梯度下降法中的一次迭代:
  1. 对于所有 \textstyle l,令\textstyle \Delta W^{(l)} := 0 ,\textstyle \Delta b^{(l)} := 0 (设置为全零矩阵或全零向量)
  2. 对于 \textstyle i = 1\textstyle m
    1. 使用反向传播算法计算 \textstyle \nabla_{W^{(l)}} J(W,b;x,y)\textstyle \nabla_{b^{(l)}} J(W,b;x,y)
    2. 计算 \textstyle \Delta W^{(l)} := \Delta W^{(l)} + \nabla_{W^{(l)}} J(W,b;x,y)
    3. 计算 \textstyle \Delta b^{(l)} := \Delta b^{(l)} + \nabla_{b^{(l)}} J(W,b;x,y)
  3. 更新权重参数:
     \begin{align}W^{(l)} &= W^{(l)} - \alpha \left[ \left(\frac{1}{m} \Delta W^{(l)} \right) + \lambda W^{(l)}\right] \\b^{(l)} &= b^{(l)} - \alpha \left[\frac{1}{m} \Delta b^{(l)}\right]\end{align}

现在,我们可以重复梯度下降法的迭代步骤来减小代价函数 \textstyle J(W,b) 的值,进而求解我们的神经网络。

 BP算法虽然很简单,但是也存在着弊端:

(1)梯度越来越稀疏:从顶层越往下,误差校正信号越来越小;

(2)收敛到局部最小值:尤其是从远离最优区域开始的时候(随机值初始化会导致这种情况的发生);

(3)一般,我们只能用有标签的数据来训练:但大部分的数据是没标签的,而大脑可以从没有标签的的数据中学习;

所以说层数不能太多。



二:Convolutional  Neural Networks(卷积神经网络)

        卷积神经网络是人工神经网络的一种,已成为当前语音分析和图像识别领域的研究热点。它的权值共享网络结构使之更类似于生物神经网络,降低了网络模型的复杂度,减少了权值的数量。该优点在网络的输入是多维图像时表现的更为明显,使图像可以直接作为网络的输入,避免了传统识别算法中复杂的特征提取和数据重建过程。卷积网络是为识别二维形状而特殊设计的一个多层感知器,这种网络结构对平移、比例缩放、倾斜或者共他形式的变形具有高度不变性。

       CNNs是受早期的延时神经网络(TDNN)的影响。延时神经网络通过在时间维度上共享权值降低学习复杂度,适用于语音和时间序列信号的处理。

       CNNs是第一个真正成功训练多层网络结构的学习算法。它利用空间关系减少需要学习的参数数目以提高一般前向BP算法的训练性能。CNNs作为一个深度学习架构提出是为了最小化数据的预处理要求。在CNN中,图像的一小部分(局部感受区域)作为层级结构的最低层的输入,信息再依次传输到不同的层,每层通过一个数字滤波器去获得观测数据的最显著的特征。这个方法能够获取对平移、缩放和旋转不变的观测数据的显著特征,因为图像的局部感受区域允许神经元或者处理单元可以访问到最基础的特征,例如定向边缘或者角点。


   1 模型

    _images/mylenet.png

       卷积神经网络是一个多层的神经网络,每层由多个二维平面组成,而每个平面由多个独立神经元组成。

     2 训练过程

      神经网络用于模式识别的主流是有指导学习网络,无指导学习网络更多的是用于聚类分析。对于有指导的模式识别,由于任一样本的类别是已知的,样本在空间的分布不再是依据其自然分布倾向来划分,而是要根据同类样本在空间的分布及不同类样本之间的分离程度找一种适当的空间划分方法,或者找到一个分类边界,使得不同类样本分别位于不同的区域内。这就需要一个长时间且复杂的学习过程,不断调整用以划分样本空间的分类边界的位置,使尽可能少的样本被划分到非同类区域中。

       卷积网络在本质上是一种输入到输出的映射,它能够学习大量的输入与输出之间的映射关系,而不需要任何输入和输出之间的精确的数学表达式,只要用已知的模式对卷积网络加以训练,网络就具有输入输出对之间的映射能力。卷积网络执行的是有指导训练,通过有标签样本集训练构建神经网络model,提取特征。所以其样本集是由形如:(输入向量,理想输出向量)的向量对构成的。

       训练算法与传统的BP算法差不多。主要包括4步,这4步被分为两个阶段:

       第一阶段,向前传播阶段:

        a)从样本集中取一个样本(X,Yp),将X输入网络;

        b)计算相应的实际输出Op

      在此阶段,信息从输入层经过逐级的变换,传送到输出层。这个过程也是网络在完成训练后正常运行时执行的过程。在此过程中,网络执行的是计算(实际上就是输入与每层的权值矩阵相点乘,得到最后的输出结果):

          Op=Fn(…(F2(F1(XpW(1))W(2))…)W(n)

第二阶段,向后传播阶段

a)算实际输出Op与相应的理想输出Yp的差;

b)按极小化误差的方法反向传播调整权矩阵。


三:Autoencoders||Denoising Autoencoders(DA)||Stacked Denoising Autoencoders(SDA)(降燥自动编码器||栈式降燥自动编码器

1:Autoencoders自动编码器

    Deep Learning最简单的一种方法是利用人工神经网络的特点,人工神经网络(ANN)本身就是具有层次结构的系统,如果给定一个神经网络,我们假设其输出与输入是相同的,然后训练调整其参数,得到每一层中的权重。自然地,我们就得到了输入I的几种不同表示(每一层代表一种表示),这些表示就是特征。自动编码器就是一种尽可能复现输入信号的神经网络。为了实现这种复现,自动编码器就必须捕捉可以代表输入数据的最重要的因素,就像PCA那样,找到可以代表原信息的主要成分


具体过程简单的说明如下:

1)给定无标签数据,用非监督学习学习特征:

 

       在我们之前的神经网络中,如第一个图,我们输入的样本是有标签的,即(input, target),这样我们根据当前输出和target(label)之间的差去改变前面各层的参数,直到收敛。但现在我们只有无标签数据,也就是右边的图。那么这个误差怎么得到呢?

      如上图,一个自动编码器将样本输入到一个encoder编码器中,得到一个隐含输出y:\mathbf{y} = s(\mathbf{W}\mathbf{x} + \mathbf{b}),s为activation function。那么我们怎么知道这个code表示的就是input呢?我们加一个decoder解码器,通过函数得到decoder输出:

\mathbf{z} = s(\mathbf{W'}\mathbf{y} + \mathbf{b'}),那么如果输出的这个信息和一开始的输入信号input是很像的(理想情况下就是一样的),那很明显,我们就有理由相信这个code是靠谱的。所以,我们就通过调整encoder和decoder的参数,使得重构误差最小,这时候我们就得到了输入input信号的第一个表示了,也就是编码code了。因为是无标签数据,所以误差的来源就是直接重构后与原输入相比得到。


2)通过编码器产生特征,然后训练下一层。这样逐层训练:

       那上面我们就得到第一层的code,我们的重构误差最小让我们相信这个code就是原输入信号的良好表达了,或者牵强点说,它和原信号是一模一样的(表达不一样,反映的是一个东西)。那第二层和第一层的训练方式就没有差别了,我们将第一层输出的code当成第二层的输入信号,同样最小化重构误差,就会得到第二层的参数,并且得到第二层输入的code,也就是原输入信息的第二个表达了。其他层就同样的方法炮制就行了(训练这一层,前面层的参数都是固定的,并且他们的decoder已经没用了,都不需要了)。

       重构误差可以由很多方式来获得,主要依赖给定的输入样本的分布假设。在这里我们用传统的平方差来计算误差。L(\mathbf{x} \mathbf{z}) = || \mathbf{x} -\mathbf{z} ||^2,如果输入是向量,则误差可以重写为:

L_{H} (\mathbf{x}, \mathbf{z}) = - \sum^d_{k=1}[\mathbf{x}_k \log        \mathbf{z}_k + (1 - \mathbf{x}_k)\log(1 - \mathbf{z}_k)]

      

         我们希望编码 y 是一个分布式表示, 它可以抓住数据变化主要因素的方向. 这类似于向主成分方向投影的方式, 都将获得数据变化的主要因素. 实际上, 如果有一个线性隐藏层(编码), 并且使用均方差准则来训练网络, 那么,k 个隐藏层单元就是学习如何将输入投影到由数据的前k个主成分张成的子空间里(in the span of the first k principal components of the data). 如果隐藏层是非线性的, 自编码器与PCA表现不同, 它具有捕获数据分布多模态(multi-modal)的能力. 因而, 当我们构建深度自编码器时, 我们会堆叠多个编码器(stacking multiple encoders, 及其对应的解码器), 此时, 就不能以PCA的观点来看待.

      因为yx的有损压缩, 所以对于所有的x,y当然不能全部很好(small-loss)的压缩x. 优化自编码器模型, 使y成为训练样例的良好压缩, 并希望自编码器对其它的输入也能较好的压缩, 但不是说对任意的输入都有良好的压缩. 那么一个自编码器推广的意义就是: 一个自编码器在与训练样例(training examples)有相同分布的测试样例(test examples)上的重构误差低, 然而, 一般说来, 对在从输入空间随机抽取的样例上的重构误差很高.


3)有监督微调:

      经过上面的方法,我们就可以得到很多层了。至于需要多少层(或者深度需要多少,这个目前本身就没有一个科学的评价方法)需要自己试验调了。每一层都会得到原始输入的不同的表达。当然了,我们觉得它是越抽象越好了,就像人的视觉系统一样。

       到这里,这个AutoEncoder还不能用来分类数据,因为它还没有学习如何去连结一个输入和一个类。它只是学会了如何去重构或者复现它的输入而已。或者说,它只是学习获得了一个可以良好代表输入的特征,这个特征可以最大程度上代表原输入信号。那么,为了实现分类,我们就可以在AutoEncoder的最顶的编码层添加一个分类器(例如罗杰斯特回归、SVM等),然后通过标准的多层神经网络的监督训练方法(梯度下降法)去训练。

        也就是说,这时候,我们需要将最后层的特征code输入到最后的分类器,通过有标签样本,通过监督学习进行微调,这也分两种,一个是只调整分类器(黑色部分):

       另一种:通过有标签样本,微调整个系统:(如果有足够多的数据,这个是最好的。end-to-end learning端对端学习)

       一旦监督训练完成,这个网络就可以用来分类了。神经网络的最顶层可以作为一个线性分类器,然后我们可以用一个更好性能的分类器去取代它。


       在研究中可以发现,如果在原有的特征中加入这些自动学习得到的特征可以大大提高精确度,甚至在分类问题中比目前最好的分类算法效果还要好!

        AutoEncoder存在一些变体,这里简要介绍下:

2:Sparse AutoEncoder稀疏自动编码器:

      当然,我们还可以继续加上一些约束条件得到新的Deep Learning方法,如:如果在AutoEncoder的基础上加上L1的Regularity限制(L1主要是约束每一层中的节点中大部分都要为0,只有少数不为0,这就是Sparse名字的来源),我们就可以得到Sparse AutoEncoder法。

       如上图,其实就是限制每次得到的表达code尽量稀疏。因为稀疏的表达往往比其他的表达要有效(人脑好像也是这样的,某个输入只是刺激某些神经元,其他的大部分的神经元是受到抑制的):

3:Denoising AutoEncoders降噪自动编码器:

        降噪自动编码器DA是在自动编码器的基础上,训练数据加入噪声,所以自动编码器必须学习去去除这种噪声而获得真正的没有被噪声污染过的输入。因此,这就迫使编码器去学习输入信号的更加鲁棒的表达,这也是它的泛化能力比一般编码器强的原因。DA可以通过梯度下降算法去训练。


        一个DA主要做两件事情,一是encode the input,并且在输入样本中加入大量噪音的前提下,能够尽量消除在经过多次Encoder后信息衰减带来的影响,二是能够捕获输入之间的依赖关系。DA可以从不同的角度来看待,可以说是流行学习模型,随机操作模型,自底向上的信息构建模型,以及自顶向下的信息生成模型。训练过程于AutoEncoder过程一样。

4:Stacked Denoising Autoencoders(SDA)


                                               

         Stacked一看就是把一堆DA堆一起的意思,哈哈,堆叠多个DA, 并把上一层的隐藏层表示(编码)作为当前层的输入, 可以形成深层网络. 这样一个无监督预训练(unsupervised pre-training)的体系结构, 一次只做一层. 每一层都作为一个降噪自编码器, 并通过最小化( 即前一层的输出编码 )重构输入的误差来训练. 一旦训练好前k层, 我们就可以训练第k+1层, 这是因为现在可以计算下一层的编码或隐层表示. 一旦所有层都经过预训练, 网络开始进入训练的第二阶段, 即微调( fine-tuning)。就和autoencoder一样的微调方式。


四:Restricted Boltzmann Machines(RBM受限波尔茨曼机)

       在此之前引入一个概念,基于能量的模型(Energy Based Model,EBM),基于能量的模型是一种具有普适意义的模型,可以说它是一种模型框架,在它的框架下囊括传统的判别模型和生成模型,图变换网络(Graph-transformer Networks),条件随机场,最大化边界马尔科夫网络以及一些流形学习的方法等。EBM通过对变量的每个配置施加一个有范围限制的能量来捕获变量之间的依赖 关系。EBM有两个主要的任务,一个是推断(Inference),它主要是在给定观察变量的情况,找到使能量值最小的那些隐变量的配置;另一个是学习(Learning)。
它主要是寻找一个恰当的能量函数,使样本中正确的输入输出的能量 比错误的输入输出的能量低。

       基于能量的模型(EBM)把我们所关心变量的各种组合和一个标量能量联系在一起。我们训练模型的过程就是不断改变标量能量的过程,因此就有了数学上期望的意义。比如,如果一个变量组合被认为是合理的,它同时也具有较小的能量。基于能量的概率模型通过能量函数来定义概率分布:

        

        其中Z为规整因子,

              

        基于能量的模型可以利用使用梯度下降或随机梯度下降的方法来学习,具体而言,就是以训练集的负对数作为损失函数,

                

        其中θ为模型的参数,将损失函数对θ求偏导,

                               

即得到损失函数下降最快的方向。

包含隐单元的EBMs

         在很多情况下,我们无法观察到样本的所有属性,或者我们需要引进一些没有观察到的变量,以增加模型的表达能力,这样得到的就是包含隐含变量的EBM,

              

          其中h表示隐含变量。在这种情况下,为了与不包含隐含变量的模型进行统一,我们引入如下的自由能量函数,

                      

          这样P(x)就可以写成,

                       

          此时,损失函数还是类似的定义,只是在进行梯度下降求解时稍微有些不同,

                                              

       该梯度表达式中包含两项,他们都影响着模型所定义的分布密度:第一项增加训练数据的概率(通过减小对应的自由能量),而第二项则减小模型 生成的样本的概率。

      通常,我们很难精确计算这个梯度,因为式中第一项涉及到可见单元与隐含单元的联合分布,由于归一化因子Z(θ)的存在,该分布很难获取。我们只能通过一些采样方法(如Gibbs采样)获取其近似值,其具体方法将在后文中详述。

       1 波尔兹曼机

        波尔茨曼机(BM是Hiton和Sejnowski于1986年提出的一种根植于统计力学的随机神经网络。这种网络中的神经元是随机神经元,神经元的输出只有两种状态(未激活、激活),一般用二进制的0和1表示,,状态的取值根据概率统计法则决定。从功能上讲,BM是由随机神经元全连接组成的反馈神经网络,且对称连接,无自反馈,如图(1)所示

                                                             

                                                                                 图 1包含一个可见层和一个隐层的BM模型如图2(a)所示



                                                                          图2


    BM具有强大的无监督学习能力,能够学习数据中复杂的规则。但是,拥有这种学习能力的代价是其训练/学习时间非常长。此外,不仅无法确切地计算BM所表示的分布,甚至得到服从BM所表示分布的随机样本也很困难。为克服此问题,Sejnowski引入了一种限制的波尔兹曼机(RBM)。RBM具有一个可见层,一个隐层,层内无连接,其结构如图2(b)所示。Roux和Bengio从理论上证明只要隐单元的数目足够多,RBM能够拟合任意离散分布。

     2 RBM受限波尔茨曼机

      受限波尔茨曼机(Boltzmann Machine,BM)是一种特殊形式的对数线性的马尔科夫随机场(Markov Random Field,MRF),即能量函数是自由变量的线性函数。 通过引入隐含单元,我们可以提升模型的表达能力,表示非常复杂的概率分布。

                                                                                                              _images/rbm.png


       为什么它是Deep Learning方法。首先,这个模型因为是二部图,所以在已知v的情况下,所有的隐藏节点之间是条件独立的(因为节点之间不存在连接),即p(h|v)=p(h1|v)…p(hn|v)。同理,在已知隐藏层h的情况下,所有的可视节点都是条件独立的。同时又由于所有的v和h满足Boltzmann 分布,因此,当输入v的时候,通过p(h|v) 可以得到隐藏层h,而得到隐藏层h之后,通过p(v|h)又能得到可视层,通过调整参数,我们就是要使得从隐藏层得到的可视层v1与原来的可视层v如果一样,那么得到的隐藏层就是可视层另外一种表达,因此隐藏层可以作为可视层输入数据的特征,所以它就是一种Deep Learning方法。


下面介绍下它的原理以及用到的方法

能量函数E(v,h) 定义为:E(v,h) = - b'v - c'h - h'Wv

 W 表示输入层与隐层连接的权重b,c分别为可见层和隐藏层的偏移量。

直接自由能公式如下:

\mathcal{F}(v)= - b'v - \sum_i \log \sum_{h_i} e^{h_i (c_i + W_i v)}.

因为RBMs的特殊结构,可见单元和隐藏单元彼此条件独立。有了这个属性,我们可以得到:

p(h|v) &= \prod_i p(h_i|v) \\p(v|h) &= \prod_j p(v_j|h).

     运用二值单元的RBM
 

     如果RBM中的每个单元都是二值的,即有vj,hi∈{0,1},我们可以得到神经元激活函数:


(7)   P(h_i=1|v) = sigm(c_i + W_i v) \\

(8)    P(v_j=1|h) = sigm(b_j + W'_j h)

则对应的RBM的二值自由能函数进一步简化为:

(9)   \mathcal{F}(v)= - b'v - \sum_i \log(1 + e^{(c_i + W_i v)}).

使用梯度下降法求解模型参数时,各参数的梯度值如下

(10)- \frac{\partial{ \log p(v)}}{\partial W_{ij}} &=    E_v[p(h_i|v) \cdot v_j]    - v^{(i)}_j \cdot sigm(W_i \cdot v^{(i)} + c_i) \\-\frac{\partial{ \log p(v)}}{\partial c_i} &=    E_v[p(h_i|v)] - sigm(W_i \cdot v^{(i)})  \\-\frac{\partial{ \log p(v)}}{\partial b_j} &=    E_v[p(v_j|h)] - v^{(i)}_j


前面提到了,RBM是很难学习的,即模型的参数很难确定,下面我们就具体讨论一下基于采样的近似学习方法。学习RBM的任务是求出模型的参数 θ={c,b,W}的值。

    Gibbs采样

       Gibbs采样是一种基于马尔科夫链蒙特卡罗(Markov Chain Monte Carlo,MCMC)策略的采样方法。对于一个N维随机向量S=(S_1, ... , S_N)的联合分布通过若干步以S_i \sim p(S_i | S_{-i})的形式进行Gibbs采样,其中指S中除了以外的其它的N-1维向量。(是不是很难懂?我也没懂,嘿嘿,找个例子可能就好懂了。)
      这里通俗点的解释一下。首先,什么是sampling。sampling就是以一定的概率分布,看发生什么事件。举一个例子。甲只能E:吃饭、学习、打球,时间T:上午、下午、晚上,天气W:晴朗、刮风、下雨。现在要一个sample,这个sample可以是:打球+下午+晴朗。。。
     问题是我们不知道p(E,T,W),或者说,不知道三件事的联合分布。当然,如果知道的话,就没有必要用gibbs sampling了。但是,我们知道三件事的conditional distribution。也就是说,p(E|T,W),p(T|E,W),p(W|E,T)。现在要做的就是通过这三个已知的条件分布,再用gibbs sampling的方法,得到joint distribution。
    具体方法。首先随便初始化一个组合,i.e. 学习+晚上+刮风,然后依条件概率改变其中的一个变量。具体说,假设我们知道晚上+刮风,我们给E生成一个变量,比如,学习-》吃饭。我们再依条件概率改下一个变量,根据学习+刮风,把晚上变成上午。类似地,把刮风变成刮风(当然可以变成相同的变量)。这样学习+晚上+刮风-》吃饭+上午+刮风。
    同样的方法,得到一个序列,每个单元包含三个变量,也就是一个马尔可夫链。然后跳过初始的一定数量的单元(比如100个),然后隔一定的数量取一个单元(比如隔20个取1个)。这样sample到的单元,是逼近联合分布的。


    对于RBMs来说,S包含了一组可见单元和隐藏单元。然而,因为它们是条件独立的,每一个都可以执行吉布斯抽样。在这种背景下,可见单位同时采样隐藏单位的固定值。同样,隐藏单位取样同时可见。马尔可夫链的一个步骤是采取如下:

                                                                                                            h^{(n+1)} &\sim sigm(W'v^{(n)} + c) \\v^{(n+1)} &\sim sigm(W h^{(n+1)} + b),


 h^{(n)} 表示马尔可夫链的第n步中所有的隐含单元集,也就是说 ,例如,h^{(n+1)}_i用概率sigm(W_i'v^{(n)} + c_i)被随机的指定为1(相对于0)同样的,v^{(n+1)}_j用概率sigm(W_{.j} h^{(n+1)} + b_j)指定为1.如图:

                                                                                                _images/markov_chain.png

t \rightarrow \infty, 样本(v^{(t)}, h^{(t)}) 就近似代表p(v,h).

理论上,学习过程中更新的每一个参数都需要进行这样的链式收敛(感觉就是采样过程),不用说这样做代价太高,因此,就提出了集中算法来提高采样效率。主要是Contrastive Divergence(CD),PersistentContrastive Divergence(PCD).简单提下。

Contrastive Divergence (CD-k)

     主要用了两个小技巧 :

  •  由于我们最终是想要 p(v) \approx p_{train}(v) (数据真正的潜在分布), 我们需要用一个训练样本来初始化马尔可夫链,在这个样本的选择时,最好选择一个样本是服从或者尽可能的接近我们最终的分布。
  • CD算法不等待马尔可夫链收敛。采样样本经过k步的吉布斯采样后得到。在实际训练中,k = 1效果已经很好了。(不是很懂)

Persistent CD

     Persistent CD使用另一种近似抽样. 它依赖于一个单独的马尔可夫链,这个马尔可夫链有一个persistent状态,也就是说不用为每一个观察样本重新生成一个马尔可夫链,这条链可以用于后续参数的更新。


RBM的基于CD的快速学习算法主要步骤如下:

                                                 


五:Deep Belief Networks(DBNs深度信念网络)

       DBNs是一个概率生成模型,与传统的判别模型的神经网络相对,生成模型是建立一个观察数据和标签之间的联合分布,对P(Observation|Label)和 P(Label|Observation)都做了评估,而判别模型仅仅而已评估了后者,也就是P(Label|Observation)。对于在深度神经网络应用传统的BP算法的时候,DBNs遇到了以下问题:

(1)需要为训练提供一个有标签的样本集;

(2)学习过程较慢;

(3)不适当的参数选择会导致学习收敛于局部最优解。

       DBNs由多个限制玻尔兹曼机(Restricted Boltzmann Machines)层组成,一个典型的神经网络类型如图三所示。这些网络被“限制”为一个可视层和一个隐层,层间存在连接,但层内的单元间不存在连接。隐层单元被训练去捕捉在可视层表现出来的高阶数据的相关性。

       首先,先不考虑最顶构成一个联想记忆(associative memory)的两层,一个DBN的连接是通过自顶向下的生成权值来指导确定的,RBMs就像一个建筑块一样,相比传统和深度分层的sigmoid信念网络,它能易于连接权值的学习。

       最开始的时候,通过一个非监督贪婪逐层方法去预训练获得生成模型的权值,非监督贪婪逐层方法被Hinton证明是有效的,并被其称为对比分歧(contrastive divergence)。

       在这个训练阶段,在可视层会产生一个向量v,通过它将值传递到隐层。反过来,可视层的输入会被随机的选择,以尝试去重构原始的输入信号。最后,这些新的可视的神经元激活单元将前向传递重构隐层激活单元,获得h(在训练过程中,首先将可视向量值映射给隐单元;然后可视单元由隐层单元重建;这些新可视单元再次映射给隐单元,这样就获取新的隐单元。执行这种反复步骤叫做吉布斯采样)。这些后退和前进的步骤就是我们熟悉的Gibbs采样,而隐层激活单元和可视层输入之间的相关性差别就作为权值更新的主要依据。

       训练时间会显著的减少,因为只需要单个步骤就可以接近最大似然学习。增加进网络的每一层都会改进训练数据的对数概率,我们可以理解为越来越接近能量的真实表达。这个有意义的拓展,和无标签数据的使用,是任何一个深度学习应用的决定性的因素。

       在最高两层,权值被连接到一起,这样更低层的输出将会提供一个参考的线索或者关联给顶层,这样顶层就会将其联系到它的记忆内容。而我们最关心的,最后想得到的就是判别性能,例如分类任务里面。

       在预训练后,DBN可以通过利用带标签数据用BP算法去对判别性能做调整。在这里,一个标签集将被附加到顶层(推广联想记忆),通过一个自下向上的,学习到的识别权值获得一个网络的分类面。这个性能会比单纯的BP算法训练的网络好。这可以很直观的解释,DBNs的BP算法只需要对权值参数空间进行一个局部的搜索,这相比前向神经网络来说,训练是要快的,而且收敛的时间也少。

       DBNs的灵活性使得它的拓展比较容易。一个拓展就是卷积DBNs(Convolutional Deep Belief Networks(CDBNs))。DBNs并没有考虑到图像的2维结构信息,因为输入是简单的从一个图像矩阵一维向量化的。而CDBNs就是考虑到了这个问题,它利用邻域像素的空域关系,通过一个称为卷积RBMs的模型区达到生成模型的变换不变性,而且可以容易得变换到高维图像。DBNs并没有明确地处理对观察变量的时间联系的学习上,虽然目前已经有这方面的研究,例如堆叠时间RBMs,以此为推广,有序列学习的dubbed temporal convolutionmachines,这种序列学习的应用,给语音信号处理问题带来了一个让人激动的未来研究方向。

       目前,和DBNs有关的研究包括堆叠自动编码器,它是通过用堆叠自动编码器来替换传统DBNs里面的RBMs。这就使得可以通过同样的规则来训练产生深度多层神经网络架构,但它缺少层的参数化的严格要求。与DBNs不同,自动编码器使用判别模型,这样这个结构就很难采样输入采样空间,这就使得网络更难捕捉它的内部表达。但是,降噪自动编码器却能很好的避免这个问题,并且比传统的DBNs更优。它通过在训练过程添加随机的污染并堆叠产生场泛化性能。训练单一的降噪自动编码器的过程和RBMs训练生成模型的过程一样。



参考:http://www.aichengxu.com/view/708718

           http://blog.csdn.net/zouxy09/article/details/8781396/


0 0