自编码器的原始形式和各种变体

本文参考维基百科

文章目录

  • 最简单的原始形式:非循环前馈神经网络
    • 欠完备自编码器 undercomplete autoencoders
    • 过完备自编码器 overcomplete autoencoders
  • 变体
    • 正则化自编码器 Regularized autoencoders
    • 稀疏自编码器 Sparse autoencoders
      • 用KL散度构造稀疏惩罚项
      • 用L1或L2正则化项构造稀疏惩罚项
      • 手动设0:K-sparse autoencoders
    • 去噪自编码器Denoising autoencoder (DAE):改变重构规则
    • 收缩自编码器Contractive autoencoder (CAE)
    • 变分自编码器Variational autoencoder (VAE):生成模型,像生成对抗网络
  • 应用

最简单的原始形式:非循环前馈神经网络

有一个输入层,一个输出层,一个或多个隐层。

输出层和输入层的神经元数目一样,网络用无监督的形式(不用标签)训练,目标是减小输入层和输出层的差距。

自编码器包括两部分:编码器encoder和解码器decoder,分别用空间变换 ϕ , ψ \phi, \psi ϕ,ψ表示:

编码器把输入 x ∈ R d = χ \boldsymbol{x} \in \mathbb{R}^d = \chi xRd=χ 转换为特征features,或者叫编码code,隐表示latent representations,隐变量latent variables: h ∈ R p = F \boldsymbol{h}\in \mathbb{R}^p = F hRp=F
ϕ : χ → F \phi: \chi \rightarrow F ϕ:χF
ψ : F → χ \psi: F \rightarrow \chi ψ:Fχ
ϕ , ψ = arg ⁡ min ⁡ ϕ , ψ ∣ ∣ χ − ( ϕ ∘ ψ ) χ ∣ ∣ 2 \phi, \psi = \arg\min_{\phi, \psi} ||\chi - (\phi \circ\psi)\chi||^2 ϕ,ψ=argϕ,ψminχ(ϕψ)χ2

最简单的转换就是sigmoid函数:
h = σ ( W x + b ) \boldsymbol{h}=\sigma(\boldsymbol{Wx} + \boldsymbol{b}) h=σ(Wx+b)

W \boldsymbol{W} W是权重矩阵, b \boldsymbol{b} b是偏移矢量,一般都是随机初始化,然后通过误差的反向传播进行迭代更新,就像常规的前馈神经网络一样

x ′ = σ ′ ( W ′ h + b ′ ) \boldsymbol{x'} = \sigma'(\boldsymbol{W'h} + \boldsymbol{b'}) x=σ(Wh+b)

训练目标:
L ( x , x ′ ) = ∣ ∣ x − x ′ ∣ ∣ 2 = ∣ ∣ x − σ ′ ( W ′ σ ( W x + b ) + b ′ ) ∣ ∣ 2 L(\boldsymbol{x}, \boldsymbol{x'}) = ||\boldsymbol{x}-\boldsymbol{x'}||^2= ||\boldsymbol{x}-\sigma'(\boldsymbol{W'}\sigma(\boldsymbol{Wx} + \boldsymbol{b}) + \boldsymbol{b'})||^2 L(x,x)=xx2=xσ(Wσ(Wx+b)+b)2

欠完备自编码器 undercomplete autoencoders

特征层维度低于输入输出层,特征被看做是输入 x \boldsymbol{x} x的压缩表示

过完备自编码器 overcomplete autoencoders

特征层维度大于等于输入输出层(输入层和输出层的维度是一样的),则隐层的单元有了足够的容量,理论上说隐层有潜力学到输入到输出的恒等变换,但是学到恒等变换的网络是没用的。

但是实验结果表明,过完备自编码器仍然会学到有用特征而不是恒等变换。

不管是欠完备还是过完备自编码器,我们都应该做的是:基于数据分布的复杂性找到合适的隐层维度,和合适的模型容量

变体

正则化自编码器 Regularized autoencoders

只要使用各种技术,旨在阻止网络学习恒等变换的自编码器都叫做正则化自编码器。所以一般正则化自编码器的隐层维度高于输入输出层,是过完备自编码器。

稀疏自编码器 Sparse autoencoders

研究者发现,以鼓励稀疏性的方式去学习自编码器的编码,可以提升很多分类任务的性能。

稀疏自编码器也是过完备字自编码器的变体。虽然有sparsity一词,但是隐层维度高于输入输出层!

稀疏一词强调的是隐层单元们的激活性的稀疏:隐层的单元们一次只允许激活一小部分(即,根据输入数据,迫使隐层的一小部分神经元的激活值接近1,其余部分的激活值接近于0)。

鼓励隐层的大部分神经元不激活。

这种稀疏性逼迫模型对数据的独特统计特征做出回应。

怎么实现呢?通常是在训练的目标函数中加入一个稀疏惩罚项 Ω ( h ) \Omega(\boldsymbol h) Ω(h),惩罚隐层 :

L ( x , x ′ ) + Ω ( h ) L(\boldsymbol{x}, \boldsymbol{x'}) + \Omega(\boldsymbol h) L(x,x)+Ω(h)

这个稀疏惩罚项的目的是:根据输入数据,迫使隐层的一小部分神经元的激活值接近1,其余部分的激活值接近于0。

具体的构造方法有很多,比如KL散度。

用KL散度构造稀疏惩罚项

Kullback-Leibler (KL) divergence

由于稀疏性的目的是让大部分隐层神经元的激活值接近0,则我们就把隐层单元的最终激活值的估计值表示出来。由于每一个隐层单元最终的激活值是所有输入数据点共同作用的结果,所以写出所有数据点共同作用的平均值:

ρ ^ j = 1 m ∑ i = 1 m [ h j ( x i ) ] \hat\rho_j = \frac{1}{m}\sum_{i=1}^m[h_j(x_i)] ρ^j=m1i=1m[hj(xi)]

m是输入数据的个数, h j ( x i ) h_j(x_i) hj(xi)表示输入数据 x i x_i xi被转换到第j个隐层单元的激活值,即第i个输入数据对第j个单元的影响。

我们要让 ρ ^ j \hat\rho_j ρ^j尽量接近于0.

这实在不好做,于是我们假设有一个稀疏参数 ρ \rho ρ,它是接近于0的(因为直接弄0在理论推导中很不方便,于是先用接近于0的 ρ \rho ρ进行分析推导)。于是我们把问题转换为让 ρ ^ j \hat\rho_j ρ^j尽量接近于稀疏参数 ρ \rho ρ

由于隐层单元的激活值不是确定值,而是一个随机变量,只是均值是上面的平均式子,即 ρ ^ j \hat\rho_j ρ^j。我们应该想到,既然不是确定值,是不可能直接继续推导确定理论的,只能用概率的手段进行分布和分布之间的靠近

用我的脑袋是想不到大家只是随机变量,转而用概率分布的方式去接近0这一步的。。太他妈难了。让我研究的话,到这里就到头了,于是失败。

ρ j \rho_j ρj不是一个确定值,而是服从一个以 ρ ^ j \hat\rho_j ρ^j为均值mean的伯努利随机分布的随机变量。
我们要让 ρ j \rho_j ρj接近0,就要让 ρ j \rho_j ρj服从的分布和均值为稀疏参数 ρ \rho ρ的伯努利随机分布的距离尽量小
我们要让 ρ j \rho_j ρj接近0,就要让 ρ j \rho_j ρj服从的分布和均值为稀疏参数 ρ \rho ρ的伯努利随机分布的距离尽量小
我们要让 ρ j \rho_j ρj接近0,就要让 ρ j \rho_j ρj服从的分布和均值为稀疏参数 ρ \rho ρ的伯努利随机分布的距离尽量小

两个分布的距离,自然就能想到KL散度了。

∑ j = 1 s K L ( ρ ∣ ∣ ρ ^ j ) = ∑ j = 1 s [ ρ log ⁡ ρ ρ ^ j + ( 1 − ρ ) log ⁡ 1 − ρ 1 − ρ ^ j ] \sum_{j=1}^sKL(\rho||\hat\rho_j) = \sum_{j = 1}^s[\rho\log\frac{\rho}{\hat\rho_j} + (1 - \rho)\log\frac{1- \rho}{1-\hat\rho_j}] j=1sKL(ρρ^j)=j=1s[ρlogρ^jρ+(1ρ)log1ρ^j1ρ]

用L1或L2正则化项构造稀疏惩罚项

用一个系数 λ \lambda λ去scale

损失:
L ( x , x ′ ) + λ ∑ i ∣ h i ∣ L(\boldsymbol{x}, \boldsymbol{x'}) +\lambda\sum_i|h_i| L(x,x)+λihi
or
L ( x , x ′ ) + λ ∑ i ∣ ∣ h i ∣ ∣ 2 L(\boldsymbol{x}, \boldsymbol{x'}) +\lambda\sum_i||h_i||^2 L(x,x)+λihi2

手动设0:K-sparse autoencoders

把隐层单元中除了激活性最强的K个单元之外的单元的激活值手动置零。就是把所有单元地激活值排序,然后最大的几个保留,其余的单元全部激活值设为0.

够手动,够正则,不知效果如何。

去噪自编码器Denoising autoencoder (DAE):改变重构规则

前面的正则化自编码器和稀疏自编码器,普通欠完备自编码器都是致力于研究损失函数中要增加点什么项,没有人对重构规则提出质疑和挑战。

但是去噪自编码器思路清奇,直接对重构规则动刀,它把经过部分污染的输入拿去重构未被污染的输入,即重构且去噪。

污染输入数据的行为只在训练时做,测试不做。

收缩自编码器Contractive autoencoder (CAE)

在损失(目标函数)中加一个明显的正则化项,这个项的作用是:迫使模型对于输入的微小改变,波动仍能学到鲁棒的特征表示。 forces the model to learn a function that is robust to slight variations of input values

它是输入的编码器激活值的雅可比矩阵的矩阵2范数the Frobenius norm of the Jacobian matrix of the encoder activations with respect to the input.
在这里插入图片描述
这个惩罚项迫使模型学到训练数据的分布的有用信息。

为什么叫做“收缩”?因为CAE想要把输入数据中相邻的数据点在输出中映射到更小的邻域。The name contractive comes from the fact that the CAE is encouraged to map a neighborhood of input points to a smaller neighborhood of output points.

变分自编码器Variational autoencoder (VAE):生成模型,像生成对抗网络

也是一种有向概率图模型directed probabilistic graphical models (DPGM)

应用

自从80年代以来,自编码器主要是被用于降维和信息检索,但是这些年他的变体也开始用于其他领域。

  • 降维
    降维是深度学习最早的应用之一。(原来deep learning最开始是用来完成降维任务的,而现在主要是分类和回归任务咯)。降维也是早期研究自编码器的动力之一。

简单地说,降维的目标就是找到一个合适的投射变换,把数据从高维空间投影到低维空间。

最经典的研究工作是2006年Hinton做的,他用一组堆叠RBM预训练了一个多层自编码器,实际上就是DBN啦,然后把他们的权重用来初始化一个深层自编码器,这个深层自编码器的层数逐渐减小,最后减小到30维,最终的30维结果得到了很小的重构误差,比前30维PCA主成分的重构误差更小。而且学到的表示是非常好解读的,因为他们明显地形成了聚类。

降维可以提升分类任务的性能。因为语义相关的输入也许会得到一样的降维表示,于是提升了泛化能力。

  • 信息检索
    信息检索中降维是非常重要的。Hinton和 Salakhutdinov两位大牛在2007年把自编码器用到了语义哈希semantic hashing中,他们把训练网络,以把搜索关键词降维为低维的二进制编码,于是 就可以把所有关键词存在一个哈希表里。当你执行搜索时,所有编码和搜索词被压缩为的二进制编码一样的网页就会都显示出来,或者比较相似的(只有几位bits不同)的也显示出来。
  • 异常检测
  • 图像处理
    有损图像压缩lossy image compression task,比JPEG2000还好使
    图像去噪 image denoising,图像恢复image restoration
    甚至在医学图像这种更精妙的领域,自编码器都被用来做去噪和超分辨率super-resolution了。
  • 药物发现
    2019年,用一种特殊类型的变分自编码器生成的分子在小鼠身上进行了实验验证。牛逼。
  • 受欢迎度预测
    堆叠自编码器用于预测社交媒体的推文的受欢迎程度,对于在线广告很有帮助
  • 机器翻译
    文本被作为序列被编码,然后译码器再生成这些文本

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