深度学习基础知识之**函数

在深度视觉的三大基本任务中,我们构建一个卷积神经网络,**函数是必不可少的,例如sigmoid,relu等,下面我们来介绍下**函数。

什么是**函数?

神经网络中每层的输入是上一层的输出,每层输出是下一层的输入,所以在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为**函数。

如图所示:

深度学习基础知识之**函数除输入层外,每个神经元被分成两部分,第一部分我们认为就是上一层的输出;第二部分就是经过一个**函数的作用,作为下一层的输入。

为什么要用**函数?

不使用**函数的话,神经网络的每层都只是做线性变换,线性函数无论叠加多少层,都是线性的,只是斜率和截距不同,叠加网络对解决实际问题没有多大帮助;因为需要神经网络解决的实际问题基本都是非线性的。

我们现在有一个任务,要分4个类别,用下面两个图来说明:

深度学习基础知识之**函数没有加入**函数,绿色的五角星在直线上,占了一部分。
深度学习基础知识之**函数加入了**函数,绿色五角星被很好的分开了。

从以上两幅图片对比,用了**函数分类效果更准确,这也说明非线性拟合能力更强。

线性非线性在这里就可以理解为直线和曲线。
其实光理解直线和曲线不太严谨,不过这里不影响后续学习。

常用的**函数

sigmoid

函数公式:

s i g m o i d = 1 1 + e − x sigmoid = \frac{1}{1+e^{-x}} sigmoid=1+ex1

函数图像如图所示
深度学习基础知识之**函数
Sigmoid函数:输出值范围为[0,1]之间的实数,用作2分类问题。

缺点:

  1. sigmoid函数饱和使梯度消失。
  2. sigmoid函数输出不是零为中心,即zigziag现象,收敛慢。
  3. 指数函数计算比较消耗计算资源。

sigmoid函数现在不常用。
sigmoid函数求导:
s i g m o i d = F ( x ) = 1 1 + e − x F ( x ) ′ = 1 1 + e − x = − − e − x ( 1 + e − x ) 2 = e − x ( 1 + e − x ) 2 = 1 1 + e − x ⋅ e − x 1 + e − x = 1 1 + e − x ⋅ 1 + e − x − 1 1 + e − x = 1 1 + e − x ⋅ ( 1 + e − x 1 + e − x + 1 1 + e − x ) = F ( x ) ( 1 − F ( x ) ) sigmoid = F(x) = \frac{1}{1+e^{-x}} \\ F(x)^{'} = \frac{1}{1+e^{-x}} \\ =- \frac{-e^{-x}}{(1+e^{-x})^2} = \frac{e^{-x}}{(1+e^{-x})^2}\\ = \frac{1}{1+e^{-x}}·\frac{e^{-x}}{1+e^{-x}} \\ = \frac{1}{1+e^{-x}}· \frac{1 + e^{-x} -1}{1+e^{-x}} \\ = \frac{1}{1+e^{-x}}· (\frac{1 + e^{-x} }{1+e^{-x}} + \frac{1}{1+e^{-x}} ) \\ = F(x)(1 - F(x)) sigmoid=F(x)=1+ex1F(x)=1+ex1=(1+ex)2ex=(1+ex)2ex=1+ex11+exex=1+ex11+ex1+ex1=1+ex1(1+ex1+ex+1+ex1)=F(x)(1F(x))
后续反向传播会用到,感兴趣的可以了解一下,不看也没有关系。

tanh

函数公式:
t a n h = 1 − e − x 1 + e − x tanh = \frac{1 - e^{-x}}{1+e^{-x}} tanh=1+ex1ex

函数图像如下图所示:

深度学习基础知识之**函数
优点:tanh解决了sigmoid的输出非“零为中心”的问题

缺点:

  1. 依然有sigmoid函数过饱和的问题。
  2. 依然进行的是指数运算

ReLU

函数公式:
r e l u = m a x ( 0 , x ) relu = max(0, x) relu=max(0,x)

函数图像如下图所示:
深度学习基础知识之**函数
优点:

  1. ReLU解决了梯度消失的问题,至少x在正区间内,神经元不会饱和。
  2. 由于ReLU线性、非饱和的形式,在SGD中能够快速收敛。
  3. 算速度要快很多。ReLU函数只有线性关系,不需要指数计算,计算速度都比sigmoid和tanh快。

缺点:

  1. ReLU的输出不是“零为中心”。
  2. 随着训练的进行,可能会出现神经元死亡,权重无法更新的情况。这种神经元的死亡是不可逆转的死亡。

常用的还是relu函数,当你不知道用啥,就用relu。

选择**函数的一些建议

  1. 通常来说,不能把各种**函数串起来在一个网络中使用。
  2. 如果使用ReLU,那么一定要小心设置学习率(learning rate),并且要注意不要让网络中出现很多死亡神经元。
  3. 尽量不要使用sigmoid**函数,可以试试tanh,不过我还是感觉tanh的效果会比不上ReLU。

参考文章链接:
https://www.cnblogs.com/XDU-Lakers/p/10557496.html