文章目录
Sigmoid函数
Sigmoid函数介绍
Sigmoid 是常用的非线性的激活函数,公式如下:
σ ( x ) = 1 1 + e − x \sigma(x)=\frac{1}{1+e^{-x}} σ(x)=1+e−x1
函数图像如下:
从图像可以看出,它能够把连续实值映射为0和1之间的输出,特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1。
Sigmoid 函数有很多局限性:
第一点,在数值的绝对值非常大的情况下,对应的函数图像的部分几乎是一条水平线。这意味着梯度几乎为0,不利于深层网络中梯度的反向传播,容易造成梯度消失。
第二点,Sigmoid 的输出不是0均值,导致梯度的更新要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢。具体的解释,在文末讨论。
第三点,式子包含幂运算,计算量很大。
Sigmoid函数求导
求导过程及结果如下:
σ ′ ( x ) = ( 1 1 + e − x ) ′ = e − x ( 1 + e − x ) 2 = 1 + e − x − 1 ( 1 + e − x ) 2 = σ ( x ) ( 1 − σ ( x ) ) \begin{aligned} \sigma^{\prime}(x) &=\left(\frac{1}{1+e^{-x}}\right)^{\prime} \\ &=\frac{e^{-x}}{\left(1+e^{-x}\right)^{2}} \\ &=\frac{1+e^{-x}-1}{\left(1+e^{-x}\right)^{2}} \\ &=\sigma(x)(1-\sigma(x)) \end{aligned} σ′(x)=(1+e−x1)′=(1+e−x)2e−x=(1+e−x)21+e−x−1=σ(x)(1−σ(x))
函数图像如下:
求导的结果可以看出,导数的最大值为0.25,小于1 ,很容易造成梯度消失。
tanh 函数
tanh 函数介绍
tanh 函数公式如下:
tanh ( x ) = e x − e − x e x + e − x \tanh (x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} tanh(x)=ex+e−xex−e−x
图像如下:
tanh 函数决了Sigmoid函数的输出不是0均值,然而,梯度消失和幂运算的问题仍然存在。
tanh 函数求导
求导过程如下:
t a n h ( x ) ′ = ( e x + e − x ) 2 − ( e x − e − x ) 2 ( e x + e − x ) 2 = 1 − ( t a n h ( x ) ) 2 tanh(x)^{\prime}=\frac{(e^{x}+e^{-x})^{2}-(e^{x}-e^{-x})^{2}}{(e^{x}+e^{-x})^{2}}=1-(tanh(x))^{2} tanh(x)′=(ex+e−x)2(ex+e−x)2−(ex−e−x)2=1−(tanh(x))2
求导后的图像:
Relu函数
Relu函数介绍
Relu函数公式如下:
R e L U ( x ) = { 0 , x ⩽ 0 x , x > 0 ReLU(x)=\begin{cases}{0,} & {x \leqslant 0} \\ {x,} & {x>0}\end{cases} ReLU(x)={
0,x,x⩽0x>0
函数图像如下:
Relu 函数在输出值大于 0 的部分的导数值都大于0,并且不趋近于0,因而梯度下降速度较快。
Relu 函数在输出值小于 0 的部分的导数值都等于0,此时神经元就不会得到训练,能对网络产生稀疏性,降低过分拟合的概率。
但是也存在以下问题:
- 输出不是0均值
- Dead ReLU Problem:因梯度等于0导致失效的神经元不会再被激活
注:为了解决第二个问题,有人提出了Leaky ReLU激活函数: L e a k y R e L U ( x ) = m a x ( 0.01 x , x ) Leaky \; ReLU(x) = max(0.01x, x) LeakyReLU(x)=max(0.01x,x),使得小于0的部分有些许梯度。
尽管ReLU存在这两个问题,ReLU目前仍是最常用的激活函数,在搭建模型的时候推荐优先尝试。
Relu函数求导
求导结果如下:
R e L U ( x ) ′ = { 0 , x ⩽ 0 1 , x > 0 ReLU(x)^{\prime}=\begin{cases}{0,} & {x \leqslant 0} \\ {1,} & {x>0}\end{cases} ReLU(x)′={
0,1,x⩽0x>0
函数图像如下:
Softmax函数
Softmax函数介绍
对于多分类任务,常用的激活函数是 Softmax 激活函数。使用了Softmax函数的神经网络对应多个输出层神经元 ,如下图所示;
每个输出单元的数值代表该类别的概率 p i p_i pi,数值越大,说明属于该类别可能性越大。
具体而言,假设倒数第二层的输出值为:
z i = w i x + b i z_i = w_i x + b_i zi=wix+bi
假设有K个类别,Softmax函数定义如下:
S o f t m a x ( z i ) = e z i ∑ i = 1 K e z i ∀ i ∈ 1 … K Softmax(z_i)=\frac{e^{z_i}}{\sum_{i=1}^{K} e^{z_i}} \quad \forall i \in 1 \ldots K Softmax(zi)=∑i=1Keziezi∀i∈1…K
则在最后一层使用 Softmax 激活函数后的输出值为:
h w ( x ) = [ p 1 p 2 ⋮ p K ] = 1 ∑ i = 1 K e z i [ e z 1 e z 2 ⋮ e z K ] h_w(x) = \begin{bmatrix}p_1\\p_2 \\ \vdots \\p_{K} \end{bmatrix} = \frac{1}{\sum_{i=1}^K e^{z_i}} \begin{bmatrix}e^{z_1}\\e^{z_2 } \\ \vdots \\e^{z_K} \end{bmatrix} hw(x)=⎣⎢⎢⎢⎡p1p2⋮pK⎦⎥⎥⎥⎤=∑i=1Kezi1⎣⎢⎢⎢⎡