• DL二(稀疏自编码器 Sparse Autoencoder)


    稀疏自编码器

    Sparse Autoencoder

    神经网络(Neural Networks

    1.1 基本术语

    神经网络(neural networks

    激活函数(activation function

    偏置项(bias units

    激活值(activation

    前向传播(forward propagation

    前馈神经网络(feedforward neural network

    1.2 神经元(neuron)模型

    这个"神经元"是一个以及偏置项+1为输入值的运算单元,其输出为,其中函数被称为"激活函数"。在本教程中,我们选用sigmoid函数作为激活函数(activation function

    sigmoid函数的导数为

    1.3 神经网络模型

    神经网络(neural networks:所谓神经网络就是将许多个单一"神经元"联结在一起,这样,一个"神经元"的输出就可以是另一个"神经元"的输入。

    该网络有3个输入单元(偏置单元不计在内),3个隐藏单元及一个输出单元。我们使用圆圈来表示神经网络的输入。

    • 偏置节点:标上"+1"的圆圈,也就是偏置项。
    • 输入层:神经网络最左边的一层。
    • 输出层:最右边的一层。
    • 隐藏层:中间所有节点组成的一层。

    对于给定参数集合,我们的神经网络就可以按照函数来计算输出结果。本例神经网络的计算步骤如下:

    我们用表示第层第单元输入加权和(包括偏置单元),比如,,则。那么,上面的等式可以更简洁地表示为:

    我们将上面的计算步骤叫作前向传播(forward propagation

    将参数矩阵化,使用矩阵-向量运算方式,我们就可以利用线性代数的优势对神经网络进行快速求解。这是一个前馈神经网络(feedforward neural network)的例子,因为这种联接图没有闭环或回路。

    反向传播算法(Backpropagation Algorithm

    2.1 基本术语

      权重衰减Weight decay

    对称失效 Symmetry breaking

    反向传播算法backpropagation algorithm

    (批量)梯度下降法(batchgradient descent

    (整体)代价函数(overallcost function

    方差squared-error

    均方差average sum-of-squares error

    规则化项 regularization term

    偏置项 bias terms

    贝叶斯规则化方法 Bayesian regularization method

    高斯先验概率 Gaussian prior

    极大后验估计 MAP

    极大似然估计 maximum likelihood estimation

    非凸函数 non-convex function

    阿达马乘积 Hadamard product

    2.2 代价函数(cost function

      假设有个样例。对于单个样例,其代价函数为:

      整个代价函数可以定义为:

      其中,第一项是一个均方差项。第二项是一个规则化项(也叫权重衰减项Weight decay),其目的是减小权重的幅度,防止过度拟合。权重衰减参数用于控制公式中两项的相对重要性。

    2.3 梯度下降法

      我们的目标是针对参数来求其函数的最小值。为了求解神经网络,我们先将每个参数初始化一个很小的、接近零的随机值,然后使用梯度下降法求出参数的最优值。梯度下降法中每一次迭代都按照下面的公式对进行更新:

    其中是学习速率。现在关键是如何计算偏导数。下面讲一下反向传播算法,它是计算偏导数的一种有效方法。

    2.3.1 反向传播算法

    偏导数的计算:

    公式推导:

    对于第层(输出层)的每个输出单元:

    残差"error term",则:

    对于各层:

    ,则

    替换成,反向传播算法可表示为以下几个步骤(这里是矩阵向量表示),我们使用"" 表示向量乘积运算符(在Matlab或Octave里用".*"表示,也称作阿达马乘积)。:

    1. 进行前馈传导计算,利用前向传导公式,得到直到输出层的激活值。
    2. 对输出层(第层),计算:

    3. 对于 的各层,计算:

    4. 计算最终需要的偏导数值:

    2.3.2 梯度下降法

    批量梯度下降法中的一次迭代:

    1. 对于所有,令 , (设置为全零矩阵或全零向量)
    2. 对于
      1. 使用反向传播算法计算
      2. 计算
      3. 计算
    3. 更新权重参数:

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

    梯度检验与高级优化(Gradient checking and advanced optimization

    3.1 基本术语

      缺位错误 off-by-one error:比如 for循环中循环m次,正确应该是for(i=1;i<=m;i++),但有时程序员疏忽,会写成 for(i=1;i<m;i++),这就是缺位错误。

    数值检验 numerically checking

    数值舍入误差 numerical roundoff errors

    有效数字 significant digits

    组合扩展 unrolling

    牛顿法 Newton's method

    共轭梯度 conjugate gradient

    3.2 梯度检验

    原因:反向传播算法很难调试得到正确结果,尤其是当实现程序存在很多难于发现的bug时。

    目的:对求导结果进行数值检验的方法,该方法可以验证求导代码是否正确。另外,使用本节所述求导检验方法,可以帮助你提升写正确代码的信心

    方法:

    假设我们想要最小化以为自变量的目标函数。假设,则。在一维的情况下,一次迭代的梯度下降公式是

    再假设我们已经用代码实现了计算的函数,那么由导数的定义:

    给定一个被认为能计算的函数,我们可以用下面的数值检验公式

    计算两端是否近似来检验函数是否正确。实际应用中,我们常将设为一个很小的常量,比如在数量级。

    在神经网络的例子里我们使用 ,可以想象为把参数组合扩展成一个长向量。现在我们将求导检验方法推广到一般化,即是一个向量的情况。

    假设我们有一个用于计算 的函数;我们想要检验是否输出正确的求导结果。我们定义,其中

    是第个基向量(维度和相同,在第行是"1"而其他行是"0")。类似地,得到的第行减小了。然后我们可以对每个检查下式是否成立,进而验证的正确性:

    3.3高级优化

      迄今为止,我们的讨论都集中在使用梯度下降法来最小化。其实还有更精妙的算法来最小化。举例来说,可以想象这样一个算法:它使用梯度下降,并能够自动调整学习速率,以得到合适的步长值,最终使能够快速收敛到一个局部最优解。还有更妙的算法:比如可以寻找一个Hessian矩阵的近似,得到最佳步长值,使用该步长值能够更快地收敛到局部最优(和牛顿法类似)。此类算法的详细讨论已超出了这份讲义的范围,但是L-BFGS算法我们以后会有论述(另一个例子是共轭梯度算法conjugate gradient)。你将在编程练习里使用这些算法中的一个。使用这些高级优化算法时,你需要提供关键的函数:即对于任一个,需要你计算出。之后,这些优化算法会自动调整学习速率/步长值的大小(并计算Hessian近似矩阵等等)来自动寻找最小化时的值。诸如L-BFGS和共轭梯度算法通常比梯度下降法快很多。

    自编码算法与稀疏性(Autoencoders and Sparsity 

    4.1 基本术语

      自编码算法 Autoencoders

    稀疏性 Sparsity

    隐藏神经元 hidden units

    像素灰度值 the pixel intensity value

    独立分布 IID

    主元分析 PCA

    激活 active

    抑制 inactive

    激活度 activation

    平均活跃度 the average activation

    稀疏性参数 sparsity parameter

    惩罚因子 penalty term

    相对熵 KL divergence

    伯努利随机变量 Bernoulli random variable

    总体代价函数 overall cost function

    目标函数 the objective

    梯度验证方法 the derivative checking method

    4.2 自编码神经网络(autoencoder neural network)

      一个没有带类别标签的训练样本集合,其中。自编码神经网络是一种无监督学习算法,它使用了反向传播算法,并让目标值等于输入值,比如。下图是一个自编码神经网络的示例。

    自编码神经网络尝试学习一个 的函数。

    4.3 自编码神经网络学习的意义

    • 当隐藏层神经元数量,小于输入层神经元数量时:

      自编码神经网络可以用于学习输入数据的压缩表示,如果网络的输入数据中隐含着一些特定的结构,那么这一算法就可以发现输入数据中的这些相关性,事实上,这一简单的自编码神经网络通常可以学习出一个跟主元分析(PCA结果非常相似的输入数据的低维表示。

    • 当隐藏层神经元数量,大于输入层神经元数量时:

      我们给隐藏神经元加入稀疏性限制,那么自编码神经网络仍然可以发现输入数据中一些有趣的结构。(稀疏性限制:如果当神经元的输出接近1的时候认为它被激活,而输出接近于0时认为它被抑制,那么使得神经元大部分的时间都是被抑制的限制。)

    4.4 稀疏编码总体代价函数

      隐藏神经元平均活跃度the average activation

      其中,表示在给定输入为情况下,自编码神经网络隐藏神经元的激活度。

      为了让每一个隐藏神经元的活跃度接近于0(如果接近于1的话,那么输入将会集中在一个神经元上,其他的神经元基本就没作用,如果都接近0,那么输出将会是有这些神经元组合而成。),我们可以近似的加入一条限制:

      其中, 稀疏性参数sparsity parameter,通常是一个接近于0的较小的值(比如)。

      为了实现这一限制,我们将会在我们的优化目标函数中加入一个额外的惩罚因子,而这一惩罚因子将惩罚那些有显著不同的情况从而使得隐藏神经元的平均活跃度保持在较小范围内。这里选择的相对熵(KL divergence,其实就是信息增益,体现的是两个因素之间的差异(无差异时为0,随着差异增大单调递增)。于是惩罚因子表示为:

    那么总体代价函数可以表示为:

      其中 如之前所定义,而控制稀疏性惩罚因子的权重。项则也(间接地)取决于,因为它是隐藏神经元的平均激活度,而隐藏层神经元的激活度取决于

    4.5 模型参数学习

      还是使用反向传播算法,使用梯度下降进行求解。利用前面BP算法,只需要对隐层的残差公式进行修改:

    可视化自编码器训练结果

    5.1 基本术语

      可视化 Visualizing

    激励 activate

    平凡解 trivial answer

    范数约束 norm constrained

    有界范数 norm bounded

    输入域 input domains

    5.2 可视化训练结果

      目的:弄明白它到底学到了什么。

      例子:以在10×10图像(即n=100)上训练自编码器为例。在该自编码器中,每个隐藏单元i对如下关于输入的函数进行计算:

      这里我们必须给加约束,否则会得到平凡解。若假设输入有范数约束,则可证(请读者自行推导)令隐藏单元得到最大激励的输入应由下面公式计算的像素给出(共需计算100个像素,j=1,…,100):

      当我们对稀疏自编码器(100个隐藏单元,在10X10像素的输入上训练)进行上述可视化处理之后,结果如下所示:

      上图的每个小方块都给出了一个(带有有界范数的)输入图像,它可使这100个隐藏单元中的某一个获得最大激励。我们可以看到,不同的隐藏单元学会了在图像的不同位置和方向进行边缘检测。

      显而易见,这些特征对物体识别等计算机视觉任务是十分有用的。若将其用于其他输入域(如音频),该算法也可学到对这些输入域有用的表示或特征。

  • 相关阅读:
    Eclipse项目上传和下载到码云上
    java.lang.IllegalArgumentException,java.util.zip.ZipException 解决办法
    #{}和${}的区别
    Lambda 表达式
    存储器的按字寻址和按字节寻址
    二叉树的三种遍历方式
    线性表和链表
    java泛型理解
    java字符输入输出流
    applet的生命周期
  • 原文地址:https://www.cnblogs.com/robert-dlut/p/4061732.html
Copyright © 2020-2023  润新知