1. 什么是激活函数
在这里插入图片描述
如上图所示, 激活函数 (Activation Function) 是在人工神经网络神经元上运行的函数, 负责将神经元的输入映射到输出. 激活函数为人工神经网络引入非线性因素, 可以让人工神经网络模型更好的去学习, 理解非常复杂的非线性关系.
2. 为什么要用激活函数
2.1 感知机(Perception)
感知机 (Perception) 是人工神经网络的前身, 在感知机模型中不使用激活函数, 是一个线性分类器.
2.1.1 一层感知机
一层感知机网络如下图所示:
在这里插入图片描述
表达式为:
y = w_{1}x_{1}+w_{2}x_{2}+w_{3}x_{3}
观察上式可知: 一层感知机是一个线性分类器;
2.1.2 二层感知机
二层感知机如下图所示:
在这里插入图片描述
y=w_{2-1}(w_{1-11}x_{1}+w_{1-21}x_{2}+w_{1-31}x_{3})\\+w_{2-2}(w_{1-12}x_{1}+w_{1-22}x_{2}+w_{1-32}x_{3})\\ +w_{2-3}(w_{1-13}x_{1}+w_{1-23}x_{2}+w_{1-33}x_{3})
整理如下:
y=(w_{2-1}w_{1-11}+w_{2-2}w_{1-12}+w_{2-3}w_{1-13})x_{1}\\+(w_{2-1}w_{1-21}+w_{2-2}w_{1-22}+w_{2-3}w_{1-23})x_{2}\\+(w_{2-1}w_{1-31}+w_{2-2}w_{1-32}+w_{2-3}w_{1-33})x_{3}
把一层感知机的表达式和二层感知机整理后的式子进行对比发现: 感知机的层数并不能改变其是线性分类器的特性.
2.2 线性不可分
线性分类器存在一个问题: 不能解决线性不可分的问题. 最简单的线性不可分问题如下图所示: 使用一条直线把橙色的正方形和绿色的圆形进行分割.
在这里插入图片描述
上图中红色和深绿色的线是两条例子, 经试验发现, 在二维平面中不存在这样一条直线可以把橙色的正方形和绿色的圆形进行分割.
这就是感知机 (线下分类器) 面临的问题: 不能解决线性不可分问题.
2.3 激活函数的作用
激活函数最重要的作用就是可以给模型带来非线性因素, 直白的理解就是把直线 "掰弯".
在这里插入图片描述
如上图所示, 当感知器加入激活函数后, 可以使用曲线把橙色的正方形和绿色的圆形分割开来.
3. 常见的激活函数
3.1 sigmoid
表达式
sigmoid 是常用的非线性激活函数, 解析式如下所示:
sigmoid(x) = f(x) = \frac{1}{1+e^{-x}}
导函数的表达式如下:
sigmoid'(x)=f'(x) = \frac{e^{-x}}{(1+e^{-x})^2}=\frac{1}{1+e^{-x}}-\frac{1}{(1+e^{-x})^2}=f(x)\times(1-f(x))
图像
在这里插入图片描述
备注: 橙色的线表示原函数, 蓝色的线表示导函数.
特点
sigmoid 把输入的值转换为 0 到 1 之间, 特别的: 如果是非常大的正数, 就转换为 1, 如果非常小的负数, 则转换为 0;
缺点
从上图可以看出, sigmod 的导函数的值域为: 0, 0.25, 在反向传播 (BP) 更新参数时很容易出现梯度消失的现象;
有饱和区域, 当输入的 x 非常大或非常小时, sigmoid 激活函数的导函数值为 0, 即此时的梯度为 0, 会导致神经元不能更新;
sigmoid 的输出都是正数, 不是 zero centered, 这会导致 zigzag 现象;
sigmoid 含有幂运算, 在求解时比较耗时. 对于规模较大的神经网络, 这会时训练时间增长.
3.2 tanh
表达式
tanh 的解析式如下所示:
tanh(x)=f(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}
tanh 的导函数如下所示:
tanh'(x)=f'(x)=\frac{(e^{x}+e^{-x})^2-(e^{x}-e^{-x})^2}{(e^{x}+e^{-x})^2}=1-(\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}})=1-f^2(x)
图像
在这里插入图片描述
备注: 橙色的线表示原函数, 蓝色的线表示导函数.
特点
tanh 把输入的值转换为 0 到 1 之间, 特别的: 如果是非常大的正数, 就转换为 1, 如果非常小的负数, 则转换为 0;
tanh 解决了 sigmoid 不是 zero centered 的问题. 缺点
从上图可以看出, sigmod 的导函数的值域为: 0, 1, 在反向传播 (BP) 更新参数时仍然会出现梯度消失的现象;
有饱和区域, 当输入的 x 非常大或非常小时, sigmoid 激活函数的导函数值为 0, 即此时的梯度为 0, 会导致神经元不能更新;
tanh 含有幂运算, 在求解时比较耗时. 对于规模较大的神经网络, 这会时训练时间增长.
- 3.3 relu
- 3.3.1 relu
表达式
relu 的解析式如下所示:
relu(x) =f(x)=max(0,x)
relu 的导函数解析式如下所示:
relu'(x)=f'(x)= {{1, x>0 \atop 0, x \leq 0}}
图像
在这里插入图片描述
备注: 橙色的线表示原函数, 蓝色的线表示导函数.
优点
在正区间中, 解决了梯度消失的问题;
不含幂运算, 计算速度非常快;
收敛速度远远快于 sigmoid 和 tanh; 存在的问题
relu 的输出不是 zero-centered;
存在 dead relu problem, 即: 某些神经元在训练过程中会出现永远不会被激活的情况, 因为在反向更新时, 如果梯度太大, 权值更新之后可能会变成负数, 在之后的正向传播的时候, 输出会一直为 0, 造成 dead relu 的问题(备注: 此问题可以通过使用小学习率或者使用 leaky ReLU 等方法改进).
3.3.2 leaky relu
表达式
leaky_relu 的解析式如下所示:
leaky_relu(x) =f(x)=max(ax,x)
leaky_relu 的导函数解析式如下所示:
relu'(x)=f'(x)= {{1, x>0 \atop a, x \leq 0}}
图像
备注: 橙色的线表示原函数, 蓝色的线表示导函数. 特点 leaky relu 是为了解决 relu 的 dead relu 问题而设计的, 将 relu 的前半段用 "ax"(通常 a 取值为 0.01)替换 0. 这样在理论上就解决了 dead relu 的问题.
备注: 在实践中, 并没有证明 leaky relu 在效果上完全优于 relu.
3.3.3 ELU
表达式
elu 的表达式如下所示:
elu(x)=f(x)= {{x,x>0 \atop a(e^{x}-1), x \leq 0}}
elu 导函数的表达式如下所示:
elu'(x)=f'(x)={{1, x>0 \atop ae^{x}, x \leq 0}}
图像
在这里插入图片描述
备注: 橙色的线表示原函数, 蓝色的线表示导函数.
特点
elu 也是为了解决 relu 的 dead relu 问题而设计的, elu 除了具有 relu 的优点之外还具有以下优点:
解决 dead relu 问题;
输出的均值接近于 0, 即满足 zero-centered; 小缺点
计算量比 relu 和 leaky relu 大;
备注: 在实践中, 并没有证明 elu 在效果上完全优于 relu.
来源: https://www.qcloud.com/developer/article/1548121