深度学习基础模型算法原理及编程实现–09.自编码网络
对于有些标注的数据,我们可以通过深度神经网络模型学习训练数据的高阶特征;而对于没有标注的数据,可以使用无监督的自编码来学习稀疏的高阶特征并重构自己。子编码器是神经网络的一种,通过将输入压缩到隐藏层,再解压到输出层,重构原始输入,是一种无监督学习方法,同样采用反向传播训练模型,主要用来进行数据降维、特征学习、去躁、生成式建模等。自编码神经网络一般由输入层、隐藏层及输出层构成,网络模型如下:
其中输入层到隐藏层对应着编码功能,又叫压缩过程:
由于输入信息自身存在不同程度的冗余信息,自编码通过学习去掉这些冗余特征,把所有有用的特征输入到隐藏层中。其实如果激活函数为线性函数,那么压缩过程就是PCA过程。输出层对应着解码功能,
为了使解码重构后的 与输入x一致,相应的损失函数为:
设输入层为维度为1*n,那么输出层的维度也为1*n,隐藏层的维度为1*m。由于自编码神经网络的目的是让输出与输入一致,那么自编码的意义在哪里呢,其实自编码神经网络的训练只是手段而已,我们更多专注的是隐藏层的特征提取作用。如果n>m,即隐藏层节点数小于输入层节点数,输入层到隐藏层是一种降维操作,此时的自编码器称为欠完备自编码,当激活函数为线性函数且损失函数为二次型误差且隐藏层只有一层时,输入层到隐藏层之间的降维操作等价于主成分分析PCA。如果n<=m,此时训练出的网络可能直接复制输入信息,但如果加入正则化修正,那么就能得到正则自编码器,其实我以为正则自编码器就是损失函数有L1或L2正则项约束的网络模型,但发现网上许多博客中将有稀疏约束、小导数限制或存在噪声输入等情况下的自编码器统称为正则自编码器。
(1) 稀疏自编码器:
稀疏自编码主要是通过限制隐藏层神经元的数量来学习有用的特征,并通过抑制神经元。L1正则化项具有较好的稀疏特性,将隐藏层权重系数的L1范数加入损失函数中,即可得到稀疏自编码。
(2) 去噪自编码
在输入项中添加噪声,其他不变,通过学习输出项与原始无噪声输入之间的误差来达到去躁的目的。
(3) 小导数限制(好像叫收缩自编码器,我也不知道该怎么称呼)
在损失函数中添加一个对输入项导数平方和约束的项,还不知道有什么用。
以上都是单隐层的自编码网络结构,对于隐藏层数大于1的自编码网络,称其为堆叠自编码(又称栈式自编码)。堆叠自编码就是在原来自编码的基础上添加对应编码及解码的隐藏层,以3个隐层的自编码器为例(即2层编码、2层解码),网络模型如下。
是不是与深度学习中的神经网络长得很像,过去由于梯度消失的存在,在训练时是并不是将误差逐层传递一次性训练完的,而是逐层预训练与微调相结合,称为逐层非监督预训练,将每个隐藏层看成受限玻尔兹曼机,对其进行无监督学习,获取的参数用来初始化整个网络,再对整个模型用反向传播算法微调权重及偏置,这样可以解决网络过深带来的梯度弥散问题。前面做这方面研究的大神认为与训练后的权重及偏执可以更接近原有数据内在结构,从而加速收敛。不过现在有ReLU或别的技巧来解决梯度消失问题,直接训练也是可行的。
这里给出了一个图像去躁的例子,去躁效果还是很好的,实现结果如下,代码详参【TensorFlow入门深度学习–04.自编码器(对添加高斯白噪声后的MNIST图像去噪).】,TensorFlow实现起来真的是太方便了,我就不想用python或C++编了。
---------------------
【转载】
作者:drilistbox
原文:https://blog.csdn.net/drilistbox/article/details/79761290
|
|