目录
摘要
1. Introduction
2. Compare with PCA
3. Deep Auto-encoder
3.1 Multi Layer
3.2 Visualize
4. Text Retrieval
4.1 Bag-of-word
4.2 Auto-encoder
5. Similar Image Search
6. CNN as Encoder
【机器学习|2020李宏毅机器学习笔记-Unsupervised Learning: Deep Auto-encoder】6.1 Unpooling
6.2 Deconvolution
总结和展望
摘要文节主要介绍了自编码器的基本思想:本质上是一个自压缩和解压的过程,自编码器与PCA的类似,但是很多方面效果更好。Auto-encoder的结构是由编码器(Encoder)和解码器(Decoder)组成,因为是Unsupervised Learning,我们是将Encoder和Decoder连接起来一起训练。
具体工作原理是Auto-encoder把数据作为输入,将其编码转换为一个向量,并输出看起来像输入的数据。换句话说,它可以学习输入中的模式,通过反向传播,可以生成新的非常接近输入数据的东西。最后讲了一些自编码器的应用,如在文字搜索和图像搜索上的应用,预训练DNN的基本过程,利用CNN实现自编码器的过程,加噪声的自编码器,利用解码器生成图像等内容。
1. Introduction Auto-encoder本质上就是一个自我压缩和解压的过程,我们想要获取压缩后的code,它代表了对原始数据的某种紧凑精简的有效表达,即降维结果,这个过程中我们需要:
- Encoder(编码器),它可以把原先的图像压缩成更低维度的向量
- Decoder(解码器),它可以把压缩后的向量还原成图像
文章图片
因此Encoder和Decoder单独拿出一个都无法进行训练,我们需要把它们连接起来,这样整个神经网络的输入和输出都是我们已有的图像数据,就可以同时对Encoder和Decoder进行训练,而降维后的编码结果就可以从最中间的那层hidden layer中获取。
2. Compare with PCA 实际上PCA用到的思想与之非常类似,PCA的过程本质上就是按组件拆分,再按组件重构的过程
在PCA中,我们先把均一化后的x根据组件W分解到更低维度的c,然后再将组件权重c乘上组件的反置WT得到重组后的x^,同样我们期望重构后的x^与原始的x越接近越好。
文章图片
如果把这个过程看作是神经网络,那么原始的x就是input layer,重构x^就是output layer,中间组件分解权重c就是hidden layer,在PCA中它是linear的,我们通常又叫它瓶颈层(Bottleneck layer)
由于经过组件分解降维后的c,维数要远比输入输出层来得低,因此hidden layer实际上非常窄,因而有瓶颈层的称呼。对比于Auto-encoder,从input layer到hidden layer的按组件分解实际上就是编码(encode)过程,从hidden layer到output layer按组件重构实际上就是解码(decode)的过程。
可不可以用更多层hidden layer呢?答案是肯定的
3. Deep Auto-encoder 3.1 Multi Layer 对deep的自编码器来说,实际上就是通过多级编码降维,再经过多级解码还原的过程
此时:
- 从input layer到bottleneck layer的部分都属于Encoder
- 从bottleneck layer到output layer的部分都属于Decoder
- bottleneck layer的output就是自编码结果Coder
文章图片
注意到,如果按照PCA的思路,则Encoder的参数Wi需要和Decoder的参数WTi保持一致的对应关系,这可以通过给两者相同的初始值并设置同样的更新过程得到,这样做的好处是,可以节省一半的参数,降低overfitting的概率。但这件事情并不是必要的,实际操作的时候,你完全可以对神经网络进行直接训练而不用保持编码器和解码器的参数一致。
3.2 Visualize 下图给出了Hinton分别采用PCA和Deep Auto-encoder对手写数字进行编码解码后的结果,从784维降到30维,可以看出,Deep的自编码器还原效果比PCA要更好。
文章图片
如果将其降到二维平面做可视化,不同颜色代表不同的数字,可以看到
- 通过PCA降维得到的编码结果中,不同颜色代表的数字被混杂在一起
- 通过Deep Auto-encoder降维得到的编码结果中,不同颜色代表的数字被分散成一群一群的
文章图片
4. Text Retrieval Auto-encoder也可以被用在文字处理上
比如我们要做文字检索,很简单的一个做法是Vector Space Model,把每一篇文章都表示成空间中的一个vector。假设查询者输入了某个词汇,那我们就把该查询词汇也变成空间中的一个点,并计算query和每一篇document之间的内积(inner product)或余弦相似度(cos-similarity)。下图中跟query向量最接近的几个向量的cosine-similarity是最大的,于是可以从这几篇文章中去检索,实际上这个模型的好坏,就取决于从document转化而来的vector的好坏,它是否能够充分表达文章信息。
4.1 Bag-of-word 最简单的vector表示方法是Bag-of-word,维数等于所有词汇的总数,某一维等于1则表示该词汇在这篇文章中出现,此外还可以根据词汇的重要性将其加权;但这个模型是非常脆弱的,对它来说每个词汇都是相互独立的,无法体现出词汇之间的语义(semantic)。
文章图片
4.2 Auto-encoder 虽然Bag-of-word不能直接用于表示文章,但我们可以把它作为Auto-encoder的input,通过降维来抽取有效信息,以获取所需的vector。同样为了可视化,这里将Bag-of-word降维到二维平面上,下图中每个点都代表一篇文章,不同颜色则代表不同的文章类型。
文章图片
如果用户做查询,就把查询的语句用相同的方式映射到该二维平面上,并找出属于同一类别的所有文章即可。在矩阵分解(Matrix Factorization)中,介绍了LSA算法,它可以用来寻找每个词汇和每篇文章背后的隐藏关系(vector),如果在这里我们采用LSA,并使用二维latent vector来表示每篇文章,得到的可视化结果如上图右下角所示,可见效果并没有Auto-encoder好。
5. Similar Image Search Auto-encoder同样可以被用在图像检索上
以图找图最简单的做法就是直接对输入的图片与数据库中的图片计算pixel的相似度,并挑出最像的图片,但这种方法的效果是不好的,因为单纯的pixel所能够表达的信息太少了。我们需要使用Auto-encoder对图像进行降维和特征提取,并在编码得到的code所在空间做检索,下图展示了Encoder的过程,并给出了原图与Decoder后的图像对比。
文章图片
这么做的好处如下:
- Auto-encoder可以通过降维提取出一张图像中最有用的特征信息,包括pixel与pixel之间的关系
- 降维之后数据的size变小了,这意味着模型所需的参数也变少了,同样的数据量对参数更少的模型来说,可以训练出更精确的结果,一定程度上避免了过拟合的发生
- Auto-encoder是一个无监督学习的方法,数据不需要人工打上标签,这意味着我们只需简单处理就可以获得大量的可用数据
文章图片
可能有些人脸在原图的pixel上看起来并不像,但把它们投影到256维的空间中却是相像的,可能在投影空间中某一维就代表了人脸的特征,因此能够被检索出来。
6. CNN as Encoder 处理图像通常都会用卷积神经网络CNN,它的基本思想是交替使用卷积层和池化层,让图像越来越小,最终展平,这个过程跟Encoder编码的过程其实是类似的。理论上要实现自编码器,Decoder只需要做跟Encoder相反的事即可,那对CNN来说,解码的过程也就变成了交替使用去卷积层和去池化层即可,那什么是去卷积层(Deconvolution)和去池化层(Unpooling)呢?
6.1 Unpooling 做pooling的时候,假如得到一个4×4的matrix,就把每4个pixel分为一组,从每组中挑一个最大的留下,此时图像就变成了原来的四分之一大小,然后做Unpooling,就要把当前的matrix放大到原来的四倍,也就是把2×2 matrix里的pixel按照原先记录的位置插入放大后的4×4 matrix中,其余项补0即可,当然这不是唯一的做法,在Keras中,pooling并没有记录原先的位置,做Unpooling的时候就是直接把pixel的值复制四份填充到扩大后的matrix里即可。
文章图片
6.2 Deconvolution 实际上,Deconvolution就是convolution
这里以一维的卷积为例,假设输入是5维,过滤器(filter)的大小是3,卷积的过程就是每三个相邻的点通过过滤器生成一个新的点,如下图左侧所示
在你的想象中,去卷积的过程应该是每个点都生成三个点,不同的点对生成同一个点的贡献值相加;但实际上,这个过程就相当于在周围补0之后再次做卷积,如下图右侧所示,两个过程是等价的卷积和去卷积的过程中,不同点在于,去卷积需要补零且过滤器的weight与卷积是相反的:
- 在卷积过程中,依次是橙线、蓝线、绿线
- 在去卷积过程中,依次是绿线、蓝线、橙线
文章图片
总结和展望 本节学习的自编码器是前馈神经网络的一种,由编码器和解码器构成。自编码器最开始主要用于数据的降维以及特征的抽取,随着技术的不断发展,现在也被用于生成模型中,可用来生成图片等。因为其是无监督学习,数据不需要标注因此较容易收集,泛化性强。与PCA对数据进行重构降维类似,不同的是PCA是通过求解特征向量,进行降维,是一种线性的降维方式,而自编码是一种非线性降维。
推荐阅读
- 深度学习|我的NVIDIA开发者之旅——Caffe教程(3)使用sklearn和caffe进行简单逻辑回归实践
- 机器学习|python—sklearn特征提取
- 牛客刷题|牛客刷题-Java专项练习(2022-3-28)
- #|YOLOv6 | 模型结构与训练策略详细解析
- #|YOLOv5的Tricks | 【Trick14】YOLOv5的val.py脚本的解析
- 目标检测|yolov5
- pytorch入门|pytorch学习笔记——3.6~3.7Pytorch中定义网络的方式以及模型保存和加载方法
- Transformer|Swin Transformer原理(新手入门级理解)
- pytorch入门|pytorch学习笔记——3.5Pytorch中网络参数的初始化方法