深度学习算法实践13---去噪自动编码机(Denosing Autoencoder)

截至目前为止,我们所讨论的神经网络技术,感知器模型、BP网络、多层卷积神经网络(CNN),都可以视为前馈神经网络的变形,都会采用信号前向传播,误差反向传播修正连接权值,采用有监督学习方式,解决样本分类问题。

在这一篇博文,我们将介绍稍微不同的神经网络架构,即被称为自动编码机(Autoencoder)。与前述我们所讨论的神经网络不同,自动编码器(Autoencoder)属于非监督学习,不需要对训练样本进行标记。自动编码器(Autoencoder)由三层网络组成,其中输入层神经元数量与输出层神经元数量相等,中间层神经元数量少于输入层和输出层。在网络训练期间,对每个训练样本,经过网络会在输出层产生一个新的信号,网络学习的目的就是使输出信号与输入信号尽量相似。自动编码器(Autoencoder)训练结束之后,其可以由两部分组成,首先是输入层和中间层,我们可以用这个网络来对信号进行压缩;其次是中间层和输出层,我们可以将压缩的信号进行还原。

那么这种网络有什么实际应用呢?自动编码器(Autoencoder)是当前深度学习研究的热点之一,有很多重要的应用领域,这里仅举一个有趣的例子,大家还记得前一段时间百度推出的上传你的照片,系统帮你找到与你像的明星吗?其实这个功能就可以用自动编码器(Autoencoder)来实现,首先,我们将已经训练好的自动编码器(Autoencoder)的输入层和中间层组成的网络拿出来,将所有明星的脸进行压缩,得到一个人脸向量,保存起来,然后,当普通用户上传了自己的照片后,系统将用户照片输入自动编码器(Autoencoder)的输入层,从中间层得到该用户的人脸向量,最后拿这个用户的人脸向量与明星们的人脸向量进行比较,找出向量距离最近的一个或几个明星,将明星的照片作为与用户最像的明星照片,返回给用户。由于百度这项服务推出的时间较早,应该不是基于自动编码器实现的,但是使用自动编码器,完全可以实现这个功能,有兴趣的读者完全可以试一下。

当然去噪自动编码机(Denosing Autoencoder)更大的应用是作为深度学习中的一层,堆叠在一起形成深度学习网络。

言归正传,我们来看一下去噪自动编码机的数学原理。假设我们有一个d维输入信号x,经过输入层到达中间层,信号变为y,可以用如下公式表示:

 式1

式1中的s为一个非线性函数,例如可以是Sigmal函数。W是输入层到中间层的连接权值,b为中间层的bias值,信号y经过解码层解码,输出到d个神经元的输出层,如下公式所示:

 式2

式2中的s为一个非线性函数,例如可以是Sigmal函数。W‘是中间层到输出层的连接权值,b’为输出层的bias值。

在通常情况下,有,即中间层到输出层连接权值矩阵是输入层到中间层连接权值矩阵的转置,当然可以没有这种关系,不过多数情况下取二者相等,在本文中,我们就取二者相等。这时整个网络的参数就变为:

当前的问题就变成通过调整网络参数使得最终输出z与原始输入信号y尽量接近。

如果我们将输入层与中间层之间的函数s变为线性函数,将最终输出层信号z与原始输入信号的误差变为设为平方误差:

 式3

则这个问题就变成了一个线性代数中的主成份分析问题了。假设中间层有k个节点,就变成由输入信号x的前k个主成份项,来近似表示原始输入信号。关于这个问题,我们会在深度学习数学基础的线性代数章节中,详细分析这一过程。

因为y可以视为x的有损压缩形式,通过我们的优化算法,可以对训练样本产生很好的压缩效果,同时在测试样本集上有很好的表现,但是我们并不能保证网络可以所有样本都有好的压缩效果。
随着对自动编码器的研究,研究者们发现,对于采用非线性编码器,随机梯度下降算法时,当中间层神经元个数大于输入层神经元个数时,网络误差和泛化的效果会更好一些。
这是什么原因呢?因为我们采用的是随机梯度下降加早期终止优化算法,我们的自动编码器编码层非线性神经元的连接权值需要非常小,才能模拟出线性变换的效果,同时,对于解码网络,又需要非常大的权值,才能有效的恢复原始信号(可以想像成编码层是乘以一个数,而解码层是乘以这个数的倒数),而我们的优化算法,很难产生特别大的连接权值。因此,我们的自动编码器只能拟合于我们的训练样本集。增加中间层神经元的数量,可以在一定程度上解决这个问题。
但是,如果我们把自动编码器的编码层视为对输入信号的压缩,如果中间层的神经元数量多于输入层,那么不仅没有实现压缩,反而使信号扩大了。这就未免太搞笑了。为此,很多研究人员提出,可以通过向中间层神经元引入稀疏性,使大部分神经元为0或者接近为0,从而达到信号压缩的目的。从实践上来看,这种方法的效果还不错。
我们在这里介绍的是另一种方法,来解决自动编码器编解码性能问题。与上面增加中间层神经元数量的方法不同,在这里我们通过向编解码过程中添加随机噪音来解决这一问题,这也是我们为什么把今天所介绍的网络称为去噪自动编码机(dA)的原因。

这个方法的核心思想很简单,就是随机的将原始信号的一些维度数值变为0,有时甚至可以达到一半左右,将这个加入了随机噪音的信号输入我们的去噪自动编码器,将得到的输出与原始输入信号之间计算误差,还是采用前面的随机梯度下降算法,对权值进行调整,使误差达到最小。如果网络可以做到这一点,就可以视为网络自动将我们人为加入了随机噪音去掉了。
我们自然会问,为什么要这样做呢?实际上,对于如图像信号而言,很多信号内容是冗余的,去掉之后不影响信息量,例如当图像信号有一些雪花时,我们还是可以识别出图像内容的。这说明让自动编解码机去噪是可能的。至于加入噪音的原因,是因为我们人对图像内容的理解,完全可以在某些信息缺失的情况下得出结论,如图像中物体被遮盖、破损的情况下,我们依然可以识别图像中的物体。去噪自动编码机(dA)通过加入随机噪声,试图使神经网络也具有与人类似的能力。

去噪自动编码机的基本原理就讲这些了,在下一篇博文中,我们将演示怎样基于Theano框架,构造去噪自动编码机(dA),并将其用于MNIST手写字符识别领域。

你可能感兴趣的:(DA,深度学习,AutoEncoder,自动编码机)