常用激活函数

目录

  • 1、简介
    • 1)why:为什么需要非线性激活函数
    • 2)what:激活函数需要满足的条件
    • 3)how:如何选择激活函数
  • 2、常见的激活函数
    • 1)Sigmoid函数
    • 2)Tanh/双曲正切激活函数
    • 3)ReLU激活函数
    • 4) Leaky Relu 和 Parametric Relu

常用激活函数_第1张图片


1、简介

1)why:为什么需要非线性激活函数

给神经网络提供非线性建模能力。如果没有激活函数,网络中全部是线性结构,线性的组合还是线性,与单独一个线性分类器无异,只能处理线性可分问题。 所以,神经网络中使用激活函数来加入非线性因素,提高模型的表达能力。

2)what:激活函数需要满足的条件

  • 一定要激活可导
  • 定义域 需要覆盖所有的实数
  • 非线性
  • 单调递增 (s型曲线 )
    激活函数只是为了增加非线性,并不需要改变输入的响应状态,只需要做到随着输入的增加而增加,随着输入的减小而减小

3)how:如何选择激活函数

  • 如果搭载的神经网络层数不多,选择sigmoid,tanh,relu,softmax 都可以

  • 如果搭建的网络层次较多,一般不宜选择sigmoid、tanh激活函数,因为他们的导数都小于1,尤其是sigmoid的导数在 [0, 1/4]之间,多层叠加后,根据微积分联试法则,随着层数增多,导数或偏导数将指数级变小,导致梯度消失 。

  • 层数较多的神经网络,不仅需要考虑其导数不宜小于1(梯度消失),也不宜大于1,否则可能导致梯度爆炸

  • 导数为1最好,而激活函数relu正好满足这个条件,所以搭建比较深的神经网络时,一般使用relu激活函数

  • softmax 激活函数,常用于多分类神经网络输出层


2、常见的激活函数

1)Sigmoid函数

常用激活函数_第2张图片
当使用sigmoid函数作为激活函数,反向传播求导时:

根据导数链式法则: ∂ L ∂ w = ∂ L ∂ O ∂ O ∂ y ∂ y ∂ w \frac{\partial L}{\partial w} = \frac{\partial L}{\partial O} \frac{\partial O}{\partial y}\frac{\partial y}{\partial w} wL=OLyOwy ∂ L ∂ b = ∂ L ∂ O ∂ O ∂ y ∂ y ∂ b \frac{\partial L}{\partial b} = \frac{\partial L}{\partial O} \frac{\partial O}{\partial y}\frac{\partial y}{\partial b} bL=OLyOby

我们这里主要研究 sigmoid 激活函数部分的导数 ∂ O ∂ y \frac{\partial O}{\partial y} yO 的情况。

Sigmoid 激活函数的缺陷:

a、梯度消失
Sigmoid 的导数最大值是 0.25,所以,在当神经网络反向传播的时候,每层梯度会被动缩小大约1/4。如果当网络层数很多,或者某层出现极端的输出时,根据反向传播的链式法则,就会导致前几层的梯度几乎为0,参数不会被更新,这就是梯度消失现象。如下面的例子,这个4层网络剧其实就等价为两层网络。
常用激活函数_第3张图片
b、不易收敛
常用激活函数_第4张图片
sigmoid激活函数 的输出值范围属于(0,1),或者说是大于0的。我们考虑神经元输入 x 1 x_1 x1 x 2 x_2 x2是上一层 Sigmoid 的函数的输出,即, x 1 > 0 , x 2 > 0 x_1>0, x_2>0 x1>0,x2>0

反向传播时:

  • ∂ L ∂ w 1 = ∂ L ∂ O ∂ O ∂ y ∂ y ∂ w 1 \frac{\partial L}{\partial w_1} = \frac{\partial L}{\partial O} \frac{\partial O}{\partial y}\frac{\partial y}{\partial w_1} w1L=OLyOw1y ,其中, ∂ y ∂ w 1 = x 1 > 0 \frac{\partial y}{\partial w_1}=x_1>0 w1y=x1>0 , ∂ O ∂ y = σ ′ > 0 \frac{\partial O}{\partial y} = \sigma'>0 yO=σ>0
  • ∂ L ∂ w 2 = ∂ L ∂ O ∂ O ∂ y ∂ y ∂ w 2 \frac{\partial L}{\partial w_2} = \frac{\partial L}{\partial O} \frac{\partial O}{\partial y}\frac{\partial y}{\partial w_2} w2L=OLyOw2y ,其中, ∂ y ∂ w 2 = x 2 > 0 \frac{\partial y}{\partial w_2}=x_2>0 w2y=x2>0 , ∂ O ∂ y = σ ′ > 0 \frac{\partial O}{\partial y} = \sigma'>0 yO=σ>0

所以, 参数 w 1 , w 2 w_1, w_2 w1,w2 的梯度的正负完全取决于 损失函数对O的导数 ∂ L ∂ O \frac{\partial L}{\partial O} OL ,这就意味着参数 w 1 , w 2 w_1, w_2 w1,w2 的梯度符号始终一致,被强制的同时始终同时的正向或反向更新,这种情况会使神经网络更慢的收敛到预定位置。


2)Tanh/双曲正切激活函数

常用激活函数_第5张图片
参考sigmoid 函数,可知:
(1)tanh激活函数的输出取值范围为(-1, 1),性能优于sigmoid函数。
(2)tanh 仍然存在梯度消失的情况


3)ReLU激活函数

常用激活函数_第6张图片

优点:

  • 相较于sigmoid函数和tanh函数(需要计算 e − x e^{-x} ex),relu函数的计算简单(正向,反向计算都简单),所以收敛速度快
  • 大于0 的梯度为1, 反向传播的时候,即不会梯度爆炸也不会梯度消失;小于0的,梯度为0,参数不进行调整
  • relu函数可以动态控制神经元的状态,要么激活大于0,要么等于0被抑制,这种性质叫做稀疏性。

缺陷:

  • 和 sigmoid函数一样,是非零均值函数,会影响网络的收敛效果。不过这个缺陷可以通过 将激活函数的输出进行归一化(normalization) 来解决
  • Relu函数 是没有上界的,如果线性单元输出过大,或者网络是循环结构,就会导致梯度累积超出计算机的数值上限,造成梯度爆炸(可通过 参数初始化 和 重新设计网络结构 来解决)
  • 可能有些神经元始终不能被激活,从而让网络表达能力下降的问题,这个现象被称为神经元坏死现象,leaky relu 的设计就是为了避免这个问题。

4) Leaky Relu 和 Parametric Relu

常用激活函数_第7张图片


总结:

  • 激活函数(Activation Function):增加非线性表达
  • 饱和函数: sigmoid, tanh (他们都有可能造成梯度消失的问题)
  • 非饱和函数:Relu
  • 为了解决relu函数的神经元坏死现象,提出了Leaky Relu 和 Parametric Relu

你可能感兴趣的:(#,pytorch,深度学习基础,pytorch,深度学习,人工智能)