【深度学习(deep learning)】花书第14章 自编码器 读书笔记
第14章 自编码器
前言
打基础,阅读花书,感觉一次性啃不动。看一点算一点,写一点笔记留作纪念。以便日后查看与回顾。 兜兜转转,回来接着啃花书。 啊……VAE可太难了。或许应该直接看原始论文。。。英文花书是原始论文的二道贩子,中文花书是英文花书的二道贩子,花书解读又是花书的二道贩子……以下是正式内容。
一、自编码器
自编码器(autoencoder,AE),生成模型的一种。中间有个隐层h,产生编码(code),也称为瓶颈层。
编码器与编码过程:
h
=
f
(
x
)
h=f(x)
h=f(x),解码器与解码过程:
r
=
g
(
h
)
r=g(h)
r=g(h)。
不应该让输入输出完全相当,而是要施加约束近似相等,保证模型对数据中的特征进行筛选,从而学到数据中的有用特征。
结构图:
图片来自知乎 https://zhuanlan.zhihu.com/p/46067799
二、欠完备自编码器
欠完备自编码器:编码维度小于输入维度的自编码器。j就是一般的自编码器。
学习过程为最小化损失函数
L
(
x
,
g
(
f
(
x
)
)
)
L(\boldsymbol x,g(f(\boldsymbol x)))
L(x,g(f(x))), L可以是均方误差
- 当解码器是线性的,且L是均方误差时,会学习出与PCA相同的生成子空间。
- 当f,g是非线性的,能够学出更强大的PCA非线性推广。但是当容量太大时,自编码器会倾向于复制,而不是捕捉有用信息。所以要保证不学到恒等变换,要限制网络的层数和瓶颈层的维数。
三、正则自编码器
正则编码器使用损失函数上的约束,解除对于模型容量的限制。
3.1 稀疏自编码器
损失函数(重构误差+稀疏惩罚):
L
(
x
,
g
(
f
(
x
)
)
)
+
Ω
(
h
)
L(\boldsymbol x,g(f(\boldsymbol x)))+\varOmega(\boldsymbol h)
L(x,g(f(x)))+Ω(h)
如:
Ω
(
h
)
=
λ
∑
i
∣
h
i
∣
\varOmega(\boldsymbol h)=\lambda \sum_i|h_i|
Ω(h)=λi∑∣hi∣
3.2 去噪自编码器 (denoising autoencoder, DAE)
改变重构误差,来获得学习有用信息的自编码器。
损失函数:
L
(
x
,
g
(
f
(
x
~
)
)
)
L(\boldsymbol x,g(f(\tilde\boldsymbol x)))
L(x,g(f(x~)))
x
~
\tilde\boldsymbol x
x~是被损坏的数据。
训练过程:
引入损坏过程
C
(
x
~
∣
x
)
C(\tilde\boldsymbol x |\boldsymbol x)
C(x~∣x),这个条件分布代表给定数据样本x 产生损坏样本
x
~
\tilde\boldsymbol x
x~的概率。从训练样本
(
x
~
,
x
)
(\tilde\boldsymbol x ,\boldsymbol x)
(x~,x)中学习重构分布
p
r
e
c
o
n
s
t
r
u
c
t
(
x
∣
x
~
)
p_{reconstruct}(\boldsymbol x |\tilde\boldsymbol x)
preconstruct(x∣x~)的过程:
- 从训练数据中采一个训练样本x
- 从 C ( x ~ ∣ x ) C(\tilde\boldsymbol x |\boldsymbol x) C(x~∣x)采一个损坏样本 x ~ \tilde\boldsymbol x x~。
- 将 ( x ~ , x ) (\tilde\boldsymbol x ,\boldsymbol x) (x~,x) 作为训练样本来估计自编码器的重构分布 p r e c o n s t r u c t ( x ∣ x ~ ) = p d e c o d e r ( x ∣ h ) p_{reconstruct}(\boldsymbol x |\tilde\boldsymbol x)=p_{decoder}(\boldsymbol x |\boldsymbol h) preconstruct(x∣x~)=pdecoder(x∣h)
- 基于负对数似然,使用随机梯度下降训练: − E x ∼ p ^ d a t a ( x ) E x ^ ∼ C ( x ~ ∣ x ) log p d e c o d e r ( x ∣ h = f ( x ~ ) ) -\mathbb{E}_{\mathbf{x}\thicksim \hat{p}_{data}\left( \mathbf{x} \right)}\mathbb{E}_{\mathbf{\hat{x}}\thicksim C\left( \mathbf{\tilde{x}|x} \right)}\log\text{\ }p_{decoder}\left( \boldsymbol{x|h}=f\left( \boldsymbol{\tilde{x}} \right) \right) −Ex∼p^data(x)Ex^∼C(x~∣x)log pdecoder(x∣h=f(x~))
3.3 收缩自编码器(contractive autoencoder, CAE)
损失函数:
L
(
x
,
g
(
f
(
x
)
)
)
+
Ω
(
h
,
x
)
L(\boldsymbol x,g(f(\boldsymbol x)))+\varOmega(\boldsymbol h ,\boldsymbol x)
L(x,g(f(x)))+Ω(h,x)
Ω
(
h
,
x
)
=
λ
∑
i
∥
∇
x
h
i
∥
2
\varOmega \left( h,x \right) =\lambda \sum_i{\lVert \nabla _{\boldsymbol{x}}h_i \rVert ^2}
Ω(h,x)=λi∑∥∇xhi∥2或者说:
Ω
(
h
)
=
λ
∥
∂
f
(
x
)
∂
x
∥
F
2
\varOmega \left( \boldsymbol{h} \right) =\lambda \lVert \frac{\partial f\left( \boldsymbol{x} \right)}{\partial \boldsymbol{x}} \rVert _{F}^{2}
Ω(h)=λ∥∂x∂f(x)∥F2作用于与编码器的函数相关偏导数的jacobian矩阵。
使模型学习一个在x 变化小时目标也没有太大变化的函数。因为这个惩罚只对训练数据适用,它迫使自编码器学习可以反映训练数据分布信息的特征。
四、深度自编码器(栈式自编码器)
多个自编码器级联,以完成逐层特征提取的任务
图来自 https://www.cnblogs.com/royhoo/p/Autoencoders.html
逐层训练
分别训练一系列单层的自编码器,并且每个被训练为重构前一个自编码器的隐藏层。这些自编码器的组合就组成了一个深度自编码器。
权重绑定
如果一个自编码器的层次是严格轴对称的,一个常用的技术是将decoder层的权重捆绑到encoder层。这使得模型参数减半,加快了训练速度并降低了过拟合风险。
f 和g 都是由线性仿射变换后进行逐元素非线性变换的标准神经网络层组成,因此将g 的权重矩阵设成 f 权重矩阵的转置是很直观的。
五、变分自编码器(variational auto-encoder, VAE)
花书20.10.3节。
VAE和AE的不同点在于:AE中间输出的是隐变量的具体取值,而VAE中间要输出的是隐变量的分布。这样一来,就可以从这个分布中另外取样,送入decoder,就可以生成类似输入样本 x x x的其他样本 x ^ \hat x x^。所以,单纯的AE不是生成模型,而VAE才是生成模型。
对应基本概念有:
输入及其分布:
x
\boldsymbol x
x,
p
(
x
)
p(\boldsymbol x)
p(x)
encoder, 编码过程:
f
(
x
)
f(\boldsymbol x)
f(x) ,
p
(
z
∣
x
)
p(\boldsymbol z|\boldsymbol x)
p(z∣x)
近似推断网络(编码器):
q
(
z
∣
x
)
q(\boldsymbol z|\boldsymbol x)
q(z∣x)
code层,隐藏层,隐藏变量分布,隐层空间,编码分布 :
p
m
o
d
e
l
(
z
)
p_{model}(\boldsymbol z)
pmodel(z)
生成器网络(解码器):
g
(
z
)
g(\boldsymbol z)
g(z),
p
(
x
∣
z
)
p(\boldsymbol x|\boldsymbol z)
p(x∣z)
训练过程
- 已知 x \boldsymbol x x,求 p ( z ∣ x ) p(\boldsymbol z|\boldsymbol x) p(z∣x),有 p ( z ∣ x ) = p ( x ∣ z ) p ( z ) p ( x ) p\left( \boldsymbol{z|x} \right) =\frac{p\left( \boldsymbol{x|z} \right) p\left( \boldsymbol{z} \right)}{p\left( \boldsymbol{x} \right)} p(z∣x)=p(x)p(x∣z)p(z)而 p ( x ) = ∫ p ( x ∣ z ) p ( z ) d z p\left( \boldsymbol{x} \right) =\int{p\left( \boldsymbol{x|z} \right) p\left( \boldsymbol{z} \right) d\boldsymbol{z}} p(x)=∫p(x∣z)p(z)dz是不可解的
这里隐含着一个观点:x的分布是受z的分布控制的。
从生成模型角度出发:我的本意是构造X,我希望直接用可观测的{X1,X2……}去计算X的分布。但是这不可行。那么我假设X是由另一个Z控制的,Z是可控制的,且Z→X有一个固定过程,我就可以通过Z再去构造X。Z可以假设为正态分布,那么接下来一步就是找到一个合适的Z→X的过程。这个过程落实在模型上就是AE,在重构的基础上保证信息不丢失。
假设, p ( z ) = N ( 0 , I ) p(z)=N(0,I) p(z)=N(0,I)
假设,p(x|z)是正态分布,则有X|Z服从 N ( μ ( Z ) , σ ( Z ) ) N(\mu(Z),\sigma(Z)) N(μ(Z),σ(Z)),也就是说X的均值方差是Z的函数,而具体的函数关系不可知。那我们用神经网络来模拟,就有 p ( x ∣ z ) = N ( μ θ ( Z ) , σ θ ( Z ) ) p(x|z)=N(\mu_\theta(Z),\sigma_\theta(Z)) p(x∣z)=N(μθ(Z),σθ(Z)).
- 用变分推断,用一个可解的 q ( z ∣ x ) q(\boldsymbol z|\boldsymbol x) q(z∣x)去近似不可解的 p ( z ∣ x ) p(\boldsymbol z|\boldsymbol x) p(z∣x),用KL散度衡量二者的差异性,希望KL散度最小化。
- 对KL散度进行推导,得到具体的变分下界目标,最大化变分下界进行训练 L ( q ) = E z ∼ q ( z ∣ x ) log p ( x ∣ z ) − D K L ( q ( z ∣ x ) ∣ ∣ p ( z ) ) \mathcal{L}\left( q \right) =\mathbb{E}_{\boldsymbol{z}\thicksim q\left( \boldsymbol{z|x} \right)}\log p\left( \boldsymbol{x|z} \right) -D_{KL}\left( q\left( \boldsymbol{z|x} \right) ||p\left( \boldsymbol{z} \right) \right) L(q)=Ez∼q(z∣x)logp(x∣z)−DKL(q(z∣x)∣∣p(z))第一项是潜变量的近似后验的情况下,可见变量x与潜变量z的对数似然。而第一项可以使用自编码器的重构对数似然代替,即 p ( x ∣ g ( z ) ) = p ( x ∣ x ^ ) p\left( \boldsymbol{x|}g\left( \boldsymbol{z} \right) \right) =p\left( \boldsymbol{x|\hat{x}} \right) p(x∣g(z))=p(x∣x^)第二项使近似后验分布 q ( z ∣ x ) q(\boldsymbol z|\boldsymbol x) q(z∣x)去逼近先验分布 p m o d e l ( z ) p_{model}(\boldsymbol z) pmodel(z)
第一项是:x经过encoder,得到服从q(z|x)的z,再让z经过decoder得到重构的x,最后得到x与重构的x的似然。这是一个完整的AE的过程。第二项KL散度相当于对AE施加的一个正则项,约束encoder部分能够尽可能地还原p(z),使一般正态的q(z|x)向标准正态靠拢。
假定p与q都服从正态(高斯)分布。 p m o d e l ( z ) p_{model}(\boldsymbol z) pmodel(z)假设是一个标准正态分布,而 q ( z ∣ x ) q(\boldsymbol z|\boldsymbol x) q(z∣x)是正态分布,这里希望即使在x的影响下,每个x对应的q分布都拥有0方差,向标准正态分布看齐。
式子中所有期望都可以通过蒙特卡罗采样来近似。
推导过程:
https://zhuanlan.zhihu.com/p/25401928
https://zhuanlan.zhihu.com/p/83865427
生成过程
- 从编码分布 p m o d e l ( z ) p_{model}(\boldsymbol z) pmodel(z)中采样 z z z。
实际上没有显式地获得真正 p m o d e l ( z ) p_{model}(\boldsymbol z) pmodel(z),一直是假设p(z)为标准正态,实际获得的是一般正态的q(z|x)。
采样的过程是:先从N(0,1)中采样一个噪声ε,配合计算出的 p ( z ∣ x ) = N ( μ ϕ ( X ) , σ ϕ ( X ) ) p(z|x)=N(\mu_\phi(X),\sigma_\phi(X)) p(z∣x)=N(μϕ(X),σϕ(X))的均值方差 ( μ , σ ) (μ,σ) (μ,σ),计算出 Z = μ + ε × σ Z=μ+ε×σ Z=μ+ε×σ
所以工作时,encoder部分分别模拟计算 μ ϕ ( X ) , σ ϕ ( X ) \mu_\phi(X),\sigma_\phi(X) μϕ(X),σϕ(X),然后加入一个服从标准正态的噪声,再计算出 Z = μ + ε × σ Z=μ+ε×σ Z=μ+ε×σ。所以在VAE中,encoder由两部分组成,且不是直接计算 z = f ( x ) z=f(x) z=f(x),而是分别模拟均值和标准差。
- 通过可微生成器网络 g ( z ) g(\boldsymbol z) g(z)
- 从分布 p ( x ; g ( z ) ) = p ( x ∣ z ) p\left( \boldsymbol{x};g\left( \boldsymbol{z} \right) \right) =p\left( \boldsymbol{x|z} \right) p(x;g(z))=p(x∣z)中采样 x x x
六、应用
- 降维
- 表示学习
- 信息检索、语义哈希:数据库中找到与用户的查询条目相近的条目
- 去噪、异常检测
参考资料
1.机器学习,周志华
2.统计学习方法,第二版,李航
3.https://zhuanlan.zhihu.com/p/38431213
4.https://github.com/MingchaoZhu/DeepLearning
5.https://www.bilibili.com/video/BV1kE4119726?p=5&t=1340
6.https://blog.csdn.net/qq_41485273/article/details/113117864
7.https://www.cnblogs.com/klausage/p/12582421.html
8.https://blog.csdn.net/qq_27825451/article/details/84968890
9.https://blog.csdn.net/wblgers1234/article/details/81545079
10.https://www.cnblogs.com/royhoo/p/Autoencoders.html
11.https://www.spaces.ac.cn/archives/5253(写的很好)
12.https://zhuanlan.zhihu.com/p/83865427
13. https://zhuanlan.zhihu.com/p/25401928
14. https://www.bilibili.com/video/BV15E411w7Pz(讲的很好)