用deepseek学大模型07-激活函数和损失函数
激活函数输出范围梯度特性计算成本适用场景Sigmoid(0,1)最大0.25高二分类输出层Tanh(-1,1)最大1.0高RNN隐藏层ReLU[0, +∞)0或1低通用隐藏层Leaky ReLU(-∞, +∞)0.01或1低避免神经元死亡Softmax[0,1] (概率)依赖输入分布高多分类输出层。
deepseek.com 常用的激活函数有哪些?特点是什么?常用的损失函数有哪些?特点是什么?
以下是对常用激活函数和损失函数的系统总结,包含数学形式、特性对比及PyTorch实现:
一、常用激活函数及特性
1. Sigmoid
- 数学形式:
σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+e−x1 - 特点:
- 输出范围 (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+e−xex−e−x - 特点:
- 输出范围 (-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=1∑N(yi−y^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=1∑Nc=1∑Cyi,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=1∑N[yilogy^i+(1−yi)log(1−y^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(y−y^)2δ(∣y−y^∣−21δ)∣y−y^∣≤δ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() |
四、选择指南
激活函数选择
- 隐藏层优先选择:
- ReLU系列(计算高效)
- 有死亡神经元风险时 → Leaky ReLU
- 输出层选择:
- 二分类 → Sigmoid
- 多分类 → Softmax
- 回归 → 无激活(线性输出)
损失函数选择
- 分类任务:
- 二分类 →
BCEWithLogitsLoss
- 多分类 →
CrossEntropyLoss
- 二分类 →
- 回归任务:
- 数据干净 → MSE
- 含噪声 → Huber Loss
- 特殊需求:
- 类别不平衡 → 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,经过多层连乘后,梯度会指数级减小,最终趋近于零,导致浅层网络的权重无法有效更新。
- 常见场景:使用Sigmoid或Tanh激活函数时,这些函数的导数在输入较大或较小时接近零,容易导致梯度消失。
-
梯度爆炸:
- 原因:如果每一层的梯度值大于1,经过多层连乘后,梯度会指数级增大,导致权重更新过大,模型无法收敛。
- 常见场景:权重初始化过大或网络层数过深时,梯度在反向传播过程中不断放大。
二、解决方法
-
梯度消失的解决方法:
- 使用ReLU及其变体:ReLU在正区间的导数为1,避免了梯度消失问题。
- 权重初始化:使用Xavier或He初始化方法,确保权重初始值合理。
- 批量归一化(Batch Normalization):通过归一化每层的输入,稳定梯度传播。
- 残差网络(ResNet):通过跳跃连接(skip connections)让梯度直接传递,缓解梯度消失。
-
梯度爆炸的解决方法:
- 梯度裁剪(Gradient Clipping):限制梯度的最大值,防止梯度过大。
- 权重正则化:通过L1或L2正则化限制权重大小。
- 调整学习率:使用较小的学习率或自适应优化器(如Adam)。
三、激活函数的选择
- ReLU:最常用的激活函数,计算简单且能有效缓解梯度消失问题。
- Leaky ReLU:在负区间引入小斜率,避免ReLU的“神经元死亡”问题。
- Sigmoid:适用于二分类问题的输出层,但容易导致梯度消失。
- Tanh:输出范围为[-1, 1],比Sigmoid更适合中间层。
- 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=pm⊙h,m∼Bernoulli(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=1∑Nc=1∑Cyi,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.Dropout
、weight_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) wi←wi−η⋅(∂wi∂Loriginal+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=pm⊙h,m∼Bernoulli(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=1∑Nc=1∑Cyi,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=pm⊙h(训练时) | 降低神经元间依赖性,增强泛化性 |
交叉熵损失 | 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=−N1∑i∑cyi,clog(pi,c) | 分类任务的基础损失函数 |
四、公式应用注意事项
- 正则化系数 λ \lambda λ:
- 过大导致欠拟合,过小无法抑制过拟合,需通过网格搜索调整。
- Dropout概率 p p p:
- 通常设为0.5(隐藏层)或0.8(输入层),需根据任务调整。
- L1 vs L2:
- L1产生稀疏解,适合特征选择;L2更稳定,适合大多数场景。
通过灵活组合这些公式(如L2正则化+Dropout),可有效平衡模型复杂度和泛化能力。
更多推荐
所有评论(0)