您的位置:首页 > 其它

【UFLDL】Ex1-SparseAutoencoder 稀疏自编码器

2017-11-06 15:21 555 查看
UFLDL系列教程是Andrew Ng教授在网站开设的深度学习课程,主要介绍了无监督特征学习和深度学习的一些相关知识,并且还配有相关的习题可以练习,是非常好的深度学习入门教程。该课程主要的内容有以下几大内容:

稀疏自编码器

矢量化编程实现

预处理:主成分分析与白化

Softmax回归

自我学习与无监督特征学习

建立分类用深度网络

自编码线性解码器

处理大型图像

这里将介绍第一部分内容稀疏自编码器(Sparse Autoencoder)。

1.神经网络与反向传播算法

首先构造一个最简单的神经网络,假设我们有一组训练样本(x,y),我们将构造一个非线性的假设模型hw,b(x),它具有参数w和b,可以来拟合我们的数据,该模型如下所示:



x是输入数据,a2是整个模型的输出数据,f()是激活函数,一般采用sigmoid函数。圆圈来表示神经网络的输入,标上+1的圆圈被称为偏置节点。最左边的一层(x)为输入层,中间的一层(a1)为隐藏层,最右边的一层(a2)为输出层。由上图模型可以得到以下关系:

z1=w1∗x+b1

a1=f(z1)

z2=w2∗a1+b2

a2=f(z2)

这样给这个神经网络一个输入x,对应的输出就是a2。而整个模型的参数有4个,分别是w1,w2,b1,b2。我们的目标是构建一个输出近似为y的神经网络,因此接下来要做的就是为这个神经模型找到一组合适的参数,使对应的输出a2接近y。

随机初始化参数

首先为模型初始化参数,根据教程中的说法,随机初始化的目的是使对称失效。如果所有参数都用相同的值作为初始值,那么所有隐藏层单元最终会得到与输入值有关的、相同的函数。

正向传播算法

根据上面初始化的参数值和输入值x,计算输出a2。将损失函数简单定义为loss(a2)=1/2||y−a2||2。

反向传播算法

计算总的损失函数loss(a2)针对每个参数w1,w2,b1,b2的偏导数。

∂loss∂w2=∂loss(a2)∂w2=∂loss(a2)∂a2⋅∂a2∂w2=∂loss(a2)∂a2⋅∂f(z2)∂z2⋅a1

∂loss∂b2=∂loss(a2)∂b2=∂loss(a2)∂a2⋅∂a2∂b2=∂loss(a2)∂a2⋅∂f(z2)∂z2

∂loss∂w1=∂loss(a2)∂w1=∂loss(a2)∂a2⋅∂f(z2)∂z2⋅w2⋅∂f(z1)∂z1⋅x

∂loss∂b1=∂loss(a2)∂b1=∂loss(a2)∂a2⋅∂f(z2)∂z2⋅w2⋅∂f(z1)∂z1

更新权重参数

设置一个更新速率λ,根据上述偏导数更新每个权重参数。

w1=w1−λ⋅∂loss∂w1

b1=b1−λ⋅∂loss∂b1

w2=w2−λ⋅∂loss∂w2

b2=b2−λ⋅∂loss∂b2

此时将得到新的一组权重系数,重复上面的步骤,计算新的输出和各系数的偏导值,直到最终结果a2与y的误差在可接受范围内。

2.自编码算法和稀疏性

在前面的基础上,考虑建立一个如下图所示的自编码神经网络模型,该模型将尝试学习一个hw,b(x)≈x的函数(自编码)。



与上面的简单模型相比较,这个自编码神经模型也是一个三层神经网络,其训练样本集合为{x1,x2,...xm},因此对应的每一层的神经元个数有所增加。在计算最后的损失函数时,除了要约束输出值hw,b(x)与x相近外,还要对第二层中神经元的激活度进行稀疏性约束。

稀疏性可以被简单地解释如下。如果当神经元的输出接近于1的时候我们认为它被激活,而输出接近于0的时候认为它被抑制,那么使得神经元大部分的时间都是被抑制的限制则被称作稀疏性限制。这里我们假设的神经元的激活函数是sigmoid函数。如果你使用tanh作为激活函数的话,当神经元输出为-1的时候,我们认为神经元是被抑制的。

第二层中第j个神经元的激活度定义为ρ^j=1m∑i=1maj⋅xi,即第二层中第j个神经元输出值aj与前一层中所有输入{x1,x2,...xm}的乘积和的均值。近似的加入一条限制,

ρ^j=ρ,其中 ρ是稀疏性参数,通常是一个接近于0的较小的值。我们选取一个合适的惩罚因子(KL相对熵)来实现这一稀疏性限制:KL(ρ||ρ^j)。该函数具有如下性质,当ρ=ρ^j时,KL(ρ||ρ^j)=0,且随着ρ和ρ^j之间的差异增大而单调递增,如下图中,设定ρ=0.2时,相对熵值KL(ρ||ρ^j)随着ρ^j变化的曲线图。



综合以上两个约束,我们可以得到总体代价函数为:

Jsparse(w,b)=J(w,b)+βKL(ρ||ρ^j)

其中J(w,b)是一般神经网络的代价函数(loss函数)。

根据上一节中的参数优化方法和反向传播算法,可以计算出此稀疏自编码器的参数w和b。

3.代码实现

此部分为matlab方法实现,代码可参考这里。下面将简单介绍一下代码中的一些参数设定和训练方法。

训练数据:10000个8*8的图片块,为了提高运算效率,将它们拉伸为10000*64的矩阵。

网络设置:输入层和输出层的神经元个数均为64,隐藏层的神经元个数为25。稀疏性参数ρ为0.01,β为3。

参数设置:随机初始化3289个参数((64+1)*25+(25+1)*64)。

sparseAutoencoderCost

根据初始化的参数计算出此时的总体代价函数cost值和所有参数的梯度值。

computeNumericalGradient

检验上面的梯度计算代码是否正确。

minFunc

使用minFunc中的L-BFGS方法来对模型参数进行优化,迭代次数上限设为400次。

visualization

计算出模型参数后,将第一层与第二层之间的25*64个参数显示出来,结果为25个6*6的图像块。



4.总结

最后的模型参数可视化结果有什么意义?

最后可视化的是第一层到第二层之间的参数结果。由于这里采用了10000组训练样本,样本量比较充足,因此效果比较好,能看出每一个8*8的图像块都有某种特定的纹理形状,也就是说稀疏自编码器可以自动提取图片的边缘特征。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: