自编码器神经网络尝试学习一个:
的函数,换句话说,它尝试逼近一个恒等函数(identity function,或叫证同函数),使得输出 x^ 接近于输入 x 。
恒等函数虽然看上去不太有学习的意义,但是当我们为自编码神经网络加入某些限制,比如限定隐藏神经元的数量,我们就可以从输入数据中发现一些有趣的结构。
隐藏神经元数量较小 ⇒ 类似于 PCA,实现降维;
即使隐藏神经元的数量较大(可能比输入像素的个数还要多),我们仍然通过给自编码神经网络施加一些其他的限制条件来发现输入数据中的结构。具体来说,如果我们给隐藏神经元加入稀疏性限制,那么自编码神经网络即使在隐藏神经元数量较多的情况下仍然可以发现输入数据中一些有趣的结构。
稀疏性可以被简单地解释如下。如果当神经元的输出接近于 1 的时候我们认为它被激活,而输出接近于 0 的时候认为它被抑制,那么使得神经元大部分的时间都是被抑制的限制则被称作稀疏性限制。这里我们假设的神经元的激活函数是 sigmoid 函数(其值域在 (0,1))。如果你使用 tanh(值域 (-1, 1)) 作为激活函数的话,当神经元输出为-1的时候,我们认为神经元是被抑制的。
ρ^j 表示隐层神经元的平均活跃度(在全部数据集上的平均)。我们可以近似地加入一些限制:
其中 ρ 是稀疏性参数,通常是一个接近于 0 的较小的值( ρ=0.05 ),也即我们要限制隐层神经元 j 的平均活跃度接近 0.05。为了实现这一限制,我们将会在我们的优化目标函数中加入一些额外的惩罚因子,而这一惩罚因子将惩罚那些
这里,
s2
是隐藏层中隐藏神经元的数量,而遍历
j
可得隐层中每一个神经元。这一惩罚因子其实是基于 KL-divergence 的,于是惩罚因子也可被表示为:
其中 KL(ρ||ρ^j)=ρlogρρ^j+(1−ρ)log1−ρ1−ρ^j 相对熵是一种标准的用来测量两个分布之间差异的方法。
这一惩罚因子有如下性质,当 ρ^j=ρ 时, KL(ρ||ρ^j)=0 ,并且随着 ρ^j 与 ρ 之间的差异增大而单调增加。举例来说,在下图中,我们设定 ρ=0.2 ,并且画出了相对熵 KL(ρ||ρ^j) 随着 ρ^j 随着 ρ^j 的变化情况:
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=ρ
时达到最小值 0,而当
ρ^j
靠近 0 或者 1(也即远离
ρ
)时,相对熵则会变得非常大。所以最小化这一惩罚因子具有使得
ρ^j
靠近
ρ
的效果,现在我们的总体代价函数为: