一、激活函数 sigmoid,tanh,relu,softmax
1、sigmoid
Sigmoid函数是一种常用的非线性函数,可以将任何实数映射到0到1之间。它通常用于将不归一化的预测值转换为概率分布
使用场景:
输出限制在0到1之间,表示概率分布。
处理回归问题或二元分类问题。
优点:
可以将任何范围的输入映射到0-1之间,适合表示概率。
这个范围是有限的,这使得计算更加简单和快速。
缺点:在输入值非常大时,梯度可能会变得非常小,导致梯度消失问题。
优化方案:
使用ReLU等其他激活函数:结合使用其他激活函数,如ReLU或其变种(Leaky ReLU和Parametric ReLU)。
使用深度学习框架中的优化技巧:利用深度学习框架(如TensorFlow或PyTorch)提供的优化技巧,如梯度裁剪、学习率调整等。
2、tanh
Tanh函数是Sigmoid函数的双曲版本,它将任何实数映射到-1到1之间
使用场景:当需要一个比Sigmoid更陡峭的函数,或者在某些需要-1到1范围输出的特定应用中。
优点:提供了更大的动态范围和更陡峭的曲线,可以加快收敛速度。
缺点:Tanh函数的导数在输入接近±1时迅速接近于0,导致梯度消失问题。
优化方案:
使用ReLU等其他激活函数:结合使用其他激活函数,如ReLU或其变种(Leaky ReLU和Parametric ReLU)。
采用残差连接:残差连接是一种有效的优化策略,如ResNet(残差网络)。
3、ReLU
ReLU激活函数是一种简单的非线性函数,其数学表达式为f(x) = max(0, x)。当输入值大于0时,ReLU函数输出该值;当输入值小于或等于0时,ReLU函数输出0
使用场景:ReLU激活函数广泛应用于深度学习模型中,尤其在卷积神经网络(CNN)中。它的主要优点是计算简单、能有效缓解梯度消失问题,并能够加速模型的训练。因此,在训练深度神经网络时,ReLU常常作为首选的激活函数。
优点:
缓解梯度消失问题:与Sigmoid和Tanh等激活函数相比,ReLU在激活值为正时不会使梯度变小,从而避免了梯度消失问题。
加速训练:由于ReLU的简单性和计算高效性,它可以显著加速模型的训练过程。
缺点:
“死亡神经元”问题:当输入值小于或等于0时,ReLU的输出为0,导致该神经元失效,这种现象称为“死亡神经元”。
不对称性:ReLU的输出范围是[0, +∞),而输入值为负数时输出为0,这导致ReLU输出的分布不对称,限制了生成的多样性。
优化方案:
Leaky ReLU:Leaky ReLU在输入小于或等于0时,输出一个较小的斜率,避免了完全的“死亡神经元”问题。
Parametric ReLU(PReLU):与Leaky ReLU不同的是,PReLU的斜率不是固定的,而是可以根据数据进行学习优化。
4、softmax
Softmax是一种常用的激活函数,主要用于多分类问题中,可以将输入的神经元转化为概率分布。它的主要特点是输出值范围在0-1之间,且所有输出值的总和为1
使用场景:
在多分类任务中,用于将神经网络的输出转换为概率分布。
在自然语言处理、图像分类、语音识别等领域广泛应用。
优点:在多分类问题中,能够为每个类别提供一个相对的概率值,方便后续的决策和分类。
缺点:会出现梯度消失或梯度爆炸问题。
优化方案:
使用ReLU等其他激活函数:结合使用其他激活函数,如ReLU或其变种(Leaky ReLU和Parametric ReLU)。
使用深度学习框架中的优化技巧:利用深度学习框架(如TensorFlow或PyTorch)提供的优化技巧,如批量归一化、权重衰减等。
5、softmax与logsoftmax
1、softmax的问题
2、LogSoftmax解决上、下溢的问题
总结:LogSoftmax现对于Softmax的优势
对数运算时求导更容易,加快了反向传播的速度。
解决Softmax可能存在的上溢和下溢的问题。
二、损失函数
BCELoss、BCEWithLogitsLoss、NLLLoss和CrossEntropyLoss
如果希望使用交叉熵损失CrossEntropyLoss,那么在网络的最后一层不用添加softmax激活函数;如果一定要加,需要使用负对数损失NLLLoss
CrossEntropyLoss = LogSoftmax + NNLLoss
x = torch.randn(100,3)
y = torch.empty(100).random_(3) # 100个标签(分3类)
CEL_loss = nn.CrossEntropyLoss()
NLL_loss = nn.NLLoss()
# 交叉熵损失函数与负对数损失函数的转化
CEL_loss(x, y.to(torch.int64)) == NLL_loss(x.log_softmax(1),y.to(torch.int64) )
# True
在PyTorch中激活函数和损失函数组合的方法:
1)torch.nn.Linear+torch.sigmoid+torch.nn.BCELoss
2)torch.nn.Linear+BCEWithLogitsLoss (BCEWithLogitsLoss集成了Sigmoid)
3)torch.nn.Linear+torch.nn.LogSoftmax+NLLoss
4)torch.nn.Linear+torch.nn.CrossEntropyLoss (CrossEntropyLoss集成了Softmax)