激活函数
mindspore.nn.get_activation(name, prim_name=None)获取激活函数。
参数:
name (str) - 激活函数名称。
prim_name (Union[str, None]) - 算子名称,默认值: None 。
返回:
激活函数。
注意以下并不包括所有带参数的激活函数。
激活函数字典(名称-激活函数类):
{'softmin': Softmin,
'softmax': Softmax,
'softmax2d': Softmax2d,
'logsoftmax': LogSoftmax,
'relu': ReLU,
'relu6': ReLU6,
'rrelu': RReLU,
'silu': SiLU,
'tanh': Tanh,
'tanhshrink': Tanhshrink,
'hardtanh': Hardtanh,
'gelu': GELU,
'fast_gelu': FastGelu,
'elu': ELU,
'sigmoid': Sigmoid,
'softsign': Softsign,
'prelu': PReLU,
'leakyrelu': LeakyReLU,
'hswish': HSwish,
'hsigmoid': HSigmoid,
'logsigmoid': LogSigmoid,
'softshrink': SoftShrink,
'hshrink': HShrink,
'threshold': Threshold,
'mish': Mish}
绘图操作定义(可绘制绝大部分激活函数的函数图像):
import mindspore.nn as nn
import mindspore.ops as ops
import mindspore
import matplotlib.pyplot as plt
def plot_activation(activation_func, x_range: tuple = (-10, 10)):
"""
:param activation_func: the activation function to be plotted
:param x_range: the range of x values to be plotted
"""
x = ops.linspace(x_range[0], x_range[1], 100) # create a tensor of 100 points between x_range[0] and x_range[1]
x = x.astype(mindspore.float32)
y = activation_func(x)
plt.plot(x.asnumpy(), y.asnumpy())
func_name = activation_func.__class__.__name__
plt.title(f"{func_name} Function\n")
plt.xlabel('x')
plt.ylabel(f'y = {func_name}(x)')
plt.grid()
plt.show()
plot_activation(nn.FastGelu())
fun_name = input("Enter the name of the activation function to be plotted: ")
while fun_name != 'exit':
try:
activation_func = fun_name.lower()
Fun = nn.get_activation(activation_func)
plot_activation(Fun)
except AttributeError:
print(f"Activation function {fun_name} not found in MindSpore. Please try again.")
fun_name = input("Enter the name of the activation function to be plotted: ")
- Sigmoid函数
公式 | |
解释/备注 | |
函数图像 | |
常用场景 | 二分类问题,RNNs |
优点 | 输出以0为中心,表达能力强 |
缺点 | 存在梯度消失问题。 |
2. Softmin
公式 | |
解释/备注 | 它是二分类函数 mindspore.nn.Sigmoid 在多分类上的推广,目的是将多分类的结果以概率的形式展现出来。 对输入Tensor在轴 axis 上的元素计算其指数函数值,然后归一化到[0, 1]范围,总和为1。 |
函数图像 | |
常用场景 | 多类别分类问题,强调最小值的类别。 |
优点 | 强调最小值的类别,适用于特定问题。 |
缺点 | 不如Softmax常用,可能不如Softmax在一般情况下表现好。 |
3. Softmax
公式 | |
解释/备注 | 它是二分类函数 mindspore.nn.Sigmoid 在多分类上的推广,目的是将多分类的结果以概率的形式展现出来。 对输入Tensor在轴 axis 上的元素计算其指数函数值,然后归一化到[0, 1]范围,总和为1。 |
函数图像 | |
常用场景 | 多类别分类问题。 |
优点 | 输出为概率分布,和为1,适用于分类问题。 |
缺点 | 计算涉及指数和求和,可能存在数值稳定性问题。 |
4. Softmax2d
公式:与Softmax相同,但应用于二维矩阵的每一行。
常用场景:图像分类、目标检测、语音识别等。
优缺点:
优点:适用于处理二维数据,如图像。
缺点:计算复杂度较高。
- LogSigmoid和LogSoftmax
公式 | |
解释/备注 | Log Softmax激活函数:输入经Softmax函数、Log函数转换后,值的范围在[-inf,0)。 |
函数图像 | |
常用场景 | 二/多类别分类问题。 |
优点 | 数值稳定性好,计算效率高。 |
缺点 | 输出的是对数概率,不直接表示概率。 |
问题Q0:Log Softmax激活函数的实际应用是什么?它的函数图像是近乎线性的,这影响它的非线性能力的表达么?
6. ReLU
公式 | ReLu(x) = max(0, x) |
解释/备注 | |
函数图像 | |
常用场景 | 大多数深度学习模型的隐藏层 |
优点 | 计算简单,速度快,缓解梯度消失问题 |
缺点 | 存在神经元死亡问题(死亡ReLu) |
7. ReLU6
公式 | ReLU6(x) = min(max(0, x), 6) |
解释/备注 | ReLU6类似于ReLU,不同之处在于设置了上限,其上限为6,如果输入大于6,输出会被限制为6。 |
函数图像 | |
常用场景 | 类似于ReLU,但限制输出值不超过6。 |
优点 | 提供输出限制,防止过大值。 |
缺点 | 可能限制模型学习更大特征的能力 |
8. RReLU
公式 | |
解释/备注 | RReLU(Randomized Leaky ReLU)激活函数;l,和u的默认值分别为1/8和1/3 |
函数图像 | |
常用场景 | 类似于Leaky ReLU,但其“斜率”是随机的 |
优点 | 解决神经元死亡问题,斜率随机化增加模型泛化能力。 |
缺点 | 在测试时需要确定斜率,可能增加实现复杂度。 |
9. SiLU (Swish)
公式 | |
解释/备注 | |
函数图像 | |
常用场景 | 可在一些经典的模型中作为激活函数,如YOLOv5目标检测模型、卷积神经网络(CNN)、循环神经网络(RNN)以及生成对抗网络(GAN)等 |
优点 | 平滑,自适应,无零输出区域。SiLU在整个定义域内都是可微的,这使得在反向传播过程中的梯度计算更加稳定,有助于优化过程 |
缺点 | 计算稍复杂,需要计算sigmoid。 |
9. Tanh
公式 | |
解释/备注 | |
函数图像 | |
常用场景 | RNNs, 早期的神经网络,多层感知器(MLP)和卷积神经网络(CNN)等网络结构中。 Tanh函数常用于处理归一化数据,帮助模型更好地捕捉数据的特征和模式。 在一些回归问题中,Tanh函数可以将输入值映射到一个对称的范围,使得输出更加平滑和稳定。 |
优点 | 输出以0为中心,表达能力强。 |
缺点 | 存在梯度消失问题。 |
10. Tanhshrink
公式 | |
解释/备注 | |
函数图像 | |
常用场景 | 去噪和特征提取。 |
优点 | 自正则化,输出范围灵活。 |
缺点 | 计算复杂度较高,可能存在梯度消失问题。 |
11. Hardtanh
公式 | λ时可设置的阈值,默认0.5 |
解释/备注 | |
函数图像 | |
常用场景 | 简化网络,减少参数。 |
优点 | 计算简单,输出以0为中心。 |
缺点 | 非平滑,可能导致训练不稳定。 |
12. GELU
公式 | 一般(默认):GELU(x) = |
解释/备注 | 高斯误差线性单元激活函数(Gaussian error linear unit activation function) |
函数图像 | |
常用场景 | BERT及其它一些Transformer模型。 |
优点 | 平滑,自适应,表现良好。 |
缺点 | 计算稍复杂,需要计算标准正态累积分布函数。 |
13. FastGelu
公式 | |
解释/备注 | 近似GELU的实现,具体公式取决于近似方法。 |
函数图像 | |
常用场景 | 需要GELU但计算资源有限的情况。 |
优点 | 计算速度快于GELU。 |
缺点 | 引入近似,可能影响精度。 |
14. ELU
公式 | |
解释/备注 | alpha参数默认值为1.0 |
函数图像 | |
常用场景 | 需要处理负值的情况,如 |
优点 | 解决神经元死亡问题,输出以0为中心。 |
缺点 | 计算涉及指数,可能较慢。 |
15. Softsign
公式 | Softsign(x) = x / (1 + |x|) |
解释/备注 | |
函数图像 | |
常用场景 | 是一种Tanh 、Sigmoid 激活函数的替代,它通过应用阈值来重新缩放 -1 和 1 之间的值 |
优点 |
|
缺点 | 虽然Softsign函数的导数存在且连续,但其计算相对于一些简单的激活函数(如ReLU)来说可能更为复杂。 |
16. PReLU
公式 | |
解释/备注 | mindspore.nn.PReLU(channel=1, w=0.25) 逐元素计算PReLU(PReLU Activation Operator)激活函数。 |
函数图像 | w = 0.25 |
常用场景 | 需要自适应斜率的Leaky ReLU。 |
优点 | 斜率可学习,解决神经元死亡问题。 |
缺点 | 引入额外参数,可能增加训练难度。 |
17. LeakyReLU
公式 |
|
解释/备注 | |
函数图像 |
|
常用场景 | 需要处理负值的情况,解决死亡ReLu问题 |
优点 | 保持计算的简单性同时解决神经元死亡问题。 |
缺点 | 斜率固定,可能不适应所有情况。 |
19. HSwish
公式 | |
解释/备注 | Hard Swish激活函数是由Google在其MobileNetV3架构中引入的,它使用一个分段线性函数来近似Swish激活函数中的Sigmoid部分,从而简化了计算。 当x大于等于3时, Hard Swish(x)的值为x; 当x小于等于-3时, Hard Swish(x)的值为0; 当x在-3和3之间时,Hard Swish(x)的值则是一个介于0和x之间的线性插值。 |
函数图像 | |
常用场景 | 部署在移动端和边缘设备的网络模型。 |
优点 | 计算效率高,适用于硬件加速。 |
缺点 | 非标准激活函数,研究和使用不如ReLU广泛。 |
20. HSigmoid
- 公式:
函数图像:
和Hswish类似,Hsigmoid迎来近似Sigmoid函数,适用于部署在移动端和边缘设备的网络模型。
问题Q1:大多数激活函数(尤其是用于神经网络中隐藏层的非线性激活)的相似点是什么?考虑从函数图像、增强模型非线性表达能力和计算代价方面观察并简单阐述。
问题Q2:目前大多数神经网络其实更偏向于计算简单的激活函数,尽管其缺点同时非常明显;在网络模型中如何平衡简单激活函数的优缺点?
损失函数
损失函数名称 | 二值交叉熵损失BCELoss |
Mindspore接口 | mindspore.nn.BCELoss (weight=None, reductinotallow='mean') |
输入/参数/输出说明 | 参数
输入输出: |
公式 | |
解释/备注/说明 | 用于二分类问题,预测值一般是sigmoid函数的输出,所以目标值应是0或者1。(即x∈[0, 1],y∈{0, 1} ) |
代码举例 |
结果: import mindspore as ms 结果: |
注:mindspore.nn.BCEWithLogitsLoss:输入经过sigmoid激活函数后作为预测值
损失函数名称 | 交叉熵损失函数CrossEntropyLoss |
Mindspore接口 | mindspore.nn.CrossEntropyLoss(weight=None, ignore_index=- 100, reductinotallow='mean', label_smoothing=0.0) |
输入/参数/输出说明 | |
公式 | 略 |
解释/备注/说明 | |
代码举例 | import mindspore as ms 结果: |
问题Q3:当训练二分类模型时,是否也能使用CrossEntropyLoss,若能,对二分类模型应用交叉熵损失函数有什么需要特别注意的?
问题Q4:交叉熵损失函数值一定都是正数么?为什么?
损失函数名称 | 余弦相似度损失函数CosineEmbeddingLoss |
Mindspore接口 | mindspore.nn.CosineEmbeddingLoss(margin=0.0, reductinotallow='mean') |
输入输出 | |
公式 | |
解释/备注/说明 | 使用场景举例:
|
损失函数名称 | 平均绝对误差损失函数L1Loss |
Mindspore接口 | mindspore.nn.L1Loss(reductinotallow='mean') |
输入输出 | |
公式 | |
解释/备注/说明 | 用于回归问题,强调预测值与真实值之间的绝对误差。 |
损失函数名称 | 平均绝对误差损失函数MAELoss |
Mindspore接口 | mindspore.nn.MAELoss(reductinotallow='mean') |
输入输出 | |
公式 | |
解释/备注/说明 | 用于回归问题,强调预测值与真实值之间的平均绝对误差。和L1Loss的公式一样,但mindspore实现中,输出有点差异,具体见官方文档。 |
损失函数名称 | 均方误差损失函数MSELoss |
Mindspore接口 | mindspore.nn.MSELoss(reductinotallow='mean') |
输入输出 | |
公式 | |
解释/备注/说明 | 用于回归问题,强调预测值与真实值之间的均方误差。 |
其它:
mindspore接口 | 函数简介 | 常用场景 | 使用该损失函数的经典模型举例 |
mindspore.nn.CTCLoss | CTCLoss损失函数。 | 用于连接时序分类(CTC)问题,如语音识别、手写识别等场景。 | CRNN网络 |
mindspore.nn.DiceLoss | Dice系数是一个集合相似性loss,用于计算两个样本之间的相似性。 | 适用于图像分割任务,计算两个样本之间的相似性。 | U-Net |
mindspore.nn.FocalLoss | FocalLoss函数解决了类别不平衡的问题。 | 用于处理类别不平衡问题,如目标检测、分类任务中。 | YOLOv3 |
mindspore.nn.GaussianNLLLoss | 服从高斯分布的负对数似然损失。 | 用于回归问题,特别是当目标变量服从高斯分布时。 | 高斯过程回归模型 |
mindspore.nn.HingeEmbeddingLoss | Hinge Embedding 损失函数。 | 用于度量学习,特别是在计算两个样本之间的边界时。 | 支持向量机(SVM) |
mindspore.nn.HuberLoss | HuberLoss计算预测值和目标值之间的误差。 | 用于回归问题,对异常值不敏感,介于L1和L2损失之间。 | 各种回归模型 |
mindspore.nn.KLDivLoss | 计算输入logits和labels的KL散度。 | 用于连续变量的分布估计,如变分自编码器(VAE)中。 | 变分自编码器(VAE) |
mindspore.nn.MarginRankingLoss | 排序损失函数,用于创建一个衡量给定损失的标准。 | 用于排序问题,如推荐系统和信息检索。 | 排序模型,如LambdaMART |
mindspore.nn.MultiClassDiceLoss | 对于多标签问题,可以将标签通过one-hot编码转换为多个二分类标签。 | 用于多标签分类问题,如图像标注、文本分类等。 | 多标签分类模型 |
mindspore.nn.MultilabelMarginLoss | 创建一个损失函数,用于最小化多分类任务的合页损失。 | 用于多标签分类问题,如文本分类、图像标注等。 | 多标签分类模型 |
mindspore.nn.MultiLabelSoftMarginLoss | 基于最大熵计算用于多标签优化的损失。 | 用于多标签分类问题,强调标签的不确定性。 | 多标签分类模型 |
mindspore.nn.MultiMarginLoss | 多分类场景下用于计算x和y之间的合页损失(Hinge Loss),其中x为一个2-D Tensor,y为一个表示类别索引的1-D Tensor,0≤y≤x.size(1)−1。 | 用于多分类问题,特别是当类别之间存在明显边界时。 | 多分类模型 |
mindspore.nn.NLLLoss | 计算预测值和目标值之间的负对数似然损失。 | 用于分类问题,特别是当输出是概率分布时。 | 各种分类模型,如逻辑回归 |
mindspore.nn.PoissonNLLLoss | 计算泊松负对数似然损失。 | 用于计数数据的回归问题,如事件发生次数的预测。 | 泊松回归模型 |
mindspore.nn.RMSELoss | RMSELoss用来测量x和y元素之间的均方根误差,其中x是输入Tensor,y是目标值。 | 用于回归问题,强调预测值与真实值之间的均方根误差。 | 各种回归模型 |
mindspore.nn.SampledSoftmaxLoss | 抽样交叉熵损失函数。 | 用于处理大规模分类问题,如语言模型中的词汇预测。 | 语言模型,如Word2Vec |
mindspore.nn.SmoothL1Loss | SmoothL1损失函数,如果预测值和目标值的逐个元素绝对误差小于设定阈值beta则用平方项,否则用绝对误差项。 | 用于回归问题,对异常值不敏感,介于L1和L2损失之间。 | 各种回归模型,如Faster R-CNN |
mindspore.nn.SoftMarginLoss | 针对二分类问题的损失函数。 | 用于二分类问题,特别是当数据不是线性可分时。 | 二分类模型,如SVM |
mindspore.nn.SoftmaxCrossEntropyWithLogits | 计算预测值与真实值之间的交叉熵。 | 用于分类问题,特别是当输出是概率分布时。 | 各种分类模型,如深度神经网络 |
mindspore.nn.TripletMarginLoss | 执行三元组损失函数的操作。 | 用于度量学习,特别是在计算样本对之间的距离时,如人脸识别。 | 三元组损失模型,如FaceNet |
公众号二维码: