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

hW,b(x)x
<script type="math/tex; mode=display" id="MathJax-Element-1"> h_{W,b}(x)\approx x </script>
的函数,换句话说,它尝试逼近一个恒等函数(identity function,或叫证同函数),使得输出 x^<script type="math/tex" id="MathJax-Element-2">\hat x</script> 接近于输入 x<script type="math/tex" id="MathJax-Element-3">x</script>。

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

  • 隐藏神经元数量较小 ⇒ 类似于 PCA,实现降维;

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

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

a(2)j<script type="math/tex" id="MathJax-Element-4">a_j^{(2)}</script>表示隐层神经元 j<script type="math/tex" id="MathJax-Element-5">j</script> 的激活度,使用 a(2)j(x)<script type="math/tex" id="MathJax-Element-6">a_j^{(2)}(x)</script> 表示在给定输入为 x<script type="math/tex" id="MathJax-Element-7">x</script> 的情况下,自编码神经网络隐藏神经元 j<script type="math/tex" id="MathJax-Element-8">j</script> 的激活度。

ρ^j=1mi=1ma(2)j(xi)
<script type="math/tex; mode=display" id="MathJax-Element-9"> \hat \rho_j=\frac1m\sum_{i=1}^ma_j^{(2)}(x_i) </script>
ρ^j<script type="math/tex" id="MathJax-Element-10">\hat \rho_j</script> 表示隐层神经元的平均活跃度(在全部数据集上的平均)。我们可以近似地加入一些限制:
ρ^j=ρ
<script type="math/tex; mode=display" id="MathJax-Element-11"> \hat \rho_j=\rho </script>
其中 ρ<script type="math/tex" id="MathJax-Element-12">\rho</script> 是稀疏性参数,通常是一个接近于 0 的较小的值(ρ=0.05<script type="math/tex" id="MathJax-Element-13">\rho=0.05</script>),也即我们要限制隐层神经元 j<script type="math/tex" id="MathJax-Element-14">j</script> 的平均活跃度接近 0.05。为了实现这一限制,我们将会在我们的优化目标函数中加入一些额外的惩罚因子,而这一惩罚因子将惩罚那些 ρ^j<script type="math/tex" id="MathJax-Element-15">\hat \rho_j</script> 和 ρ<script type="math/tex" id="MathJax-Element-16">\rho</script> 有显著不同的情况,从而使隐层神经元的平均活跃度保持在较小范围内。惩罚因子的具体形式有很多种合理的选择,我们将会选择以下这种:
j=1s2ρlogρρ^j+(1ρ)log1ρ1ρ^j
<script type="math/tex; mode=display" id="MathJax-Element-17"> \sum_{j=1}^{s_2}\rho\log{\frac{\rho}{\hat \rho_j}}+(1-\rho)\log\frac{1-\rho}{1-\hat\rho_j} </script>

这里,s2<script type="math/tex" id="MathJax-Element-18">s_2</script> 是隐藏层中隐藏神经元的数量,而遍历 j<script type="math/tex" id="MathJax-Element-19">j</script> 可得隐层中每一个神经元。这一惩罚因子其实是基于 KL-divergence 的,于是惩罚因子也可被表示为:

i=1s2KL(ρ||ρ^j)
<script type="math/tex; mode=display" id="MathJax-Element-20"> \sum_{i=1}^{s_2}\text{KL}(\rho||\hat \rho_j) </script>

其中 KL(ρ||ρ^j)=ρlogρρ^j+(1ρ)log1ρ1ρ^j<script type="math/tex" id="MathJax-Element-21">\text{KL}(\rho||\hat \rho_j)=\rho\log\frac{\rho}{\hat \rho_j}+(1-\rho)\log\frac{1-\rho}{1-\hat\rho_j}</script> 相对熵是一种标准的用来测量两个分布之间差异的方法。

这一惩罚因子有如下性质,当 ρ^j=ρ<script type="math/tex" id="MathJax-Element-22">\hat\rho_j=\rho</script> 时,KL(ρ||ρ^j)=0<script type="math/tex" id="MathJax-Element-23">KL(\rho||\hat\rho_j)=0</script>,并且随着 ρ^j<script type="math/tex" id="MathJax-Element-24">\hat\rho_j</script> 与 ρ<script type="math/tex" id="MathJax-Element-25">\rho</script> 之间的差异增大而单调增加。举例来说,在下图中,我们设定 ρ=0.2<script type="math/tex" id="MathJax-Element-26">\rho=0.2</script>,并且画出了相对熵 KL(ρ||ρ^j)<script type="math/tex" id="MathJax-Element-27">KL(\rho||\hat\rho_j)</script> 随着 ρ^j<script type="math/tex" id="MathJax-Element-28">\hat\rho_j</script> 随着 ρ^j<script type="math/tex" id="MathJax-Element-29">\hat\rho_j</script> 的变化情况:

import numpy as np
import matplotlib.pyplot as plt

def kl(p, q):
    return p*np.log(p/q) + (1-p)*np.log((1-p)/(1-q))
p = .2
q = np.arange(0, 1, 0.01)[1:]
plt.plot(q, kl(p, q))
plt.show()


这里写图片描述

我们可以看出,相对熵在 ρ^j=ρ<script type="math/tex" id="MathJax-Element-418">\hat\rho_j = \rho</script> 时达到最小值 0,而当 ρ^j<script type="math/tex" id="MathJax-Element-419">\hat\rho_j</script> 靠近 0 或者 1(也即远离 ρ<script type="math/tex" id="MathJax-Element-420">\rho</script>)时,相对熵则会变得非常大。所以最小化这一惩罚因子具有使得 ρ^j<script type="math/tex" id="MathJax-Element-421">\hat\rho_j</script> 靠近 ρ<script type="math/tex" id="MathJax-Element-422">\rho</script> 的效果,现在我们的总体代价函数为:

Jsparse(W,b)=J(W,b)+βi=1s2KL(ρ||ρ^j)
<script type="math/tex; mode=display" id="MathJax-Element-423"> J_{\text{sparse}}(W,b)=J(W,b)+\beta\sum_{i=1}^{s_2}\text{KL}(\rho||\hat\rho_j) </script>
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐