在LSTM中使用tanh的直觉是什么?

106

在LSTM网络(Understanding LSTMs)中,为什么输入门和输出门使用tanh函数?

这背后的直觉是什么?

这只是一种非线性转换吗?如果是这样,我能否把它们都改成另一个激活函数(例如ReLU)?


2
输入门和输出门都不使用tanh函数进行激活。我猜这是一个误解。在LSTM网络中,输入门(i_{t})和输出门(o_{t})都使用sigmoid函数。tanh激活函数用于确定候选单元状态(内部状态)值(\tilde{C}_{t})并更新隐藏状态(h_{t})。 - ARAT
2个回答

128
Sigmoid被用作LSTM中三个门(in、out和forget)的门控函数,因为它输出0到1之间的值,并且可以让信息通过或不通过门。另一方面,为了克服梯度消失问题,我们需要一个函数,其二阶导数可以在接近零之前维持很长的范围。Tanh是具有上述属性的良好函数。一个好的神经元单元应该是有界的,易于可微分的,单调的(对于凸优化很好),并且易于处理。如果你考虑到这些特点,那么我相信你可以使用ReLU代替tanh函数,因为他们是非常好的互补选择。但是,在选择激活函数之前,您必须知道您选择与其他函数的优缺点是什么。我简要描述了一些激活函数及其优点。Sigmoid
数学表达式:sigmoid(z) = 1 / (1 + exp(-z))
一阶导数:sigmoid'(z) = -exp(-z) / 1 + exp(-z)^2
优点:
(1) The sigmoid function has all the fundamental properties of a good activation function.

双曲正切函数

数学表达式:tanh(z) = [exp(z) - exp(-z)] / [exp(z) + exp(-z)]

一阶导数:tanh'(z) = 1 - ([exp(z) - exp(-z)] / [exp(z) + exp(-z)])^2 = 1 - tanh^2(z)

优点:

(1) Often found to converge faster in practice
(2) Gradient computation is less expensive

硬切线

数学表达式:hardtanh(z) = -1(z < -1); z (-1 <= z <= 1); 1(z > 1)

一阶导数:hardtanh'(z) = 1 (-1 <= z <= 1); 0(其他情况)

优点:

(1) Computationally cheaper than Tanh
(2) Saturate for magnitudes of z greater than 1

ReLU

数学表达式:relu(z) = max(z, 0)

一阶导数:relu'(z) = 1(如果 z > 0);0(否则)

优点:

(1) Does not saturate even for large values of z
(2) Found much success in computer vision applications

Leaky ReLU

数学表达式:leaky(z) = max(z, k dot z),其中 0 < k < 1

一阶导数:relu'(z) = 如果 z > 0,则为 1;否则为 k

优点:

(1) Allows propagation of error for non-positive z which ReLU doesn't

这篇论文介绍了一些有趣的激活函数,你可以考虑阅读它。


1
上面的论文链接似乎已经失效了,但我相信它指的是:https://pdfs.semanticscholar.org/a26f/0c396a9553d40bc6e4438697dd6455aaa25a.pdf / http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.43.6996。 - MGwynne
1
在sigmoid函数的一阶导数中有一个小错误。实际上,它等于:sigmoid'(z) = exp(-z) / (1 + exp(-z))^2 - s0urcer
8
以上答案是正确的,但与问题无关。衍生产品不能区分tanh和sigmoid,因为tanh只是一个重新缩放和移动的sigmoid。(参见:https://cs224d.stanford.edu/lectures/CS224d-Lecture6.pdf) - Aaron Schumacher
6
另一方面,为了克服消失的梯度问题,我们需要一个函数,其二阶导数在趋近于零之前可以持续很长时间。为什么呢? - figs_and_nuts
只是根据我的直觉,因为在反向传播中,如果有更多层的激活函数(例如tanh或sigmoid),它将计算不仅“二阶导数”,还将计算“三阶、四阶导数等”。通过这样做,tanh仍将保留信息的整个概念(即正值和负值),而sigmoid只保留正部分。@realmq,请看看这是否有意义。谢谢。 - Bruce Yo
显示剩余6条评论

74

LSTMs管理一个内部状态向量,它的值应该能够在添加某些函数的输出时增加或减少。Sigmoid输出始终为非负数;状态中的值只会增加。tanh的输出可以是正数或负数,允许状态增加和减少。

这就是为什么使用tanh来确定要添加到内部状态的候选值。LSTM的GRU表亲没有第二个tanh,因此在某种意义上,第二个不是必要的。有关更多信息,请查看Chris Olah的Understanding LSTM Networks中的图表和说明。

相关问题“为什么在LSTM中使用Sigmoids?”的答案也基于函数的可能输出进行了回答:“门控”通过将数字乘以介于零和一之间的数字来实现,这就是sigmoid的输出。

Sigmoid和tanh的导数之间实际上没有实质性区别;tanh只是一个重新缩放和移位的sigmoid:请参见Richard Socher的神经网络技巧和窍门。如果二阶导数相关,请告诉我如何处理。


1
@End-2-End 对我来说听起来是正确的,可能不必要地澄清一下,通常整个过程都在向量上运作,因此边界是在每个分量上。 - Aaron Schumacher
1
@AaronSchumacher,你提到状态中的值应该能够增加和减少,而且由于sigmoid函数总是具有非负输出,因此tanh是输出的首选激活函数。那么,如果ReLU也始终为非负数,那么它不也是一样的吗?这是否意味着如果我们用ReLU替换tanh,LSTM将无法按预期工作? - End-2-End
1
@End-2-End 对我来说听起来是正确的。ReLU 是非负的。 - Aaron Schumacher
1
@Quastiat 我们可以分别考虑加法部分和乘法部分:“当我们添加某些函数的输出时,值应该能够增加或减少。Sigmoid 输出始终为非负数;状态中的值只会增加。”这对于加法部分是正确的。但是,是的,在0和1之间乘以一个数字确实会减小绝对值。(它仍然不能改变符号。) - Aaron Schumacher
3
虽然这解释了状态更新规则,但它未能解决LSTM的输出门包含tanh层的事实,即h_t = o_t * tanh(C_t)。原因是在状态更新加法操作后,它可以重新归一化隐藏状态以位于[-1,1]之间。 - jonathanking
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接