前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自编码器(AutoEncoder)的基本原理

自编码器(AutoEncoder)的基本原理

作者头像
Cyril-KI
发布2022-09-19 14:36:12
3.3K0
发布2022-09-19 14:36:12
举报
文章被收录于专栏:KI的算法杂记

前言

最近在看GNN的一篇综述,里面有提到图自编码器,因此在这里推送一期关于自编码器的知识。

1.大致了解

1.1 原理

自编码器是一种无监督的数据维度压缩和数据特征表达方法。在大部分提到自编码器的场合,压缩和解压缩的函数都是通过神经网络实现的。

一个简单的自编码器结构如下所示:

可以看到上述结构只有一个隐藏层,从输入到隐藏层即为Encoder(编码器),从隐藏层到输出即为Decoder(解码器)。

一提到降维,首先想到的肯定是主成分分析(PCA),PCA具体原理可以参考:PCA系列(一):降维基础知识及PCA原理总结

那么自编码器这么简单的结构如何达到降维的目的呢?我们知道,一个最简单的自编码器(上图所示)只有三层结构,编码器将输入进行编码,变成中间结果,中间结果再经过解码器还原,这种输入等于输出的结构没有什么实际意义。对于上述结构,如果我们只看左边部分,即编码器的部分,就很容易理解降维的原理:隐藏层神经元的数目远低于输入层,那么我们就可以用更少的特征(神经元)去表征输入数据,从而到降维目的。

1.2 结构

对于样本x,自编码器的中间隐藏层的活性值为x的编码,即:

自编码器的输出为重构的数据:

因此,搭建一个自编码器需要以下几个步骤:

  • 搭建编码器
  • 搭建解码器
  • 设定一个损失函数
  • 训练

2.自编码器的分类

2.1 普通自编码器

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

2.2 堆叠自编码器

对于很多数据来说, 仅使用两层神经网络的自编码器还不足以获取一种好的数据表示。为了获取更好的数据表示,我们可以使用更深层的神经网络。深层神经网络作为自编码器提取的数据表示一般会更加抽象,能够更好地捕捉到数据的语义信息。

在实践中经常使用逐层堆叠的方式来训练一个深层的自编码器,称为堆叠自编码器(Stacked Auto-Encoder,SAE)。堆叠自编码器一般可以采用逐层训练(Layer-Wise Training)来学习网络参数。

举一个具体的例子:

可以看到,相比于普通的自编码器,我们将隐藏层的个数从1增加到3,其实就是三个普通自编码器堆叠而成。训练过程如下:

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

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

2.3 降噪自编码器

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

降噪自编码器(Denoising Auto-Encoder)就是一种通过引入噪声来增加编码鲁棒性的自编码器。

我们把损坏的数据 送给自编码器的输入端,并要求它通过编码+解码两个步骤重构出无损的原始输入。那么当输入一个没有经过损坏的数据时,我们就能将其恢复到更理想的状态。

因此,降噪自编码器的思想十分简单:通过引入噪声来学习更鲁棒性的数据编码,并提高模型的泛化能力。

2.4 稀疏自编码器

一般来说,自编码器的隐层节点数小于输入层的节点数。比如前面所述,为了达到降维的目的,一般使隐藏层神经元个数小于输入层神经元个数。但假设我们并不限制隐藏层神经元个数,而是限制了其中一部分神经元的活性,如下所示:

隐藏层中,浅蓝色的神经元被抑制了活性。

在稀疏自编码器的目标函数中我们加入了一个正则化项,用于防止过拟合,如下所示:

其中Z= [z(1), ⋯ , z(N)]表示所有训练样本的编码,ρ(Z) 为稀疏性度量函数,𝑾表示自编码器中的参数。

一般而言,我们不会指定隐层表达h中哪些节点是被抑制的,而是指定一个稀疏性参数ρ,代表隐藏神经元的平均活跃程度(在训练集上取平均)。比如,当ρ=0.05时,可以认为隐层节点在95%的时间里都是被抑制的,只有5%的机会被激活。

2.5 欠完备自编码器

欠完备自编码器为了得到有用信息,会限制编码维度小于输入维度,因为隐层编码维数小于输入维数,可以学习数据分布中最显著的特征。

但是,若中间隐层单元数特别少,则其表达信息有限,会导致重构过程比较困难。

3.损失函数的设计

3.1 普通自编码器

普通自编码器训练目的就是为了使得输入等于输出,因此,损失函数loss可以设计如下:

公式中各项意义一目了然,不再解释。

3.2 稀疏自编码器

给自编码器中隐藏层单元加上稀疏性限制,在学习的过程中,均方误差可能变得很小,这样会导过拟合,而我们期望的是一个泛化能力很强的编码器,所以我们加入L1正则化来抑制过拟合。

目标函数设计如下:

最后一项为正则化项,中间为稀疏操作。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 KI的算法杂记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.大致了解
    • 1.1 原理
      • 1.2 结构
      • 2.自编码器的分类
        • 2.1 普通自编码器
          • 2.2 堆叠自编码器
            • 2.3 降噪自编码器
              • 2.4 稀疏自编码器
                • 2.5 欠完备自编码器
                • 3.损失函数的设计
                  • 3.1 普通自编码器
                    • 3.2 稀疏自编码器
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档