赞
踩
s i g m o i d ( x ) = σ ( x ) = 1 1 + e − x sigmoid\left ( x\right )=\sigma \left ( x\right )=\frac{1}{1+e^{-x}} sigmoid(x)=σ(x)=1+e−x1
(1)便于求导的平滑函数
(2)能压缩数据,保证数据幅度不会有问题
(3)用于将预测概率作为输出的模型。由于概率的取值范围是 0 到 1,因此 Sigmoid 函数非常合适
(1)容易出现梯度消失(gradient vanishing)的现象:当激活函数接近饱和区时,变化太缓慢,导数接近0,根据后向传递的数学依据是微积分求导的链式法则,当前导数需要之前各层导数的乘积,几个比较小的数相乘,导数结果很接近0,从而无法完成深层网络的训练。
(2)Sigmoid的输出不是0均值的:这会导致后层的神经元的输入是非0均值的信号,这会降低权重更新的效率。
(3)幂运算相对耗时
m = nn.Sigmoid()
input = torch.randn(2)
output = m(input)
T a n h ( x ) = t a n h ( x ) = 2 1 + e − 2 x − 1 Tanh\left ( x\right )=tanh\left ( x\right )=\frac{2}{1+e^{-2x}}-1 Tanh(x)=tanh(x)=1+e−2x2−1
tanh函数将输出值映射到了-1到1之间,因此它是0均值的
(1)容易出现梯度消失(gradient vanishing)的现象
(2)幂运算相对耗时
注:在一般的二元分类问题中,tanh 函数用于隐藏层,而 sigmoid 函数用于输出层,但这并不是固定的,需要根据特定问题进行调整。
m = nn.Tanh()
input = torch.randn(2)
output = m(input)
R e L U ( x ) = ( x ) + = m a x ( 0 , x ) ReLU\left ( x\right )=\left ( x\right )^{+}=max\left ( 0,x\right ) ReLU(x)=(x)+=max(0,x)
(1)收敛速度比sigmoid和tanh快(梯度不会饱和,解决了梯度消失问题)
(2)计算复杂度低,不需要进行指数运算
(1)ReLU 函数不是以 0 为中心的函数
(2)Dead ReLU Problem(神经元坏死现象):某些神经元可能永远不会被激活,导致相应参数不会被更新(在负数部分,梯度为0)。产生这种现象的两个原因:参数初始化问题;learning rate太高导致在训练过程中参数更新太大。解决办法:采用Xavier初始化方法;以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。
(3)ReLu不会对数据做幅度压缩,所以数据的幅度会随着模型层数的增加不断扩张。
m = nn.ReLU()
input = torch.randn(2)
utput = m(input)
L e a k y R e L U ( x ) = m a x ( 0 , x ) + n e g a t i v e _ s l o p e × m i n ( 0 , x ) LeakyReLU\left ( x\right )=max\left ( 0,x\right )+negative\_slope\times min\left ( 0,x\right ) LeakyReLU(x)=max(0,x)+negative_slope×min(0,x)
(1)LeakyReLU通过把x的非常小的线性分量给予负输入来调整负值的零梯度(zero gradients)问题
(2)leak有助于扩大ReLU函数的范围,通常 n e g a t i v e _ s l o p e negative\_slope negative_slope的值为0.01左右
(3)Leaky ReLU 的函数范围是负无穷到正无穷
m = nn.LeakyReLU(0.1)
input = torch.randn(2)
output = m(input)
E
L
U
(
X
)
=
{
x
if
x
>
0
α
∗
(
e
x
−
1
)
if
x
⩽
0
ELU\left ( X\right )=
(1)没有Dead ReLU问题,输出的平均值接近0,以0为中心;
(2)ELU通过减少偏置偏移的影响,使正常梯度更接近于单位自然梯度,从而使均值向零加速学习;
(3)ELU在较小的输入下会饱和至负值,从而减少前向传播的变异和信息。
它的计算强度更高。与Leaky ReLU类似,尽管理论上比ReLU要好,但目前在实践中没有充分的证据表明ELU总是比ReLU好。
m = nn.ELU()
input = torch.randn(2)
output = m(input)
P R e L U ( x ) = m a x ( 0 , x ) + a ∗ m i n ( 0 , x ) PReLU\left ( x\right )=max\left ( 0,x\right )+a\ast min\left ( 0,x\right ) PReLU(x)=max(0,x)+a∗min(0,x)
(1)在负值域,PReLU的斜率较小,这也可以避免Dead ReLU问题。
(2)与ELU相比,PReLU 在负值域是线性运算。尽管斜率很小,但不会趋于0。
m = nn.PReLU()
input = torch.randn(2)
output = m(input)
S o f t m a x ( x i ) = e x p ( x i ) ∑ j e x p ( x j ) Softmax\left ( x_{i}\right )=\frac{exp\left ( x_{i}\right )}{\sum_{j}^{}exp\left ( x_{j}\right )} Softmax(xi)=∑jexp(xj)exp(xi)
(1)Softmax是用于多类分类问题的激活函数,在多类分类问题中。对于长度为K的任意实向量,Softmax可以将其压缩为长度为K,值在(0,1)范围内,并且向量中元素的总和为1的实向量。
(2)Softmax与正常的max函数不同:max函数仅输出最大值,但Softmax确保较小的值具有较小的概率,并且不会直接丢弃。
(3)Softmax函数的分母结合了原始输出值的所有因子,这意味着Softmax函数获得的各种概率彼此相关。
m = nn.Softmax(dim=1)
input = torch.randn(2, 3)
output = m(input)
S o f t p l u s ( x ) = 1 β ∗ l o g ( 1 + e x p ( β ∗ x ) ) Softplus\left ( x\right )=\frac{1}{\beta }\ast log\left ( 1+exp\left ( \beta \ast x\right )\right ) Softplus(x)=β1∗log(1+exp(β∗x))
Softplus函数类似于ReLU函数,但是相对较平滑,像ReLU一样是单侧抑制。
m = nn.Softplus()
input = torch.randn(2)
output = m(input)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。