deepseek.com 常用的激活函数有哪些?特点是什么?常用的损失函数有哪些?特点是什么?

以下是对常用激活函数和损失函数的系统总结,包含数学形式、特性对比及PyTorch实现:


一、常用激活函数及特性

1. Sigmoid
  • 数学形式
    σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+ex1
  • 特点
    • 输出范围 (0,1),适合概率输出
    • 梯度消失问题严重(导数最大仅0.25)
    • 计算成本较高
  • 应用场景
    • 二分类输出层
    • 门控结构(如LSTM)
  • PyTorch实现
    nn.Sigmoid()
    
2. Tanh
  • 数学形式
    tanh ⁡ ( x ) = e x − e − x e x + e − x \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} tanh(x)=ex+exexex
  • 特点
    • 输出范围 (-1,1),中心对称
    • 梯度消失问题比Sigmoid轻(导数最大为1)
    • 适合隐藏层
  • 应用场景
    • RNN隐藏层
    • 特征归一化
  • PyTorch实现
    nn.Tanh()
    
3. ReLU (Rectified Linear Unit)
  • 数学形式
    f ( x ) = max ⁡ ( 0 , x ) f(x) = \max(0, x) f(x)=max(0,x)
  • 特点
    • 计算高效,梯度为0或1
    • 缓解梯度消失问题
    • Dead ReLU问题(负区间梯度为0)
  • 应用场景
    • 大多数前馈网络隐藏层
    • CNN特征提取
  • PyTorch实现
    nn.ReLU()
    
4. Leaky ReLU
  • 数学形式
    f ( x ) = { x if  x > 0 α x otherwise f(x) = \begin{cases} x & \text{if } x > 0 \\ \alpha x & \text{otherwise} \end{cases} f(x)={xαxif x>0otherwise
    (通常 $ \alpha = 0.01 $)
  • 特点
    • 解决Dead ReLU问题
    • 需要调参选择α值
  • 应用场景
    • 需要避免神经元死亡的场景
  • PyTorch实现
    nn.LeakyReLU(negative_slope=0.01)
    
5. Softmax
  • 数学形式
    softmax ( x i ) = e x i ∑ j = 1 n e x j \text{softmax}(x_i) = \frac{e^{x_i}}{\sum_{j=1}^n e^{x_j}} softmax(xi)=j=1nexjexi
  • 特点
    • 输出概率分布(总和为1)
    • 指数计算可能导致数值不稳定
  • 应用场景
    • 多分类输出层
  • PyTorch实现
    nn.Softmax(dim=1)
    

二、常用损失函数及特性

1. 均方误差(MSE)
  • 数学形式
    L = 1 N ∑ i = 1 N ( y i − y ^ i ) 2 L = \frac{1}{N}\sum_{i=1}^N (y_i - \hat{y}_i)^2 L=N1i=1N(yiy^i)2
  • 特点
    • 对离群点敏感
    • 输出梯度与误差成正比
  • 应用场景
    • 回归任务(房价预测)
  • PyTorch实现
    nn.MSELoss()
    
2. 交叉熵损失(Cross-Entropy)
  • 数学形式
    L = − 1 N ∑ i = 1 N ∑ c = 1 C y i , c log ⁡ ( y ^ i , c ) L = -\frac{1}{N}\sum_{i=1}^N \sum_{c=1}^C y_{i,c} \log(\hat{y}_{i,c}) L=N1i=1Nc=1Cyi,clog(y^i,c)
  • 特点
    • 与Softmax天然配合
    • 梯度计算高效(预测概率 - 真实标签)
  • 应用场景
    • 多分类任务(图像分类)
  • PyTorch实现
    nn.CrossEntropyLoss()  # 包含Softmax
    
3. 二元交叉熵(BCE)
  • 数学形式
    L = − 1 N ∑ i = 1 N [ y i log ⁡ y ^ i + ( 1 − y i ) log ⁡ ( 1 − y ^ i ) ] L = -\frac{1}{N}\sum_{i=1}^N [y_i \log\hat{y}_i + (1-y_i)\log(1-\hat{y}_i)] L=N1i=1N[yilogy^i+(1yi)log(1y^i)]
  • 特点
    • 需配合Sigmoid使用
    • 适合多标签分类
  • 应用场景
    • 二分类/多标签分类
  • PyTorch实现
    nn.BCELoss()  # 需手动加Sigmoid
    nn.BCEWithLogitsLoss()  # 自动包含Sigmoid
    
4. Huber Loss
  • 数学形式
    L = { 1 2 ( y − y ^ ) 2 ∣ y − y ^ ∣ ≤ δ δ ( ∣ y − y ^ ∣ − 1 2 δ ) otherwise L = \begin{cases} \frac{1}{2}(y - \hat{y})^2 & |y-\hat{y}| \leq \delta \\ \delta(|y-\hat{y}| - \frac{1}{2}\delta) & \text{otherwise} \end{cases} L={21(yy^)2δ(yy^21δ)yy^δotherwise
  • 特点
    • 结合MSE和MAE优点
    • 对离群点鲁棒
  • 应用场景
    • 带噪声的回归任务
  • PyTorch实现
    nn.SmoothL1Loss()  # δ=1.0
    

三、对比总结表

激活函数对比
激活函数 输出范围 梯度特性 计算成本 适用场景
Sigmoid (0,1) 最大0.25 二分类输出层
Tanh (-1,1) 最大1.0 RNN隐藏层
ReLU [0, +∞) 0或1 通用隐藏层
Leaky ReLU (-∞, +∞) 0.01或1 避免神经元死亡
Softmax [0,1] (概率) 依赖输入分布 多分类输出层
损失函数对比
损失函数 任务类型 离群点敏感度 梯度特性 PyTorch实现
MSE 回归 线性 nn.MSELoss()
Cross-Entropy 分类 概率差异 nn.CrossEntropyLoss()
BCE 二分类 类间竞争 nn.BCEWithLogitsLoss()
Huber 回归 分段平滑 nn.SmoothL1Loss()

四、选择指南

激活函数选择
  1. 隐藏层优先选择
    • ReLU系列(计算高效)
    • 有死亡神经元风险时 → Leaky ReLU
  2. 输出层选择
    • 二分类 → Sigmoid
    • 多分类 → Softmax
    • 回归 → 无激活(线性输出)
损失函数选择
  1. 分类任务
    • 二分类 → BCEWithLogitsLoss
    • 多分类 → CrossEntropyLoss
  2. 回归任务
    • 数据干净 → MSE
    • 含噪声 → Huber Loss
  3. 特殊需求
    • 类别不平衡 → Focal Loss
    • 分布匹配 → KL散度

五、代码示例

# 二分类模型
class BinaryClassifier(nn.Module):
    def __init__(self):
        super().__init__()
        self.layers = nn.Sequential(
            nn.Linear(10, 64),
            nn.ReLU(),
            nn.Linear(64, 1),
            nn.Sigmoid()
        )
    
    def forward(self, x):
        return self.layers(x)

model = BinaryClassifier()
criterion = nn.BCELoss()  # 或直接使用BCEWithLogitsLoss省略Sigmoid

通过合理组合激活函数和损失函数,可以显著提升模型性能。建议在项目初期使用标准组合(如ReLU + CrossEntropy),再根据具体问题调整优化。

在深度学习中,梯度消失和梯度爆炸是训练深度神经网络时常见的两个问题,它们会严重影响模型的训练效果和收敛性。以下是问题的原因、解决方法、激活函数选择以及在PyTorch中的调用方式。


yuanbao.tencent.com:为什么在模型训练时会出现梯度消失或者梯度爆炸的问题?怎么解决?怎么选激活函数?Pytorch中怎么调用,给出个表格

一、梯度消失和梯度爆炸的原因

  1. 梯度消失

    • 原因:在反向传播过程中,梯度通过链式法则逐层传递。如果每一层的梯度值小于1,经过多层连乘后,梯度会指数级减小,最终趋近于零,导致浅层网络的权重无法有效更新。
    • 常见场景:使用Sigmoid或Tanh激活函数时,这些函数的导数在输入较大或较小时接近零,容易导致梯度消失。
  2. 梯度爆炸

    • 原因:如果每一层的梯度值大于1,经过多层连乘后,梯度会指数级增大,导致权重更新过大,模型无法收敛。
    • 常见场景:权重初始化过大或网络层数过深时,梯度在反向传播过程中不断放大。

二、解决方法

  1. 梯度消失的解决方法

    • 使用ReLU及其变体:ReLU在正区间的导数为1,避免了梯度消失问题。
    • 权重初始化:使用Xavier或He初始化方法,确保权重初始值合理。
    • 批量归一化(Batch Normalization):通过归一化每层的输入,稳定梯度传播。
    • 残差网络(ResNet):通过跳跃连接(skip connections)让梯度直接传递,缓解梯度消失。
  2. 梯度爆炸的解决方法

    • 梯度裁剪(Gradient Clipping):限制梯度的最大值,防止梯度过大。
    • 权重正则化:通过L1或L2正则化限制权重大小。
    • 调整学习率:使用较小的学习率或自适应优化器(如Adam)。

三、激活函数的选择

  1. ReLU:最常用的激活函数,计算简单且能有效缓解梯度消失问题。
  2. Leaky ReLU:在负区间引入小斜率,避免ReLU的“神经元死亡”问题。
  3. Sigmoid:适用于二分类问题的输出层,但容易导致梯度消失。
  4. Tanh:输出范围为[-1, 1],比Sigmoid更适合中间层。
  5. Softmax:适用于多分类问题的输出层,将输出转换为概率分布。

四、PyTorch中的调用方式

以下是常见激活函数在PyTorch中的调用方式:

激活函数 PyTorch调用方式 适用场景
ReLU torch.nn.ReLU() 中间层
Leaky ReLU torch.nn.LeakyReLU(negative_slope=0.01) 中间层
Sigmoid torch.nn.Sigmoid() 二分类问题的输出层
Tanh torch.nn.Tanh() 中间层
Softmax torch.nn.Softmax(dim=1) 多分类问题的输出层

五、总结

  • 梯度消失和梯度爆炸:主要由链式法则和激活函数的选择引起,可通过改进激活函数、权重初始化、批量归一化等方法解决。
  • 激活函数选择:根据任务需求选择合适的激活函数,如ReLU用于中间层,Softmax用于多分类输出层。
  • PyTorch调用:PyTorch提供了丰富的激活函数接口,可直接调用。

希望以上内容能帮助你更好地理解和解决梯度消失与梯度爆炸问题!
在深度学习中,过拟合和欠拟合是常见问题,以下是相关公式及其在PyTorch中的实现方法:


一、过拟合相关公式

1. L1/L2正则化

在损失函数中加入正则化项,约束模型权重:

  • 总损失函数
    L total = L original + λ ⋅ R ( W ) L_{\text{total}} = L_{\text{original}} + \lambda \cdot R(W) Ltotal=Loriginal+λR(W)
    - L original L_{\text{original}} Loriginal:原始损失(如交叉熵、均方误差)
    - λ \lambda λ:正则化系数
    - R ( W ) R(W) R(W):正则化项

    • L1正则化 R ( W ) = ∑ ∣ w i ∣ R(W) = \sum |w_i| R(W)=wi
    • L2正则化 R ( W ) = ∑ w i 2 R(W) = \sum w_i^2 R(W)=wi2
  • PyTorch实现

    import torch.nn as nn
    import torch.optim as optim
    
    # 定义模型
    model = MyModel()
    # 定义损失函数
    criterion = nn.CrossEntropyLoss()
    # 定义优化器,添加L2正则化(weight_decay参数)
    optimizer = optim.Adam(model.parameters(), weight_decay=1e-4)
    
2. Dropout

训练时以概率 p p p随机丢弃神经元,测试时缩放输出:

  • 训练阶段
    h train = m ⊙ h p , m ∼ Bernoulli ( p ) h_{\text{train}} = \frac{m \odot h}{p}, \quad m \sim \text{Bernoulli}(p) htrain=pmh,mBernoulli(p)
    - h h h:神经元输出, m m m:掩码向量(0/1), ⊙ \odot :逐元素乘

    • 除以 p p p是为了保持训练和测试时输出的期望一致。
  • PyTorch实现

    import torch.nn as nn
    
    # 在模型中添加Dropout层
    class MyModel(nn.Module):
        def __init__(self):
            super(MyModel, self).__init__()
            self.fc1 = nn.Linear(128, 64)
            self.dropout = nn.Dropout(p=0.5)  # 丢弃概率为0.5
            self.fc2 = nn.Linear(64, 10)
    
        def forward(self, x):
            x = self.fc1(x)
            x = self.dropout(x)
            x = self.fc2(x)
            return x
    

二、欠拟合相关公式

1. 交叉熵损失(分类任务)

衡量模型预测分布与真实分布的差异:
L = − 1 N ∑ i = 1 N ∑ c = 1 C y i , c log ⁡ ( p i , c ) L = -\frac{1}{N} \sum_{i=1}^N \sum_{c=1}^C y_{i,c} \log(p_{i,c}) L=N1i=1Nc=1Cyi,clog(pi,c)
- N N N:样本数, C C C:类别数
- y i , c y_{i,c} yi,c:真实标签(one-hot编码)
- p i , c p_{i,c} pi,c:模型预测概率

  • PyTorch实现
    import torch.nn as nn
    
    # 定义交叉熵损失函数
    criterion = nn.CrossEntropyLoss()
    
2. 模型复杂度提升

增加参数数量(如全连接层):
h ( l + 1 ) = σ ( W ( l ) h ( l ) + b ( l ) ) h^{(l+1)} = \sigma(W^{(l)} h^{(l)} + b^{(l)}) h(l+1)=σ(W(l)h(l)+b(l))
- h ( l ) h^{(l)} h(l):第 l l l层输出, W ( l ) W^{(l)} W(l):权重矩阵
- σ \sigma σ:激活函数(如ReLU)

  • PyTorch实现
    import torch.nn as nn
    
    # 增加模型复杂度
    class ComplexModel(nn.Module):
        def __init__(self):
            super(ComplexModel, self).__init__()
            self.fc1 = nn.Linear(128, 256)
            self.fc2 = nn.Linear(256, 512)
            self.fc3 = nn.Linear(512, 10)
    
        def forward(self, x):
            x = torch.relu(self.fc1(x))
            x = torch.relu(self.fc2(x))
            x = self.fc3(x)
            return x
    

三、总结

  • 过拟合:通过正则化、Dropout等方法限制模型复杂度。
  • 欠拟合:通过增加模型复杂度或改进特征工程提升模型能力。
  • PyTorch提供了灵活的工具(如nn.Dropoutweight_decay)来实现这些方法。

以下是深度学习中应对过拟合和欠拟合的核心公式及其解释:


一、过拟合相关公式

1. L1/L2正则化

在损失函数中加入正则化项,约束模型权重:

  • 总损失函数
    L total = L original + λ ⋅ R ( W ) L_{\text{total}} = L_{\text{original}} + \lambda \cdot R(W) Ltotal=Loriginal+λR(W)
    - L original L_{\text{original}} Loriginal:原始损失(如交叉熵、均方误差)
    - λ \lambda λ:正则化系数,控制惩罚强度
    - R ( W ) R(W) R(W):正则化项

    • L1正则化(稀疏性): R ( W ) = ∑ ∣ w i ∣ R(W) = \sum |w_i| R(W)=wi
    • L2正则化(权重衰减): R ( W ) = ∑ w i 2 R(W) = \sum w_i^2 R(W)=wi2
  • 梯度更新(以L2为例)
    w i ← w i − η ⋅ ( ∂ L original ∂ w i + 2 λ w i ) w_i \leftarrow w_i - \eta \cdot \left( \frac{\partial L_{\text{original}}}{\partial w_i} + 2\lambda w_i \right) wiwiη(wiLoriginal+2λwi)
    - η \eta η:学习率,L2正则化在梯度中增加了 2 λ w i 2\lambda w_i 2λwi,推动权重向零收缩。

2. Dropout

训练时以概率 p p p随机丢弃神经元,测试时缩放输出:

  • 训练阶段
    h train = m ⊙ h p , m ∼ Bernoulli ( p ) h_{\text{train}} = \frac{m \odot h}{p}, \quad m \sim \text{Bernoulli}(p) htrain=pmh,mBernoulli(p)
    - h h h:神经元输出, m m m:掩码向量(0/1), ⊙ \odot :逐元素乘
    • 除以 p p p是为了保持训练和测试时输出的期望一致。
  • 测试阶段
    h test = h h_{\text{test}} = h htest=h

二、欠拟合相关公式

1. 交叉熵损失(分类任务)

衡量模型预测分布与真实分布的差异:
L = − 1 N ∑ i = 1 N ∑ c = 1 C y i , c log ⁡ ( p i , c ) L = -\frac{1}{N} \sum_{i=1}^N \sum_{c=1}^C y_{i,c} \log(p_{i,c}) L=N1i=1Nc=1Cyi,clog(pi,c)
- N N N:样本数, C C C:类别数
- y i , c y_{i,c} yi,c:真实标签(one-hot编码)
- p i , c p_{i,c} pi,c:模型预测概率

2. 模型复杂度提升

增加参数数量(如全连接层):
h ( l + 1 ) = σ ( W ( l ) h ( l ) + b ( l ) ) h^{(l+1)} = \sigma(W^{(l)} h^{(l)} + b^{(l)}) h(l+1)=σ(W(l)h(l)+b(l))
- h ( l ) h^{(l)} h(l):第 l l l层输出, W ( l ) W^{(l)} W(l):权重矩阵
- σ \sigma σ:激活函数(如ReLU)


三、关键公式对比

方法 公式 作用
L1正则化 L total = L original + λ ∑ ∥ w i ∥ L_{\text{total}} = L_{\text{original}} + \lambda \sum \|w_i\| Ltotal=Loriginal+λwi 稀疏权重,适合特征选择
L2正则化 L total = L original + λ ∑ w i 2 L_{\text{total}} = L_{\text{original}} + \lambda \sum w_i^2 Ltotal=Loriginal+λwi2 限制权重大小,防止过拟合
Dropout h train = m ⊙ h p h_{\text{train}} = \frac{m \odot h}{p} htrain=pmh(训练时) 降低神经元间依赖性,增强泛化性
交叉熵损失 L = − 1 N ∑ i ∑ c y i , c log ⁡ ( p i , c ) L = -\frac{1}{N} \sum_i \sum_c y_{i,c} \log(p_{i,c}) L=N1icyi,clog(pi,c) 分类任务的基础损失函数

四、公式应用注意事项

  1. 正则化系数 λ \lambda λ
    • 过大导致欠拟合,过小无法抑制过拟合,需通过网格搜索调整。
  2. Dropout概率 p p p
    • 通常设为0.5(隐藏层)或0.8(输入层),需根据任务调整。
  3. L1 vs L2
    • L1产生稀疏解,适合特征选择;L2更稳定,适合大多数场景。

通过灵活组合这些公式(如L2正则化+Dropout),可有效平衡模型复杂度和泛化能力。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐