激活函数
激活函数的意义:激活函数为层与层之间增加非线性连接,增加模型的复杂性,如果层之间没有非线性,那么即使很深的层堆叠也等同于单个层
例如连接这两个线性函数等于得到另一个线性函数
1.Sigmoid
- 优缺点:
优点
- 平滑梯度:防止输出值产生跳跃
- 输出值约束在0-1之间:规范化每个神经元的输出值
- 明确的预测:对于X大于2或小于-2的X,趋向于将Y值(预测)带到曲线的边缘,非常接近1或0。
缺点
- 梯度消失问题:只对-4 to 4之间的值敏感,对于非常高或非常低的X值,预测值几乎没有变化,从而导致梯度消失。 这可能会导致网络拒绝进一步学习,或者太慢而无法准确
- 计算代价大
- 不以0为中心:无法对具有强负,中性和强正值的输入数据进行建模。
- 公式及梯度公式
- 函数图与导数图
- 代码实现
# sigmoid 函数
import numpy as np
def sigmoid_function(x):
z = (1/(1 + np.exp(-x)))
return z
# sigmoid 导数
def sigmoid_derivative(x):
return sigmoid(x)*(1-sigmoid(x))
2.Tanh
- 优缺点:
优点
- 以0为中心:可以更轻松地对具有强负,中性和强正值的输入数据进行建模。
- 平滑梯度:防止输出值产生跳跃
- 输出值约束在-1-1之间:规范化每个神经元的输出值
缺点
- 梯度消失问题:仅对-2 to 2之间的值敏感,对于非常高或非常低的X值,预测值几乎没有变化,从而导致梯度消失。 这可能会导致网络拒绝进一步学习,或者太慢而无法准确
- 计算代价大
- 公式及梯度公式
- 函数图与导数图
- 代码实现
# Tanh 函数
import numpy as np
def tanh_function(x):
z = (2/(1 + np.exp(-2*x))) -1
return z
# Tanh 导数
def tanh_derivative(x):
return 1 - (tanh_function(x))**2
3.ReLU
- 优缺点:
优点
- 计算代价小:允许网络更快的收敛
- 非线性分段函数:尽管它看起来像线性函数,但ReLU具有微分函数并允许反向传播
缺点
- Dying ReLU问题:当输入接近零或为负时,函数的梯度变为零,网络将无法执行反向传播,也无法学习。
- 公式及梯度公式
- 函数图与导数图
- 代码实现
# ReLU 函数
def relu_function(x):
if x<0:
return 0
else:
return x
# ReLU 导数
def relu_derivative(x):
if x>= 0:
return 1
else:
return 0
4.Leaky ReLU
- 优缺点:
优点
- 防止Dying ReLU问题:ReLU的这种变化在负区域具有较小的正斜率,因此即使对于负输入值,它也能够进行反向传播
- 计算代价小:允许网络更快的收敛
- 非线性分段函数:尽管它看起来像线性函数,但ReLU具有微分函数并允许反向传播
缺点
- 结果不一致:Leaky ReLU无法为负输入值提供一致的预测。
- 公式及梯度公式
- 函数图与导数图
- 代码实现
# Leaky ReLU函数
import numpy as np
def leaky_relu_function(x):
if x >= 0:
return x
else:
return 0.01x
# Leaky ReLU 导数
def leaky_relu_derivative(x):
if x >= 0:
return 1
else:
return 0.01
5.Parametric ReLU
- 优缺点:
优点
- 允许学习负斜率:与Leaky ReLU不同,此函数提供函数负数部分的斜率作为参数。 因此,可以进行反向传播并学习最合适的α值。
缺点
- 对于不同的问题可能会有不同的表现。
- 公式及梯度公式
- 函数图
- 代码实现
# Parametric 函数
def parametric_function(x, alpha):
if x >= 0:
return x
else:
return alpha*x
# Parametric 导数
def parametric_derivative(x, alpha):
if x >= 0:
return 1
else:
return alpha
Softmax
- 优缺点:
优点
- 能够处理多分类:其他激活函数只能处理一个类,将每个类别的输出归一化在0和1之间,得出输入值属于特定类别的概率。
- 常用于输出神经元:通常,Softmax仅用于输出层,用于需要将输入分类为多个类别的神经网络。
- 公式
- 梯度公式(由于该函数的独特性,下面重点讲下其推导过程)
推导开始:
为了方便进行代码书写,此处可以改写为雅克比矩阵的形式
知识补充: 雅克比矩阵
假如都是的函数,并且相对于各个自变量的偏微分都存在,那么定义为:
- 代码实现
# softmax 函数
import numpy as np
def softmax_function(arr):
"""
input: a array
return: a array after computed
"""
exps = np.exp(arr)
sums = np.sum(exps)
return np.divide(exps, sums)
# softmax 导数
def softmax_derivative(arr):
"""
input: a array after computed by softmax
output: n*n matrix, n = len(arr)
"""
s = arr.reshape(-1, 1)
return np.diagflat(s) - np.dot(s, s.T)
网友评论