文章目录

  • 一.自编码器的引入
  • 二.自编码器的应用
    • 1.文本检索
    • 2.寻找相似图片
    • 3.预训练神经网络
    • 4.面向图片的自编码器
    • 5.进行内容生成
  • 三.自编码器的改进
    • 1.去除噪音
    • 2.重定义损失函数
    • 3.提高编码可解释性
      • (1).特征类分离
      • (2).编码离散化

   前排提醒这篇文章长度比之前的要长很多

一.自编码器的引入

  首先我们回到PCA,我们有x−x‾≈∑i=1mciui=x^x-\overline x\approx \sum_{i=1}^mc_iu_i=\hat xxxi=1mciui=x^,我们要寻找的是uuu,之后的ccc其实就是降维后的向量。我们要想让我们的损失最少,那当然就是这个约等于号尽量取等,然后由于uuu是个正交矩阵,因此我们可以左右同乘uuu,得到ci=(x−x‾)uic_i=(x-\overline x)u_ici=(xx)ui
  然后我们就可以看成是这样的一个操作流程:输入x−x‾x-\overline xxx,乘一个矩阵WWW得到我们的ccc,之后我们再乘一次矩阵WWW,就可以得到我们的x^\hat xx^,之后我们将输入和输出做一个差就是我们的损失值。
  上面的描述就完完全全的形成了一个简单的,只有一个连接层,且中间层恰好是降维后的向量的神经网络,如下图所示。然后我们完全可以用梯度下降的方法来得到一个合适解;诚然,由于我们这里没有很多约束,并且可能陷入局部最优解,因此最后迭代后的解很可能和解析解不同。

  我们把这种中间层最窄,前后对称的,输入和学习目标相同的神经网络,就叫做自编码器。其中输入到中间最窄层的部分叫做编码器;而中间最窄层到输出层的部分叫做解码器。中间层就是机器学到的降维后的特征。

  当然我们完全可以把encoder和decoder都变为更深层或者是各种类型的神经网络,完全变为黑盒。下图就是使用深层自编码器的结果,可见效果远好于PCA(注:这里如果使用单层自编码器,那么效果肯定是不如PCA的,因为单层自编码器的全局最优解是PCA的解)。

二.自编码器的应用

  自编码器在降维上的良好结果使其应用十分的广泛。

1.文本检索

  我们可以试图将每篇文章化为空间中的一个点,用句子或关键词进行索引的时候,也转化为空间的一个点,通过定义相似度(几何距离,余弦相似度等),按照顺序搜索出对应的文章。
  或者就可以说是专门应对与文本的搜索引擎。
  我们使用自编码器的思想,如果有了输入,我们用自编码器是比较容易就做到这一点的,之后我们把其对应的编码后结果计算距离即可。但是这里最大的一个问题就是,如何去定义我们的原始输入。
  我们要这么去想,提取深层特征(比如语义等内容)我们完全可以交给神经网络,我们要做的就是只需把所有表层的信息作为输入,即文本中所有的单词的信息;这就包括了有什么单词,和对应的频率的问题。我们一般使用tf-idf方法来对每个单词定义自己的权重(与这个单词在这篇文章中的出现频率成正比,与这个单词在全部文章中的出现频率成反比),之后把所有单词构成的权重向量作为输入即可(也就是说向量的大小就是词库中词语的总数),这个方法也被称作Bag-of-word。
  下图是课件中一个简单的纯统计词频,没有使用tf-idf方法的例子。

2.寻找相似图片

  对于正常的图片而言,我们可能最开始想到的定义相似度的方法,就是把图片直接转化为向量,然后通过计算每个图片对应向量的几何距离来说明图片的相似度。但这样显然结果很差,如下图所示,识别的结果竟然是人的照片竟然和马蹄铁很像,仅仅是因为部分像素上颜色较为一致,这显然不是我们想要的结果,我们希望我们得到更深层的特征而不是这个表层特征。

  然而这些图片本来就是无标签数据,因此深层自编码器的方法呼之欲出。最后的结果是蛮好的,可以看出找到的相似图片也都是人脸照了,如下图所示。虽然这些图片在原始图片对应的向量的相似度不高,但是在经过神经网络编码后相似度就变成了最高的几张。

  但这里有一个小细节问题上课没有说,那就是这里的深层自编码器用的是全连接神经网络,而本来处理图片我们使用的都是CNN。那这里我们是否可以用CNN的模板来进行深层自编码器的训练呢?其实是可以的而且很有用,这也导出了之后的应用。

3.预训练神经网络

  我们对比一下自编码器和普通的神经网络,我们其实可以发现,其实她们隐藏层的目的都一样,那就是我们要挖掘出深层的特征,这点上他们本就是类似的。而一般进行正常的神经网络的训练的时候,由于有的时候会陷入局部最优解,而且层数比较深的话,梯度下降时总是可能会发生一定的意外的,我们希望能有比较靠谱的初始化参数。
  那顺着这个思想,我们可以使用单层自编码器,一层层的去训练出所谓的原始特征,如下图所示,为训练第一层参数。后续可以一层层的训练(固定住前面的参数,将转化后的结果作为输入)。

  但是这里又有一个小细节问题。之前我们的自编码器都是默认中间最窄而两边长,这样才能在这种思维中压缩提取特征(当然对于有标签数据,中间长也没事,不用解释了吧),否则如果像上面这张图这样中间反而最长,那我们完全可以浪费掉多余的神经元,然后使得其他的对应的矩阵是单位阵,那得到的结果反而是最完美的然而神经网络什么都没学到。为了防止这个情况的出现,一般我们会加上一个很大的正则化项去约束,防止这种情况的出现。

4.面向图片的自编码器

  就像上文所说,我们对图片使用自编码器进行特征处理的时候,我们完全可以采用CNN的架构进行处理,如下图所示。
  卷积层和池化层我们都好理解。但由于自编码器既要有编码过程又要有解码过程,因此我们就需要所谓的“反卷积层”和“反池化层”。我们要试图进行去定义i这些层来进行解码。
  反池化层其实是比较难办的,因为它其实很多时候就是真的丢失了一些信息,我们还原的时候是很难这些丢失的信息的。常见的对最大池化进行的反池化如下图所示,就是记住池化时选择的位置,反池化的时候将这个位置还原,其他的地方全部补0得到。

  但是上述方法不仅要进行额外的记录,比较麻烦;而且其他地方全部补0有的时候不是一件好事,图片会有被割裂的效果,有的地方明显补0不合理,如下图所示。

  我们可以想,那还不如就仅仅是保留原图,仅仅相当于扩大一倍,如下图所示,操作简单而且这个过程基本没有扭曲什么信息。

  而反卷积层就比较有趣了,结论就是反卷积层就是卷积层。笔者认为,最简单的理解方式如下。
  首先全连接层对应的反全连接层其实就是全连接层,而卷积层仅仅就是去掉了一些连接的全连接层罢了,那反卷积层为什么不是去掉了一些连接的全连接层呢?
  其次,在卷积层我们考虑的是卷积之后的值是由输入的哪些值决定;那我们反过来想,我们考虑输入的每个值都影响了卷积层的哪个卷积结果,这不就是反卷积了么?虽然卷积核当然极大概率不同了,但是思想上还是一样的。
  老师在课上举了个简单的例子,道理是类似的。其中最左面是卷积层,最右面是反卷积层。至于多出的几个神经元,这个主要是边界引起的,我们要都做padding的话就没有这个问题了。

  之后的训练就是常规操作了。

5.进行内容生成

  如果我们已经训练好一个深层自编码器,我们完全可以手动的在中间的瓶颈层输入一个向量,作为所谓的一个编码后的结果,然后我们只让这个自编码器去自己解码,然后看看最后的结果。
  由于图片更直观,我们一般是用这种方法去生成简单的图片用作示例。
下图是用最内部特征数为2的手写数字深层自编码器。我们就可以手动按红框中的值来直接喂给解码器来查看效果。

  当然上图中参数范围有点大了,我们可以加入正则化项来使得点更密集一些。

三.自编码器的改进

  自编码器虽然很好用,但是依旧有很大的改进空间。首先,很多无标签数据其实都是有噪音的,我们应该让我们的编码器去学会去噪;其次,我们之前定义的损失值都是所谓的最后的结果与输入的距离,我们可以扩展这个损失函数从而有更多的应用;最后,我们可以试图让我们的encoder编码后得到的东西更容易被解读。我们下面就详细的说明一下这三点。

1.去除噪音

  对于无标签数据,我们是不知道具体什么是噪音的。我们只能是根据我们对噪音的理解,去给我们的输入加入噪音去进行训练,然后让我们得到的结果去和没有加入噪音之前的输入来进行对比。下图就是针对图片的去噪自编码器的训练,加入的白点就是纯噪音。

  道理是好理解的,我们对自编码器的训练就是想让它去忽视这些噪音。

2.重定义损失函数

  我们之前的损失函数,都是直接去对比输出和输入的相似性,我们可否做一个推广,相当于是让机器自己去定义损失呢?其实是可以的。
  我们可以更广义的去思考我们所做的,我们的encoder中通过输入得到了我们想要的所谓特征,我们的目标就是尽量让这些特征显著,就是机器可以很简单的通过这个特征就进行分类(这也就是decoder中我们去做的)。那我们完全可以定义成,将我们的解码器变成一个判别器,去把我们编码器得到的输入来当作判别器的输入,然后把真正的结果当作是标签,然后进行分类,我们希望分类过程中的损失值尽量小(当然这种神经网络分类问题损失值用交叉熵损失函数即可)。如下图所示。

  当然这张图要配合老师上课讲的来食用。主要是我们想使得损失值尽量的小,那就要分成两部分。一个是encoder中的参数θ\thetaθ,它影响了输入的情况,导致了分类的固有难度(就像我们梯度下降时最优解也是有一定损失值的);另一个是这个判别器中的参数,这个我们可以用梯度下降。至于这个判别器的内部结构,我们就可以有多种选择,我们这里可以使用和GAN类似的模板。
  这样我们就可以同时进行训练,最后希望我们的编码器编码出来的结果是容易被分类的,从而代表了更具有特征。
  为什么说这是之前损失函数的扩展呢,因为这种方法取特例模型就是我们之前使用的方法,如下图所示。当然这里的score就是我们上文的LLL

  当我们的资料是有序列的资料时,我们也可以用上下文的信息来定义损失值,而不是这句话的信息。
  例如老师课件上这张图。上面的skip thought的思想其实就是,encoder部分将句子进行编码,而decoder部分解码时,把编码解成上一句和下一句,然后用真正的上一句和下一句的信息进行比对来定义损失值。当然这里至于句子如何表示,可以用词向量(进行word embedding之后)的RNN形式来作为输入输出,这样损失值我们完全可以用所谓的距离。而这种方法训练太慢了,因此出现了下文的quick thought,思想做了简化:我们用encoder对这句话进行编码,之后我们也将下一句话和比较多的随机的句子作为输入进行编码,然后告诉机器哪一个是真正的下一句话,让机器反向传播过程中,这句话和下一句话的编码越来越接近而这句话和其他句子的编码越来越远(所以说这个分类器其实内部很简单,就计算距离搞个softmax就好了)。

3.提高编码可解释性

(1).特征类分离

  在这里的可解释性,不再是我们所谓的,我们想看出每个维度所代表的含义,而是说,我们试图把我们的编码进行一个所谓的拆解,如下图所示是一个简单的例子,一句话的语音信息既包括了人本身嗓音的属性,又包括了说话内容的属性。我们希望我们的自编码器可以编码成,前一部分只描述内容部分,而后一部只描述说话者信息部分。

  这里我们介绍两种方法。
  第一种其实又是使用了GAN的思想,其实十分有趣。我们希望黄色的部分只有说话人的相关信息,那就等价于绿色的部分没有说话人的相关信息;而这部分的输出,我们可以作为一个新的用来识别说话人的分类器,然后我们训练的这个encoder和这个说话人分类器之间就开始对抗,encoder负责试图让分类器无法区分,而分类器努力的去区分。最后的结果当然是我们可以让这个分类器最后无法区分,那就只能是encoder把说话人的信息藏到黄色的部分,这样绿色的部分完全没有相应的信息,那么分类器就只能随机分了;当然这个特征是不能丢的,因为decoder还要用他来还原全部信息。
  而第二种思想其实更用到了一些我们比较认可的假设,就是我们去区分哪些特征是影响全局的,哪些特征是影响局部的。在这个比较简单的例子中,我们还是可以比较确定的说,人的语调是影响句子全局特征的,而说话内容只是影响局部特征,我们抓住这点就可以进行后续的操作了。
  那我们就可以在encoder网络层就划分成两个部分,第一个部分最后去除掉影响全局的部分(采用正则化),这样就保证了这个部分不含有全局特征信息也就是说话人信息;而第二部分虽然对encoder我们没有任何束缚,但是在decoder层中,我们只把他用作加上一个全局信息,这样的话反向传播的时候,他参数的改变就完全来自于全局信息的特征,从而保证了这个部分只含有全局特征信息。最后我们把这两个部分合起来就是编码后的全部信息。

  当然,实际上第一种方法更具有普适性和可扩展性。

(2).编码离散化

  之前我们编码后的特征是一个在连续空间中的向量。如果我们刻意的把一些权值大的特征放大,而权值小的特征缩小,那么我们就更能看出在机器眼中哪些部分的作用是什么(这个有点类似于图片风格强化等等)。如下图所示,我们就可以把大于0.5的变为1,小于0.5的变为0,从而实现离散化,我们去看对应的效果。

  当然上述方式主要还是用来分析特征的,毕竟离散之后的输入变为有限个了。至于这里有一个问题就是不容易进行微分从而无法反向传播,这个问题其实可以用强化学习的方法来解决,后面我们会介绍。
  另外一种编码离散化的方式感觉真的和上面那个quick thought道理差不多。我们让机器训练出很多可供选择的向量作为codebook,然后encoder得出的向量,我们去寻找所谓的最相近的向量,然后作为输入。这样做的意义是什么?那就是通过离散化固定住了最后的输出,最后的效果就是可以过滤掉比较全局的信息,比如声音讯号中人的口音等等,只留内容信息。(虽然老师说离散的咨询一般是局部特征,但我还是并不理解为何能实现这种效果)

  所谓的更特殊的离散化形式,我们可以让我们的编码代表一个特定的句子,从而形成一个自编码器,如下图所示。但是这样也有一个不足之处,那就是由于编码方式是黑盒,中间的特征情况不得而知,很多时候人是无法进行阅读的。于是我们继续借助GAN的思想,在中间的部分再加入一个鉴别器来识别中间形成的句子是不是符合人类的语法,具体的实现省略,最后我们就可以得到不错的结果,效果就是得到的句子大致是对内容的总结。

李宏毅机器学习笔记(十六)——无监督学习(四):自编码器相关推荐

  1. 2018-3-20李宏毅机器学习笔记十----------Logistic Regression

    上节讲到:既然是一个直线型,只需要求解w和b.为何还要那么费劲的使用概率??? 视频:李宏毅机器学习(2017)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili https://www.bilib ...

  2. 机器学习笔记(十六)强化学习

    16.强化学习 16.1任务与奖赏 强化学习(reinforcementlearning)的过程就是机器通过一系列的动作和环境交互,从而得到最佳的动作序列.图示: 强化学习任务用马尔可夫决策(Mark ...

  3. 机器学习笔记(十六)——EM算法概述

    一.引言 按照计划,这周应该学习HMM中的第三个基本问题:参数估计问题,但是其中的内容涉及到了EM算法,所以打算先把EM算法搞定之后再去继续HMM的问题.EM算法的推导过程比较复杂,这节我只给出简述和 ...

  4. ML之预测:玩转2018世界杯—采用机器学习预测小组赛、十六比赛、四决赛、半决赛、决赛以及世界杯总冠军的各个队伍

    ML之预测:玩转2018世界杯-采用机器学习预测小组赛.十六比赛.四决赛.半决赛.决赛以及世界杯总冠军的各个队伍 导读       机器学习预测.玩转2018世界杯-采用机器学习预测小组赛.十六比赛. ...

  5. 机器学习笔记十四:随机森林

    在上一篇机器学习笔记十三:Ensemble思想(上)中,简要的提了一下集成学习的原理和两种主要的集成学习形式.  而在这部分要讲的随机森林,就算是其中属于bagging思路的一种学习方法.为了篇幅,b ...

  6. 2021李宏毅机器学习笔记--21 Anomaly Detection

    2021李宏毅机器学习笔记--21 Anomaly Detection(异常侦测) 摘要 一.问题描述 二.Anomaly异常 三.Anomaly Detection(异常侦测)做法 3.1 Bina ...

  7. 机器学习笔记(六)-神经网络:概述

    本次学习笔记主要记录学习机器学习时的各种记录,包括吴恩达老师视频学习.李宏毅老师视频学习.周志华老师的<机器学习>(西瓜书)以及李航老师的<统计学习方法>.作者能力有限,如有错 ...

  8. 2021李宏毅机器学习笔记--22 Generative Adversarial Network 01

    @[TOC](2021李宏毅机器学习笔记–22 Generative Adversarial Network 01(GAN,生成式对抗网络)) 摘要 GAN是建立于神经网络的基础上的,其核心思想是&q ...

  9. 16代表啥_十六型人格的四个字母分别代表了什么含义?

    要解析用于描述十六型人格的四个字母的含义,就必须从八个维度开始探讨.众所周知,这八个维度分别是E/I(外倾/内倾).N/S(直觉/感觉).T/F(思考/情感).J/P(判断/感知).它们总是被放在一起 ...

最新文章

  1. python游戏创新大赛
  2. win2008r2下安装sql2008r2初版
  3. RequestQueue
  4. Dos下删除(非)空目录或文件
  5. skyeye linux qt,ARM仿真器SkyEye的安装及使用
  6. QT4.8.5 显示中文
  7. centos 安装 freeswitch,开启与关闭
  8. POJ3982 序列【大数】
  9. laravel validate
  10. [Error] ld returned 1 exit status
  11. 回复:程序员如何做SOHO接私单
  12. 计算机界面一直闪,电脑光标一直闪烁怎么办?Win7左上角白杠一直闪解决方法...
  13. MoveKit:一款功能强大的Cobalt Strike横向渗透套件
  14. 命令行批量缩小图片尺寸
  15. 股票买卖明细接口是怎样实现查询交易数据的?
  16. apache-ab 并发负载压力测试
  17. awk 不一样的分隔符 - 空格分隔符
  18. 基于数据库实现微服务动态路由
  19. 搜索引擎的网站登录入口
  20. 基于遗传算法的BP神经网络优化

热门文章

  1. C语言运算符的优先级和结合性方面的试题,C语言运算符优先级与结合性一览表.docx...
  2. 《甩了,甩了,甩了他》----转
  3. 基于逻辑回归/决策树/随机森林/多层感知分类器/xgboost/朴素贝叶斯分类的资讯多分类性能对比
  4. 苹果在线服务大范围的宕机,现已化解
  5. ubuntu中eclipse安装pydev不显示的解决方法
  6. 我不怕千万人阻挡,只怕自己投降
  7. JAVA 实参和形参
  8. 网络工程师的就业前景如何?
  9. 如何改typecho主题头像_开源免费typecho精美主题MDr - 书写你的篇章
  10. 香港中文大学深圳(CUHKSZ)2020fall数据科学硕士申请及笔面经