增加非线性,帮助nn学习各种现象,增加神经网络的表达能力,从而提高神经网络的性能
例如:
提高模型鲁棒性、
缓解梯度消失问题、
将特征输入映射到新的特征空间
加速模型收敛
那么在该网络中,每一层的输出都是上一层输入的线性函数,
无论最终的神经网络有多少层,输出都是输入的线性组合;
其一般也只能应用于线性分类问题中,
例如,
多层感知机 (MLP)
Multi-Layer Perceptron
(以Tanh,Sigmoid和hard-Sigmoid函数为主)
常被用作神经网络的阈值函数,将变量映射到0,1之间
i.e. 将input压缩到 [0,1]
表达式
函数图像
优点:
缺点:
Tanh是双曲函数中的一个,Tanh()为双曲正切。
在数学中,双曲正切“Tanh”是由基本双曲函数双曲正弦和双曲余弦推导而来。
函数的输出范围在 -1~1 之间
i.e. 将input压缩到 [-1,1]
表达式
函数图像
优点:
缺点:
import matplotlib.pyplot as plt
import numpy as np
class ActivateFunc():
def __init__(self, x, b=1, lamb=2, alpha=1, a=2):
super(ActivateFunc, self).__init__()
self.x = x
self.b = b
self.lamb = lamb
self.alpha = alpha
self.a = a
def __init__(self, x, b=1, lamb=2, alpha=1, a=2):
super(ActivateFunc, self).__init__()
self.x = x
self.b = b
self.lamb = lamb
self.alpha = alpha
self.a = a
def Sigmoid(self):
y = np.exp(self.x) / (np.exp(self.x) + 1)
y_grad = y*(1-y)
return [y, y_grad]
def Tanh(self):
y = np.tanh(self.x)
y_grad = 1 - y * y
return [y, y_grad]
def Hard_Sigmoid(self):
f = (2 * self.x + 5) / 10
y = np.where(np.where(f > 1, 1, f) < 0, 0, np.where(f > 1, 1, f))
y_grad = np.where(f > 0, np.where(f >= 1, 0, 1 / 5), 0)
return [y, y_grad]
def PlotActiFunc(x, y, title):
plt.grid(which='minor', alpha=0.2)
plt.grid(which='major', alpha=0.5)
plt.plot(x, y)
plt.title(title)
plt.show()
def PlotMultiFunc(x, y):
plt.grid(which='minor', alpha=0.2)
plt.grid(which='major', alpha=0.5)
plt.plot(x, y)
if __name__ == '__main__':
x = np.arange(-10, 10, 0.01)
activateFunc = ActivateFunc(x)
activateFunc.b = 1
PlotActiFunc(x, activateFunc.Sigmoid()[0], title='Sigmoid')
PlotActiFunc(x, activateFunc.Tanh()[0], title='Tanh')
PlotActiFunc(x, activateFunc.Hard_Sigmoid()[0], title='Hard_Sigmoid')
plt.figure(1)
PlotMultiFunc(x, activateFunc.Sigmoid()[0])
PlotMultiFunc(x, activateFunc.Hard_Sigmoid()[0])
plt.legend(['Sigmoid', 'Hard-Sigmoid'])
plt.figure(2)
PlotMultiFunc(x, activateFunc.Tanh()[0])
plt.legend(['Tanh'])
plt.show()
未完待续……