Sparse Autoencoder稀疏自动编码

本系列文章都是关于UFLDL Tutorial的学习笔记

Neural Networks

  • 对于一个有监督的学习问题,训练样本输入形式为(x(i),y(i))。使用神经网络我们可以找到一个复杂的非线性的假设h(x(i))可以拟合我们的数据y(i)。我们先观察一个神经元的机制:

  • 每个神经元是一个计算单元,输入为x1,x2,x3,输出为:

  • 其中f()是激活函数,常用的激活函数是S函数:

  • S函数的形状如下,它有一个很好的性质就是导数很方便求:f’(z) = f(z)(1 ? f(z)):

  • 还有一个常见的激活函数是双曲正切函数tanh:

  • 它的导数f’(z) = 1 ? (f(z))^2):

  • softmax激活函数的导数:f’(z)=f(z)?f(z)^2
  • S函数的取值在[0,1]之间,而tan函数的取值在[-1,1]之间.

Neural Network model

  • 神经网络就是将上面的单个神经元连接成一个复杂的网络:

  • 如图所示的三层神经网络包含一个输入层(3个输入单元),一个隐藏层(3个计算单元),一个输出层(一个输出单元)。我们的所有参数描述为(W,b) = (W(1),b(1),W(2),b(2))。Ws_ij表示的是第s层的第j个神经元到第s+1层的第i个神经元的权值,同理bs_i表示第s+1层的第i个神经元的偏差。可知,偏差b的数目等于总的神经元的个数减去输入层的神经元个数(输入层不需要偏差),而权值w的数目等于神经网络的连接数。最后的输出计算如下:

  • 更紧凑的写法就是讲其写成向量的积,这样以矩阵的形式存储系数可以加速计算。其中z表示该层所有神经元的输入,a表示该层的输出:

  • 我们把上面这种求最终输出的算法称为向前传播(feedforward)算法。对于输入层,我们可以用a1=x表示。给定l层的激活值al,计算l+1层的激活值的公式如下:

Backpropagation Algorithm

  • 假设我们现在有一个固定大小为m的训练集{(x1,y1),(x2,y2)…(xm,ym)},我们使用批梯度下降法来训练我们的网络。对于每个训练样本(x,y),我们计算它的损失函数如下:

  • 引入规范化权重衰减项:weight decay),使得系数尽可能的小,总的损失函数如下:

  • 需要注意的是通常规范化不会使用在偏差b上,因为对b使用规范化最终获得网络和之前没有太大区别。这里的规范化其实是贝叶斯规范化的一个变体,具体可以看CS229 (Machine Learning) at Stanford的视频。
  • 上面的损失函数通常在分类和回归问题中被用到。在分类中通常y取值为0,1,而我们的S函数的取值范围是在[0,1]之间。而如果使用tanh函数,由于取值范围是[-1,1],我们可以将-1表示0,1表示1,可以将0作为分界值。对于回归问题我们则需要先将我们的输出按比例缩小到[0,1]之间,然后最后预测时相应的放大。
  • 我们的目标是最小化损失函数J:首先随机初始化w和b,由于梯度下降法容易局部最优,因此要进行多次试验,每次随机选择的参数不能相同。计算完所有样本的损失后,更新w和b的公式如下,其中α是学习率:

  • 对于这个更新公式,最核心的是计算偏导。我们采用反向传播( backpropagation)算法来计算偏导。反向传播能够帮助解释网络的权重和偏置的改变是如何改变代价函数的。归根结底,它的意思是指计算偏导数?C/?wl_jk和?C/?bl_j。但是为了计算这些偏导数,我们首先介绍一个中间量,δl_j,我们管它叫做第l层的第j个神经元的错误量(error)。我们可以先计算一个样本产生的梯度向量,最后求所有样本梯度的平均即可:

反向传播具体推导如下:

  1. 首先使用向前传播计算出L2,L3…以及输出层的激活值。
  2. 对于输出层的每一个输出单元计算错误量(a=f(z)利用偏导的链式法则):

  3. 对于中间的隐藏层,我们计算每个神经元的错误量。其中括号里面可以理解为l+1层所有与l层该神经元相连的偏导乘以权值即为该神经元的损失值:

  4. 定义偏导如下:

  • 训练神经网络的伪代码如下(后面的λW是规范化项):

根据neural networks and deep learning这本书中对于反向传播是这么理解的:

  • 对于第l层第j个神经元,如果zl_j变为zl_j+Δzl_j,那么会对最终整体的损失带来(?C/?zl_j)*Δzl_j的改变。反向传播的目的是找到这个Δzl_j,使得最终的损失函数更小。假设?C/?zl_j的值很大(不论正负),我们期望找到一个和?C/?zl_j符号相反的Δzl_j使得损失降低。假设?C/?zl_j的值趋近于0,那么Δzl_j对损失的改变是微乎其微的,表示这个神经元以及训练接近最优了。这里以一个启发式的感觉将?C/?zl_j看成度量一个神经元的误差的方法。
  • 受上面的启发,我们可以定义第l层第j个神经元的误差是:

  • 输出层误差的方程,这个是根据偏导数链式法则 ?C/?z= (?C/?a)*(?a/?z) :

    右式第一项表示代价随着第j个神经元的输出值的变化而变化的速度。假如C不太依赖一个特定的神经元j,那么δl_j就会很小,这也是我们想要的效果。右式第二项刻画了在zl_j处激活函数σ变化的速度。如果使用二次代价函数,那么?C/?al_j = (aj ? yj)很容易计算。

  • 使用下一层的误差δl+1来表示当前层的误差δl,因为输出层是可以确定的计算出来,因此计算其它层要倒着向前传播:

    其中 (wl+1)T是第l+1层权重矩阵 wl+1的转置。假设我们知道第l+1层的误差δl+1,当我们应用转置的权重矩阵(wl+1)T,我们可以凭直觉地把它看作是在沿着网络反向移动误差,给了我们度量在第l层输出的误差方法,我们进行Hadamard(向量对应位置相乘)乘积运算 ⊙σ′(zl)。这会让误差通过 l 层的激活函数反向传递回来并给出在第 l 层的带权输入的误差 δ向量。

  • 代价函数关于网络中任意偏置的改变率:

    误差 δl_j 和偏导数值?C/?bl_j 完全一致,针对同一个神经元。

  • 代价函数关于任何一个权重的改变率

    这告诉我们如何计算偏导数?C/?wl_jk,其中 δl 和 al?1 这些量我们都已经知道如何计算了。

  • 将其向量化:

    其中 ain是输入给权重 w 的神经元的激活值δout 是输出自权重 w 的神经元的误差。当激活值 ain 很小, ain ≈ 0,梯度?C/?w 也会趋向很小。这样,我们就说权重缓慢学习,表示在梯度下降的时候,这个权重不会改变太多。换言之, 来自低激活值神经元的权重学习会非常缓慢

  • 当 σ(zl_j) 近似为 0 或者 1 的时候 σ 函数变得非常平。这时σ’(zl_j) ≈ 0。所以如果输出神经元处于或者低激活值( ≈ 0)或者高激活值( ≈1)时,最终层的权重学习缓慢。这样的情形,我们常常称输出神经元已经饱和了,并且,权重学习也会终止(或者学习非常缓慢)。如果输入神经元激活值很低,或者输出神经元已经饱和了(过高或者过低的激活值),权重会学习缓慢。

  • 第二个方程的证明

  • 反向传播过程给出了一种计算代价函数梯度的方法:

  • 给定一个大小为 m 的小批量数据,在这个小批量数据的基础上应用一步梯度下降学习算法:

  • 对l层的第j个神经元的权值做一点修改,会导致一些列激活值的变化:

  • ?wl_jk 导致了在第l层 第j个神经元的激活值的变化 ?al_j。

  • ?al_j 的变化将会导致下一层所有激活值的变化,我们聚焦到其中一个激活值上看 看影响的情况,不妨设 al+1_q :

  • 这个变化 ?al+1_q 又会去下一层的激活值。实际上,我们可以想象出一条从 wl_jk到 C 的路径,然后每个激活值的变化会导致下一层的激活值的变化,最终是输出层的代价的变化。假设激活值的序列如下 al_j, al+1_q, …,

    aL-1_n, aL_m,那么结果的表达式就是:

  • 我们用这个公式计算 C 关于网络中一个权重的变化率。这个公式告诉我们的是:两个神经元之间的连接其实是关联于一个变化率因子,这个因子是一个神经元的激活值相对于其他神经元的激活值的偏导数。从第一个权重到第一个神经元的变化率因子是 ?al_j/?wl_jk。路径的变化率因子其实就是这条路径上的众多因子的乘积而整个的变化率 ?C/?wjk l就是对于所有可能的从初始权重到最终输出的代价函数的路径的变化率因子的和。针对某一个路径,这个过程解释如下:

Gradient checking and advanced optimization

  • 在本节中,我们描述了一个数值方法用来检查你求解导数的代码是否正确,进行导数检查过程将大大增加你的代码的正确性。
  • 假设我们想最小化J(θ),我们可以进行梯度下降:

  • 假设我们找到一个函数g(θ)等于这个导数,那么我们如何确认这个g(θ)是否正确呢?回忆导数的定义:

  • 我们可以比较上式和g(θ)是否一样来检验函数g是否正确,通常ε设置为一个很小的数(比如10^-4)。假定ε=10^-4,通常你会发现上面两个式子至少有4位有效数字是一样的(通常会更多)
  • 现在考虑θ是个向量而不是一个值,我们定义:

  • 其中θi+和θ几乎相同,除了第i个位置上增加ε。
  • 我们可以对每个i 检查下式是否成立,进而验证gi(θ)的正确性:

  • 再利用反向传播求解神经网络时,正确的算法会得到下面这样的导数,我们需要使用上面的方法来验证得到的导数是都正确:

时间: 2024-10-24 16:20:29

Sparse Autoencoder稀疏自动编码的相关文章

UFLDL实验报告2:Sparse Autoencoder

Sparse Autoencoder稀疏自编码器实验报告 1.Sparse Autoencoder稀疏自编码器实验描述 自编码神经网络是一种无监督学习算法,它使用了反向传播算法,并让目标值等于输入值,比如 .自编码神经网络尝试学习一个 的函数.换句话说,它尝试逼近一个恒等函数,从而使得输出 接近于输入 .当我们为自编码神经网络加入某些限制,比如给隐藏神经元加入稀疏性限制,那么自编码神经网络即使在隐藏神经元数量较多的情况下仍然可以发现输入数据中一些有趣的结构.稀疏性可以被简单地解释如下.如果当神经

七、Sparse Autoencoder介绍

目前为止,我们已经讨论了神经网络在有监督学习中的应用.在有监督学习中,训练样本是有类别标签的.现在假设我们只有一个没有带类别标签的训练样本集合  ,其中  .自编码神经网络是一种无监督学习算法,它使用了反向传播算法,并让目标值等于输入值,比如  .下图是一个自编码神经网络的示例. 自编码神经网络尝试学习一个  的函数.换句话说,它尝试逼近一个恒等函数,从而使得输出  接近于输入  .恒等函数虽然看上去不太有学习的意义,但是当我们为自编码神经网络加入某些限制,比如限定隐藏神经元的数量,我们就可以从

稀疏自动编码之练习

从10幅图像中采样出10000幅小图像块,每个小图像块大小是8*8,利用采样出的图像作为样本学习,利用LBFGS进行优化. 下面是对10幅图像白化之后的结果: train.m %% CS294A/CS294W Programming Assignment Starter Code % Instructions % ------------ % % This file contains code that helps you get started on the % programming ass

Deep Learning论文笔记之(二)Sparse Filtering稀疏滤波

Deep Learning论文笔记之(二)Sparse Filtering稀疏滤波          自己平时看了一些论文,但老感觉看完过后就会慢慢的淡忘,某一天重新拾起来的时候又好像没有看过一样.所以想习惯地把一些感觉有用的论文中的知识点总结整理一下,一方面在整理过程中,自己的理解也会更深,另一方面也方便未来自己的勘察.更好的还可以放到博客上面与大家交流.因为基础有限,所以对论文的一些理解可能不太正确,还望大家不吝指正交流,谢谢. 本文的论文来自: Sparse filtering, J. N

Exercise:Sparse Autoencoder

斯坦福deep learning教程中的自稀疏编码器的练习,主要是参考了   http://www.cnblogs.com/tornadomeet/archive/2013/03/20/2970724.html,没有参考肯定编不出来...Σ( ° △ °|||)︴  也当自己理解了一下 这里的自稀疏编码器,练习上规定是64个输入节点,25个隐藏层节点(我实验中只有20个),输出层也是64个节点,一共有10000个训练样本 具体步骤: 首先在页面上下载sparseae_exercise.zip S

稀疏自动编码之反向传播算法(BP)

假设给定m个训练样本的训练集,用梯度下降法训练一个神经网络,对于单个训练样本(x,y),定义该样本的损失函数: 那么整个训练集的损失函数定义如下: 第一项是所有样本的方差的均值.第二项是一个归一化项(也叫权重衰减项),该项是为了减少权连接权重的更新速度,防止过拟合. 我们的目标是最小化关于 W 和 b 的函数J(W,b). 为了训练神经网络,把每个参数 和初始化为很小的接近于0的随机值(例如随机值由正态分布Normal(0,ε2)采样得到,把 ε 设为0.01), 然后运用批量梯度下降算法进行优

【转帖】Andrew ng 【Sparse Autoencoder 】@UFLDL Tutorial

Neural Networks From Ufldl Jump to: navigation, search Consider a supervised learning problem where we have access to labeled training examples (x(i),y(i)).  Neural networks give a way of defining a complex, non-linear form of hypotheses hW,b(x), wit

SQL Server ->> Sparse File(稀疏文件)

Sparse File(稀疏文件)不是SQL Server的特性.它属于Windows的NTFS文件系统的一个特性.如果某个大文件中的数据包含着大量“0数据”(这个应该从二进制上看),这样的文件就可以被称之为稀疏文件.如果从二维图上看这个文件你会发现文件就像很多很多洞一样,这就是“稀疏”的由来.这种文件造成的问题是空间浪费.比如说如果你现在用VMWare Workstatation创建了一个虚拟机,初始化磁盘大小为40G,VM必然会为虚拟机生成一个或者多个.vmdk文件.如果文件系统真的分配40

稀疏自动编码之梯度检验

众所周知,反向传播算法很难调试和得到正确结果,特别是在执行过程中存在许多细小难以察觉的错误.这里介绍一种方法来确定代码中导数的计算是否正确.使用这里所述求导检验方法,可以帮助提升写正确代码的信心. 假设我们想最小化关于  的函数   . 对于这个例子,假设 ,所以 . 在一维空间,梯度下降的一次迭代公式如下: 假设我们已经实现了某个函数  去计算 ,那么梯度下降时参数更新就可以这样:. 该如何检验我们编写的函数  是正确的呢? 回忆导数的定义: 对于任意的  ,可以用如下公式来从数值上近似导数值