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。