自编码算法与稀疏性

自编码算法与稀疏性

分类:DL2013-07-19 20:18788人阅读评论(0)收藏举报

目录(?)[+]

转自ufldl,原文地址:http://deeplearning.stanford.edu/wiki/index.php/%E8%87%AA%E7%BC%96%E7%A0%81%E7%AE%97%E6%B3%95%E4%B8%8E%E7%A8%80%E7%96%8F%E6%80%A7

目前为止,我们已经讨论了神经网络在有监督学习中的应用。在有监督学习中,训练样本是有类别标签的。现在假设我们只有一个没有带类别标签的训练样本集合

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

。下图是一个自编码神经网络的示例。

自编码神经网络尝试学习一个

的函数。换句话说,它尝试逼近一个恒等函数,从而使得输出接近于输入。恒等函数虽然看上去不太有学习的意义,但是当我们为自编码神经网络加入某些限制,比如限定隐藏神经元的数量,我们就可以从输入数据中发现一些有趣的结构。举例来说,假设某个自编码神经网络的输入是一张图像(共100个像素)的像素灰度值,于是,其隐藏层中有50个隐藏神经元。注意,输出也是100维的。由于只有50个隐藏神经元,我们迫使自编码神经网络去学习输入数据的压缩表示,也就是说,它必须从50维的隐藏神经元激活度向量中重构出100维的像素灰度值输入。如果网络的输入数据是完全随机的,比如每一个输入都是一个跟其它特征完全无关的独立同分布高斯随机变量,那么这一压缩表示将会非常难学习。但是如果输入数据中隐含着一些特定的结构,比如某些输入特征是彼此相关的,那么这一算法就可以发现输入数据中的这些相关性。事实上,这一简单的自编码神经网络通常可以学习出一个跟主元分析(PCA)结果非常相似的输入数据的低维表示。

我们刚才的论述是基于隐藏神经元数量较小的假设。但是即使隐藏神经元的数量较大(可能比输入像素的个数还要多),我们仍然通过给自编码神经网络施加一些其他的限制条件来发现输入数据中的结构。具体来说,如果我们给隐藏神经元加入稀疏性限制,那么自编码神经网络即使在隐藏神经元数量较多的情况下仍然可以发现输入数据中一些有趣的结构。

稀疏性可以被简单地解释如下。如果当神经元的输出接近于1的时候我们认为它被激活,而输出接近于0的时候认为它被抑制,那么使得神经元大部分的时间都是被抑制的限制则被称作稀疏性限制。这里我们假设的神经元的激活函数是sigmoid函数。如果你使用tanh作为激活函数的话,当神经元输出为-1的时候,我们认为神经元是被抑制的。

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

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

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

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

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

其中

是一个以为均值和一个以为均值的两个伯努利随机变量之间的相对熵。相对熵是一种标准的用来测量两个分布之间差异的方法。(如果你没有见过相对熵,不用担心,所有你需要知道的内容都会被包含在这份笔记之中。)

这一惩罚因子有如下性质,当时,并且随着与之间的差异增大而单调递增。举例来说,在下图中,我们设定并且画出了相对熵值

随着变化的变化。

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

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

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

现在我们将其换成

就可以了。

有一个需要注意的地方就是我们需要知道来计算这一项更新。所以在计算任何神经元的后向传播之前,你需要对所有的训练样本计算一遍前向传播,从而获取平均激活度。如果你的训练样本可以小到被整个存到内存之中(对于编程作业来说,通常如此),你可以方便地在你所有的样本上计算前向传播并将得到的激活度存入内存并且计算平均激活度 。然后你就可以使用事先计算好的激活度来对所有的训练样本进行后向传播的计算。如果你的数据量太大,无法全部存入内存,你就可以扫过你的训练样本并计算一次前向传播,然后将获得的结果累积起来并计算平均激活度(当某一个前向传播的结果中的激活度被用于计算平均激活度之后就可以将此结果删除)。然后当你完成平均激活度的计算之后,你需要重新对每一个训练样本做一次前向传播从而可以对其进行后向传播的计算。对于后一种情况,你对每一个训练样本需要计算两次前向传播,所以在计算上的效率会稍低一些。

证明上面算法能达到梯度下降效果的完整推导过程不再本教程的范围之内。不过如果你想要使用经过以上修改的后向传播来实现自编码神经网络,那么你就会对目标函数

做梯度下降。使用梯度验证方法,你可以自己来验证梯度下降算法是否正确。。

中英文对照

自编码算法 Autoencoders

稀疏性 Sparsity

神经网络 neural networks

监督学习 supervised learning

无监督学习 unsupervised learning

反向传播算法 backpropagation

隐藏神经元 hidden units

像素灰度值 the pixel intensity value

独立同分布 IID

主元分析 PCA

激活 active

抑制 inactive

激活函数 activation function

激活度 activation

平均活跃度 the average activation

稀疏性参数 sparsity parameter

惩罚因子 penalty term

相对熵 KL divergence

伯努利随机变量 Bernoulli random variable

总体代价函数 overall cost function

后向传播 backpropagation

前向传播 forward pass

梯度下降 gradient descent

目标函数 the objective

梯度验证方法 the derivative checking method

中文译者

周韬(ztsailing@gmail.com),葛燕儒(yrgehi@gmail.com),林锋(xlfg@yeah.net),余凯(kai.yu.cool@gmail.com)

目前为止,我们已经讨论了神经网络在有监督学习中的应用。在有监督学习中,训练样本是有类别标签的。现在假设我们只有一个没有带类别标签的训练样本集合

,其中

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

。下图是一个自编码神经网络的示例。

自编码神经网络尝试学习一个

的函数。换句话说,它尝试逼近一个恒等函数,从而使得输出

接近于输入

。恒等函数虽然看上去不太有学习的意义,但是当我们为自编码神经网络加入某些限制,比如限定隐藏神经元的数量,我们就可以从输入数据中发现一些有趣的结构。举例来说,假设某个自编码神经网络的输入

是一张

图像(共100个像素)的像素灰度值,于是

,其隐藏层

中有50个隐藏神经元。注意,输出也是100维的

。由于只有50个隐藏神经元,我们迫使自编码神经网络去学习输入数据的压缩表示,也就是说,它必须从50维的隐藏神经元激活度向量

重构出100维的像素灰度值输入

。如果网络的输入数据是完全随机的,比如每一个输入

都是一个跟其它特征完全无关的独立同分布高斯随机变量,那么这一压缩表示将会非常难学习。但是如果输入数据中隐含着一些特定的结构,比如某些输入特征是彼此相关的,那么这一算法就可以发现输入数据中的这些相关性。事实上,这一简单的自编码神经网络通常可以学习出一个跟主元分析(PCA)结果非常相似的输入数据的低维表示。

我们刚才的论述是基于隐藏神经元数量较小的假设。但是即使隐藏神经元的数量较大(可能比输入像素的个数还要多),我们仍然通过给自编码神经网络施加一些其他的限制条件来发现输入数据中的结构。具体来说,如果我们给隐藏神经元加入稀疏性限制,那么自编码神经网络即使在隐藏神经元数量较多的情况下仍然可以发现输入数据中一些有趣的结构。

稀疏性可以被简单地解释如下。如果当神经元的输出接近于1的时候我们认为它被激活,而输出接近于0的时候认为它被抑制,那么使得神经元大部分的时间都是被抑制的限制则被称作稀疏性限制。这里我们假设的神经元的激活函数是sigmoid函数。如果你使用tanh作为激活函数的话,当神经元输出为-1的时候,我们认为神经元是被抑制的。

注意到

表示隐藏神经元

的激活度,但是这一表示方法中并未明确指出哪一个输入

带来了这一激活度。所以我们将使用

来表示在给定输入为

情况下,自编码神经网络隐藏神经元

的激活度。 进一步,让

表示隐藏神经元

的平均活跃度(在训练集上取平均)。我们可以近似的加入一条限制

其中,

稀疏性参数,通常是一个接近于0的较小的值(比如

)。换句话说,我们想要让隐藏神经元

的平均活跃度接近0.05。为了满足这一条件,隐藏神经元的活跃度必须接近于0。

为了实现这一限制,我们将会在我们的优化目标函数中加入一个额外的惩罚因子,而这一惩罚因子将惩罚那些

有显著不同的情况从而使得隐藏神经元的平均活跃度保持在较小范围内。惩罚因子的具体形式有很多种合理的选择,我们将会选择以下这一种:

这里,

是隐藏层中隐藏神经元的数量,而索引

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

其中

是一个以

为均值和一个以

为均值的两个伯努利随机变量之间的相对熵。相对熵是一种标准的用来测量两个分布之间差异的方法。(如果你没有见过相对熵,不用担心,所有你需要知道的内容都会被包含在这份笔记之中。)

这一惩罚因子有如下性质,当

,并且随着

之间的差异增大而单调递增。举例来说,在下图中,我们设定

并且画出了相对熵值

随着

变化的变化。

我们可以看出,相对熵在

时达到它的最小值0,而当

靠近0或者1的时候,相对熵则变得非常大(其实是趋向于

)。所以,最小化这一惩罚因子具有使得

靠近

的效果。 现在,我们的总体代价函数可以表示为

其中

如之前所定义,而

控制稀疏性惩罚因子的权重。

项则也(间接地)取决于

,因为它是隐藏神经元

的平均激活度,而隐藏层神经元的激活度取决于

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

)更新的时候我们已经计算了

现在我们将其换成

就可以了。

有一个需要注意的地方就是我们需要知道

来计算这一项更新。所以在计算任何神经元的后向传播之前,你需要对所有的训练样本计算一遍前向传播,从而获取平均激活度。如果你的训练样本可以小到被整个存到内存之中(对于编程作业来说,通常如此),你可以方便地在你所有的样本上计算前向传播并将得到的激活度存入内存并且计算平均激活度 。然后你就可以使用事先计算好的激活度来对所有的训练样本进行后向传播的计算。如果你的数据量太大,无法全部存入内存,你就可以扫过你的训练样本并计算一次前向传播,然后将获得的结果累积起来并计算平均激活度

(当某一个前向传播的结果中的激活度

被用于计算平均激活度

之后就可以将此结果删除)。然后当你完成平均激活度

的计算之后,你需要重新对每一个训练样本做一次前向传播从而可以对其进行后向传播的计算。对于后一种情况,你对每一个训练样本需要计算两次前向传播,所以在计算上的效率会稍低一些。

证明上面算法能达到梯度下降效果的完整推导过程不再本教程的范围之内。不过如果你想要使用经过以上修改的后向传播来实现自编码神经网络,那么你就会对目标函数

做梯度下降。使用梯度验证方法,你可以自己来验证梯度下降算法是否正确。。

中英文对照

自编码算法 Autoencoders

稀疏性 Sparsity

神经网络 neural networks

监督学习 supervised learning

无监督学习 unsupervised learning

反向传播算法 backpropagation

隐藏神经元 hidden units

像素灰度值 the pixel intensity value

独立同分布 IID

主元分析 PCA

激活 active

抑制 inactive

激活函数 activation function

激活度 activation

平均活跃度 the average activation

稀疏性参数 sparsity parameter

惩罚因子 penalty term

相对熵 KL divergence

伯努利随机变量 Bernoulli random variable

总体代价函数 overall cost function

后向传播 backpropagation

前向传播 forward pass

梯度下降 gradient descent

目标函数 the objective

梯度验证方法 the derivative checking method

中文译者

周韬(ztsailing@gmail.com),葛燕儒(yrgehi@gmail.com),林锋(xlfg@yeah.net),余凯(kai.yu.cool@gmail.com)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容

  • 很早就看了晨读资料了,奈何没时间来写。现在补补! 数量&质量 政治课上学过,量变到达一定程度,才引来质变的飞跃。积...
    Amoy_Amon阅读 213评论 0 0
  • 学习此部分的目的:发现在没有单独的行动可以解决问题的时候,机器如何找到一个行动序列达到他的目标;在这部分中,通过讨...
    云时之间阅读 609评论 0 2