激活函数
因为线性的卷积运算,无法形成复杂的空间表示,故很难提取出高语义的信息,因此需要加入非线性的映射,称为激活函数,可以逼近任意的非线性函数,以提升整个神经网络的表达能力.
常用的激活函数
- Sigmoid 函数
σ
(
x
)
=
1
1
+
e
−
x
\sigma(x) = \frac{1}{1+e^{-x}}
σ(x)=1+e−x1
\sigma(x) 的导数计算
σ
(
x
)
′
=
(
1
1
+
e
−
x
)
′
=
1
−
1
1
+
e
−
x
=
1
−
σ
(
x
)
\sigma(x)' = \left(\frac{1}{1+e^{-x}}\right)' = 1 - \frac{1}{1+e^{-x}} = 1- \sigma(x)
σ(x)′=(1+e−x1)′=1−1+e−x1=1−σ(x)
目的是将一个实数输入转化到 0~1 之间的输出,具体的说也是将越大的负数转化到越靠近 0, 将越大的正数转化到越靠近 1. 即 0 端对应抑制状态,1 端对应激活状态. 中间部分梯度大.
缺点:
(1) Sigmoid 函数会造成梯度消失. 靠近 0 和 1 两端时,梯度几乎变为 0,
(2) Sigmoid 输出不是以 0 为均值, 这会导致经过 SIgmoid 激活函数之后的输出,作为最后一层网络的输入时候是非 0 均值,这个时候如果输入进入下一层神经元时全是正的,这就导梯度全是正的, 更新参数时永远是整的。
- ReLU 函数
为了缓解梯度消失现象,修正线性单元,引入 ReLU 函数,
$$
ReLU(x) = max(0, x) = \left{
$$
R e L U ( x ) = m a x ( 0 , x ) = { 0 = i f x < 0 x = i f x ≥ 0 ReLU(x)=max(0, x)=\left\{ \begin{aligned} 0 & = & if x < 0 \\ x & = & if x \geq 0 \\ \end{aligned} \right. ReLU(x)=max(0,x)={0x==ifx<0ifx≥0
ReLU 函数在 小于 0 的部分,值与梯度皆为 0,而在大于 0 的部分中导数保持为 1,避免 SIgmoid 函数的梯度消失问题.
还有很多激活函数这不一一介绍。