激活函数知识点
激活函数作用
如果不用激活函数,每一层输出都是上一层的线性函数,就变成了线性模型,表达能力不够。如果引入非线性激活函数的话,加入了非线性因素,神经网络就有意义了,能够去逼近任意函数。
Sigmoid
g
(
x
)
=
1
1
+
e
−
x
g(x)=\frac{1}{1+e^{-x}}
g(x)=1+e−x1
优点:提供非线性能力、可以作为输出层,输出概率值,处处连续,便于求导,压缩数据到(0,1)。
缺点:1)容易梯度消失,sigmoid导数最大为0.25,每传递一层梯度都会减为原来0.25倍,而sigmoid在两头梯度几乎为0导致权重几乎不更新;2)不是关于原点对称和中心对称的函数,均值不为0,这样网络收敛效果不好;3)幂运算耗时
导数:
g
(
x
)
‘
=
g
(
x
)
∗
(
1
−
g
(
x
)
)
g(x)^`=g(x)*(1-g(x))
g(x)‘=g(x)∗(1−g(x))
Sigmoid的溢出
公式含有
e
−
x
e^{-x}
e−x当 x 非常小(即 -x 非常大)时,会导致溢出
解决:
如果 x > 0 ,形式不变,如果 x < 0,则公式为
e
x
1
+
e
x
\frac{e^x}{1+e^x}
1+exex
解决softmax溢出
softmax可能下溢出,因为 x 很小的时候,分母会很小。
公式变成
e
x
−
M
e^{x-M}
ex−MM为x_1~x_n中的最大值。可以同时解决上下溢出。
e 的指数的最大值为0,所以不会发生上溢出;同时,分母中也至少会包含一个值为1的项,所以分母也不会下溢出(四舍五入为0)。分子下溢也可能这样解决。
而且,根据公式,理论上,计算结果跟原来的是一样的。
Tanh
公式
e
x
−
e
−
x
e
x
+
e
−
x
\frac{e^x-e^{-x}}{e^x+e^{-x}}
ex+e−xex−e−x
优点:解决了Sigmoid函数的不是中心对称输出问题
缺点:在两边还是有梯度饱和(也就是梯度趋近于0)和幂运算问题。
常用于输出对称你的结果的时候,比如(-1,1)
ReLu
优点:
- 计算速度快
- 收敛速度快
- 减轻梯度消失问题,relu的梯度为1
缺点
- 输入值为负的时候,输出始终为0,其一阶导数也始终为0,这样会导致神经元不能更新参数,导致神经元死亡 ------ leaky relu来解决这个问题
- 不会对数据做幅度压缩,所以数据的幅度会随着模型层数的增加不断扩张
- 训练的时候很“脆弱”,很容易就死了,例如,一个非常大的梯度流过一个 ReLU 神经元,更新过参数之后,这个神经元再也不会对任何数据有激活现象了,那么这个神经元的梯度就永远都会是 0。如果 learning rate 很大,那么很有可能网络中的 40% 的神经元都”dead”了
ReLu死亡的解释
神经网络接受异于常值范围的输入时,在反向传播过程中会产生大的梯度。这种大的梯度,会因梯度消失而永久关闭诸如 ReLU 的激活函数。
如果一个负样本回传了负梯度,如果学习率设置过大或者参数初始化不好,会导致权重偏向于将输入变为负数,如果全部输入都被权重变成负数了,ReLu就没办法让权重更新梯度了,就死亡了。
可以看成:权重最开始是低方差中心在0.1的高斯分布,被负样本更新后,变成了低方差中心在-0.1的高斯分布,很多参数都倾向于输出负数,不能更新权重了。
Rule激活函数如果不加在卷积层之后而是加在最大池化层之后有什么影响?
先池化可以减少计算量,没什么影响
Leaky ReLu
小于0的时候,乘以一个权重,0.01。
是PReLu的特殊情况(0.01),PReLu的话就是权重可能是其他的
优点
- 神经元不会出现死亡的情况。
- 对于所有的输入,不管是大于等于0还是小于0,神经元不会饱和。
- 由于Leaky ReLU线性、非饱和的形式,在SGD中能够快速收敛。
- 计算速度要快很多。Leaky ReLU函数只有线性关系,不需要指数计算,不管在前向传播还是反向传播,计算速度都比sigmoid和tanh快
虽然解决了失活神经元的问题,但在实践中并没有发现效果比ReLU有明显的提升。 可能ReLu让神经元死亡可以带来一定的正则作用
ReLU6
在Mobile v1里面使用ReLU6,ReLU6就是普通的ReLU但是限制最大输出值为6(对输出值做clip),这是为了在移动端设备float16的低精度的时候,也能有很好的数值分辨率,如果对ReLU的激活范围不加限制,输出范围为0到正无穷,如果激活值非常大,分布在一个很大的范围内,则低精度的float16无法很好地精确描述如此大范围的数值,带来精度损失。
ELU
x<0时,等于
α
∗
(
e
x
−
1
)
α*(e^x-1)
α∗(ex−1)