DL入门(2):自编码器(AutoEncoder)

DL入门(2):自编码器(AutoEncoder)简单叙述普通自编码器、堆叠自编码器、稀疏自编码器、降噪自编码器的原理及应用。

大家好,又见面了,我是你们的朋友全栈君。

  写在前面:看预测论文综述时,面临这样一个问题:很多DL的方法只是会简单运用,却不是特别了解其详细原理,故针对CNN、RNN、LSTM、AutoEncoder、RBM、DBN以及DBM分别做一些简单总结,以达到了解的目的,此篇为AutoEncoder。

1.大致了解

1.1 原理

  自动编码器是一种无监督的数据维度压缩和数据特征表达方法。在大部分提到自动编码器的场合,压缩和解压缩的函数是通过神经网络实现的。
  一个简单的自编码器结构如下所示:
在这里插入图片描述
可以看到上述结构只有一个隐藏层,从输入到隐藏层即为Encoder(编码器),从隐藏层到输出即为Decoder(解码器)。
  一提到降维,首先想到的肯定是主成分分析(PCA),PCA具体原理可以参考:降维基础知识(样本均值、样本方差、中心矩阵)与PCA(最大投影方差,最小重构代价,SVD分解)
  那么自编码器这么简单的结构如何达到降维的目的呢?我们知道,一个最简单的自编码器(上图所示)只有三层结构,编码器将输入进行编码,变成中间结果,中间结果再经过解码器还原,这种输入等于输出的结构没有什么实际意义。对于上述结构,如果我们只看左边部分,即编码器的部分,就很容易理解降维的原理:隐藏层神经元的数目远低于输入层,那么我们就可以用更少的特征(神经元)去表征输入数据,从而到降维目的。

1.2 结构

在这里插入图片描述
对于样本x,自编码器的中间隐藏层的活性值为x的编码,即:
在这里插入图片描述
自编码器的输出为重构的数据:
在这里插入图片描述
其中, W ( 1 ) , W ( 2 ) , b ( 1 ) , b ( 2 ) W^{(1)}, W^{(2)}, b^{(1)}, b^{(2)} W(1),W(2),b(1),b(2)是自编码器网络的参数,参数经梯度下降训练得到。
  因此,搭建一个自编码器需要以下几个步骤:

  1. 搭建编码器
  2. 搭建解码器
  3. 设定一个损失函数
  4. 训练

2.自编码器分类

2.1 普通自编码器

输入和输出完全相同,即上面提到的这种。

2.2 堆叠自编码器

  对于很多数据来说, 仅使用两层神经网络的自编码器还不足以获取一种好的数据表示。为了获取更好的数据表示, 我们可以使用更深层的神经网络。深层神经网络作为自编码器提取的数据表示一般会更加抽象, 能够更好地捕捉到数据的语义信息。
  在实践中经常使用逐层堆叠的方式来训练一个深层的自编码器,称为堆叠自编码器(Stacked Auto-Encoder, SAE)。堆叠自编码器一般可以采用逐层训练(Layer-Wise Training)来学习网络参数。
  举一个具体的例子:
在这里插入图片描述
  可以看到,相比于普通的自编码器,我们将隐藏层的个数从1增加到3,其实就是三个普通自编码器堆叠而成。
训练过程如下:

  1. 第一个自编码器:784->1000->784。训练完毕后,固定参数和中间隐层的结果,去掉输出层和相应的权值偏置,然后将隐藏层1000作为第二个自编码器的输入。
  2. 第二个自编码器:1000->1000->1000。训练完毕后,固定参数和中间隐层的结果,去掉输出层和相应的权值偏置,然后再将隐藏层1000作为第三个自编码器的输入。
  3. 第三个自编码器:1000->500->1000。训练完毕后,固定参数和中间隐层的结果,去掉输出层和相应的权值偏置。
  4. 在第三个自编码器隐藏层后面加一个分类器(softmax),进行解码恢复。

  三个自编码器训练完毕后,最后要进行的是整体的反向调优训练,即整体网络使用反向传播进行训练,对参数进行微调。

2.3 降噪自编码器

  我们使用自编码器是为了得到有效的数据表示, 而有效的数据表示除了具有最小重构错误或稀疏性等性质之外,还可以要求其具备其他性质,比如对数据部分损坏(Partial Destruction)的鲁棒性。高维数据(比如图像)一般都具有一定的信息冗余,比如我们可以根据一张部分破损的图像联想出其完整内容。因此, 我们希望自编码器也能够从部分损坏的数据中得到有效的数据表示, 并能够恢复出完整的原始信息,降噪自编码器便应运而生。
  降噪自编码器(Denoising Auto-Encoder)就是一种通过引入噪声来增加编码鲁棒性的自编码器。

工作原理
  对于一个向量 x x x,我们首先根据一个比例 μ \mu μ将x的某些维度设置为0,得到一个被损坏的向量 x ^ \hat{x} x^,要注意,损坏比例一般不超过0.5,另外,也可通过引入高斯噪声来损坏数据。
  我们把损坏的数据 x ^ \hat{x} x^送给自编码器的输入端,并要求它通过编码+解码两个步骤重构出无损的原始输入。那么当输入一个没有经过损坏的数据时,我们就能将其恢复到更理想的状态。
  因此,降噪自编码器的思想十分简单, 通过引入噪声来学习更鲁棒性的数据编码,并提高模型的泛化能力。
在这里插入图片描述

2.3 稀疏自编码器

  一般来说,自编码器的隐层节点数小于输入层的节点数,比如前面所述,为了达到降维的目的,一般使隐藏层神经元个数小于输入层神经元个数。但假设我们并不限制隐藏层神经元个数,而是限制了其中一部分神经元的活性,如下所示:
在这里插入图片描述
隐藏层中,浅蓝色的神经元被抑制了活性。
  稀疏自编码器的目标函数中我们加入了一个正则化项,用于防止过拟合,如下所示:
在这里插入图片描述
  其中Z= [z(1), ⋯ , z(N)]表示所有训练样本的编码, ρ ( Z ) \rho(Z) ρ(Z)为稀疏性度量函数,?表示自编码器中的参数。
  一般而言,我们不会指定隐层表达h中哪些节点是被抑制的,而是指定一个稀疏性参数ρ,代表隐藏神经元的平均活跃程度(在训练集上取平均)。比如,当ρ=0.05时,可以认为隐层节点在95%的时间里都是被抑制的,只有5%的机会被激活。

2.4 欠完备自编码器

  欠完备自编码器为了得到有用信息,会限制编码维度小于输入维度,因为隐层编码维数小于输入维数,可以学习数据分布中最显著的特征。
  但是,若中间隐层单元数特别少,则其表达信息有限,会导致重构过程比较困难。

3 损失函数的设计

3.1 普通自编码器

  普通自编码器训练目的就是为了使得输入等于输出,因此,损失函数loss可以设计如下:
在这里插入图片描述
公式中各项意义一目了然,不再解释。

3.2 稀疏自编码器

  给自编码器中隐藏层单元加上稀疏性限制,在学习的过程中,均方误差可能变得很小,这样会导过拟合,而我们期望的是一个泛化能力很强的编码器,所以我们加入L1正则化来抑制过拟合。
  目标函数设计如下:
在这里插入图片描述
最后一项为正则化项,中间为稀疏操作。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/134657.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 万字长文告诉新手如何学习Python图像处理(上篇完结 四十四) | 「Python」有奖征文

    万字长文告诉新手如何学习Python图像处理(上篇完结 四十四) | 「Python」有奖征文这篇文章是图像处理的最后一篇文章,后面我们将进入新的章节。图像处理文章主要讲解的图像处理方法包括图像几何运算、图像量化采样、图像点运算、图像形态学处理、图像增强、图像平滑、图像锐化、图像特效、图像分割、傅里叶变换与霍夫变换、图像分类等。个人感觉如果你是编程初学者、Python初学者或图像处理爱好者,这个系列真心适合你学习,并且这篇文章算是Python图像处理的学习路线,希望您喜欢。

    2022年10月14日
  • 光棍节程序员闯关秀 writeup

    光棍节程序员闯关秀 writeup先放上题目网址→→https://1111.segmentfault.com/第1关ctrl+a~~第2关查看页面源代码,复制粘贴回车~~第3关用firebug抓包,或者火狐谷歌浏览器自带的开发者工具也可,就可以看见The-Key-Is:a87ff679a2f3e71d9181a67b7542122c把Key复制到URL上K=后面即可第4关观察密码规律,

  • 窗宽窗位

    窗宽窗位转自“CT诊断学”中的窗宽窗位部分。窗宽与窗位CT能识别人体内2000个不同灰阶的密度差别。而人的眼睛却只能分辨16个灰阶度。因此,人眼在CT图像上能分辨的CT值应为125Hu(2000/16)。换句话说,人体内不同组织CT值只有相差125Hu以上,才能为人眼所识别。人体软组织CT值多变化在20-50Hu之间,人眼就无法识别。为此,必须进行分段观察,才能使

  • idea配置运行springboot项目_java项目框架搭建流程

    idea配置运行springboot项目_java项目框架搭建流程IDEA创建springboot项目

  • kong网关作用_网关的基本功能

    kong网关作用_网关的基本功能转载李亚飞大佬的文章:https://www.lyafei.com/Kong网关简介安装之前简单介绍安装了Kong,这篇就是深入Kong详细讲述下它的一些工作原理、核心概念。附上:Kong官网:https://konghq.com/KongGitHub地址:https://github.com/kong/kongKong的工作原理Kong默认开放的端口接收客户端流量的端口,proxy部分:8000——http端口:8443——https端口adm.

  • java中%c%n是什么意思_在编码时如何使用\r与\n,两者的区别

    java中%c%n是什么意思_在编码时如何使用\r与\n,两者的区别\r与\n到底有何区别,编码的时候又应该如何使用,我们下面来了解一下。区别:\r:全称:carriagereturn(carriage是“字车”的意思,打印机上的一个部件)简称:return缩写:rASCII码:13作用:把光标移动到当前行的最左边\n:全称:newline别名:linefeed缩写:nASCII码:10作用:把光标向下移动一行不同操作系统怎样表示“回车+换行”(即一行的结…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号