前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Pytorch神器(8)

Pytorch神器(8)

作者头像
刀刀老高
发布2018-07-24 15:27:50
5830
发布2018-07-24 15:27:50
举报
文章被收录于专栏:奇点大数据

理解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的特性和原理我们就大致介绍这么多,希望大家学习顺利。

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

本文分享自 奇点 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档