什么是激活函数
-
激活函数(Activation functions)主要作用在神经元上,是神经网络模型去学习、理解非常复杂和非线性的函数来说起到非常重要的作用,它将非线性特性引入到神经网络中。将A-NN模型中负责将神经元的输入映射到输出端。
-
如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,在神经网络将无法学习和模拟其他复杂类型的数据,例如图像、视频、音频、语音等
常见的激活函数特点
sigmoid
函数公式及导数
函数图像
import matplotlib.pyplot as plt
import numpy as np
x=np.linspace(-5,5,100)
y=1/(1+np.exp(-x))
plt.xlabel("x")
plt.ylabel("y")
plt.title("sigmoid function")
plt.plot(x,y,color='r',label="sigmoid")
plt.legend()
plt.grid(linewidth=1)
sigmoid的导数图像
import matplotlib.pyplot as plt
import numpy as np
x=np.linspace(-5,5,100)
y=np.exp(-x)/pow((1+np.exp(-x)),2)
plt.title("sigmoid derivative image")
plt.plot(x,y,color='b',label="derivative")
plt.legend()
plt.grid(linewidth=1)
- sigmoid函数输出范围(0,1)
- sigmoid导数取值范围是[0, 0.25],通常我们会将权重初始值|W|初始化为为小于1的随机,随着网络层数的加深,求解的梯度会以指数级别的减小,出现梯度消失,使得网络学习较慢,无法收敛,当权重值w大于1时,反之梯度会以指数级别增长,出现梯度爆炸
tanh
函数公式
tanh函数图像
x=np.linspace(-5,5,100)
y=(1-np.exp(-2*x))/(1+np.exp(-2*x))
plt.xlabel('x')
plt.ylabel('y')
plt.title("Tanh function ")
plt.plot(x,y,color='r',label='Tanh')
plt.legend()
plt.grid(linewidth=1)
tanh导数图像
x=np.linspace(-5,5,100)
y=1-pow((1-np.exp(-2*x))/(1+np.exp(-2*x)),2)
plt.title("derivative image")
plt.plot(x,y,color='b',label='derivative')
plt.legend()
plt.grid(linewidth=1)
-
tanh的输出范围时(-1, 1)
-
tanh导数范围在(0, 1)之间,相比sigmoid的(0, 0.25),梯度消失问题会得到缓解,但仍然还会存在
relu
函数公式
函数图像
x=np.linspace(-4,4,100)
y=x*(x>0)
plt.xlabel('x')
plt.ylabel('y')
plt.title("Relu function")
plt.plot(x,y,color='r',label="Relu")
plt.legend()
plt.grid(linewidth=1)
导数
x=np.linspace(0,4)
y=np.linspace(1,1)
plt.title("derivative image")
plt.plot(x,y,color='b',label="derivative")
plt.grid(linewidth=1)
x=np.linspace(-4,0)
y=np.linspace(0,0)
plt.plot(x,y,color='b')
-
ReLU在x>0下,导数为常数1,导数为常数1的好处就是在“链式反应”中不会出现梯度消失,
-
ReLU在x<0下,输出置为0,可能会导致模型无法学习到有效特征,所以如果学习率设置的太大,就可能会导致网络的大部分神经元处于无效状态,所以使用ReLU的网络,学习率不能设置太大。另一方面,也起到到了一个去除噪音的目的,对于输入的大批量的样本数据,将其密集矩阵转化为稀疏矩阵,保留数据关键信息,使得模型更具鲁棒性
Leaky ReLU
- Leaky ReLU 保证在 x < 0 的时候,梯度仍然不为 0。理论上来说,Leaky ReLU 有 ReLU 的所有优点,但在实际操作中没有证明总是好于 ReLU,因此不常用