Pytorch神器(8)

理解Encoder和Decoder

在学习深度学习的过程中,我们通常会学到这样一对单词“Encoder”和“Decoder”。其实只要你学习深度学习,“Encoder”和“Decoder”就一定会接触到,并非只是Pytorch所独有。

乍一看这种东西似乎不是很好理解,不过从字面理解来看,就是“编码器”和“解码器”。你可能会闹不清究竟这种东西是干啥用的,是像我们看高清电影一样用的那种压缩和解压缩工具吗?下面我们就来简单说一下,其实很快你就能明白这些东西是干啥用的。

我们先来看它的结构:

这就是一个比较典型的Encoder和一个Decoder。

Encoder其实就是一个网络,通常能够把高维的内容映射到一个低维空间去。

Decoder相反,能够把一个低维的内容映射到高维去,而通常我们又希望输出的内容的维度和输入的维度类似,至少复杂度差不多。

Encoder解释:

把一个高维的输入映射到低维空间,这不是什么难事,只要让网络输入的向量(矩阵)维度高,而在输出的部分维度低一些就可以了。从这个角度来说,网络的拓扑结构其实没有太多讲究,FC、CNN、LSTM都可以用来做这个事情,而且只要能够在定义网络的时候让输出的维度减小几乎就够了,所以并不难。

而由它输出的中间的这个code的维度通常要低很多。Encoder的应用主要目的也非常的简单,就是希望在机器学习(通常指监督学习)应用的过程中,让它来做特征提取,把高维度的信息压缩到低维度上去,消除数据的稀疏性,让每个维度表示的意义变得更为密集一些。比如输入一张1000*1000*3的猫图片(H*W*C),输出为一个4096维度的Tensor。一个数据从300万维度被压缩到了4096维,那么压缩后的code每个维度所代表的含义则更容易在具体的训练任务中让模型有好的表现。

我们现在回国头去看我们前面做过的实验中,用FC、CNN、LSTM分别来做MNIST的分类实验,其实每个分类任务的网络把最后一层剥离掉,只让它输出倒数第二层的结果,那么这就是一个Encoder(当然,维度是变多还是变少,这个要自己控制一下网络的拓扑结构才行)。

Decoder解释:

把一个低维度的数据编码映射到高维度去做输出,通常高维度的输出结果都是人类可以直接阅读或者理解的内容,这就是Decoder的作用。

比如在MNIST实验中,从倒数第二层的code把内容解成一个10个维度的one-hot向量,这个过程其实就是一个Decoder——把人类读不懂的code转换成人类能够读懂的code。当然,在这个实验中,未必是会发生低维度到高维度映射的,可能相反。

那就再举一个例子,比如用来做Word Embedding训练的Decoder,通常被压缩(Emedding)后的Word只有几百个维度或者几千维,而通过Decoder解码后就把每个code解码成为一个one-hot向量了。这个过程就是一个典型的从低维到高维的映射。Deocoder在具体工程上可以有多种模型实现方式,FC、LSTM、反卷积,都可以。

解释code:

最后我们来解释code。

Code其实就是在模型训练中根据一定的需要,把原始输入的数据从高维压缩映射为低维数据后的编码值。这个编码值的每一位通常都有一些“具体”的含义,因为是提取过特征的,当然人读不懂,因为你不知道具体每一个维度的含义。

有人问了,那计算机就能读懂了吗?它怎么才能读懂呢?有趣的事情就在这里。要想知道计算机怎么读懂code,就要知道它是怎么训练Encoder和Decoder的。

就拿我们说的用FC、CNN或者LSTM来做MNIST的Encoder吧,整个网络倒数第二层之前都是Encoder的部分,最后一层输出是一个one-hot。但是别忘了,这个训练过程是有着严格限定的,最后一层和倒数第二层的关系是什么呢?是一个向量到一个确定的one-hot向量的映射过程对吗?说它确定是因为输出的one-hot向量就是标签,我们要求它输出跟我们需求的一致,而且就把差异定义成了损失函数,在训练的过程中让网络通过梯度下降调参把损失降到最小。通过损失函数的限制,我们在这个过程中约束了Encoder的过程,也约束了Decoder的过程。如果当时你没有理解的话,现在回过头再看一下可能就会明白了。

通过这样的方式,实际上我们约束了这样一个过程:在MNIST实验中从1到n-1层就是Encoder,从n-1到n的输出是Decoder,并且希望两个部分的参数都要满足这个压缩映射和解压映射的最终结果要准确(误差要小)。一旦有了这样的限定后,Encoder和Decoder就可以正常工作了,而且这个code通常带有迁移性,因为它里面包含了重要的样本特征信息。

补充说明:

由于Encoder和Decoder方式的特性,使得code的特征提取功能很好,这样也就让它在很多场合下都有很好的表现。

因此我们才在很多项目中看到这种嫁接的情形,比如,先用个在COCO数据集上训练过的分类器模型(不管是VGG还是RESNET还是别的什么网络),把它的最后一层去掉后,拿这个半截的网络做图片的特征提取工具。再把输入的结果作为另一个网络的输入,然后根据具体业务的需要来仅仅训练后面那一段新定义的网络来满足业务的需要。也就相当于,用别人训练好的Encoder做工具,在项目中我们只训练一个Decoder。

抑或在做NLP的项目中,我们也需要用完整的训练Encoder和Decoder的方式来完整地训练一个模型,从而实现Word Embedding的功能。所谓Word Embedding,就是把原来one-hot的word映射到一个稠密的连续空间上去,让一个较小空间上的连续向量来表示每个word。通常在语料库足够丰富的情况下,Word Embedding处理后的word向量有类似这样的功能,例如:

国王-男人=王后-女人,

女人+军人=女兵

至少我们是期望它能够有足够精确的这类特性的。

好了,Encoder和Decoder的特性和原理我们就大致介绍这么多,希望大家学习顺利。

原文发布于微信公众号 - 奇点(qddata)

原文发表时间:2018-05-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏人工智能头条

RNN在自然语言处理中的应用及其PyTorch实现

1732
来自专栏数值分析与有限元编程

矢量函数

一个由三个变量组成的函数w = f(x,y,z)表示如何根据x,y,z来确定w的值。从几何角度更有利于对这个概念的理解:在空间笛卡尔坐标系下取一点,坐标为(x,...

3177
来自专栏机器之心

观点 | 从信息论的角度理解与可视化神经网络

选自TowardsDataScience 作者:Mukul Malik 机器之心编译 参与:Pedro、思源 信息论在机器学习中非常重要,但我们通常熟知的是信息...

6245
来自专栏ATYUN订阅号

【学术】一篇关于机器学习中的稀疏矩阵的介绍

AiTechYun 编辑:Yining 在矩阵中,如果数值为0的元素数目远远多于非0元素的数目,并且非0元素分布无规律时,则称该矩阵为稀疏矩阵;与之相反,若非0...

6714
来自专栏ATYUN订阅号

使用NumPy介绍期望值,方差和协方差

AiTechYun 编辑:yuxiangyu 基础统计是应用机器学习中的有力工具,它可以更好地理解数据。而且,它也为更先进的线性代数运算和机器学习方法奠定了基础...

6098
来自专栏ATYUN订阅号

【深度学习】UPN分支介绍—深度信念网络基础原理与架构

图像来源(http://www.cognitivetoday.com/wp-content/uploads/2016/10/DCN-600×392.png) 我...

3726
来自专栏WOLFRAM

用Wolfram语言绘制一笔画环形迷宫

3704
来自专栏专知

【NAACL 2018】Self-attention考虑相对位置,谷歌Vaswani团队最新工作

2335
来自专栏绿巨人专栏

强化学习读书笔记 - 11 - off-policy的近似方法

3607
来自专栏AI科技大本营的专栏

利用RNN训练Seq2Seq已经成为过去,CNN才是未来?

翻译 | AI科技大本营(rgznai100) 参与 | Shawn、周翔 当前 seq2seq (序列到序列)学习惯用的方法是,借助 RNN(循环神经网络)将...

3537

扫码关注云+社区

领取腾讯云代金券