【UFLDL】Ex1-SparseAutoencoder 稀疏自编码器
UFLDL系列教程是Andrew Ng教授在网站开设的深度学习课程,主要介绍了无监督特征学习和深度学习的一些相关知识,并且还配有相关的习题可以练习,是非常好的深度学习入门教程。该课程主要的内容有以下几大内容:
- 稀疏自编码器
- 矢量化编程实现
- 预处理:主成分分析与白化
- Softmax回归
- 自我学习与无监督特征学习
- 建立分类用深度网络
- 自编码线性解码器
- 处理大型图像
这里将介绍第一部分内容稀疏自编码器(Sparse Autoencoder)。
1.神经网络与反向传播算法
首先构造一个最简单的神经网络,假设我们有一组训练样本
这样给这个神经网络一个输入
随机初始化参数
首先为模型初始化参数,根据教程中的说法,随机初始化的目的是使对称失效。如果所有参数都用相同的值作为初始值,那么所有隐藏层单元最终会得到与输入值有关的、相同的函数。正向传播算法
根据上面初始化的参数值和输入值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
此时将得到新的一组权重系数,重复上面的步骤,计算新的输出和各系数的偏导值,直到最终结果
2.自编码算法和稀疏性
在前面的基础上,考虑建立一个如下图所示的自编码神经网络模型,该模型将尝试学习一个
与上面的简单模型相比较,这个自编码神经模型也是一个三层神经网络,其训练样本集合为
稀疏性可以被简单地解释如下。如果当神经元的输出接近于1的时候我们认为它被**,而输出接近于0的时候认为它被抑制,那么使得神经元大部分的时间都是被抑制的限制则被称作稀疏性限制。这里我们假设的神经元的**函数是sigmoid函数。如果你使用tanh作为**函数的话,当神经元输出为-1的时候,我们认为神经元是被抑制的。
第二层中第
综合以上两个约束,我们可以得到总体代价函数为:
其中
根据上一节中的参数优化方法和反向传播算法,可以计算出此稀疏自编码器的参数
3.代码实现
此部分为matlab方法实现,代码可参考这里。下面将简单介绍一下代码中的一些参数设定和训练方法。
训练数据:10000个8*8的图片块,为了提高运算效率,将它们拉伸为10000*64的矩阵。
网络设置:输入层和输出层的神经元个数均为64,隐藏层的神经元个数为25。稀疏性参数
参数设置:随机初始化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的图像块都有某种特定的纹理形状,也就是说稀疏自编码器可以自动提取图片的边缘特征。