自动编码器 Auto-Encoder
自监督学习
当我们使用一群没有标注的数据去进行学习训练模型时,由于没有标签,我们需要根据一些不想要标注目标的任务,去进行学习,这就是自监督机器学习
而自编码器可以说是自监督学习中的一种方法
类似于我们做填空题时,需要进行预测填空题里要填什么答案
Auto-Encoder
自编码器分为两个部分:**编码器(Encoder)**和 解码器(Decoder)
数据通过编码器后形成一组向量,再通过解码器形成一组数据,而我们最终的任务就是使得输入的数据和输出的数据尽可能地相似
把数据压缩成一组向量,再把它复原地过程又叫做重建
注:这个训练地过程不需要任何的标注资料
编码器
通常数据地输入是一个很高维的向量,但是通过编码器后,会把他压缩成一个低维的向量,即隐变量
h
h
h,从而强迫神经网络学习最有信息量的特征,整体流程就是 Dimension reduction
技术
编码的过程:
h
=
g
θ
1
(
x
)
=
σ
(
W
1
x
+
b
1
)
h = g\theta_1(x) = \sigma(W_1x + b_1)
h=gθ1(x)=σ(W1x+b1)
编码器做的主要任务就是降维,把复杂的东西(内部关键部分的变化有限)使用简单的方法去表示,即找到数据中的重要成分
例如对于一个图像而言,虽然他可能有很多种样式,但是其根本部分就只有几种变化,我们只需要找出这少数的关键变化即可
解码器
解码器的主要作用是对编码后形成的向量进行数据还原,把隐藏层的隐变量 h h h 还原到初始维度,相当于解压缩的过程
解码过程:
x
^
=
g
θ
2
(
h
)
=
σ
(
W
2
+
b
2
)
\hat x = g\theta _2(h) = \sigma(W_2 + b_2)
x^=gθ2(h)=σ(W2+b2)
解码器Decoder可以当作一个generator来使用
由于最终解码目标的最好状态时输出能够完美地与输入相似,即尽可能地对数据进行还原,
X
R
≈
X
X_R\approx X
XR≈X,因此我们对最终优化目标函数就可以写为:
min
L
o
s
s
=
d
i
s
t
(
X
,
X
R
)
\min Loss = dist(X, X_R)
minLoss=dist(X,XR)
其中,
d
i
s
t
dist
dist表示
X
X
X和
X
R
X_R
XR二者之间地距离度量函数
Feature Disentangle功能
Feature Disentangle即特征解耦,解耦就是把一堆本来纠缠在一起的东西把它解开
对于自编码器的输入,可以是图片、语音、或者文本,这些数据都是连在一起的一个整体,而自编码器具有Feature Disentangle功能,就是把这些联系在一起的整体分开,辨别各种信息。
例如对于一个语音数据,自编码器可以做到将其具体数据信息抽象出来,例如可以告知我们前50维是语音中交流的内容,后50维中是说话者的特征
即告诉我们哪些维度代表哪些内容
详情参考论文:
- https://arxiv.org/abs/1904.05742
- https://arxiv.org/abs/1804.02812
- https://arxiv.org/abs/1905.05879
通过这种技术,我们可以做到Voice Conversion(变声器)的功能,即把内容的维度与说话者的特征两个信息在丢入Encoder后进行组合,然后再通过Decoder,即可实现变声器
Auto-Encoder变形应用
De-noising Auto-encoder
De-noising是自编码器的一种变形
De-noising Auto-encoder将输入数据进行了加入噪音处理,然后在作为输入到自编码器中
而我们模型最后得到的结果是要对加入噪声之前的图形进行还原重构,因此要比较输出结果与初始图像的相似度,作为目标
相比较于自编码器,De-noising Auto-encoder的编码器与自编码器要一起联合起来,学习如何把输入数据中的噪声去掉
VQVAE
主要思想是将我们中间的向量 Embedding 离散化,使他只有有限的可能
具体流程为 输入数据丢入Encoder中,得到我们的Vector,然后把这个Vector与Codebook(存在 V e c t o r 1 Vector1 Vector1、 V e c t o r 2 Vector2 Vector2 … \dots …)中的数据进行对比,选出与我们得到的Vector最相似的一个 V e c t o r i Vector_i Vectori,放入Decoder进行解码,最终得到输出结果
其中,Codebook也是通过训练得到的
通过这种技术,如果应用到语音数据中,我么可以学习到每一个基本的发音部位,其中Codebook中每一个 V e c t o r i Vector_i Vectori就对应了一个发音符号
应用:Anomaly Detection 异常检测
给我们一组训练数据 x 1 , x 2 , … , x N {x^1, x^2, \dots, x^N} x1,x2,…,xN,且这些数据都是正常的,我们要通过学习这些数据,进而在以后的数据检测中,可以检测出与学习的资料特征不符合的一些数据,即异常数据
这种问题不能当作一种二元分类的任务来做,因为异常检测的主要难点在于资料的收集上,我们能够很容易的的搜集到大量正常的数据,因此在训练阶段,一般假设我们的数据都是正常数据,即训练集只有一个类别,这种分类问题又叫做one-class问题
对于Auto-Encoder的测试中
-
如果我们最后得到的结果能够很好的将数据还原,即差异比较小,那么可以将该数据认为是正常数据
-
如果我们最后的到的结果不能将原始数据进行还原,即差异比较大,那么将该数据认为是异常数据
我们可以通过设置重构时的损失值的阈值,来决定我们的数据是否正常:
- 当损失值超过这个阈值时,代表的是异常数据
- 当损失值低于这个阈值时,代表的是正常数据