本文介绍了AutoEncoder。包括如下内容:
- AutoEncoder的定义和推导。
- Sparse AutoEncoder由来和介绍。
- 做Deep Learning所用的unsupervised learning的方法之间的比较。
1. 数学基础
1.1 Orthogonal Matrix
满足如下定义的是Orthogonal Matrix
以元素表示为。
1.2 The theorem about SVD
假设A是任意一个矩阵,SVD表示就是$A = U \Sigma V^T $。
其中 $\Sigma$ 是一个对角矩阵。
$U, V$都是orthonormal矩阵(columns/rows are orthonormal vectors)。
假设$U_{. ,\le k} \Sigma _{_{\le k ,\le k}} V_{. ,\le k}^T $作为当我们只保留最大的k个singular values的decomposition。
这样矩阵B,秩为k,它与A的距离就可以写一个式子。
求得$B^{*} = U_{. ,\le k} \Sigma _{_{\le k ,\le k}} V_{. ,\le k}^T$。
这个定理需要用在推导过程中,具体看参考文献[3]。
2. AutoEncoder 定义
AutoEncoder 是多层神经网络,其中输入层和输出层表示相同的含义,具有相同的节点数。AutoEncode学习的是一个输入输出相同的“恒等函数”。不过输入和输出相同,使得这个网络的输出没有任何意义。AutoEncoder的意义在于学习的(通常是节点数更少的)中间coder层(最中间的那一层),这一层是输入向量的良好表示。这个过程起到了“降维”的作用。当AutoEncoder只有一个隐含层的时候,其原理相当于主成分分析(PCA),当AutoEncoder有多个隐含层的时候,每两层之间可以用RBM来pre-training,最后由BP来调整最终权值。网络权重更新公式很容易用求偏导数的方法推导出来,算法是梯度下降法。(RBM:层内无连接,层间全连接,二分图)。
当AutoEncoder只有一个隐含层的时候,其原理相当于主成分分析(PCA)。但是 AutoEncoder 明显比PCA的效果更好一点,尤其在图像上。 当AutoEncoder有多个隐含层的时候,每两层之间可以用RBM来pre-training,最后由BP来调整最终权值。
通过unsupervised learning只对input$X^{(t)}$我们可以做下面的事情:
- 自动获取有意义Features
- leverage无标注数据
- 添加一个有数据驱动的规则化工具来帮助训练(add a data-dependent regularizer to trainings)
下图是一个AutoEncoder的三层模型,Input layer,Hidden layer,和Output layer。其中$W^{*} = W^T$,因为使用tied weight。
如果是实数值作为输入,我们要优化的目标函数是:
如果是01值那么就是:
loss function的梯度可以写成:
当然使用tied weight,那么是两个$\nabla$的和。
具体推导在参考文献[3],而且目前只能做有关liner AutoEncoder的推导,其他的目前是NP问题。
3. Denoising AutoEncoder
按照常理,hidden layer压缩输入,而且是一句training集的分布。hidden layer比Input layer小称之为 undercomplete representation。
overcomplete representation 就是反过来,hidden layer比Input layer要大。这个会导致无法保证hidden layer提取有用的结构信息。
下图是形成的网络结构:
Denoising AutoEncoder是AutoEncoder的一个变种,与AutoEncoder不同的是,Denoising AutoEncoder在输入的过程中加入了噪声信息,从而让AutoEncoder能够学习这种噪声。直观可见就是新的输入层有些值变成0了。
意思就是要使得我们的表达能够足够强壮,所以我们加入噪声信息。
(一) 随机让一些input值做为0,根据一个概率v。
(二) 加入Gaussian噪声。
具体会重新构建$\hat{X}$使用改变过的输入$\tilde{X}$,并且loss function是使用noiseless input X。我们把noise process称为$p(\tilde{X}|X)$。
YouTube上有视频讲的很清楚,地址。
4. Sparse Autoencoder
这个部分在我之前的博文里有讲到,自编码算法与稀疏性 自我学习。
5. 几种方法不同点
首先Autoencoder和RBM是一类的,都属于学习模型;而稀疏编码更像是施加在这些基本模型上的一种优化手段。
Autoencoder和RBM的不同之处:Autoencoder的神经元是确定型的,用的是sigmold函数,就像传统的ff网络一样。而RBM的神经元是随机的。(最基本的RBM神经元只有0和1两种状态,但是扩展后可以在这个区间上取任何值)由于autoencoder的确定性,它可以用BP方法来训练。但是RBM就只能用采样的方法来得到一个服从RBM所表示分布的随机样本。(Gibbs采样,CD采样等等)在深度学习里面,可以把autoencoder和RBM都看作是一块块砖头,我们可以用许多这样的砖头构造出深层次的网络。基本思路是前面先用这些“砖头”搭出几层网络,自动学习出数据的一些特征后,后面再用一个分类器来分类,得到最后的结果。如果用autoencoder作砖头,得到的就是stacked autoencoder;如果用RBM作砖头,得到的就是deep belief network。
Denoising AutoEncoder与RBM非常像,:
(1)参数一样:隐含层偏置、显示层偏置、网络权重
(2)作用一样:都是输入的另一种(压缩)表示
(3)过程类似:都有reconstruct,并且都是reconstruct与input的差别,越小越好
Denoising AutoEncoder与RBM的区别:RBM是能量函数,区别在于训练准则。RBM是隐含层“产生”显示层的概率(通常用log表示),Denoising AutoEncoder是输入分布与reconstruct分布的KL距离。所用的训练方法,前者是CD-k,后者是梯度下降。RBM固定只有两层;AutoEncoder,可以有多层,并且这些多层网络可以由标准的bp算法来更新网络权重和偏置,与标准神经网络不同的是,AutoEncoder的输入层和最终的输出层是“同一层”,不仅仅是节点数目、输出相同,而是完完全全的“同一层”,这也会影响到这一层相关的权值更新方式。总之,输入与输出是同一层,在此基础上,再由输入与输出的差别构造准则函数,再求各个参数的偏导数,再用bp方式更新各个权重。
再说稀疏编码,它是把大多数的神经元限制为0,只允许少量的神经元激活,来达到“稀疏”的效果。这主要是为了模拟人眼视觉细胞的特性。在算法里,其实就是在用来优化的目标函数里面加入一个表示稀疏的正则项,一般可以通过L1范数或者KL divergence来实现。并且稀疏性可以加到autoencoder上,也可以加到RBM上。稀疏编码是训练整个深层神经网络的一种预先训练的方法。它是一个非监督学习的过程,通过神经元对feature本身作一次回归,可以得到一个神经元的初始参数。这些参数对再下来的监督学习过程算是个初始化。这一步也可以用分层的监督学习来取代。
参考文献
[1] 维基百科:https://en.wikipedia.org/wiki/Autoencoder
[2] AutoEncoder:http://jacoxu.com/?p=1108
[3] 数学推导AutoEncoder Optimality:https://dl.dropboxusercontent.com/u/19557502/6_04_linear_autoencoder.pdf
[4] 知乎上回答地比较好的比较AutoEncoder和RBM联系区别的回答:https://www.zhihu.com/question/22906027/answer/40628698
因为我们是朋友,所以你可以使用我的文字,但请注明出处:http://alwa.info