多层感知器的激活函数

Posted

技术标签:

【中文标题】多层感知器的激活函数【英文标题】:Activation function for multilayer perceptron 【发布时间】:2013-01-08 13:18:17 【问题描述】:

我尝试使用xor 函数训练简单的反向传播神经网络。当我使用tanh(x) 作为激活函数并使用导数1-tanh(x)^2 时,我在大约 1000 次迭代后得到了正确的结果。但是,当我使用g(x) = 1/(1+e^(-x)) 作为激活函数时,使用导数g(x)*(1-g(x)),我需要大约50000 次迭代才能得到正确的结果。可能是什么原因?

谢谢。

【问题讨论】:

学习率可能太小了?:p 你是如何编码你的 XOR 数据集的? 1 0 = 1-1 1 = 1? 但是为什么学习常数对 tanh 来说很好,但对逻辑函数来说不够好呢?我认为“1”输出为真,“0”为假。 “结果”是什么意思?两种激活函数在 500 集后的预测效果如何? 【参考方案1】:

是的,你观察到的是真实的。在使用反向传播训练神经网络时,我也有类似的观察结果。对于XOR问题,我曾经建立了一个2x20x2网络,逻辑函数需要3000+集才能得到以下结果:

[0, 0] -> [0.049170633762142486]
[0, 1] -> [0.947292007836417]
[1, 0] -> [0.9451808598939389]
[1, 1] -> [0.060643862846171494]

当使用tanh 作为激活函数时,这是 800 集后的结果。 tanh 的收敛速度始终快于 logistic

[0, 0] -> [-0.0862215901296476]
[0, 1] -> [0.9777578145233919]
[1, 0] -> [0.9777632805205176]
[1, 1] -> [0.12637838259658932]

这两个函数的形状如下图(来源:efficient backprop):

左边是标准逻辑函数:1/(1+e^(-x))。 右边是tanh函数,也称为双曲正切。

很容易看出tanh 关于原点反对称。

根据efficient Backprop,

Symmetric sigmoids(例如 tanh)通常比标准逻辑函数收敛得更快。

同样来自维基Logistic regression:

实践者警告说,当使用反向传播训练网络时,关于原点反对称(例如双曲正切)的 sigmoid 函数会导致更快收敛.

请参阅efficient Backprop 了解更多关于此处解释直觉的详细信息。

请参阅elliott 以获取更容易计算的tanh 的替代方案。如下图黑色曲线所示(蓝色为原tanh)。

从上面的图表中应该突出两件事。首先,与 Elliott 相比,TANH 通常需要更少的迭代来训练。因此,对于 Encoder,Elliott 的训练精度不如 Encoder 好。但是,请注意培训时间。 Elliott 完成了它的整个任务,即使它必须做额外的迭代,也只用了 TANH 一半的时间。这是一个巨大的改进,字面意思是在这种情况下,Elliott 会将您的训练时间缩短一半,并提供相同的最终训练错误。虽然确实需要更多的训练迭代才能到达那里,但每次迭代的速度要快得多,它仍然会导致训练时间减半。

【讨论】:

以上是关于多层感知器的激活函数的主要内容,如果未能解决你的问题,请参考以下文章

感知机+激活函数+多层感知机的实现

一看就懂的Tensorflow实战(多层感知机)

动手学习pytorch——多层感知机

感知机的梯度推导

神经网络多层感知机

深度学习入门多层感知机