UFLDL Tutorial 课程核心内容提炼-3:自编码算法和稀疏性

11 篇文章 0 订阅
11 篇文章 0 订阅

该课程在斯坦福深度学习课上,点此打开

        核心内容,自编码器,非监督学习方法。如果隐藏层的神经元数目较少,很好理解,如果较多,则要对隐层进行稀疏性限制,引入惩罚因子,这个惩罚因子和信息熵理论中的散度有关,所以引入KL-divergence进行转换,转换完成之后,为了求解这个最后的解,即\textstyle h_{W,b}(x) \approx xh,给出最终的损失函数,之后就和普通的神经网络一致了,进行梯度求解,迭代解出h

--------------------------------------------------分割线------------------------------------------------------

一、自编码器概述

        自编码神经网络是一种无监督学习算法,它使用了反向传播算法,并让目标值等于输入值。

                                

        网络尝试学习一个 \textstyle h_{W,b}(x) \approx x 的函数,该算法有个特性是迫使自编码神经网络去学习输入数据的压缩表示。事实上,这一简单的自编码神经网络通常可以学习出一个跟主元分析(PCA)结果非常相似的输入数据的低维表示。

二、稀疏性

        “一、”中的论述是基于隐藏神经元数量较小的假设。但是即使隐藏神经元的数量较大(可能比输入像素的个数还要多),我们仍然通过给自编码神经网络施加一些其他的限制条件来发现输入数据中的结构。这里的限制条件,即引入稀疏性限制。注:加入稀疏性限制的目的,是为了让自编码神经网络即使在隐藏神经元数量较多的情况下仍然可以发现输入数据中一些有趣的结构

        这里先不说定义,单纯从字面来说,“稀疏性”三个字可以作以下解释:

        “如果当神经元的输出接近于1的时候我们认为它被激活,而输出接近于0(这里选择sigmoid函数,tanh作为激活函数的话,当神经元输出为-1)的时候认为它被抑制,那么使得神经元大部分的时间都是被抑制的限制则被称作稀疏性限制。

        所以稀疏过程,就是简单地对隐藏层进行控制,使之在隐藏层神经元较多的情况下仍然能够提取有用特征信息!       


基本的思路过程:

        1.为隐藏层的神经元信息定义度量,类似于决定去留:

                这里使用 \textstyle a^{(2)}_j(x) 来表示在给定输入为 \textstyle x 情况下,自编码神经网络隐藏神经元 \textstyle j 的激活度。

        2.然后,我们使用下式表示隐藏神经元 \textstyle j 的平均活跃度(在训练集上取平均)

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

        3.我们可以近似的加入一条限制\begin{align}\hat\rho_j = \rho,\end{align} 其中, \textstyle \rho 是稀疏性参数(超参数)

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

        4.为实现3中的这一限制需要加入惩罚因子

        将会在我们的优化目标函数中加入一个额外的惩罚因子,而这一惩罚因子将惩罚那些 \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 依次代表隐藏层中的每一个神经元。而由于以上的惩罚因子是基于相对熵概念的,即有

                            

        所以,这里:

                            

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

        5.根据计算残差的要求需要求导

        为了对相对熵进行导数计算,我们可以使用一个易于实现的技巧,这只需要在你的程序中稍作改动即可。具体来说,前面在后向传播算法中计算第二层( \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}

        就可以了。

--------------------------------------------------------------------------------------------------------

1:补充一下,原文中还有以下这段话,这里附加上,感兴趣的自己去最顶上博主给出的链接找原文看可以了。

        有一个需要注意的地方就是我们需要知道 \textstyle \hat\rho_i 来计算这一项更新。所以在计算任何神经元的后向传播之前,你需要对所有的训练样本计算一遍前向传播,从而获取平均激活度。如果你的训练样本可以小到被整个存到内存之中(对于编程作业来说,通常如此),你可以方便地在你所有的样本上计算前向传播并将得到的激活度存入内存并且计算平均激活度 。然后你就可以使用事先计算好的激活度来对所有的训练样本进行后向传播的计算。如果你的数据量太大,无法全部存入内存,你就可以扫过你的训练样本并计算一次前向传播,然后将获得的结果累积起来并计算平均激活度 \textstyle \hat\rho_i (当某一个前向传播的结果中的激活度 \textstyle a^{(2)}_i 被用于计算平均激活度 \textstyle \hat\rho_i 之后就可以将此结果删除)。然后当你完成平均激活度 \textstyle \hat\rho_i 的计算之后,你需要重新对每一个训练样本做一次前向传播从而可以对其进行后向传播的计算。对于后一种情况,你对每一个训练样本需要计算两次前向传播,所以在计算上的效率会稍低一些。证明上面算法能达到梯度下降效果的完整推导过程不再本教程的范围之内。不过如果你想要使用经过以上修改的后向传播来实现自编码神经网络,那么你就会对目标函数 \textstyle J_{\rm sparse}(W,b) 做梯度下降。使用梯度验证方法,你可以自己来验证梯度下降算法是否正确。

--------------------------------------------------------------------------------------------------------

注2:关于信息熵的相关概念,博主之前也一直未得精髓,所幸找到知乎上的这个材料(点击这里),share偷笑~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值