深度学习4大激活函数
如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层输出实际上都是上层输入的线性函数。
这样就使得无论神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,模型的表达力仍然不够。
我们决定引入非线性函数作为激励函数,这样深层神经网络才有意义(不再是输入的线性组合)。
本文将介绍深度学习中的4个常见的激活函数,从原函数公式、导数函数及二者的可视化来进行对比:
- Sigmoid函数
- Tanh函数
- ReLu函数
- Leaky ReLu函数
激活函数特征
- 非线性:激活函数满足非线性时,才不会被单层网络替代,神经网络才有了意义
- 可微性:优化器大多数是用梯度下降来更新梯度;如果不可微的话,就不能求导,也就不能更新参数
- 单调性:激活函数是单调的,能够保证网络的损失函数是凸函数,更容易收敛
Sigmoid函数
表示形式为tf.nn.sigmoid(x)
原函数
In [1]:
代码语言:javascript复制# import tensorflow as
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
%matplotlib inline
def sigmoid(x):
"""
返回sigmoid函数
"""
return 1 / (1 np.exp(-x))
def plot_sigmoid():
# param:起点,终点,间距
x = np.arange(-10, 10, 0.2)
y = sigmoid(x)
plt.plot(x, y)
plt.grid()
plt.show()
if __name__ == '__main__':
plot_sigmoid()
导数函数
该函数的导数为:
$$begin{aligned} f^{prime}(z) &=left(frac{1}{1 e{-z}}right){prime} &=frac{e{-z}}{left(1 e{-z}right)^2} &=frac{1 e{-z}-1}{left(1 e{-z}right)^2} &=frac{1}{left(1 e{-z}right)}left(1-frac{1}{left(1 e{-z}right)}right) &=f(z)(1-f(z)) end{aligned} $$
另一种求解方法:
步骤1:
$$begin{aligned} frac{mathrm{d} y}{mathrm{~d} x} &=-left(1 e{-x}right){-2} cdotleft(1 e{-x}right){prime} &=-left(1 e{-x}right){-2} cdot 1 cdotleft(e{-x}right){prime} &=-left(1 e{-x}right){-2} cdot 1 cdotleft(e^{-x}right) cdot(-x)^{prime} &=-left(1 e{-x}right){-2} cdot 1 cdotleft(e^{-x}right) cdot(-1) &=left(1 e{-x}right){-2} cdotleft(e^{-x}right) &=frac{e{-x}}{left(1 e{-x}right)^2} end{aligned}$$
步骤2:
步骤3:
代码语言:javascript复制# import tensorflow as
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
%matplotlib inline
def der_sigmoid(x):
"""
返回sigmoid函数
"""
sig = 1 / (1 np.exp(-x)) # sigmoid函数
return sig * (1 - sig) # 输出为导数函数
def plot_der_sigmoid():
# param:起点,终点,间距
x = np.arange(-10, 10, 0.2)
y = der_sigmoid(x) # 导数函数
plt.plot(x, y)
plt.grid()
plt.show()
if __name__ == '__main__':
plot_der_sigmoid()
特点
Sigmoid函数是二分类算法,尤其是逻辑回归中算法中的常用激活函数;也可以作为较少层数的神经网络的激活函数。
它主要是有下面几个特点:
- 能够将自变量