首先四种激活函数分别为:
(1)Sigmoid函数
(2)Tahn函数
(3)ReLu函数
(4)SoftMax函数
1.Sigmoid函数(该函数是将取值为(-∞,+∞)的数映射到(0,1)之间)
优点:在特征相差比较复杂或是相差不是特别打的效果比较好;
缺点:当z值非常大或着非常小时,sigmoid函数的导数将接近0.着会导致权重W的梯度将接近0,使得梯度更新十分缓慢,即梯度消失;
sigmoid函数可用在网络最后一层,作为输出层进行二分类,尽量不要使用在隐藏层。
代码如下:
import numpy as np
import matplotlib.pyplot as plt
def sigmoid(z):
return 1/(1+np.exp(-z))
nums=np.arange(-10,10,step=1)
fig,ax=plt.subplots(figsize=(12,8))
ax.plot(nums,sigmoid(nums),'r')
plt.title('sigmoid')
plt.show()
图像:
2.Tanh函数(该函数是将取值为(-∞,+∞)的数映射到(-1,1)之间)
优点:tanh函数在0附近很短一段区域内可看作线性的。由于tanh函数均值为0,因此弥补了sigmoid函数均值为0.5的缺点。
缺点:当z很大或很小时,导函数接近于0,会导致梯度很小,权重更新非常缓慢,即梯度消失问题。
代码如下:
import numpy as np
import matplotlib.pyplot as plt
def tanh(x):
return (np.exp(x)-np.exp(-x))/(np.exp(x)+np.exp(-x))
fig = plt.figure(figsize=(6, 4))
ax = fig.add_subplot(111)
x = np.linspace(-10, 10)
y = tanh(x)
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))
ax.set_xticks([-10, -5, 0, 5, 10])
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))
ax.set_yticks([-1, -0.5, 0.5, 1])
plt.plot(x, y, label="Tanh", color="red")
plt.legend()
plt.show()
图像:
3.Relu函数(是一种分段线性函数,弥补了sigmoid函数以及tanh函数的梯度消失问题)
优点:
(1)在输入为正数的时候(对于大多数输入z空间来说),不存在梯度消失问题。
(2)计算速度快很多,Relu函数只有线性关系,不管是前向传播还是反向传播,都比sigmoid和tanh要快很多。(sigmoid和tanh要计算指数,计算速度会比较慢)。
缺点:当输入为负时,梯度为0,会产生梯度消失问题。
代码如下:
import numpy as np
import matplotlib.pyplot as plt
def ReLU(x):
return np.maximum(0,x)
fig = plt.figure(figsize=(6, 4))
ax = fig.add_subplot(111)
x = np.linspace(-10, 10)
y = ReLU(x)
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))
ax.set_xticks([-10,10])
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))
ax.set_yticks([0, 10])
plt.plot(x, y, label="ReLU(x)", color="red")
plt.legend()
plt.show()
图像:
4.SotfMax函数(sotfmax用于多分类过程中,它将多个神经元的输出,映射到(0,1)区间内,可以堪称概率理解,从而进行多分类)
假设有一个数组,V, Vi表示V中的第i个元素,那么这个元素的softmax值就是
代码如下:
import numpy as np
def softmax(x):
D = np.max(x)
exp_x = np.exp(x-D)
return exp_x / np.sum(exp_x)
图像: