编码器和解码器的概念理解

编码器和解码器最开始看概念的时候有点懵,因为说编码器先把原始信号给编码,然后解码器再给解出来得到原始信号。哈?这是干啥,原始信号本来就有,用这个搞啥,做无用功吗?

1. 首先,说一下编码器和解码器干什么用的。

我们举个例子。

一个是,类似PCA这样的,做矩阵分解,然后恢复。矩阵分解里,把原始大矩阵变成了几个小矩阵相乘,信息没有丢失,但需要存储的数据变少了很多。虽然解码的时候需要额外的计算,但相比起来,小矩阵更符合我们的需求。实际使用的例子,如,图片的传输。以往,是一行一行的像素传输的,所以,网速慢的时候,我们可以看到刷新图片都是从上往下慢慢出来;而现在,是计算特征矩阵,所以看的时候,图片都是先是整体模糊的图片,然后慢慢清晰起来。这个就是传输的特征矩阵,随着特征数据的增多,图片逐渐清晰。

二个是,就像电话,把声音信号转换为电信号,然后远距离传输,再反向把电话信号转换为声音信号,从而达到目的:声音的远距离传输。这里面,打的电话是一个编码器,把声音信号转换为电信号。接的电话是一个解码器,把电信号解码成声音信号。这里面,电话同时具有编码和解码的功能,而且是硬件实现的。本身的功能呢,就是实现了声音的远距离传输。

而我们用到的编码器和解码器,本身编码器是用来做数据特征抽取的,用来做原始信号的主要特征。解码器,只是在编码器训练过程中的一个反向的组件,用来协助编码器做训练的。在我们的场景中,实际使用里,主要是使用编码器的。

2. 其次,说一下编码器怎么训练。

根据上面提到编码器的作用,我们说一个最简单的编码器,就是直接传输的恒等编码器。

比如,输入100个信号,我们让中间编码器也有100个节点,每个节点都是对接一个输入,然后不变的输出。解码器也是一样,对应编码器的输出,不变,直接输出。这样,编码器和解码器都没有损失信息,输出也和输入完全一样,没有信息丢失。这就是一个最简单的编码器和解码器。恒等,无损失。挺好。

或者,编码器对对应的输入乘以2,解码器来乘以1/2,结果同样是无损失的。

但如果我们的目标是想要对数据压缩,不给这么多中间节点。比如说,输入100个信号,但编码器只有10个节点,那么,就没发一一对应的恒等输出的。所以,就需要编码器来努力了。首先,不能再是和输入的一一对应的连接了,因为编码节点数不够。所以,需要全连接这样的。其次,为了让信号方便做转换,可以加入非线性转换一类的。编码器弄完了之后,解码器也是对应的反向参数来解出来,然后输出。把输出和原始输入进行对比,计算损失函数,然后反向传播来降低loss,从而逐步把编码器和解码器的参数训练好,最后拿到一个比较好的压缩的输入数据的特征。

3. 再次,说一下编码器的结构。

注意:编码器+解码器,和MLP的结构可以很像。但是,解码器由于要把编码器的输出特征再解析出原始信号,所以,要求解码器的输出节点个数等于原始信号的输入节点个数。

正常的,编码器和解码器可以是两个层。比如,输入层+编码器层+输出层(解码器层)。也可以,把编码器和解码器都弄成多层的结构。

一般的,解码器是编码器的参数的反函数,这样,二者结构相似,参数相反。但也可以,解码器和编码器并不相同,包括,结构不同,或者参数不按照相反来。

一般的,解码器和编码器是同一种网络,比如,都是层、或者都是CNN,或者都是RNN等。但特殊的,也可以二者不同结构,比如,CNN+RNN等。

所以,本身编码和解码是一种概念。编码器输入数据的特征抽取出来(一般是压缩的,但应该也可以是扩张的),然后解码器根据特征反向解出原始输入信号,让二者尽可能的接近,就可以了。

4. 再说一下编码器的应用。

一个是,特征抽取。这个说过了。二个是,新东西的生成。因为,编码器把重要特征抽出来了,那么,我们可以把这些特征自由的组合,就生成一个新的原始样本中没有的样本,这个也可以比较好玩。

5. 最后,再说一下编码器的一些trick。

比如,可以往编码器的输入中,加入一些噪声。这样,可以防止编码器学出来恒等的复制输入输出的问题。

也可以加入dropout,来增加健壮性。

 

 

 

 

 

 

 

你可能感兴趣的:(机器学习)