深度学习入门 ---稀疏自编码器

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jiede1/article/details/76681371

在学习稀疏自编码器之前,需要读者有BP神经网络的基础

1. 为什么要用稀疏自编码器

  对于没有带类别标签的数据,由于为其增加类别标记是一个非常麻烦的过程,因此我们希望机器能够自己学习到样本中的一些重要特征。通过对隐藏层施加一些限制,能够使得它在恶劣的环境下学习到能最好表达样本的特征,并能有效地对样本进行降维。这种限制可以是对隐藏层稀疏性的限制。
  如果给定一个神经网络,我们假设其输出与输入是相同的,然后训练调整其参数,得到每一层中的权重。自然地,我们就得到了输入的几种不同表示(每一层代表一种表示),这些表示就是特征。自动编码器就是一种尽可能复现输入信号的神经网络。为了实现这种复现,自动编码器就必须捕捉可以代表输入数据的最重要的因素,就像PCA那样,找到可以代表原信息的主要成分。
  当然,我们还可以继续加上一些约束条件得到新的Deep Learning方法,如:如果在AutoEncoder的基础上加上L1的Regularity限制(L1主要是约束隐含层中的节点中大部分都要为0,只有少数不为0,这就是Sparse名字的来源),我们就可以得到Sparse AutoEncoder法。
  之所以要将隐含层稀疏化,是由于,如果隐藏神经元的数量较大(可能比输入像素的个数还要多),不稀疏化我们无法得到输入的压缩表示。具体来说,如果我们给隐藏神经元加入稀疏性限制,那么自编码神经网络即使在隐藏神经元数量较多的情况下仍然可以发现输入数据中一些有趣的结构。

2. 稀疏自编码器的解释

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

3. 模型

这里写图片描述
我们的目标是,使得hw,b(x)=x。并且通过隐含层,得到输入的压缩表示。

在神经网络里面,我们得到的隐含层输出用a表示。在这里,我们将其转换一下概念。a(2)j是隐含层第j个单元的输出。a(2)jx(i)表示在给定输入为 x 情况下,自编码神经网络隐藏神经元 j 的激活度。 进一步,让
ρˆ=1mmi=1a(2)jx(i)

表示隐藏神经元 j 的平均活跃度(在训练集上取平均)。我们可以近似的加入一条限制。
这里写图片描述
其中, ρ 是稀疏性参数,通常是一个接近于0的较小的值(比如 ρ= 0.05 )。换句话说,我们想要让隐藏神经元 ρˆ的平均活跃度接近0.05。为了满足这一条件,隐藏神经元的活跃度必须接近于0。
为了实现这一限制,我们将会在我们的优化目标函数中加入一个额外的惩罚因子,而这一惩罚因子将惩罚那些ρˆρ 有显著不同的情况从而使得隐藏神经元的平均活跃度保持在较小范围内。惩罚因子的具体形式有很多种合理的选择,我们将会选择以下这一种(KL散度):
这里写图片描述

其中为了方便书写:

这里写图片描述

这样,神经网络整体代价函数就可以表示为:
这里写图片描述

然后我们基于此再推导一次神经网络的反向传播算法。

最后我们得到,原本的神经网络误差项:
这里写图片描述
变成:
这里写图片描述

接下来就是训练神经网络,直到收敛了。到最后,我们可以得到输入层到隐含层的权重,利用这我们可以知道我们学习到了什么。具体可参考可视化自编码器训练结果

4.代码实现

由于是ufldl的教程,github上已经有开源的实现。
python实现
matla实现
读者可以将源码下载回来,在自己的电脑上跑。但学习一个新算法,最好的方式还是能够自己能够实现一次。所以以后有时间我会更新自己的稀疏自编码器的实现。

参考文献:

展开阅读全文

没有更多推荐了,返回首页