赞
踩
relu、softplus、tanh、sigmoid、softmax
线性整流函数(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是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
双曲正切函数(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
也被称为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))
归一化指数函数
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)分类问题
(2)回归问题
(3) 模型基于的分布不同
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()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。