0
点赞
收藏
分享

微信扫一扫

激活函数和损失函数的小结——以mindspore为演示工具

激活函数

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: ")

  1. Sigmoid函数

公式

激活函数和损失函数的小结——以mindspore为演示工具_激活函数


解释/备注


函数图像

激活函数和损失函数的小结——以mindspore为演示工具_函数图像_02


常用场景

二分类问题,RNNs

优点

输出以0为中心,表达能力强

缺点

存在梯度消失问题。

2. Softmin


公式

激活函数和损失函数的小结——以mindspore为演示工具_激活函数_03


解释/备注

它是二分类函数 mindspore.nn.Sigmoid 在多分类上的推广,目的是将多分类的结果以概率的形式展现出来。

对输入Tensor在轴 axis 上的元素计算其指数函数值,然后归一化到[0, 1]范围,总和为1。

函数图像

激活函数和损失函数的小结——以mindspore为演示工具_激活函数_04



常用场景

多类别分类问题,强调最小值的类别。

优点

强调最小值的类别,适用于特定问题。

缺点

不如Softmax常用,可能不如Softmax在一般情况下表现好。



3. Softmax


公式

激活函数和损失函数的小结——以mindspore为演示工具_函数图像_05


解释/备注

它是二分类函数 mindspore.nn.Sigmoid 在多分类上的推广,目的是将多分类的结果以概率的形式展现出来。

对输入Tensor在轴 axis 上的元素计算其指数函数值,然后归一化到[0, 1]范围,总和为1。

函数图像

激活函数和损失函数的小结——以mindspore为演示工具_激活函数_06


常用场景

多类别分类问题。

优点

输出为概率分布,和为1,适用于分类问题。


缺点

计算涉及指数和求和,可能存在数值稳定性问题。


4. Softmax2d

公式:与Softmax相同,但应用于二维矩阵的每一行。

常用场景:图像分类、目标检测、语音识别等。

优缺点:

优点:适用于处理二维数据,如图像。

缺点:计算复杂度较高。


  1. LogSigmoid和LogSoftmax


公式

激活函数和损失函数的小结——以mindspore为演示工具_函数图像_07


激活函数和损失函数的小结——以mindspore为演示工具_损失函数_08


解释/备注

Log Softmax激活函数输入经Softmax函数、Log函数转换后,值的范围在[-inf,0)。

函数图像


激活函数和损失函数的小结——以mindspore为演示工具_函数图像_09


激活函数和损失函数的小结——以mindspore为演示工具_损失函数_10


常用场景

二/多类别分类问题。

优点

数值稳定性好,计算效率高。

缺点

输出的是对数概率,不直接表示概率。

问题Q0:Log Softmax激活函数的实际应用是什么?它的函数图像是近乎线性的,这影响它的非线性能力的表达么?

6. ReLU


公式

ReLu(x) = max(0, x)

解释/备注


函数图像

激活函数和损失函数的小结——以mindspore为演示工具_激活函数_11



常用场景

大多数深度学习模型的隐藏层

优点

计算简单,速度快,缓解梯度消失问题

缺点

存在神经元死亡问题(死亡ReLu)


7. ReLU6


公式

ReLU6(x) = min(max(0, x), 6)

解释/备注

ReLU6类似于ReLU,不同之处在于设置了上限,其上限为6,如果输入大于6,输出会被限制为6。

函数图像


激活函数和损失函数的小结——以mindspore为演示工具_激活函数_12


常用场景

类似于ReLU,但限制输出值不超过6。

优点

提供输出限制,防止过大值。

缺点

可能限制模型学习更大特征的能力


8. RReLU


公式

激活函数和损失函数的小结——以mindspore为演示工具_函数图像_13


解释/备注

RReLU(Randomized Leaky ReLU)激活函数;l,和u的默认值分别为1/8和1/3

函数图像


激活函数和损失函数的小结——以mindspore为演示工具_函数图像_14


常用场景

类似于Leaky ReLU,但其“斜率是随机的

优点

解决神经元死亡问题,斜率随机化增加模型泛化能力。

缺点

在测试时需要确定斜率,可能增加实现复杂度。


9. SiLU (Swish)


公式

激活函数和损失函数的小结——以mindspore为演示工具_函数图像_15


解释/备注


函数图像

激活函数和损失函数的小结——以mindspore为演示工具_函数图像_16



常用场景

在一些经典的模型中作为激活函数,如YOLOv5目标检测模型卷积神经网络(CNN)、循环神经网络(RNN)以及生成对抗网络(GAN)

优点

平滑,自适应,无零输出区域。SiLU在整个定义域内都是可微的,这使得在反向传播过程中的梯度计算更加稳定,有助于优化过程

缺点

计算稍复杂,需要计算sigmoid。


9. Tanh

公式

激活函数和损失函数的小结——以mindspore为演示工具_损失函数_17


解释/备注


函数图像


激活函数和损失函数的小结——以mindspore为演示工具_函数图像_18


常用场景

RNNs, 早期的神经网络多层感知器(MLP)和卷积神经网络(CNN)等网络结构中

Tanh函数常用于处理归一化数据,帮助模型更好地捕捉数据的特征和模式。

在一些回归问题中,Tanh函数可以将输入值映射到一个对称的范围,使得输出更加平滑和稳定。

优点

输出以0为中心,表达能力强。

缺点

存在梯度消失问题。


10. Tanhshrink

公式

激活函数和损失函数的小结——以mindspore为演示工具_激活函数_19


解释/备注


函数图像

激活函数和损失函数的小结——以mindspore为演示工具_激活函数_20


常用场景

去噪和特征提取。

优点

自正则化,输出范围灵活。

缺点

计算复杂度较高,可能存在梯度消失问题。


11. Hardtanh

公式

激活函数和损失函数的小结——以mindspore为演示工具_损失函数_21


λ时可设置的阈值,默认0.5

解释/备注


函数图像

激活函数和损失函数的小结——以mindspore为演示工具_损失函数_22


常用场景

简化网络,减少参数。

优点

计算简单,输出以0为中心。

缺点

非平滑,可能导致训练不稳定。


12. GELU


公式

激活函数和损失函数的小结——以mindspore为演示工具_函数图像_23


一般(默认):GELU(x) =

激活函数和损失函数的小结——以mindspore为演示工具_函数图像_24


解释/备注

高斯误差线性单元激活函数(Gaussian error linear unit activation function)

函数图像


激活函数和损失函数的小结——以mindspore为演示工具_函数图像_25


常用场景

BERT及其它一些Transformer模型。

优点

平滑,自适应,表现良好。

缺点

计算稍复杂,需要计算标准正态累积分布函数。


13. FastGelu

公式

激活函数和损失函数的小结——以mindspore为演示工具_激活函数_26


解释/备注

近似GELU的实现,具体公式取决于近似方法。

函数图像


激活函数和损失函数的小结——以mindspore为演示工具_函数图像_27


常用场景

需要GELU但计算资源有限的情况。

优点

计算速度快于GELU。

缺点

引入近似,可能影响精度。


14. ELU

公式

激活函数和损失函数的小结——以mindspore为演示工具_函数图像_28


解释/备注

alpha参数默认值为1.0

函数图像


激活函数和损失函数的小结——以mindspore为演示工具_激活函数_29


常用场景

需要处理负值的情况,如

优点

解决神经元死亡问题,输出以0为中心。

缺点

计算涉及指数,可能较慢。



15. Softsign


公式

Softsign(x) = x / (1 + |x|)

解释/备注


函数图像


激活函数和损失函数的小结——以mindspore为演示工具_函数图像_30


常用场景

是一种Tanh 、Sigmoid 激活函数的替代,它通过应用阈值来重新缩放 -1 和 1 之间的值

优点

  1. 解决梯度消失问题:由于Softsign函数在输入值趋近于无穷大或无穷小时,其导数趋近于0但并非完全为0(相比于Sigmoid或Tanh函数在某些区域的导数完全为0),因此它可以在一定程度上缓解梯度消失的问题。
  2. 正则化:Softsign函数可以将输入的任意实数映射到[-1,1]的区间内,这种特性使得它也可以用于正则化,从而避免过拟合的问题。

缺点

虽然Softsign函数的导数存在且连续,但其计算相对于一些简单的激活函数(如ReLU)来说可能更为复杂。


16. PReLU


公式

激活函数和损失函数的小结——以mindspore为演示工具_函数图像_31


解释/备注

mindspore.nn.PReLU(channel=1, w=0.25) 逐元素计算PReLU(PReLU Activation Operator)激活函数。

函数图像


激活函数和损失函数的小结——以mindspore为演示工具_激活函数_32


w = 0.25

常用场景

需要自适应斜率的Leaky ReLU。

优点

斜率可学习,解决神经元死亡问题。

缺点

引入额外参数,可能增加训练难度。


17. LeakyReLU


公式

激活函数和损失函数的小结——以mindspore为演示工具_损失函数_33


激活函数和损失函数的小结——以mindspore为演示工具_函数图像_340.2

解释/备注


函数图像


激活函数和损失函数的小结——以mindspore为演示工具_损失函数_35


激活函数和损失函数的小结——以mindspore为演示工具_激活函数_36 = 0.2

常用场景

需要处理负值的情况解决死亡ReLu问题

优点

保持计算的简单性同时解决神经元死亡问题。

缺点

斜率固定,可能不适应所有情况。


19. HSwish


公式

激活函数和损失函数的小结——以mindspore为演示工具_激活函数_37


解释/备注

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之间的线性插值。

函数图像


激活函数和损失函数的小结——以mindspore为演示工具_损失函数_38


常用场景

部署在移动端和边缘设备的网络模型。

优点

计算效率高,适用于硬件加速。

缺点

非标准激活函数,研究和使用不如ReLU广泛。


20. HSigmoid

- 公式:

激活函数和损失函数的小结——以mindspore为演示工具_激活函数_39


函数图像:

激活函数和损失函数的小结——以mindspore为演示工具_损失函数_40


和Hswish类似,Hsigmoid迎来近似Sigmoid函数,适用于部署在移动端和边缘设备的网络模型。


问题Q1:大多数激活函数(尤其是用于神经网络中隐藏层的非线性激活)的相似点是什么?考虑从函数图像、增强模型非线性表达能力和计算代价方面观察并简单阐述


问题Q2:目前大多数神经网络其实更偏向于计算简单的激活函数,尽管其缺点同时非常明显;在网络模型中如何平衡简单激活函数的优缺点?

损失函数

损失函数名称

二值交叉熵损失BCELoss

Mindspore接口

mindspore.nn.BCELoss (weight=None, reductinotallow='mean')

输入/参数/输出说明

参数

  1. weight可选) - 指定每个批次二值交叉熵的权重。与输入数据的shape和数据类型相同。默认值: None 。
  2. reduction,可选) - 指定应用于输出结果的规约计算方式,可选 'none' 、 'mean' 、 'sum' ,默认值: 'mean'

输入输出:

激活函数和损失函数的小结——以mindspore为演示工具_损失函数_41


公式

激活函数和损失函数的小结——以mindspore为演示工具_激活函数_42


解释/备注/说明

用于二分类问题,预测值一般是sigmoid函数的输出,所以目标值应是0或者1。(即x∈[0, 1],y∈{0, 1} )

代码举例


import mindspore as ms
import mindspore.nn as nn

loss = nn.BCELoss(reductinotallow='mean')
N = 6
logits = ms.ops.randn((N, ), dtype=ms.float32)
logits = ms.ops.sigmoid(logits)
labels = ms.ops.randint(0, 2, size=(N, )).astype(ms.float32)
print(logits.shape, labels.shape)
print(logits, labels, sep='\n')

output = loss(logits, labels)
print(output)

结果:

激活函数和损失函数的小结——以mindspore为演示工具_函数图像_43



import mindspore as ms
import mindspore.nn as nn

loss = nn.BCELoss(reductinotallow='mean')
N = 3
logits = ms.ops.randn((N, 2), dtype=ms.float32)
logits = ms.ops.sigmoid(logits)
labels = ms.ops.randn((N, 2), dtype=ms.float32)
labels = ms.ops.sigmoid(labels)
print(logits.shape, labels.shape)
print(logits, labels, sep='\n')

output = loss(logits, labels)
print(output)

结果:

激活函数和损失函数的小结——以mindspore为演示工具_损失函数_44


注:mindspore.nn.BCEWithLogitsLoss输入经过sigmoid激活函数后作为预测值


损失函数名称

交叉熵损失函数CrossEntropyLoss

Mindspore接口

mindspore.nn.CrossEntropyLoss(weight=None, ignore_index=- 100, reductinotallow='mean', label_smoothing=0.0)

输入/参数/输出说明

激活函数和损失函数的小结——以mindspore为演示工具_函数图像_45


公式

解释/备注/说明


代码举例

import mindspore as ms
import mindspore.nn as nn
import numpy as np
print("# Case 1: Indices labels......")
inputs = ms.Tensor(np.random.randn(3, 5), ms.float32)
inputs = ms.nn.Softmax(axis=1)(inputs)
target = ms.Tensor(np.array([1, 0, 4]), ms.int32)
print(inputs.shape,inputs, target.shape, target, sep='\n', end='\n\n')
loss = nn.CrossEntropyLoss()
output = loss(inputs, target)
print('loss value:', output)

print("# Case 2: Probability labels......")
inputs = ms.Tensor(np.random.randn(3, 5), ms.float32)
inputs = ms.nn.Softmax(axis=1)(inputs)
target = ms.nn.Softmax(axis=1)(ms.Tensor(np.random.randn(3, 5), ms.float32))
print(inputs.shape,inputs, target.shape, target, sep='\n', end='\n\n')

loss = nn.CrossEntropyLoss()
output = loss(inputs, target)
print('loss value:', output)

结果:

激活函数和损失函数的小结——以mindspore为演示工具_损失函数_46


问题Q3:当训练二分类模型时,是否也能使用CrossEntropyLoss,若能,对二分类模型应用交叉熵损失函数有什么需要特别注意的?


问题Q4:交叉熵损失函数值一定都是正数么?为什么?



损失函数名称

余弦相似度损失函数CosineEmbeddingLoss

Mindspore接口

mindspore.nn.CosineEmbeddingLoss(margin=0.0, reductinotallow='mean')

输入输出

激活函数和损失函数的小结——以mindspore为演示工具_损失函数_47


公式

激活函数和损失函数的小结——以mindspore为演示工具_函数图像_48


解释/备注/说明

使用场景举例:

  1. 自然语言处理(NLP)
  1. 文本分类:通过计算不同文本特征向量的余弦相似度,帮助模型提高分类的准确性。
  2. 情感分析:评估文本中情感倾向的相似度,有助于模型更好地理解情感的细微差别。
  3. 机器翻译:评估源语言和目标语言句子对的相似度,帮助优化翻译模型的性能。
  1. 计算机视觉
  1. 人脸验证:通过计算人脸特征向量的余弦相似度,判断两个人脸是否属于同一人。
  2. 图像检索:在大规模图像数据库中,量化图像特征向量之间的相似性,提高检索系统的相关性和效率。
  3. 视频分析:比较视频帧或关键帧的特征向量,以识别和检索视频内容。



损失函数名称

平均绝对误差损失函数L1Loss

Mindspore接口

mindspore.nn.L1Loss(reductinotallow='mean')

输入输出

激活函数和损失函数的小结——以mindspore为演示工具_损失函数_49


公式

激活函数和损失函数的小结——以mindspore为演示工具_损失函数_50


解释/备注/说明

用于回归问题,强调预测值与真实值之间的绝对误差。


损失函数名称

平均绝对误差损失函数MAELoss

Mindspore接口

mindspore.nn.MAELoss(reductinotallow='mean')

输入输出


公式

激活函数和损失函数的小结——以mindspore为演示工具_损失函数_51


解释/备注/说明

用于回归问题,强调预测值与真实值之间的平均绝对误差。和L1Loss的公式一样,但mindspore实现中,输出有点差异,具体见官方文档。


损失函数名称

均方误差损失函数MSELoss

Mindspore接口

mindspore.nn.MSELoss(reductinotallow='mean')

输入输出

激活函数和损失函数的小结——以mindspore为演示工具_函数图像_52


公式

激活函数和损失函数的小结——以mindspore为演示工具_函数图像_53


解释/备注/说明

用于回归问题,强调预测值与真实值之间的均方误差。


其它:

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


激活函数和损失函数的小结——以mindspore为演示工具_函数图像_54

公众号二维码:

激活函数和损失函数的小结——以mindspore为演示工具_函数图像_55



举报

相关推荐

0 条评论