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

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

  • 稀疏自编码器
  • 矢量化编程实现
  • 预处理:主成分分析与白化
  • Softmax回归
  • 自我学习与无监督特征学习
  • 建立分类用深度网络
  • 自编码线性解码器
  • 处理大型图像

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

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

首先构造一个最简单的神经网络,假设我们有一组训练样本 (x,y) ,我们将构造一个非线性的假设模型 hw,b(x) ,它具有参数 w b ,可以来拟合我们的数据,该模型如下所示:
简单神经网络模型
x 是输入数据, a2 是整个模型的输出数据, f() 是激活函数,一般采用sigmoid函数。圆圈来表示神经网络的输入,标上 +1 的圆圈被称为偏置节点。最左边的一层( x )为输入层,中间的一层( a1 )为隐藏层,最右边的一层( a2 )为输出层。由上图模型可以得到以下关系:
z1=w1x+b1
a1=f(z1)
z2=w2a1+b2
a2=f(z2)
这样给这个神经网络一个输入 x ,对应的输出就是 a2 。而整个模型的参数有4个,分别是 w1,w2,b1,b2 。我们的目标是构建一个输出近似为 y 的神经网络,因此接下来要做的就是为这个神经模型找到一组合适的参数,使对应的输出 a2 接近 y

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

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

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

    lossw2=loss(a2)w2=loss(a2)a2a2w2=loss(a2)a2f(z2)z2a1

    lossb2=loss(a2)b2=loss(a2)a2a2b2=loss(a2)a2f(z2)z2

    lossw1=loss(a2)w1=loss(a2)a2f(z2)z2w2f(z1)z1x

    lossb1=loss(a2)b1=loss(a2)a2f(z2)z2w2f(z1)z1

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

    b1=b1λlossb1

    w2=w2λlossw2

    b2=b2λlossb2

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

2.自编码算法和稀疏性

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

自编码神经网络

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

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

第二层中第 j 个神经元的激活度定义为 ρ^j=1mi=1majxi ,即第二层中第 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的图像块都有某种特定的纹理形状,也就是说稀疏自编码器可以自动提取图片的边缘特征。

猜你喜欢

转载自blog.csdn.net/zzj__/article/details/78456262
今日推荐