稀疏自编码器

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

(批量)梯度下降法(batch)gradient descent

(整体)代价函数(overall)cost 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个隐藏单元中的某一个获得最大激励。我们可以看到,不同的隐藏单元学会了在图像的不同位置和方向进行边缘检测。

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

DL二(稀疏自编码器 Sparse Autoencoder)的更多相关文章

  1. 稀疏自动编码器 (Sparse Autoencoder)

    摘要: 一个新的系列,来自于斯坦福德深度学习在线课程:http://deeplearning.stanford.edu/wiki/index.php/UFLDL_Tutorial.本文梳理了该教程第一 ...

  2. 可视化自编码器训练结果&稀疏自编码器符号一览表

    训练完(稀疏)自编码器,我们还想把这自编码器学习到的函数可视化出来,好弄明白它到底学到了什么.我们以在10×10图像(即n=100)上训练自编码器为例.在该自编码器中,每个隐藏单元i对如下关于输入的函 ...

  3. Sparse autoencoder implementation 稀疏自编码器实现

    任务:在这个问题中,你将实现稀疏自编码器算法,并且展示它怎么发现边缘是自然图像的一个好的表示. 在文件 sparseae_exercise.zip中,我们已经提供了一些Matlab中的初始代码,你应该 ...

  4. 七、Sparse Autoencoder介绍

    目前为止,我们已经讨论了神经网络在有监督学习中的应用.在有监督学习中,训练样本是有类别标签的.现在假设我们只有一个没有带类别标签的训练样本集合  ,其中  .自编码神经网络是一种无监督学习算法,它使用 ...

  5. UFLDL实验报告2:Sparse Autoencoder

    Sparse Autoencoder稀疏自编码器实验报告 1.Sparse Autoencoder稀疏自编码器实验描述 自编码神经网络是一种无监督学习算法,它使用了反向传播算法,并让目标值等于输入值, ...

  6. Deep Learning 1_深度学习UFLDL教程:Sparse Autoencoder练习(斯坦福大学深度学习教程)

    1前言 本人写技术博客的目的,其实是感觉好多东西,很长一段时间不动就会忘记了,为了加深学习记忆以及方便以后可能忘记后能很快回忆起自己曾经学过的东西. 首先,在网上找了一些资料,看见介绍说UFLDL很不 ...

  7. (六)6.5 Neurons Networks Implements of Sparse Autoencoder

    一大波matlab代码正在靠近.- -! sparse autoencoder的一个实例练习,这个例子所要实现的内容大概如下:从给定的很多张自然图片中截取出大小为8*8的小patches图片共1000 ...

  8. Deep Learning学习随记(一)稀疏自编码器

    最近开始看Deep Learning,随手记点,方便以后查看. 主要参考资料是Stanford 教授 Andrew Ng 的 Deep Learning 教程讲义:http://deeplearnin ...

  9. CS229 6.5 Neurons Networks Implements of Sparse Autoencoder

    sparse autoencoder的一个实例练习,这个例子所要实现的内容大概如下:从给定的很多张自然图片中截取出大小为8*8的小patches图片共10000张,现在需要用sparse autoen ...

随机推荐

  1. Spring事务管理之编程式事务管理

    © 版权声明:本文为博主原创文章,转载请注明出处 案例:利用Spring的编程式事务管理模拟转账过程 数据库准备 -- 创建表 CREATE TABLE `account`( `id` INT NOT ...

  2. 【Hadoop基础教程】3、Hadoop之伪分布式环境搭建(转)

    伪分布式模式即单节点集群模式,所有的守护进程都运行在同一台机器上.这种模式下增加了代码调试功能,可以查看内存.HDFS文件系统的输入/输出,以及与其他守护进程交互.以hadoop用户远程登录K-Mas ...

  3. leetcode笔记:Add Binary

    一.题目描写叙述 Given two binary strings, return their sum (also a binary string). For example, a = "1 ...

  4. Android SDK环境搭建

    方法有二 方法一: Android SDK开发包国内下载地址 http://www.cnblogs.com/bjzhanghao/archive/2012/11/14/android-platform ...

  5. [转]Ubuntu Server命令行更换软件源

    sucd /etc/aptwget http://mirrors.163.com/.help/sources.list.lucidmv sources.list sources.list.backup ...

  6. idea各种设置和学习

    1. 去掉方法中的参数名提示 idea在Review时候的编码设置 idea在review代码的时候会会出现中文乱码,文件是GBK的,但是idea的字符集和项目的字符集都是UTF-8, 这时可以通过把 ...

  7. VMWare虚拟机下为Ubuntu 12.04.2配置静态IP(NAT方式)

    http://www.cnblogs.com/objectorl/archive/2012/09/27/vmware-ubuntu-nat-static-ip-settings.html 参考以上方式 ...

  8. 关于移动端border 1像素在不同分辨率下边显示粗细不一样的处理

    最近开发发现一个很有趣的问题  就是我如果给一个元素加上一个像素的 border 在不同的分辨率的情况下显示的不同 在高清屏幕(尤其是ios 喽 不鄙视国产) 据说在6plus下会变成3px  这个我 ...

  9. ASP.NET动态网站制作(16)-- SQL数据库(2)

    前言:SQL数据库的第二节课,继续讲解基本的语句及用法. 内容: 1.insert插入语句  insert into Book(bookName,bookPrice,bookAuthor) value ...

  10. python实现身份证识别

    github: 人脸联合语音身份认证:https://github.com/tsstss123/faceUnionVoiceRecognition 身份证识别简易版:https://github.co ...