softmax:
将输入的向量映射为0-1之间的实数,并且归一化保证和为1。
python实现:
import numpy as np
z = np.array([1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 3.0])
# z = z - np.max(z) 有资料做了这一步操作
print(np.exp(z)/sum(np.exp(z)))
tensorflow实现:
softmax = tf.exp(logits) / tf.reduce_sum(tf.exp(logits), axis)
softmax 一般用于输出层,而不用于中间层的激活函数。
sigmoid:
将输入的向量映射为0-1之间的实数,和softmax之间的区别是,每一项的加和不再为1,每一项都是竞争关系。
python 实现:
import numpy as np
def sigmoid(x):
num = 1 / (1 + np.exp(-x))
return num
优点:平滑、易于求导。
缺点:只有在较小空间的梯度比较明显(图中-4~4区域),超过这个空间,梯度容易消失
导数:
relu:
当输入值为负数是,梯度为0,输入为正值时梯度与函数斜率保持一致。
import numpy as np
def relu(x):
num= np.where(x < 0, 0, x)
return num
优势:
1.没有了其他复杂激活函数中诸如指数函数的影响,简化了计算过程
2.更加有效率的梯度下降以及反向传播:避免了梯度爆炸和梯度消失问题
导数:小于0时为0,大于0时为输入值。
tanh:
双曲正切函数(tanh)是双曲正弦函数(sinh)与双曲余弦函数(cosh)的比值
import numpy as np
def tanh(x):
return (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))
特点:双曲正切函数的图形夹在水平直线y=1及y=-1之间,且为奇函数,图形通过原点且关于原点对称。
导数:
softplus:
softplus 是对relu函数的平滑,使得负数部分的导数上调,正数部分的导数下调。
import math
def softplus(x):
num = math.log(1+math.exp(x))
return num
mish:
在负值的时候并不是完全截断,而是允许比较小的负梯度流入。
import math
def mish(x):
num = x * math.tanh(math.log(1 + math.exp(x)))
return num
优点:一种自正则的非单调神经激活函数,平滑的激活函数允许更好的信息深入神经网络,从而得到更好的准确性和泛化
激活函数大集合: