人工智能基础知识笔记二:激活函数
1、激活函数简介
激活函数(Activation Function)又称激励函数,是在人工神经网络(Artifcial Neurawmwok)中每一个神经元上运行的函数,根据神经元的输人,通过激活函数的作用,产生神经元的输出。
人工神经网络是从信息处理角度模拟人脑神经元网络,建立神经元的简单模型,按不同的连接试组成不同的网络结构。在人工神经网络中,每个神经元都是一个计算单元,大量的神经元节点之间相互连接,每个连接就是数据的一种传输通道,数据从网络一端输人,经过神经元之间的运算,从网络的另一端输出。下图是一个多层神经网络模型:
在上图 中,向量x1,x2,…xn表示输入,ωijk 表示第k层神经元输入向量的权值,bjk 表示第k层第j个神经元输人的常量部分。图中的圆形节点就是神经元,每一个神经元都是一个计算单元,将输人本节点的数据经过计算后产生的输出传到下一层神经元。神经元的模型如下图所示:
来自上一层的神经元的输人向量xi,经神经元连接的权值加权求和,再加上一个与当前神经元相关的常量构成神经元输人。
每一个神经元有一个激活函数,作用于本神经元的输人,产生输出如下:
本层神经元的输出通过神经元连接传入下一层神经元,作为下一层神经元的输入。
如果没有激活函数或激活函数是线性的,即f(x)=x,在这种情况下,每一层节点的输人虽然经过连接的权值和神经元节点的常量作用,但这本质上只是一种线性作用;不论神经网络的层数有多少,任何线性函数的线性组合仍然是线性的,在一张纸上证明它是正确的并不难。按照目前的方式,我们的神经网络仍然只是一个线性分类器,网络的计算能力就相当有限。使用非线性激活函数,可以将线性作用变成非线性作用,在输入输出之间生成非线性映射,使神经网络更加复杂,可以表示输人输出之间非线性的复杂的任意函数映射,可以描述复杂的表单数据,甚至可以具有学习复杂事物的能力。
激活函数是一个应用于每个神经元输出的非线性变换函数。假设 z是神经元的加权输入之和加上偏置项,即 z=∑iwixi+b,其中 wi 是权重,xi 是输入,b是偏置项。那么激活函数 f(z)将这个线性组合转换为最终的输出。
2、激活函数的作用
- 引入非线性:如果没有激活函数或仅使用线性激活函数,无论神经网络有多少层,其表达能力都等同于单层线性模型。非线性激活函数使神经网络能够逼近任意复杂的非线性函数。
- 加速收敛:某些激活函数(如ReLU)有助于加快梯度下降的速度,从而加速模型的收敛。
- 解决梯度消失问题:一些激活函数(如ReLU及其变体)可以缓解梯度消失问题,特别是在深层网络中。
3、常见的激活函数及其优缺点
3.1 Sigmoid
- 定义:
- 函数形状:
-
- 特点:
- 能够把输入的连续实值压缩到[0,1]区间上输出有助于输出值的收敛。如果输入非常大的负数,输出收敛于0;输入非常大的正数,输出收敛为1。
- 应用 Sigmoid 函数,会出现梯度消失情况。神经网络训练连接权值时,一般按照误差反向传播,应用梯度下降法不断对连接权值进行调整。Sigimoid函数的导数在x值非常大或非常小时接近于0,这对梯度下降法非常不利,会导致权值的梯度接近于0,权值的更新变得十分缓慢,即度消失。
- Sigmoid 函数非原点中心对称,不利于下层的计算。Sigmoid的函数的输出值全 为正,在神经网络计算过程中,后一层的神经元将得到前一层输出的非0均值的信 号作为输人,当输入x>0时,对权值局部求梯度为正,这样在反向传播中,权值要 么往正向更新要么往负向更新,使得收敛缓慢。
- Sigmoid 函数含有幂运算,求解时耗时比较长。
- Pyton实现:
import numpy as np
def sigmoid(x):
s = 1/(1 + np.exp(-x))
return s
3.2Tanh (双曲正切)
tanh 函数是另外一种激活函数,与 Sigmoid 函数不同的是它是把(-∞,+∞)的输人映射到(-1.区间。在数学中,tanh称为双曲正切函数,是双曲函数中的一个,可由基本双曲函数双曲正弦和双曲余弦推导而来。
- 定义:
- 函数形状:
-
- 特点:
- 与 Sigmoid 函数类似,tanh 能够把输人的连续实值压缩到(-1,1)区间上输出。如果输入非常大的负数,输出收敛于-1;输人非常大的正数,输出收敛为1,有助于输出值的收敛。
- 相比 Sigmoid 函数,tanh 函数关于原点中心对称,收敛较好。
- (tanh) 函数在x很大或很小时,导数趋于0,因此应用tanh函数也存在梯度消失问题。
- tanh函数也含有幂运算,计算机求解时相对比较耗时。
- Pyton实现:
import numpy as np
def sigmoid(x):
s = (np.exp(x) - np.exp(-x))/(np.exp(x) + np.exp(-x))
return s
3.3 ReLU函数
ReLU函数又称为修正线性单元(Rectifed Linear Unit),是一种分段线性函数,它弥补了Sigmoid 函数以及 tanh 函数的梯度消失问题。
- 定义:
- 函数形状:
- 特点:
- 在x>0 时,导数为1,解决了梯度消失问题。
- 计算速度很快,只需要判断输入是否大于0
- 收敛速度快于 Sigmoid 函数和 tanh 函数。
- ReLU 是非原点对称的,会影响收敛速度。
- 当输入小于0时,输出为0,导致某些神经元永远不会被激活,相应的权值也不会被更新。
- Pyton实现:
import numpy as np
def relu(x):
s = np.where(x<=0, 0, x)
return s
3.4 Leaky ReLU函数
为了解决 ReLU算法在x轴负向为0可能导致部分神经元无法激活的问题,将ReLU前半段。设为ax非0、通常=001。改进的函数称为LcakyRLU函数。另外一种思路是基于参数的方法新算法来确定ax中的参数a,这种方法又称为PamnmemicReLU(pReLU)方法
- 定义:
- 函数形状:
- 特点:
Leaky ReLU 函数的特点与 ReLU 函数类似,理论上具有ReLU 函数的所有优点,同时也解决了ReLU函数可能导致部分神经元无法激活的问题。
- Pyton实现
import numpy as np
def relu(x):
s = np.where(x<=0, 0.01*x, x)
return s
4、 总结
机器学习需要大量时间来处理数据,模型的收敛速度非常重要。在选取激活函数时,其收敛速度以及计算的简单性要重点考虑。总体而言,有以下选取规则:
- (1) 尽量选择具有中心对称特性的激活函数,这样保证多层神经网络中数据可正可负,加速模型的收敛。
- (2)ReLU函数是一个通用的激活函数,其收敛性较好,但 ReLU 函数一般只用在隐藏层。
- (3)由于梯度消失问题会降低收敛性,所以在多层网络中,要减少使用 Sigmoid 函数和tanh函数。
- (4)对于分类器,Sigmoid 函数及其组合函数效果会比较好。