Python:梯度消失和其他激活函数 (七十三)

梯度消失

还有一个问题会发生,我们来看看 S 型函数,在两端曲线非常平缓,如果我们计算最左端或最右端的点的导数,这个导数将几乎为0,这样不好,因为导数可以告诉我们移动方向。
file

在多层线性感知器中,情况更糟,看看这个示例,我们知道误差函数相对权重的导数是在输出对应的路径上的节点算出的所有导数的积,所有这些导数都是 s 型函数导数,所以它们很小,一堆很小的数字相乘更小了,这样使训练过程变得很难,因为梯度下降使我们对权重所做的更改非常非常小,意味着我们迈着很小的步子,永远也无法从珠峰上下来,如何解决这一问题呢,我们来看看一些方法。
file

file

其他激活函数

双曲正切函数

解决这一问题的最佳方式是更改激活函数,再介绍一种激活函数,双曲正切函数,公式在下图,这个函数和 s 型函数相似,但是因为范围在 -1 到 1 之间,所以导数更大些,这种小小的差别让神经网络有了很大的改进。
file

ReLU函数

另一种非常热门的激活函数是修正线性单元,简称 ReLUctant,这是一个非常简单的函数,如果为正值则返回相同而值,如果是负值则返回 0,可以看做 x 和 0 之间的最大值,这个函数比 S 型函数更常用,它可以显著改善训练结果,但是不会太牺牲准确性,因为如果数字是正数,则导数是1,很神奇的是,这个函数几乎不能区分情形,但却能够形成如此复杂的非线性解决方案。
file

现在有了更好的激活函数,当我们将导数相乘以对任何特定权重获得导数时,结果将是稍微大点的数字,使导数稍微大些并让我们能够进行梯度下降,我们将用它的函数图表来表示 ReLU 单元,这是一个多层感知器示例,其中具有大量 ReLU 激活单元,注意最后一个单元是 s 函数,因为最终输出依然需要为 0 到 1 之间的概率,但是如果让最后一个输出函数为 ReLU,实际上最终会获得预测值的回归模型,这将在我们课程的递归神经网络中有用。

file

file

Keras 中的其他激活函数

更改激活函数很简单。到目前为止,我们一直在使用 s 型函数(如果有多个类别,则使用 softmax,例如我们对输出进行一位热码编码时),并按以下方式添加到层级中:

model.add(Activation('sigmoid'))

model.add(Activation('softmax'))

如果我们要使用 relu 或 tanh,则直接将层级名称指定为 relu 或 tanh:

model.add(Activation('relu'))
model.add(Activation('tanh'))

为者常成,行者常至