[激活函数]什么是 ReLU
参考资料:算法基础---ReLU激活函数及其变种
1、什么是 ReLU
ReLU 是修正线性单元(rectified linear unit),在 0 和 x 之间取最大值。
2、为什么要引入 ReLU
因为 sigmoid 和 tanh 容易导致梯度消失,而 ReLU 是非饱和激活函数,不容易发生梯度消失
3、ReLU 的函数表达式和导数表达式
ReLU 的函数表达式:
当 x <= 0 时,ReLU = 0
当 x > 0 时,ReLU = x
ReLU 的导数表达式:
当 x<= 0 时,导数为 0
当 x > 0 时,导数为 1
4、ReLU 的函数图像和导数图像
ReLU 的函数图像:
ReLU 的导数图像:
5、ReLU 的优点
① 有效缓解过拟合的问题,因为 ReLU 有可能使部分神经节点的输出变为 0,从而导致神经节点死亡,降低了神经网络的复杂度
② 不会发生梯度消失或梯度爆炸,当 x 大于 0 时,ReLU 的梯度恒为 1,不会随着网路深度的加深而使得梯度在累乘的时候变得越来越小或者越来越大,从而不会发生梯度消失或梯度爆炸
③ 计算简单,ReLU 本质上就是计算一次在两个值中取最大值
6、ReLU 的缺点
① 会导致神经元死亡,当一个神经元在某次的激活值为 0 之后,此后得到的激活值都是 0.
证明:
因为假设某个神经元在第 N 次时的激活值为 0,则第 N+1 次的激活值为:,其中 取值大于 0, 是 ReLU 在 x 点的梯度。当 x <= 0 时, 的值为 0,则 也为 0;当 x > 0 时, 的梯度为 1,则 为 0 和 中的最大值 0.即无论 x 取什么值, 的值都等于 0.
解决方法:
① 对于ReLU 会导致神经节点死亡的原因有:
a.参数初始化时初始化到的参数值恰好能使神经节点死亡,不过这种情况非常罕见
b.学习率太高,导致在参数更新时,导致参数小于等于 0
改进方法有:
针对原因 a,采用 Xavier 初始化方法(深度学习——Xavier初始化方法)
针对原因 b,可以设置小一点的学习率或者是使用会自动调整学习率的优化方法,例如 Adagrad
② 输出不是零均值化(zero-centered),会导致模型收敛较慢(解释:谈谈激活函数以零为中心的问题)
7、ReLU 的变种:
① Leaky ReLU
Leaky ReLU 的目的是为了解决 ReLU 的死亡神经节点的问题。Leaky ReLU 的表达式是:
ReLU = max(),其中 通常取值为 0.01,即
当 x <= 0 时,ReLU =
当 x > 0 时,ReLU =
② PReLU,Parameter ReLU 是对 Leaky ReLU 的改进,对于 不再取定值,而是从样本中学习得到,具有收敛速度快,错误率低的优点。
③ RReLU,Randomized ReLU 是对 Leaky ReLU 的改进,对于 不再取定值,而是在指定范围内随机取一个值,而在预测阶段则是使用固定值。PReLU 在一定程度上具有正则效果
8、pytorch 的 ReLU 函数的作用和参数详解
torch.nn.ReLU(inplace=False)
函数作用:对输入进行修正线性函数 ReLU(x) = max(0, x)
参数详解
inplace:默认为 False,即不进行覆盖运算,默认为 True 的话,则会对输入进行覆盖运算,此时减少了申请和注销内存的操作,会提高运行效率
例子:
from torch import autograd
>>> m = nn.ReLU()
>>> input = autograd.Variable(torch.randn(2))
>>> print(input)
>>> print(m(input))
结果:
tensor([-0.3543, -0.7416])
tensor([0., 0.])
注:连续使用多次 ReLU 跟使用一次的 ReLU 的效果是一样的