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

原创 2016年08月31日 17:57:29

截至目前为止,我们所讨论的神经网络技术,感知器模型、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手写字符识别领域。

相关文章推荐

Tensorflow实战3:实现去噪自编码器

1.自编码器的简介 自编码器(AutoEncoder)是一种典型的无监督学习,即不需要对样本进行手工标注,就可对数据进行一定程度的学习。这是对人工成本的极大节约(亲身体会,标注数据真的还蛮痛...
  • Felaim
  • Felaim
  • 2017年03月28日 14:41
  • 2599

去噪自编码器_DeepLearning 0.1 documentation中文翻译

《DeepLearning 0.1 documentation》的 Denoising Autoencoders (DA) 部分的翻译,即去噪自编码器。...

深度学习之自编码器AutoEncoder

一、什么是自编码器(Autoencoder) 自动编码器是一种数据的压缩算法,其中数据的压缩和解压缩函数是数据相关的、有损的、从样本中自动学习的。在大部分提到自动编码器的场合,压缩和解压缩的函数...

TensorFlow实现去噪自编码器及使用—Masking Noise Auto Encoder

有关于自编码器的原理,请参考博客http://blog.csdn.net/xukaiwen_2016/article/details/70767518;对于对其与原理熟悉的可以直接看下面代码。    ...

tensorflow 实现基本AutoEncoder,降噪自编码器

这篇博客主要是自己看了一些关于自编码器的文章和阅读了tensorflow自己公布的源码,并在源码上附上一些注释,因为要完全理解一个算法或者结构,最直接的方式就是阅读相关的源码。...

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

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

[神经网络]从反向传播(BP)到去噪自动编码器(DAE)

本文主要总结一下神经网络几种训练机制,不仅简单介绍这几种训练机制的步骤和优缺点,而且从发展,进化的角度理清训练机制不断改进的思路和解决方案,以加深对这几种网络的理解,文中没有公式,适合DL入门者。BP...
  • cuclxt
  • cuclxt
  • 2016年05月21日 10:05
  • 2053

【TensorFlow-windows】(二) 实现一个去噪自编码器

主要内容: 1.自编码器的TensorFlow实现代码(详细代码注释) 2.该实现中的函数总结平台: 1.windows 10 64位 2.Anaconda3-4.2.0-Window...

自动编码机

自动编码机(Autodencoder) 自动编码机(Autoencoder)属于非监督学习,不需要对训练样本进行标记。自动编码机(Autoencoder)由三层网络组成,其中输入层神经元数量与输出层神...

机器学习课程练习(一)——稀疏自动编码机

前言 斯坦福的UFLDL教程每一个章节都配有练习 本文是稀疏自动编码器这一章节的练习的解答 练习的目的是填补空缺代码,实现一个稀疏自动编码器,完成对8*8图片块的特征编码 具体内容可以浏览课程网页 s...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习算法实践13---去噪自动编码机(Denosing Autoencoder)
举报原因:
原因补充:

(最多只允许输入30个字)