为什么自动编码器中的重建使用与前向激活相同的激活函数,而不是逆向激活函数?

数据挖掘 机器学习 可视化 深度学习 自动编码器
2021-09-23 07:39:36

假设你有一个有 n 个神经元的输入层,第一个隐藏层有m神经元,通常具有m<n. 然后你计算动作ajj-隐藏层中的第一个神经元

aj=f(i=1..nwi,jxi+bj), 在哪里f是一个激活函数tanh或者sigmoid.

要训​​练网络,您需要计算输入的重构,表示为 z,并最小化之间的误差 zx. 现在i-第一个元素 z 通常计算为:

zi=f(j=1..mwj,iaj+bi)

我想知道为什么重建 z 通常使用相同的激活函数而不是使用反函数来计算,为什么要分开 wb有用而不是使用捆绑的权重和偏差?用逆激活函数计算重建对我来说似乎更直观f1,例如, arctanh, 如下:

zi=j=1..mf1(aj)bjwj,iT

请注意,这里使用了捆绑权重,即 w=wT, 和偏差 bj 使用隐藏层,而不是为输入层引入一组额外的偏差。

还有一个非常相关的问题:为了可视化特征,而不是计算重建,通常会创建一个具有隐藏层维度的单位矩阵。然后,将矩阵的每一列用作重新激活函数的输入,该函数在输入神经元中产生一个输出。对于重新激活函数,使用相同的激活函数会更好(分别是zi) 或反函数 (resp. the zi)?

1个回答

我不认为你的假设 w=wT持有。或者更确切地说是没有必要的,如果这样做了,也不是为了以某种方式自动反转计算以创建隐藏层特征。一般来说,直接以这种方式从 n 到更小的 m 是不可能逆转压缩的。如果这是目标,那么您将需要一种矩阵求逆形式,而不是简单的转置。

相反,我们只想 wij 用于压缩的高级特征表示,并将丢弃 wij 自动编码器完成后。

可以设置w=wT并系上重物。这有助于正则化 - 帮助自动编码器泛化。但这不是必需的。

如果自动编码器的最后一层可以表达可能的输入范围,那么在您预训练的层之后使用什么激活函数实际上并不重要。但是,根据您使用的内容,您可能会获得不同质量的结果,这对于神经网络来说是正常的。

使用与构建预训练层相同的激活函数是非常合理的,因为它是最简单的选择。

也可以使用反函数,但不建议用于 sigmoid 或 tanh,因为例如 arctanh 未定义 < -1 或 > 1,因此可能在数值上不稳定。