编码维数小于输入维数的欠完备自编码器可以学习数据分布最显著的特征,但如果这类自编码器的容量过大,将会专注于复制任务进而学习不到任何有益信息。
如果隐藏编码的维数与输入相等或者大于输入的过完备自编码器同样会发生类似的问题,在这种情况下,线性的编码器与解码器也可以学会输入数据的复制,进而学习不到任何有益特征。
理想情况下,根据要建模的数据分布的复杂性,选择合适的编码维数与编码器、解码器容量,可以成功训练出任意架构的自编码器。正则自编码器选用的损失函数可以鼓励模型学习其他特性(除了将输入复制成输出),而不必限制使用浅层的编码器和解码器以及小的编码维数限制模型的容量。因此使用正则自编码器,即使模型大到足以学习到一个毫无意义的恒等式,非线性且过完备的正则自编码器仍然能够从训练数据中学到关于数据分布的有益特征。
任何带有潜变量并且有一个推断过程的生成模型,都可以认为是自编码器的一种特殊形式(好厉害!)
稀疏自编码器在训练时结合编码层的稀疏惩罚和重构误差:
其中g(h)表示解码器的输出,h是解码器的输出,h=f(x)。
稀疏自编码器一般用于学习特征,以便用于分类等任务。稀疏正则化的自编码器必须反映训练数据集的独特统计特征,而不是简单的充当恒等函数。以这种方式训练,执行附带稀疏惩罚的复制任务可以得到能学习有用特征的模型。
将惩罚项可以视为加入到前馈神经网络的正则项,这个前馈神经网络的主要任务是将输入复制到输出,并尽可能的根据这些稀疏特征执行一些监督学习的任务。权重衰减和其他正则惩罚可以被解释为一个MAP近似贝叶斯推断,正则化的惩罚对应于模型参数的先验概率分布。正则化的最大似然对应最大化,相当于最大化。即通常的数据似然项,参数的对数先验项包含了对特定值的偏好。正则自编码器不适用于这样的解释是因为正则项取决于数据,因此根据定义来说,它不是一个先验。但是,仍可以认为这些正则项隐式的表达了对函数的偏好。
可以将整个稀疏自编码器框架理解为是对带有潜变量的生成模型的近似最大似然训练,而不将稀疏惩罚视为复制任务的正则化。设有一个带有可见变量x和潜变量h的模型,且具有明确的联合分布。将视为模型关于潜变量的先验分布,表示模型看到x的信念先验。对数似然函数可以分解为:;可以认为自编码器使用一个高似然值h得点估计近似这个总和。类似于稀疏自编码器生成模型,但h是参数编码器的输出,而不是从优化结果推断出的最可能的h。从这个角度看,可以根据选择的h,最大化如下:;
能被稀疏诱导,如Laplace先验:,对应于绝对值稀疏惩罚。将对数先验表示为绝对值惩罚,可以得到:
这里的常数项只跟有关。通常将视为超参数,因此可以丢弃不影响学习的常数项。从稀疏性导致学习成近似最大似然的结果看,稀疏惩罚完全不是一个正则项。这仅仅影响模型关于潜变量的分布。这个观点提供了训练自编码器的另一种动机:这是近似训练生成模型的一种途径。这也给出了为什么自编码器学到的特征是有用的另一个解释:它们描述的潜变量可以解释输入(注意这段话,很重要)。
---------------------------------------------------------------------(is so hard)-------------------------------------------------------------------------------------
所谓稀疏自编码器,即是在传统自编码器的基础上添加一些稀疏性约束而得到的。稀疏自编码器的编码维度高于输入维度,为什么要这样呢?直接让编码维度低于输入维度不是可以实现降维吗,为什么要使编码维度高于输入维度呢,类似于对输入数据反而进行了升维操作。为什么呢?吴恩达Ng(大佬)认为高维但稀疏的表达是好的,因此提出了对自编码器的隐藏层神经元进行一些稀疏性的限制,为达到这一效果,可以通过对隐藏层神经炎的大部分输出进行抑制。例如,选用sigmoid激活函数,则神经元输出接近0表示被抑制。
为了实现抑制效果,稀疏自编码器通过对隐藏层神经元输出的平均激活值进行约束,利用KL散度迫使其与一个给定的稀疏值相近,并将其作为惩罚项添加到损失函数中,so,稀疏自编码器的损失函数为:
其中,,代表所有训练样本在隐藏层的神经元j上的平均激活值,为隐藏层神经元j上的激活值。,用于控制稀疏惩罚项的权重,可取0-1之间的任意值,一般取接近0的值。如果取0.01,则通过这个约束,自编码器的每个隐藏层神经元j的平均激活值都将接近0.02。
KL散度可以很好的度量两个不同分布之间的差异。若,则;若与差异较大,KL散度会呈现单调增加的规律。因此为了使与给定的尽量相同,采用两者之间的KL散度作为惩罚项。
k-稀疏自编码器
稀疏自编码器可以使模型通过抑制隐藏层神经元从而实现很好的稀疏效果,但是无法确定的指出哪些神经元处于激活状态,哪些神经元处于抑制状态。k-稀疏自编码器针对该问题进行了改进,k-稀疏自编码器使用线性激活函数,同时在隐藏层只保留k个最大激活值。使用线性激活函数可以有效提升自编码器的训练速度。通过指定的k值,可以避免使用KL散度,同时使模型获得一个准确的稀疏度。由此,k-稀疏自编码器在处理大数据量的问题时可以有较好的性能。
k-稀疏自编码器的基本思想:
1.在神经网络前馈阶段,首先对输入数据进行线性变换,计算其激活值;
2.利用排序算法或者Relu函数选取k个最大的激活值(k的设置可以看成一个规则化,防止使用过多的隐藏层神经元去重建输入);
3.利用隐藏层的稀疏表示计算输出与误差;
4.利用反向传播算法对网络参数进行优化。
训练阶段:
(1)前馈阶段,利用线性变化计算激活值:
(2)选取k个最大激活值构成集合,其余全部设置为0。
其中用于产生k个最大激活值,该步骤是算法中唯一的非线性变换。
(3)计算输出值和重构误差
(4)反向传播重构误差,迭代更新网络参数。
测试阶段:
(1)利用训练好的参数计算特征:;
(2)选取h前个最大激活值,其余设为0;
算法选取个最大激活值代替训练阶段的k个,其中,这种改进是基于Coates和Ng提出的思想:当用于分类的稀疏编码与用于训练的编码不完全相同时,可以获得更好的结果。
相比稀疏自编码器,k-稀疏自编码器更容易训练,编码速度更快,而且在隐藏层可以获取准确的稀疏度。k的取值及的取值作者并未给出方法,对于不同的数据集,k的不同取值也会对结果产生较大的影响。
参考文献:Ian Goodfellow等《深度学习》
袁非牛等《自编码神经网络理论及应用综述》