稀疏自动编码之梯度检验

众所周知,反向传播算法很难调试和得到正确结果,特别是在执行过程中存在许多细小难以察觉的错误。这里介绍一种方法来确定代码中导数的计算是否正确。使用这里所述求导检验方法,可以帮助提升写正确代码的信心。

假设我们想最小化关于  的函数   . 对于这个例子,假设 ,所以 . 在一维空间,梯度下降的一次迭代公式如下:

假设我们已经实现了某个函数  去计算 ,那么梯度下降时参数更新就可以这样:. 该如何检验我们编写的函数  是正确的呢?

回忆导数的定义:

对于任意的  ,可以用如下公式来从数值上近似导数值:

在实践中,将  EPSILON 设定为一个极小的常数,如 .(虽然EPSILON可以取得极其小的值,如,但这样会导致数值舍入误差),通常就足够了。

现在,给定假设中计算  的函数  ,我们可以通过如下方式检验该函数的正确如否:

到底这两个值接近到什么样的一个程度才算正确呢?要取决于  的具体形似。但是假定 , 通常我们会发现上述式子左右两边的值至少有4位有效数字是一样的(甚至更多)。

现在,考虑 ,即参数是一个向量而不是一个实数(所以需要学习出  个参数),且. 在我们的神经网络例子中使用符号, 所以我们可以想象把这许多参数   全部装进一个很长的向量 . 现在,就把导数检验过程泛化到  是向量的情况。

假设我们编写了一个函数  计算导数 ,我们想要检验  是否正确地计算出了导数值. 令,其中:

是第  个基向量(维数与  一样,只有第  个元素为1,其他位置元素全部为0).所以对于 ,除了第  个元素比的第  个元素多加了EPSILON,其他元素完全一样。类似地有:.然后就可以通过检查下面式子的正确与否来检验  的正确性:

当用反向传播去训练神经网络时, 正确执行的算法可以得到:

这展示在

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

的梯度下降伪代码中.通常用上面的方法计算出  的导数值,通过它检验我们程序中  和  是否确实计算出了我们想要的到数值。

学习来源:http://deeplearning.stanford.edu/wiki/index.php/Gradient_checking_and_advanced_optimization

时间: 2024-08-27 00:53:28

稀疏自动编码之梯度检验的相关文章

稀疏自动编码之自动编码器和稀疏性

到目前为止,已经叙述了神经网络的监督学习,即学习的样本都是有标签的.现在假设我们有一个没有标签的训练集,其中. 自动编码器就是一个运用了反向传播进行无监督学习的神经网络,学习的目的就是为了让输出值和输入值相等,即.下面就是一个自动编码器: 自动编码器试图学习一个函数. 换句话说,它试图逼近一个等式函数,使得该函数的输出  和输入  很近似.举一个具体的例子,假设输入  是来自一个  图像(共100个像素点)像素点的灰度值,在  层有  个隐层节点. 注意输出 . 由于隐层节点只有50个,所以网络

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

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

稀疏自动编码之练习

从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

CS231n 卷积神经网络与计算机视觉 7 神经网络训练技巧汇总 梯度检验 参数更新 超参数优化 模型融合 等

前面几章已经介绍了神经网络的结构.数据初始化.激活函数.损失函数等问题,现在我们该讨论如何让神经网络模型进行学习了. 1 梯度检验 权重的更新梯度是否正确决定着函数是否想着正确的方向迭代,在UFLDL中我们提到过,计算时梯度公式如果计算错误是不容被察觉的,我们需要比较分析法得到梯度与数值法得到的梯度是否相似,下面是一些技巧: 1.1 centered formula 高等数学中我们知道导数的近似公式: df(x)dx=f(x+h)?f(x)h 以及下面的centered formula: df(

梯度检验!

梯度检验是在编写机器学习算法时必备的技术,可以检验所编写的cost函数是否正确 cost函数的主要功能是:计算代价函数.计算代价函数对参数的梯度 实际程序中,梯度检验要配合cost函数一起使用 ① 给定一组样本及参数初始值 ② 利用cost函数计算grad ③ 利用computeNumericalGradient函数计算梯度的近似值numGrad ④ 比较grad和numGrad是否比较相近:如果diff小于1e-6,则cost函数是正确的,否则,需要检查cost函数 diff = norm(n

稀疏自动编码之可视化自动编码器

对于训练出的一个稀疏自动编码器,现在想看看学习出的函数到底是什么样子.对于训练一个的图像,.计算每一个隐层节点    的输出值: 我们要可视化的函数,就是这个以一副2D图像为输入,以 为参数(忽略偏置项),由隐层节点  计算出来的函数.特别是,我们把  看作是输入  的非线性特征.我们很想知道:什么样的的图像  能使得  成为最大程度的激励? 还有一个问题,就是必须对  加上约束.如果假设输入的范数约束是,可以证明,能够使得隐层神经元得到最大程度激活的像素输入   (所有100个像素点,): 展

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)): 还有一个常见的

稀疏自动编码之神经网络

考虑一个监督学习问题,现在有一些带标签的训练样本(x(i),y(i)).神经网络就是定义一个复杂且非线性的假设hW,b(x),其中W,b 是需要拟合的参数. 下面是一个最简单的神经网络结构,只含有一个神经元,后面就用下图的形式代表一个神经元: 把神经元看作是一个计算单元,左边的x1,x2,x3 (和 截距+1 )作为计算单元的输入,输出为:,其中,函数被称为激活函数,在这里我们的激活函数是sigmoid函数: 还有一种激活函数是正切函数(tanh function): 下面是两种激活函数图像:

深度学习UFLDL老教程笔记1 稀疏自编码器Ⅱ

稀疏自编码器的学习结构: 稀疏自编码器Ⅰ: 神经网络 反向传导算法 梯度检验与高级优化 稀疏自编码器Ⅱ: 自编码算法与稀疏性 可视化自编码器训练结果 Exercise: Sparse Autoencoder 自编码算法与稀疏性 已经讨论了神经网络在有监督学习中的应用,其中训练样本是有类别标签的(x_i,y_i). 自编码神经网络是一种无监督学习算法,它使用了反向传播算法,并让目标值等于输入值x_i = y_i . 下图是一个自编码神经网络的示例. 一次autoencoder学习,结构三层:输入层