Deep Learning 学习笔记(8):自编码器( Autoencoders )

之前的笔记,算不上是 Deep Learning, 

只是为理解Deep Learning 而需要学习的基础知识,

从下面开始,我会把我学习UFDL的笔记写出来

#主要是给自己用的,所以其他人不一定看得懂#

UFDL链接 : http://deeplearning.stanford.edu/wiki/index.php/UFLDL_Tutorial


自编码器( Autoencoders ):(概述)

自编码器是只有一层隐藏节点,输入和输出具有相同节点数的神经网络。

自编码器的目的是求的函数 \textstyle h_{W,b}(x) \approx x. 也就是希望是的神经网络的输出与输入误差尽量少。

 

 

由于隐藏节点数目小于输入节点,

这就表示神经网络需要学习到输入样本的特征,以便进行压缩表示。

如果输入样本是完全混乱的,这将会十分困难。

但是当输入样本具有一定相似性(比如都是汽车),神经网络将会学习到其中的共同特征(比如车窗,车轮)

这种学习是半监督的(样本无标签,但是经过了筛选)。


 

自编码器(autoencoder):

File:Autoencoder636.png

 

如图是一个自编码器(autoencoder),不算偏置节点的话,输入输出节点相同。

节点函数是sigmoid,用之前讲到的反向传播算法对其进行训练

训练的结果,出来后,我们对W1进行可视化表示,便是数据的压缩特征。

(注意,由于输出节点是sigmoid,输入数据的范围必须在 [ 0, 1] 内)

(常用激活函数有:sigmoid、tanh、max(x,0))

 


 

稀疏性:(直接粘贴自UFDL)

      如果隐藏节点比可视节点(输入、输出)少的话,由于被迫的降维,自编码器会自动习得训练样本的特征(变化最大,信息量最多的维度)。但是如果隐藏节点数目过多,甚至比可视节点数目还多的时候,自编码器不仅会丧失这种能力,更可能会习得一种“恒等函数”——直接把输入复制过去作为输出。这时候,我们需要对隐藏节点进行稀疏性限制。

 

  所谓稀疏性,就是对一对输入图像,隐藏节点中被激活的节点数(输出接近1)远远小于被抑制的节点数目(输出接近0)。那么使得神经元大部分的时间都是被抑制的限制则被称作稀疏性限制。

 

注意到 \textstyle a^{(2)}_j 表示隐藏神经元 \textstyle j 的激活度,但是这一表示方法中并未明确指出哪一个输入 \textstyle x 带来了这一激活度。所以我们将使用 \textstyle a^{(2)}_j(x) 来表示在给定输入为 \textstyle x 情况下,自编码神经网络隐藏神经元 \textstyle j 的激活度。 进一步,让

\begin{align}
\hat\rho_j = \frac{1}{m} \sum_{i=1}^m \left[ a^{(2)}_j(x^{(i)}) \right]
\end{align}

表示隐藏神经元 \textstyle j 的平均活跃度(在训练集上取平均)。我们可以近似的加入一条限制

\begin{align}
\hat\rho_j = \rho,
\end{align}

其中, \textstyle \rho 是稀疏性参数,通常是一个接近于0的较小的值(比如 \textstyle \rho = 0.05 )。换句话说,我们想要让隐藏神经元 \textstyle j 的平均活跃度接近0.05。为了满足这一条件,隐藏神经元的活跃度必须接近于0。

为了实现这一限制,我们将会在我们的优化目标函数中加入一个额外的惩罚因子,而这一惩罚因子将惩罚那些 \textstyle \hat\rho_j 和 \textstyle \rho 有显著不同的情况从而使得隐藏神经元的平均活跃度保持在较小范围内。惩罚因子的具体形式有很多种合理的选择,我们将会选择以下这一种:

\begin{align}
\sum_{j=1}^{s_2} \rho \log \frac{\rho}{\hat\rho_j} + (1-\rho) \log \frac{1-\rho}{1-\hat\rho_j}.
\end{align}

这里, \textstyle s_2 是隐藏层中隐藏神经元的数量,而索引 \textstyle j 依次代表隐藏层中的每一个神经元。如果你对相对熵(KL divergence)比较熟悉,这一惩罚因子实际上是基于它的。于是惩罚因子也可以被表示为

\begin{align}
\sum_{j=1}^{s_2} {\rm KL}(\rho || \hat\rho_j),
\end{align}

其中 \textstyle {\rm KL}(\rho || \hat\rho_j)
 = \rho \log \frac{\rho}{\hat\rho_j} + (1-\rho) \log \frac{1-\rho}{1-\hat\rho_j} 是一个以 \textstyle \rho 为均值和一个以 \textstyle \hat\rho_j 为均值的两个伯努利随机变量之间的相对熵。相对熵是一种标准的用来测量两个分布之间差异的方法。(如果你没有见过相对熵,不用担心,所有你需要知道的内容都会被包含在这份笔记之中。)


这一惩罚因子有如下性质,当 \textstyle \hat\rho_j = \rho 时 \textstyle {\rm KL}(\rho || \hat\rho_j) = 0 ,并且随着 \textstyle \hat\rho_j 与 \textstyle \rho 之间的差异增大而单调递增。举例来说,在下图中,我们设定 \textstyle \rho = 0.2 并且画出了相对熵值 \textstyle {\rm KL}(\rho || \hat\rho_j) 随着 \textstyle \hat\rho_j 变化的变化。

KLPenaltyExample.png


我们可以看出,相对熵在 \textstyle \hat\rho_j = \rho 时达到它的最小值0,而当 \textstyle \hat\rho_j 靠近0或者1的时候,相对熵则变得非常大(其实是趋向于\textstyle \infty)。所以,最小化这一惩罚因子具有使得 \textstyle \hat\rho_j 靠近 \textstyle \rho 的效果。 现在,我们的总体代价函数可以表示为

\begin{align}
J_{\rm sparse}(W,b) = J(W,b) + \beta \sum_{j=1}^{s_2} {\rm KL}(\rho || \hat\rho_j),
\end{align}

其中 \textstyle J(W,b) 如之前所定义,而 \textstyle \beta 控制稀疏性惩罚因子的权重。 \textstyle \hat\rho_j 项则也(间接地)取决于 \textstyle W,b ,因为它是隐藏神经元 \textstyle j 的平均激活度,而隐藏层神经元的激活度取决于 \textstyle W,b 。


为了对相对熵进行导数计算,我们可以使用一个易于实现的技巧,这只需要在你的程序中稍作改动即可。具体来说,前面在后向传播算法中计算第二层( \textstyle l=2 )更新的时候我们已经计算了

\begin{align}
\delta^{(2)}_i = \left( \sum_{j=1}^{s_{2}} W^{(2)}_{ji} \delta^{(3)}_j \right) f'(z^{(2)}_i),
\end{align}

现在我们将其换成

\begin{align}
\delta^{(2)}_i =
  \left( \left( \sum_{j=1}^{s_{2}} W^{(2)}_{ji} \delta^{(3)}_j \right)
+ \beta \left( - \frac{\rho}{\hat\rho_i} + \frac{1-\rho}{1-\hat\rho_i} \right) \right) f'(z^{(2)}_i) .
\end{align}

就可以了。

 

 

 

posted @ 2013-09-15 10:57  Pony_s  阅读(6430)  评论(0编辑  收藏  举报