python中激活函数 pythoncharm激活( 二 )


我们可以用一个简单的 if-statement 来描述这个问题,如下所示:
对于大于零的值,这个函数是线性的,这意味着当使用反向传播训练神经网络时,它具有很多线性激活函数的理想特性 。然而 , 它是一个非线性函数,因为负值总是作为零输出 。由于矫正函数在输入域的一半是线性的 , 另一半是非线性的 , 所以它被称为 分段线性函数(piecewise linear function )。
我们可以很容易地在 Python 中实现ReLU激活函数 。
我们希望任何正值都能不变地返回,而0.0或负值的输入值将作为0.0返回 。
下面是一些修正的线性激活函数的输入和输出的例子:
输出如下:
我们可以通过绘制一系列的输入和计算出的输出,得到函数的输入和输出之间的关系 。下面的示例生成一系列从 -10到10的整数 , 并计算每个输入的校正线性激活,然后绘制结果 。
运行这个例子会创建一个图,显示所有负值和零输入都突变为0.0,而正输出则返回原样:
ReLU函数的导数是斜率 。负值的斜率为0.0,正值的斜率为1.0 。
传统上,神经网络领域已经不能是任何不完全可微的激活函数,而ReLU是一个分段函数 。从技术上讲,当输入为0.0时,我们不能计算ReLU的导数,但是,我们可以假设它为0 。
tanh 和 sigmoid 激活函数需要使用指数计算 ,  而ReLU只需要max(),因此他 计算上更简单,计算成本也更低。
ReLU的一个重要好处是,它能够输出一个真正的零值。这与 tanh 和 sigmoid 激活函数不同 , 后者学习近似于零输出,例如一个非常接近于零的值,但不是真正的零值 。这意味着负输入可以输出真零值,允许神经网络中的隐层激活包含一个或多个真零值 。这就是所谓的稀疏表示,是一个理想的性质,在表示学习,因为它可以加速学习和简化模型 。
ReLU看起来更像一个线性函数,一般来说,当神经网络的行为是线性或接近线性时,它更容易优化。
这个特性的关键在于,使用这个激活函数进行训练的网络几乎完全避免了梯度消失的问题,因为梯度仍然与节点激活成正比 。
ReLU的出现使得利用硬件的提升和使用反向传播成功训练具有非线性激活函数的深层多层网络成为可能。
很长一段时间,默认的激活方式是Sigmoid激活函数 。后来,Tanh成了激活函数 。对于现代的深度学习神经网络,默认的激活函数是ReLU激活函数。
ReLU 可以用于大多数类型的神经网络 ,  它通常作为多层感知机神经网络和卷积神经网络的激活函数 , 并且也得到了许多论文的证实 。传统上,LSTMs 使用 tanh 激活函数来激活cell状态,使用 Sigmoid激活函数作为node输出 。而ReLU通常不适合RNN类型网络的使用 。
偏置是节点上具有固定值的输入,这种偏置会影响激活函数的偏移 , 传统的做法是将偏置输入值设置为1.0 。当在网络中使用 ReLU 时 ,  可以将偏差设置为一个小值 , 例如0.1。
在训练神经网络之前,网络的权值必须初始化为小的随机值 。当在网络中使用 ReLU 并将权重初始化为以零为中心的小型随机值时,默认情况下 , 网络中一半的单元将输出零值 。有许多启发式方法来初始化神经网络的权值,但是没有最佳权值初始化方案 。何恺明的文章指出Xavier 初始化和其他方案不适合于 ReLU,对 Xavier 初始化进行一个小的修改,使其适合于 ReLU,提出He Weight Initialization , 这个方法更适用于ReLU。
在使用神经网络之前对输入数据进行缩放是一个很好的做法 。这可能涉及标准化变量,使其具有零均值和单位方差 , 或者将每个值归一化为0到1 。如果不对许多问题进行数据缩放,神经网络的权重可能会增大,从而使网络不稳定并增加泛化误差 。无论是否在网络中使用 ReLU,这种缩放输入的良好实践都适用 。

推荐阅读