Sparse AutoEncoder简介

1. AutoEncoder

  AutoEncoder是一种特殊的三层神经网络, 其输出等于输入:(y^{(i)}=x^{(i)}), 如下图所示:

        

  亦即AutoEncoder想学到的函数为(f_{W,b} approx x), 来使得输出(hat{x})比较接近x. 乍看上去学到的这种函数很平凡, 没啥用处, 实际上, 如果我们限制一下AutoEncoder的隐藏单元的个数小于输入特征的个数, 便可以学到数据的很多有趣的结构. 如果特征之间存在一定的相关性, 则AutoEncoder会发现这些相关性.

  2. Sparse AutoEncoder

  我们可以限制隐藏单元的个数来学到有用的特征, 或者可以对网络施加其他的限制条件, 而不限制隐藏单元的个数. 特别的, 我们可以对隐藏单元施加稀疏性限制. 具体的, 一个神经元是激活的当且仅当其输出值比较接近1, 一个神经元是不激活的当且仅当其输出值比较接近0. 我们可以限制神经元在大多数时间下都是不激活的(亦即Sparse Filtering中的Lifetime Sparsity概念).

  定义(a_j^{(2)})为AutoEncoder中隐藏单元的激活值, 我们形式化的定义如下的限制:$${hat{ ho}}_j=frac{1}{m}sum_{i=1}^{m}[a_j^{2}(x^{(i)})]= ho$$

  其中( ho)是稀疏性参数, 一般取值为一个比较接近0的数, 比如0.05. 

  为了使得学到的AutoEncoder达到上述的稀疏性要求, 我们在优化目标里添加了新的一项, 用于惩罚那些偏离( ho)太多的(hat{ ho}_j). 可以使用KL Divergence:$$sum_{j=1}^{s_2} ho log frac{ ho}{hat{ ho}_j}+(1- ho)logfrac{1- ho}{1-hat{ ho}_j}$$

  上式可也以写作:$$sum_{j=1}^{s_2}KL( ho||hat{ ho}_j)$$

  下图展示了KL Divergence的特性: (hat{ ho}_j)越接近( ho)(此处为0.2), 则KL Divergence越小.

  

  所以, Sparse AutoEncoder的损失函数为:$$mathit{J}_{sparse}(mathit{W},mathit{b})=mathit{J}(mathit{W},mathit{b}) + etasum_{j=1}^{s_2}KL( ho||hat{ ho}_j)$$

  其中$$mathit{J}(mathit{W},mathit{b})=left[frac{1}{m}sum_{i=1}^{m}mathit{J}(mathit{W},mathit{b};mathit{x}^{(i)},mathit{j}^{(i)}) ight]+frac{lambda}{2}sum_{l=1}^{n_l-1}sum_{i=1}^{s_l}sum_{j=1}^{s_l+1}left(mathit{W}_{ji}^{(l)} ight) ^2=left[frac{1}{m}sum_{i=1}^{m}left(frac{1}{2}left|left|h_{mathit{W,b}}(x^{(i)})-y^{(i)} ight| ight| ^2 ight) ight]+frac{lambda}{2}sum_{l=1}^{n_l-1}sum_{i=1}^{s_l}sum_{j=1}^{s_l+1}left(mathit{W}_{ji}^{(l)} ight) ^2$$

  添加KL Divergence后的cost function后的偏导数为:

     

  有个新的偏导数之后, 使用Back Propagation来优化整个神经网络:

  参考文献:

  [1]. Sparse AutoEncoder. Andrew Ng.

原文地址:https://www.cnblogs.com/kemaswill/p/3348883.html