Sigmoid
torch.nn.Sigmoid
优点:
- 用于二元分类的激活函数。
缺点:
- 梯度消失:当输入 x>5 或 x < -5 时,变化太缓慢,导数接近0,根据后向传递的数学依据是微积分求导的链式法则,当前导数需要之前各层导数的乘积,几个比较小的数相乘,导数结果很接近0,从而无法完成深层网络的训练。
- Sigmoid的输出不是0均值的:这会导致后层的神经元的输入是非0均值的信号,这会对梯度产生影响。以 f=sigmoid(wx+b)为例, 假设输入均为正数(或负数),那么对w的导数总是正数(或负数),这样在反向传播过程中要么都往正方向更新,要么都往负方向更新,导致有一种捆绑效果,使得收敛缓慢。
- 幂运算相对耗时。
Tanh
torch.nn.Tanh
优点:
-
Sigmoid
的变种,改善的是tanh
函数将输出值映射到了-1到1之间,因此它是0均值的了。
缺点:
- 同样存在梯度消失和幂运算的问题。
Softsign
torch.nn.Softsign
优点:
-
Tanh
的变种,解决了 幂运算问题。
缺点:
- 还存在梯度消失问题,但梯度消失的区间变宽了,适当调整输入数据区间,还是可以获得可观的梯度。
ReLU
torch.nn.ReLU(inplace=False)
ReLU(x)=max(0,x)
优点:
- 收敛速度比 sigmoid 和 tanh 快;(梯度不会饱和,解决了梯度消失问题)
- 计算复杂度低,不需要进行指数运算
缺点:
- 输出不是0均值的;
- Dead ReLU Problem(神经元坏死现象):某些神经元可能永远不会被激活,导致相应参数不会被更新(在负数部分,梯度为0)。产生这种现象的两个原因:参数初始化问题;learning rate太高导致在训练过程中参数更新太大。解决办法:采用Xavier初始化方法;以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。
- ReLu不会对数据做幅度压缩,所以数据的幅度会随着模型层数的增加不断扩张。
LeakyReLU
torch.nn.LeakyReLU(negative_slope=0.01, inplace=False)
negative_slope 调整 x<0 部分的斜率
negative_slope=0.01(默认)
negative_slope=2.7
优点:
-
Relu
变种,处理了负值的情况,并解决Relu
神经元坏死。
缺点:
- 不会对数据做幅度压缩
PReLU
torch.nn.PReLU(num_parameters=1, init=0.25)
其中a 是一个可学习的参数,当不带参数调用时,即nn.PReLU(),在所有的输入通道上使用同一个a,当带参数调用时,即nn.PReLU(nChannels),在每一个通道上学习一个单独的a。
注意:当为了获得好的performance学习一个a时,不要使用weight decay。
num_parameters:要学习的a的个数,默认1
init:a的初始值,默认0.25
图形和
LeakyReLU
类似init=0.25(默认)
init=2
ELU
torch.nn.ELU(alpha=1.0, inplace=False)
ELU(x)=max(0,x)+min(0,α∗(exp(x)−1))
alpha 调整 x<0 的部分
alpha=1(默认)
alpha=3
优点:
-
ReLU
变种,解决Relu
神经元坏死,均值为0的输出、而且处处一阶可导
缺点:
- 幂运算问题消耗比
ReLU
大
CELU
torch.nn.CELU(alpha=1.0, inplace=False)
CELU(x)=max(0,x)+min(0,α∗(exp(x/α)−1))
ELU
变种,相对于ELU
转折处更平滑
alpha=1 时和ELU
alpha=1 一致
alpha=3
SELU
torch.nn.SELU(inplace=False)
SELU(x)=scale∗(max(0,x)+min(0,α∗(exp(x)−1)))
α=1.6732632423543772848170429916717
scale=1.0507009873554804934193349852946
ELU
变种
GELU
torch.nn.GELU
GELU(x)=x∗Φ(x)
Φ(x)是高斯分布的累积分布函数
ELU
变种,输出不是0均值的
Softplus
torch.nn.Softplus(beta=1, threshold=20)
ReLU
变种,SoftPlus
是ReLU
函数的平滑近似
beta=1, threshold=20(默认)
beta=.5, threshold=20
ReLU6
torch.nn.ReLU6(inplace=False)
ReLU6(x)=min(max(0,x),6)
ReLU
变种,和ReLU
相比在x==6的位置有转折
RReLU
torch.nn.RReLU(lower=0.125, upper=0.3333333333333333, inplace=False)
ReLU
变种,lower,upper 分别是2个斜率 对应 x<0阴影的两个斜边,也就是负值的斜率在训练中是随机的,这个值在测试环节就会固定下来
lower,upper默认
lower=0.3, upper=3
Threshold
torch.nn.Threshold(threshold, value, inplace=False)
ReLU
变种,通过参数调整处理了负值的情况
threshold=0, value=0 和 relu
一致
threshold=-2, value=-2
threshold=0, value=-2,threshold != value 时会出现有间断
Hardshrink
torch.nnHardshrink(lambd=0.5)
lambd 调整中间=0 的长度
lambd=0.5(默认)
lambd=2
Softshrink
torch.nn.Softshrink(lambd=0.5)
相对于Hardshrink
没有跳跃
lambd=0.5(默认)
lambd=2
Tanhshrink
torch.nn.Tanhshrink
Tanhshrink(x)=x−Tanh(x)
较Softshrink
转折处有弧度
Hardtanh
torch.nn.Hardtanh(min_val=-1.0, max_val=1.0, inplace=False)
min_val=-1.0, max_val=1.0 调整中间 y=x
min_val=-1.0, max_val=1.0(默认)
min_val=-3.0, max_val=3.0
LogSigmoid
torch.nn.LogSigmoid()
Softmin
对n维输入张量运用Softmin函数,将张量每个的元素缩放到(0,1)区间且最后一维和为1
Softmax
对n维输入张量运用Softmax函数,将张量每个的元素缩放到(0,1)区间且最后一维和为1
Softmax2d
运用到输入 4D 的 tensor, 将张量每行的元素缩放到(0,1)区间
LogSoftmax
对 Softmax 求 log
参考:
Non-linear activations (weighted sum, nonlinearity)
Pytorch激活函数及优缺点比较
https://www.jianshu.com/p/68bd249327ce
激活函数ReLU、Leaky ReLU、PReLU和RReLU