经典激活函数
relu、softplus、tanh、sigmoid、softmax
reLU
线性整流函数(Rectified Linear Unit, ReLU)
f
(
x
)
=
m
a
x
(
0
,
x
)
f(x) = max(0,x)
f(x)=max(0,x)
而在神经网络中,Relu作为神经元的激活函数,定义了该神经元在线性变换
w
x
+
b
wx+b
wx+b之后的非线性输出结果。换言之,对于进入神经元的来自上一层神经网络的输入向量,使用线性整流激活函数的神经元会输出
softplus
SoftPlus是ReLU函数的平滑近似,可用于将网络的输出约束为始终为正。
f
(
x
)
=
log
(
1
+
e
x
)
f(x) = \log (1 + {e^x})
f(x)=log(1+ex)
它的导数是sigmoid
f
′
(
x
)
=
1
1
+
e
−
x
f'(x) = \frac{1}{{1 + {e^{ - x}}}}
f′(x)=1+e−x1
tanh
双曲正切函数(hyperbolic tangent function)是双曲函数的一种,经常简写为tanh,双曲正切函数(tanh)是双曲正弦函数(sinh)与双曲余弦函数(cosh)的比值,其形式为:
tanh
x
=
sinh
x
cosh
x
=
e
x
−
e
−
x
e
x
+
e
−
x
\tanh x = \frac{{\sinh x}}{{\cosh x}} = \frac{{{e^x} - {e^{ - x}}}}{{{e^x} + {e^{ - x}}}}
tanhx=coshxsinhx=ex+e−xex−e−x
双曲的导数是双曲余弦的平方的倒数,即
(
tanh
x
)
′
=
1
cosh
2
x
(\tanh x)' = \frac{1}{{{{\cosh }^2}x}}
(tanhx)′=cosh2x1
sigmoid
也被称为Logistic函数,用于隐层神经元输出,取值范围为(0,1),它可以将一个实数映射到(0,1)的区间,可以用来做二分类。在特征相差比较复杂或是相差不是特别大时效果比较好。Sigmoid作为激活函数有以下优缺点:
优点:平滑、易于求导。
缺点:激活函数计算量大,反向传播求误差梯度时,求导涉及除法;反向传播时,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练。
f
(
x
)
=
1
1
+
e
−
x
f(x) = \frac{1}{{1 + {e^{ - x}}}}
f(x)=1+e−x1
尤其!!
f
′
(
x
)
=
e
−
x
(
1
+
e
−
x
)
2
=
f
(
x
)
(
1
−
f
(
x
)
)
f'(x) = \frac{{{e^{ - x}}}}{{{{(1 + {e^{ - x}})}^2}}} = f(x)(1 - f(x))
f′(x)=(1+e−x)2e−x=f(x)(1−f(x))
softmax
归一化指数函数
f
(
x
)
j
=
e
x
j
∑
k
=
1
K
e
z
k
f(x)_j = \frac{e^{x_j}}{\sum_{k=1}^K e^{z_k}}
f(x)j=∑k=1Kezkexj
如果某一个
x
j
x_j
xj 大过其他
x
x
x, 那这个映射的分量就逼近于 1,其他就逼近于 0,主要应用就是多分类。
为什么要取指数:
第一个原因是要模拟 max 的行为,所以要让大的更大。第二个原因是需要一个可导的函数
Softmax 和 Sigmoid区别:
(1)分类问题
- sigmoid将一个real value映射到(0,1)的区间,用来做二分类。
- softmax 把一个 k 维的real value向量(a1,a2,a3,a4….)映射成(b1,b2,b3,b4….)其中 bi是一个 0~1 的常数,输出神经元之和为 1.0,所以相当于概率值,然后可以根据 bi的概率大小来进行多分类的任务。
(2)回归问题
- softmax是sigmoid的扩展,当类别数 k=2 时,softmax 回归退化为 logistic 回归。
(3) 模型基于的分布不同
- softmax建模使用的分布是多项式分布,而logistic则基于伯努利分布
- 多个logistic回归通过叠加也同样可以实现多分类的效果,但是softmax回归进行的多分类,类与类之间是互斥的,即一个输入只能被归为一类;多个logistic回归进行多分类,输出的类别并不是互斥的,即”苹果”这个词语既属于”水果”类也属于”3C”类别。
代码实现
import torch
import torch.nn.functional as F
from torch.autograd import Variable
import matplotlib.pyplot as plt
import os
os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'
#生成伪数据
x = torch.linspace(-5, 5, 200) #torch.linspace(start, end, steps=100, out=None) → Tensor
#返回一个1维张量,包含在区间start和end上均匀间隔的step个点。
x = Variable(x)
x_np = x.data.numpy() #用numpy数据生成plot
#常用激活函数 relu sigmoid tanh softplus softmax
y_relu = torch.relu(x).data.numpy()
y_sigmoid = torch.sigmoid(x).data.numpy()
y_tanh = torch.tanh(x).data.numpy()
y_softplus = F.softplus(x).data.numpy()
y_softmax = torch.softmax(x, dim=0).data.numpy() #sigmoid将一个real value映射到(0,1)的区间,用来做二分类
# 而 softmax 把一个 k 维的real value向量(a1,a2,a3,a4….)映射成一个(b1,b2,b3,b4….)
# 其中 bi 是一个 0~1 的常数,输出神经元之和为 1.0,所以相当于概率值,然后可以根据 bi 的概率大小来进行多分类的任务。
# 二分类问题时 sigmoid 和 softmax 是一样的,求的都是 cross entropy loss,而 softmax
# 可以用于多分类问题多个logistic回归通过叠加也同样可以实现多分类的效果,但是 softmax回归进行的多分类,类与类之间是互斥的,
# 即一个输入只能被归为一类;多个logistic回归进行多分类,输出的类别并不是互斥的,即"苹果"这个词语既属于"水果"类也属于"3C"类别。
plt.figure(1, figsize=(8, 9))
plt.subplot(321)
plt.plot(x_np, y_relu, c='red', label='relu')
plt.ylim((-1, 5))
plt.legend(loc='best')
plt.subplot(322)
plt.plot(x_np, y_sigmoid, c='red', label='sigmoid')
plt.ylim((-0.2, 1.2))
plt.legend(loc='best')
plt.subplot(323)
plt.plot(x_np, y_tanh, c='red', label='tanh')
plt.ylim((-1.2, 1.2))
plt.legend(loc='best')
plt.subplot(324)
plt.plot(x_np, y_softplus, c='red', label='softplus')
plt.ylim((-0.2, 6))
plt.legend(loc='best')
plt.subplot(325)
plt.plot(x_np, y_softmax, c='red', label='softmax')
plt.ylim((-0.2, 1.2))
plt.legend(loc='best')
plt.show()