本文参考维基百科
有一个输入层,一个输出层,一个或多个隐层。
输出层和输入层的神经元数目一样,网络用无监督的形式(不用标签)训练,目标是减小输入层和输出层的差距。
自编码器包括两部分:编码器encoder和解码器decoder,分别用空间变换 ϕ , ψ \phi, \psi ϕ,ψ表示:
编码器把输入 x ∈ R d = χ \boldsymbol{x} \in \mathbb{R}^d = \chi x∈Rd=χ 转换为特征features,或者叫编码code,隐表示latent representations,隐变量latent variables: h ∈ R p = F \boldsymbol{h}\in \mathbb{R}^p = F h∈Rp=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′=σ′(W′h+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′)=∣∣x−x′∣∣2=∣∣x−σ′(W′σ(Wx+b)+b′)∣∣2
特征层维度低于输入输出层,特征被看做是输入 x \boldsymbol{x} x的压缩表示
特征层维度大于等于输入输出层(输入层和输出层的维度是一样的),则隐层的单元有了足够的容量,理论上说隐层有潜力学到输入到输出的恒等变换,但是学到恒等变换的网络是没用的。
但是实验结果表明,过完备自编码器仍然会学到有用特征而不是恒等变换。
不管是欠完备还是过完备自编码器,我们都应该做的是:基于数据分布的复杂性找到合适的隐层维度,和合适的模型容量。
只要使用各种技术,旨在阻止网络学习恒等变换的自编码器都叫做正则化自编码器。所以一般正则化自编码器的隐层维度高于输入输出层,是过完备自编码器。
研究者发现,以鼓励稀疏性的方式去学习自编码器的编码,可以提升很多分类任务的性能。
稀疏自编码器也是过完备字自编码器的变体。虽然有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散度。
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=1∑m[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=1∑sKL(ρ∣∣ρ^j)=j=1∑s[ρlogρ^jρ+(1−ρ)log1−ρ^j1−ρ]
用一个系数 λ \lambda λ去scale
损失:
L ( x , x ′ ) + λ ∑ i ∣ h i ∣ L(\boldsymbol{x}, \boldsymbol{x'}) +\lambda\sum_i|h_i| L(x,x′)+λi∑∣hi∣
or
L ( x , x ′ ) + λ ∑ i ∣ ∣ h i ∣ ∣ 2 L(\boldsymbol{x}, \boldsymbol{x'}) +\lambda\sum_i||h_i||^2 L(x,x′)+λi∑∣∣hi∣∣2
把隐层单元中除了激活性最强的K个单元之外的单元的激活值手动置零。就是把所有单元地激活值排序,然后最大的几个保留,其余的单元全部激活值设为0.
够手动,够正则,不知效果如何。
前面的正则化自编码器和稀疏自编码器,普通欠完备自编码器都是致力于研究损失函数中要增加点什么项,没有人对重构规则提出质疑和挑战。
但是去噪自编码器思路清奇,直接对重构规则动刀,它把经过部分污染的输入拿去重构未被污染的输入,即重构且去噪。
污染输入数据的行为只在训练时做,测试不做。
在损失(目标函数)中加一个明显的正则化项,这个项的作用是:迫使模型对于输入的微小改变,波动仍能学到鲁棒的特征表示。 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.
也是一种有向概率图模型directed probabilistic graphical models (DPGM)
自从80年代以来,自编码器主要是被用于降维和信息检索,但是这些年他的变体也开始用于其他领域。
简单地说,降维的目标就是找到一个合适的投射变换,把数据从高维空间投影到低维空间。
最经典的研究工作是2006年Hinton做的,他用一组堆叠RBM预训练了一个多层自编码器,实际上就是DBN啦,然后把他们的权重用来初始化一个深层自编码器,这个深层自编码器的层数逐渐减小,最后减小到30维,最终的30维结果得到了很小的重构误差,比前30维PCA主成分的重构误差更小。而且学到的表示是非常好解读的,因为他们明显地形成了聚类。
降维可以提升分类任务的性能。因为语义相关的输入也许会得到一样的降维表示,于是提升了泛化能力。