【深度学习基础】损失函数与优化算法详解:从理论到实践
【深度学习基础】损失函数与优化算法详解:从理论到实践
一、引言
1. 损失函数与优化算法在深度学习中的核心作用
在深度学习中,模型训练的本质是通过不断调整参数,使模型输出尽可能接近真实值。这一过程的核心驱动力是损失函数(Loss Function)和优化算法(Optimization Algorithm):
- 损失函数:量化模型预测值与真实值的差异,是模型性能的“评分标准”。例如,回归任务中常用的均方误差(MSE)直接衡量预测值与真实值的距离,而分类任务中的交叉熵损失(Cross-Entropy)则评估概率分布的匹配程度。
- 优化算法:根据损失函数的梯度信息,指导参数更新的方向和步长。例如,梯度下降通过反向传播计算梯度,逐步逼近损失函数的极小值点。
可以说,损失函数定义了模型的“目标”,而优化算法决定了如何高效地“抵达目标”。二者共同决定了模型的收敛速度、泛化能力以及最终性能。
2. 文章目标:系统掌握常见损失函数与优化算法的原理、实现及调参技巧
本文将从理论推导、代码实现和实战调参三个维度展开:
- 理论:解析损失函数与优化算法的数学原理,理解其适用场景与局限性。
- 实践:通过Python代码(NumPy/PyTorch)手写核心算法,并结合框架API演示实际应用。
- 调参:总结学习率设置、批量大小选择等关键技巧,帮助读者避开训练中的常见“坑”。
通过本文,读者不仅能掌握经典方法(如MSE、SGD、Adam),还能了解前沿改进(如Focal Loss、自适应优化器),最终具备根据任务需求灵活设计训练策略的能力。
二、损失函数:模型训练的“指南针”
1. 回归任务中的损失函数
回归任务的目标是预测连续值(如房价、温度),其损失函数需衡量预测值与真实值的距离。以下是两类经典损失函数:
1.1 均方误差(MSE, Mean Squared Error)
-
数学公式:
MSE = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 \text{MSE} = \frac{1}{n} \sum_{i=1}^n (y_i - \hat{y}_i)^2 MSE=n1i=1∑n(yi−y^i)2
其中 y i y_i yi 是真实值, y ^ i \hat{y}_i y^i 是预测值, n n n 是样本数量。 -
直观解释:
MSE 通过平方放大较大误差的影响(如预测误差为2时,损失为4;误差为3时,损失为9),因此对异常值敏感。 -
适用场景:
- 数据分布接近高斯分布(无明显异常值)时效果最佳。
- 常用于线性回归、神经网络回归任务。
-
局限性:
- 对异常值敏感,可能导致模型过度拟合噪声。
- 梯度随误差线性增长(梯度为 2 ( y i − y ^ i ) 2(y_i - \hat{y}_i) 2(yi−y^i)),可能引发训练不稳定。
-
代码实现(PyTorch):
import torch.nn as nn mse_loss = nn.MSELoss() loss = mse_loss(predictions, targets)
1.2 平均绝对误差(MAE, Mean Absolute Error)
-
数学公式:
MAE = 1 n ∑ i = 1 n ∣ y i − y ^ i ∣ \text{MAE} = \frac{1}{n} \sum_{i=1}^n |y_i - \hat{y}_i| MAE=n1i=1∑n∣yi−y^i∣ -
与MSE的对比:
- 鲁棒性:MAE 对异常值不敏感(损失随误差线性增长)。
- 梯度特性:MAE 的梯度为常数(±1),训练更稳定但收敛速度较慢。
-
适用场景:
- 数据中存在显著异常值(如金融风控中的极端值)。
- 需要稳定训练过程的场景。
-
代码实现(PyTorch):
mae_loss = nn.L1Loss() # L1损失即MAE loss = mae_loss(predictions, targets)
1.3 Huber Loss(平滑平均绝对误差)
-
数学公式:
L δ ( y , y ^ ) = { 1 2 ( y − y ^ ) 2 当 ∣ y − y ^ ∣ ≤ δ δ ∣ y − y ^ ∣ − 1 2 δ 2 否则 L_{\delta}(y, \hat{y}) = \begin{cases} \frac{1}{2}(y - \hat{y})^2 & \text{当 } |y - \hat{y}| \leq \delta \\ \delta |y - \hat{y}| - \frac{1}{2}\delta^2 & \text{否则} \end{cases} Lδ(y,y^)={21(y−y^)2δ∣y−y^∣−21δ2当 ∣y−y^∣≤δ否则
δ \delta δ 是超参数,控制 MSE 与 MAE 的切换阈值。 -
设计动机:
结合 MSE 的平滑性和 MAE 的鲁棒性,在误差较小时使用 MSE 加速收敛,误差较大时使用 MAE 减少异常值影响。 -
代码实现(手动实现):
def huber_loss(y_true, y_pred, delta=1.0):error = y_true - y_predcondition = torch.abs(error) < deltasquared_loss = 0.5 * torch.square(error)linear_loss = delta * (torch.abs(error) - 0.5 * delta)return torch.mean(torch.where(condition, squared_loss, linear_loss))
2. 分类任务中的损失函数
分类任务的目标是预测离散类别标签,损失函数需衡量预测概率分布与真实分布的差异。
2.1 交叉熵损失(Cross-Entropy Loss)
-
数学公式(二分类):
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 \left[ y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i) \right] L=−n1i=1∑n[yilog(y^i)+(1−yi)log(1−y^i)]
其中 y i ∈ { 0 , 1 } y_i \in \{0, 1\} yi∈{0,1}, y ^ i \hat{y}_i y^i 是模型预测的概率。 -
数学公式(多分类):
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)
C C C 为类别数, y i , c y_{i,c} yi,c 是 one-hot 编码的真实标签, y ^ i , c \hat{y}_{i,c} y^i,c 是 Softmax 输出的预测概率。 -
与 Softmax 的结合:
Softmax 将模型输出转换为概率分布,交叉熵衡量两个分布的差异。二者联合使用可避免数值不稳定。 -
代码实现(PyTorch):
- 二分类:
bce_loss = nn.BCELoss() # 输入需经过 Sigmoid loss = bce_loss(predictions, targets)
- 多分类:
ce_loss = nn.CrossEntropyLoss() # 输入为原始logits(无需Softmax) loss = ce_loss(logits, target_labels)
- 二分类:
2.2 合页损失(Hinge Loss)
-
数学公式:
L = 1 n ∑ i = 1 n max ( 0 , 1 − y i ⋅ y ^ i ) L = \frac{1}{n} \sum_{i=1}^n \max(0, 1 - y_i \cdot \hat{y}_i) L=n1i=1∑nmax(0,1−yi⋅y^i)
其中 y i ∈ { − 1 , 1 } y_i \in \{-1, 1\} yi∈{−1,1}, y ^ i \hat{y}_i y^i 是模型输出的原始得分(非概率)。 -
应用场景:
- 主要用于支持向量机(SVM),强调分类边界的“间隔”最大化。
- 对预测结果的置信度要求较高(如人脸识别)。
-
与交叉熵的对比:
- Hinge Loss 关注于分类正确且置信度高于阈值的样本,对“接近正确”的预测更宽容。
- 交叉熵对所有预测概率进行细粒度优化,适合需要概率校准的任务(如医学诊断)。
-
代码实现(手动实现):
def hinge_loss(y_true, y_pred):# 假设 y_true 为 ±1 的标签 return torch.mean(torch.clamp(1 - y_true * y_pred, min=0))
3. 其他损失函数
3.1 Focal Loss(焦点损失)
-
设计动机:
解决类别不平衡问题(如目标检测中背景与前景的极端不平衡),通过调节因子降低易分类样本的权重,使模型聚焦于难样本。 -
数学公式:
L = − 1 n ∑ i = 1 n α ( 1 − y ^ i ) γ y i log ( y ^ i ) L = -\frac{1}{n} \sum_{i=1}^n \alpha (1 - \hat{y}_i)^\gamma y_i \log(\hat{y}_i) L=−n1i=1∑nα(1−y^i)γyilog(y^i)- γ \gamma γ(聚焦参数):增大 γ \gamma γ 会更多关注难样本(通常取2)。
- α \alpha α(平衡参数):缓解类别不平衡(如正样本占比少时,增大正样本的 α \alpha α)。
-
代码实现(PyTorch):
class FocalLoss(nn.Module):def __init__(self, alpha=0.25, gamma=2):super().__init__()self.alpha = alphaself.gamma = gammadef forward(self, inputs, targets):bce_loss = nn.functional.binary_cross_entropy_with_logits(inputs, targets, reduction='none')p_t = torch.exp(-bce_loss) # 计算概率 focal_loss = self.alpha * (1 - p_t)**self.gamma * bce_lossreturn focal_loss.mean()
三、优化算法:模型参数的“导航仪”
1. 梯度下降(Gradient Descent)基础
梯度下降是优化神经网络参数的核心方法,其核心思想是通过迭代调整参数,使损失函数最小化。
1.1 数学原理
-
参数更新公式:
θ t + 1 = θ t − η ⋅ ∇ θ J ( θ t ) \theta_{t+1} = \theta_t - \eta \cdot \nabla_\theta J(\theta_t) θt+1=θt−η⋅∇θJ(θt)
其中:- θ t \theta_t θt:第 t t t 次迭代的参数值。
- η \eta η:学习率(Learning Rate),控制参数更新步长。
- ∇ θ J ( θ t ) \nabla_\theta J(\theta_t) ∇θJ(θt):损失函数对参数的梯度。
-
梯度方向的意义:
梯度指向损失函数增长最快的方向,反向更新参数以逼近最小值点。
1.2 学习率的作用与选择
- 学习率的影响:
- 过大:参数更新步长过大,可能导致震荡甚至发散(如损失值忽大忽小)。
- 过小:收敛速度慢,训练时间长。
- 学习率选择策略:
- 经验值:常用初始学习率为 0.1 0.1 0.1、 0.01 0.01 0.01 或 0.001 0.001 0.001。
- 学习率衰减(Learning Rate Decay):
随着训练轮次增加逐步减小学习率,例如:
η t = η 0 1 + decay_rate ⋅ t \eta_t = \frac{\eta_0}{1 + \text{decay\_rate} \cdot t} ηt=1+decay_rate⋅tη0 - 自适应学习率:由优化算法自动调整(如Adam)。
2. 梯度下降的三种变体
2.1 批量梯度下降(BGD, Batch Gradient Descent)
- 原理:每次迭代使用全部训练数据计算梯度。
- 优点:梯度方向准确,更新稳定。
- 缺点:
- 计算成本高,内存占用大。
- 无法在线更新模型(需遍历全量数据)。
- 代码示例:
for epoch in range(num_epochs):# 遍历整个数据集计算梯度 gradients = compute_gradient(entire_dataset, params) params = params - learning_rate * gradients
2.2 随机梯度下降(SGD, Stochastic Gradient Descent)
- 原理:每次迭代随机选取一个样本计算梯度。
- 优点:
- 计算速度快,内存占用低。
- 适合在线学习(实时更新模型)。
- 缺点:
- 梯度估计噪声大,更新方向波动剧烈。
- 收敛路径曲折,可能需要更多迭代次数。
- 代码示例:
for epoch in range(num_epochs):shuffle(dataset)for sample in dataset:gradients = compute_gradient(sample, params)params = params - learning_rate * gradients
2.3 小批量梯度下降(Mini-batch GD)
- 原理:每次迭代使用**一小批样本(Batch)**计算梯度(如32、64个样本)。
- 优点:
- 平衡计算效率与梯度稳定性。
- 适合GPU并行计算。
- 批量大小选择技巧:
- 较小批量(如32):梯度噪声大,可能带来正则化效果。
- 较大批量(如1024):内存占用高,但梯度方向更准确。
- 代码示例:
batch_size = 64 for epoch in range(num_epochs):shuffle(dataset)for i in range(0, len(dataset), batch_size):batch = dataset[i:i+batch_size]gradients = compute_gradient(batch, params)params = params - learning_rate * gradients
3. 改进型优化算法
3.1 动量法(Momentum)
-
原理:引入“动量”模拟物理惯性,加速收敛并减少震荡。
- 参数更新公式:
v t = γ v t − 1 + η ∇ θ J ( θ t ) v_{t} = \gamma v_{t-1} + \eta \nabla_\theta J(\theta_t) vt=γvt−1+η∇θJ(θt)
θ t + 1 = θ t − v t \theta_{t+1} = \theta_t - v_t θt+1=θt−vt
其中 γ \gamma γ 是动量系数(通常取0.9)。
- 参数更新公式:
-
作用:
- 在梯度方向变化时,动量项抑制震荡。
- 在梯度方向一致时,动量项加速更新。
-
代码实现(PyTorch):
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
3.2 AdaGrad & RMSProp
-
AdaGrad(自适应梯度):
- 原理:为每个参数自适应调整学习率,累积历史梯度平方和。
θ t + 1 = θ t − η G t + ϵ ⋅ ∇ θ J ( θ t ) \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{G_t + \epsilon}} \cdot \nabla_\theta J(\theta_t) θt+1=θt−Gt+ϵη⋅∇θJ(θt)
其中 G t G_t Gt 是历史梯度平方的累加。 - 缺点:随着训练进行,分母过大导致学习率趋近于零。
- 原理:为每个参数自适应调整学习率,累积历史梯度平方和。
-
RMSProp:
- 改进:引入指数衰减平均,仅关注近期梯度。
G t = β G t − 1 + ( 1 − β ) ∇ θ J ( θ t ) 2 G_t = \beta G_{t-1} + (1-\beta) \nabla_\theta J(\theta_t)^2 Gt=βGt−1+(1−β)∇θJ(θt)2
θ t + 1 = θ t − η G t + ϵ ⋅ ∇ θ J ( θ t ) \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{G_t + \epsilon}} \cdot \nabla_\theta J(\theta_t) θt+1=θt−Gt+ϵη⋅∇θJ(θt)
其中 β \beta β 是衰减因子(通常取0.9)。
- 改进:引入指数衰减平均,仅关注近期梯度。
-
代码实现(PyTorch):
# AdaGrad optimizer = torch.optim.Adagrad(model.parameters(), lr=0.01) # RMSProp optimizer = torch.optim.RMSprop(model.parameters(), lr=0.01, alpha=0.9)
3.3 Adam(Adaptive Moment Estimation)
-
原理:结合动量法与RMSProp,同时考虑梯度的一阶矩(均值)和二阶矩(方差)。
- 一阶矩(动量):
m t = β 1 m t − 1 + ( 1 − β 1 ) ∇ θ J ( θ t ) m_t = \beta_1 m_{t-1} + (1-\beta_1) \nabla_\theta J(\theta_t) mt=β1mt−1+(1−β1)∇θJ(θt) - 二阶矩(自适应学习率):
v t = β 2 v t − 1 + ( 1 − β 2 ) ∇ θ J ( θ t ) 2 v_t = \beta_2 v_{t-1} + (1-\beta_2) \nabla_\theta J(\theta_t)^2 vt=β2vt−1+(1−β2)∇θJ(θt)2 - 偏差校正(应对初始零偏问题):
m ^ t = m t 1 − β 1 t , v ^ t = v t 1 − β 2 t \hat{m}_t = \frac{m_t}{1 - \beta_1^t}, \quad \hat{v}_t = \frac{v_t}{1 - \beta_2^t} m^t=1−β1tmt,v^t=1−β2tvt - 参数更新:
θ t + 1 = θ t − η ⋅ m ^ t v ^ t + ϵ \theta_{t+1} = \theta_t - \frac{\eta \cdot \hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} θt+1=θt−v^t+ϵη⋅m^t
- 一阶矩(动量):
-
超参数调优:
- β 1 \beta_1 β1:通常取0.9,控制动量衰减。
- β 2 \beta_2 β2:通常取0.999,控制二阶矩衰减。
- ϵ \epsilon ϵ:防止除零(如 1 e − 8 1e-8 1e−8)。
-
代码实现(PyTorch):
optimizer = torch.optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.999))
4. 调参技巧
4.1 学习率设置
- 学习率预热(Warmup):
训练初期逐步增大学习率(如从0线性增长到初始值),避免参数更新剧烈震荡。 - 学习率衰减策略:
- 余弦退火(Cosine Annealing):周期性调整学习率。
- 按需衰减(ReduceLROnPlateau):当验证损失停滞时自动降低学习率。
4.2 批量大小的权衡
- 小批量:更适合非凸优化,可能找到更优的局部极小值。
- 大批量:需增大学习率,但可能降低模型泛化能力。
4.3 早停法(Early Stopping)与梯度裁剪
- 早停法:监控验证集损失,当连续多轮不下降时终止训练,防止过拟合。
- 梯度裁剪:限制梯度最大值(如
torch.nn.utils.clip_grad_norm_
),防止梯度爆炸。
四、实战:损失函数与优化算法的调参技巧
1. 损失函数的选择原则
1.1 根据任务类型匹配损失函数
-
回归任务:
- 数据分布接近正态分布且无显著异常值 → MSE。
- 数据存在异常值 → MAE 或 Huber Loss。
- 需要平衡鲁棒性与收敛速度 → Huber Loss(调整 (\delta) 参数)。
-
分类任务:
- 二分类或多分类 → 交叉熵损失(搭配 Softmax/Sigmoid)。
- 类别严重不平衡(如目标检测) → Focal Loss(调节 (\gamma) 和 (\alpha))。
- 强调分类边界间隔 → Hinge Loss(如 SVM)。
-
特殊任务:
- 生成对抗网络(GAN) → Wasserstein Loss(缓解模式崩溃)。
- 强化学习 → TD Error(时序差分误差)。
1.2 处理噪声与不平衡数据的策略
- 异常值处理:
- 使用鲁棒损失函数(如 MAE、Huber Loss)。
- 对数据预处理(如 Winsorizing 缩尾处理)。
- 类别不平衡:
- 损失函数层面:Focal Loss、加权交叉熵(
nn.CrossEntropyLoss(weight=class_weights)
)。 - 数据层面:过采样少数类(如 SMOTE)、欠采样多数类。
- 损失函数层面:Focal Loss、加权交叉熵(
2. 优化算法的调参经验
2.1 学习率设置技巧
-
学习率预热(Warmup):
- 作用:避免训练初期参数更新过大导致震荡。
- 实现:在前 (k) 步(如 1000 步)线性增加学习率至初始值。
def warmup_lr(step, warmup_steps, initial_lr):return initial_lr * min(step / warmup_steps, 1.0)
-
学习率衰减策略:
- 余弦退火(Cosine Annealing):周期性重置学习率,跳出局部极小。
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=50)
- 按需衰减(ReduceLROnPlateau):当验证损失停滞时自动降低学习率。
scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, 'min', patience=3)
- 余弦退火(Cosine Annealing):周期性重置学习率,跳出局部极小。
2.2 批量大小的选择与影响
- 经验法则:
- 小批量(32~256):适合大多数任务,平衡内存与收敛速度。
- 大批量(>1024):需增大学习率(如线性缩放规则:
lr = base_lr * batch_size / 256
)。
- 内存不足时的解决方案:
- 使用梯度累积(Gradient Accumulation):
for i, batch in enumerate(dataloader):loss = model(batch)loss.backward()if (i+1) % accumulation_steps == 0:optimizer.step()optimizer.zero_grad()
- 使用梯度累积(Gradient Accumulation):
2.3 早停法与梯度裁剪
-
早停法(Early Stopping):
best_loss = float('inf') patience = 5 counter = 0 for epoch in range(100):train_model()val_loss = evaluate()if val_loss < best_loss:best_loss = val_losscounter = 0torch.save(model.state_dict(), 'best_model.pth')else:counter += 1if counter >= patience:break
-
梯度裁剪(Gradient Clipping):
- 防止梯度爆炸(常见于RNN)。
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
3. 代码示例:从零实现优化算法
3.1 手写SGD优化器
class SGD:def __init__(self, params, lr=0.01):self.params = list(params)self.lr = lrdef step(self):for param in self.params:param.data -= self.lr * param.grad.datadef zero_grad(self):for param in self.params:if param.grad is not None:param.grad.detach_()param.grad.zero_()# 使用示例
model = ... # 定义模型
optimizer = SGD(model.parameters(), lr=0.01)
loss_fn = ...
for x, y in dataloader:optimizer.zero_grad()loss = loss_fn(model(x), y)loss.backward()optimizer.step()
3.2 手写Adam优化器
class Adam:def __init__(self, params, lr=0.001, betas=(0.9, 0.999), eps=1e-8):self.params = list(params)self.lr = lrself.beta1, self.beta2 = betasself.eps = epsself.m = [torch.zeros_like(p.data) for p in self.params] # 一阶矩 self.v = [torch.zeros_like(p.data) for p in self.params] # 二阶矩 self.t = 0def step(self):self.t += 1for i, param in enumerate(self.params):self.m[i] = self.beta1 * self.m[i] + (1 - self.beta1) * param.grad.dataself.v[i] = self.beta2 * self.v[i] + (1 - self.beta2) * param.grad.data ** 2# 偏差校正 m_hat = self.m[i] / (1 - self.beta1 ** self.t)v_hat = self.v[i] / (1 - self.beta2 ** self.t)# 更新参数 param.data -= self.lr * m_hat / (torch.sqrt(v_hat) + self.eps)def zero_grad(self):for param in self.params:if param.grad is not None:param.grad.detach_()param.grad.zero_()# 使用示例
optimizer = Adam(model.parameters(), lr=0.001)
3.3 PyTorch框架实战
import torch
from torch import nn, optim # 定义模型
model = nn.Sequential(nn.Linear(784, 256),nn.ReLU(),nn.Linear(256, 10)
)# 选择损失函数与优化器
loss_fn = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=1e-3, weight_decay=1e-4) # 带L2正则化 # 学习率调度器
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1) # 训练循环
for epoch in range(100):for x, y in dataloader:optimizer.zero_grad()logits = model(x)loss = loss_fn(logits, y)loss.backward()torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0) # 梯度裁剪 optimizer.step()scheduler.step()
4. 调参流程总结
- 任务分析:确定任务类型(回归/分类)与数据特点(是否含异常值、类别分布)。
- 损失函数选择:根据任务特点选择基础损失函数,必要时添加权重或改进(如Focal Loss)。
- 优化算法选择:
- 默认从 Adam 开始(学习率设为3e-4)。
- 对凸优化问题(如线性回归)可尝试 SGD + Momentum。
- 学习率调优:
- 初始学习率通过网格搜索(如1e-5到1e-1)。
- 添加学习率预热与衰减策略。
- 监控与调整:
- 使用TensorBoard监控训练/验证损失曲线。
- 早停法终止训练,梯度裁剪防止爆炸。
五、总结与展望
1. 损失函数与优化算法的核心关联性
损失函数与优化算法是深度学习模型训练的两大支柱,二者的协同作用决定了模型的最终性能:
-
损失函数为优化提供方向:
损失函数定义了模型需要最小化的目标(如回归任务的误差、分类任务的概率差异),其数学性质(如凸性、平滑性)直接影响优化难度。例如,交叉熵损失与Softmax结合时具有良好的凸性,而Hinge Loss的非平滑性可能需特定优化策略。 -
优化算法决定收敛效率:
梯度下降类算法通过梯度信息迭代更新参数,其变体(如Adam、动量法)通过引入动量、自适应学习率等机制,加速收敛并避免局部极小。例如,Adam在非凸优化问题中表现优异,而SGD+Momentum在特定任务(如图像分类)中仍具竞争力。 -
实践中的动态平衡:
损失函数的选择需与优化算法参数(如学习率、动量系数)相匹配。例如:- 使用MSE时,因梯度随误差线性增长,需较小的学习率防止震荡。
- 使用Focal Loss时,因损失动态调整样本权重,需配合稳定的优化器(如Adam)避免训练不稳定。
2. 未来方向:自动化与新型方法探索
2.1 自动化调参(AutoML)
- 神经架构搜索(NAS)与优化器联合优化:
现有AutoML工具(如Google的AutoML-Zero)已尝试自动设计优化算法,未来可能实现损失函数与优化器的端到端联合搜索。 - 元学习(Meta-Learning):
通过元学习框架(如MAML),模型可自动适应不同任务的最优损失函数与优化策略。
2.2 自适应优化算法的改进
- 动态环境适应:
针对在线学习、持续学习场景,开发自适应调整学习率与动量参数的算法(如Adan、Lion)。 - 二阶优化器的实用化:
传统二阶方法(如牛顿法)计算成本高,但近似二阶优化器(如K-FAC)在分布式训练中展现出潜力。
2.3 面向新型任务的损失函数设计
- 多模态与跨域任务:
设计统一损失函数处理多模态数据(如图文检索中的对比学习损失)。 - 可解释性与鲁棒性:
开发兼顾模型可解释性与对抗鲁棒性的损失函数(如对抗训练中的TRADES Loss)。
2.4 绿色AI与能效优化
- 低功耗优化策略:
研究稀疏梯度更新(如AdaGrad with Momentum)或量化训练技术,降低计算资源消耗。
3. 结语
损失函数与优化算法的研究贯穿深度学习发展史,从经典的SGD到如今的AutoML,每一次突破均推动模型性能的跃升。未来,随着计算硬件的升级与理论工具的完善,二者的协同创新将继续解决更复杂的现实问题(如自动驾驶、蛋白质结构预测)。读者可通过实践文中代码示例,结合前沿论文(如ICML、NeurIPS最新成果),深入参与这一充满活力的领域。
相关文章:
【深度学习基础】损失函数与优化算法详解:从理论到实践
【深度学习基础】损失函数与优化算法详解:从理论到实践 一、引言 1. 损失函数与优化算法在深度学习中的核心作用 在深度学习中,模型训练的本质是通过不断调整参数,使模型输出尽可能接近真实值。这一过程的核心驱动力是损失函数(…...
睿抗足球机器人
目录 大框架 战术 Lua脚本语言编辑环境 大框架 策略脚本(LUA-官方脚本)、决策算法(C-自定义)、ROS系统 战术 我们研究了场地的长度、宽度、禁区范围、机器人运动速度等等,发现即使 Kicker 点球往极端角度踢…...
助力DBA技能无缝平迁 | YashanDB携最新成果亮相XCOPS智能运维管理人年会
5 月 16 日,由上海市软件行业协会、上海市计算机行业协会指导, dbaplus社群主办的XCOPS智能运维管理人年会在广州盛大召开,活动汇聚500余名金融、政府、能源、教育、电信、交通等领域的行业专家。深算院崖山数据库受邀参会,系统性…...
服务端安全测试:OWASP ZAP使用
ZAP下载地址:https://www.zaproxy.org/download/ ZAP有两种扫描方式: 1、使用 OpenAPI / Swagger 地址进行扫描 2、ZAP Proxy + Postman 因为业务云没有添加swagger插件所以本次介绍第2种方式。 【第一步】设置 ZAP 的代理端口(默认是 127.0.0.1:8080) 成功安装并打…...
Amazon Q 从入门到精通 – 测试与重构
Amazon Q Developer 是亚马逊推出的一个专为专业开发人员设计的人工智能助手,旨在提升代码开发和管理效率。其主要功能包括代码生成、调试、故障排除和安全漏洞扫描,提供一站式代码服务。 众所周知,在软件开发领域,测试代码是软件…...
[CSS3]属性增强2
空间转换 使用transform属性实现元素在空间内的位移、旋转、缩放等效果 空间: 是从坐标轴角度定义的。x、y 和z三条坐标轴构成了一个立体空间,z轴位置与视线方向相同。空间转换也叫3D转换 空间位移 使用translate实现元素空间位移效果 transform: translate3d(x…...
Go 语言 vs C+Lua(Skynet)游戏服务器方案对比分析
为啥挑这两个呢?因为两种技术分别对应CSP模型和Actor模型,都是经过时间检验的成熟且可靠的并发模型,问了很多地方,经过gpt整理得出如下报告。 从开发效率、运行性能、热更新扩展、云部署与水平扩展能力、多类型游戏支持等五个维度…...
ArcGIS Pro 3.4 二次开发 - 内容
环境:ArcGIS Pro SDK 3.4 .NET 8 文章目录 内容1 工程1.1 创建一个空工程1.2 使用指定名称创建新工程1.3 使用Pro的默认设置创建新工程1.4 使用自定义模板文件创建新工程1.5 使用 ArcGIS Pro 提供的模板创建工程1.6 打开现有工程1.7 获取当前工程1.8 获取当前工程的…...
java每日精进 5.19【Excel 导入导出】
基于 EasyExcel 实现 Excel 的读写操作,可用于实现最常见的 Excel 导入导出等功能。 Excel 导入导出功能涉及前后端协作,后端处理数据查询、文件生成和解析,前端提供用户交互和文件下载/上传界面。以下是全流程解析,分为导出流程…...
基于Elasticsearch的搜索引擎简介
## 一、Elasticsearch简介 Elasticsearch(简称ES)是一个开源的、分布式、RESTful风格的搜索和数据分析引擎,基于Apache Lucene开发。它能够实现对海量结构化和非结构化数据的实时存储、搜索和分析,广泛应用于全文检索、日志分析、…...
不同类型桥梁的无人机检测内容及技术难度
不同类型桥梁的无人机检测内容及技术难度 无人机桥梁检测的难度因桥梁类型、结构特点和所处环境的不同而存在显著差异。以下是针对梁桥、拱桥、斜拉桥、悬索桥等主要桥梁类型的无人机检测难度分析: 1. 梁桥(简支梁、连续梁) 检测难度&#x…...
数据结构实验10.1:内部排序的基本运算
文章目录 一,实验目的二,实验内容1. 数据生成与初始化2. 排序算法实现(1)直接插入排序(2)二分插入排序(3)希尔排序(4)冒泡排序(5)快速…...
java20
1.List集合 2.数据结构之栈,队列,数组,链表 3.ArrayList集合 4.LinkedList 5.泛型 注意:E...e是指若干个变量...
LLM笔记(九)KV缓存(2)
文章目录 1. 背景与动机2. 不使用 KV Cache 的情形2.1 矩阵形式展开2.2 计算复杂度 3. 使用 KV Cache 的优化3.1 核心思想3.2 矩阵形式展开3.3 计算复杂度对比 4. 总结5. GPT-2 中 KV 缓存的实现分析5.1 缓存的数据结构与类型5.2 在注意力机制 (GPT2Attention) 中使用缓存5.3 缓…...
将 Element UI 表格拖动功能提取为公共方法
为了在多个页面复用表格拖动功能,我们可以将其封装成以下两种形式的公共方法: 方案一:封装为 Vue 指令(推荐) 1. 创建指令文件 src/directives/tableDrag.js import interact from interactjs;export default {inse…...
项目中把webpack 打包改为vite 打包
项目痛点: 老vu e-cli1创建的项目,项目是ERP系统集成了很多很多管理,本地运行调试的时候,每次修改代码都需要等待3分钟左右的编译时间,严重影响开发效率. 解决方案: 采用vite构建项目工程 方案执行 第一步 使用vite脚手架构件一个项目,然后把build文件自定义的编译逻辑般到…...
Vue3 Element Plus 中el-table-column索引使用问题
在 Element Plus 的 el-table 组件中,使用 scope.index 是不准确的。正确的索引属性应该是 scope.$index。你的代码需要调整为: vue 复制 下载 <el-button type"primary" size"default" text click"onModifyClick(scope…...
盲盒一番赏小程序系统发展:创新玩法激发市场活力
盲盒一番赏小程序系统凭借其创新的玩法,在潮玩市场中脱颖而出,激发了市场的无限活力。它不仅保留了传统一番赏百分百中奖的特点,还结合线上平台的优势,开发出了更多新颖的玩法。 例如,小程序系统设置了赏品回收功能。…...
MySQL故障排查
目录 MySQL 单示例故障排查 故障现象一 故障现象二 故障现象三 故障现象四 故障现象五 故障现象六 故障现象七 故障现象八 MySQL主从复制排查 故障现象一 故障现象二 故障现象三 MySQL 优化 硬件方面 关于CPU 关于内存 关于磁盘 MySQL配置文件 核…...
微服务项目->在线oj系统(Java版 - 4)
相信自己,终会成功 目录 B端用户管理 C端用户代码 发送验证码: 验证验证码 退出登录 登录用户信息功能 用户详情与用户编辑 用户竞赛接口 用户报名竞赛 用户竞赛报名接口查询 用户信息列表 ThreadLocalUtil Hutool工具库 常用功能介绍 B端用户管理 进行列表显示与…...
DDoS与CC攻击:谁才是服务器的终极威胁?
在网络安全领域,DDoS(分布式拒绝服务)与CC(Challenge Collapsar)攻击是两种最常见的拒绝服务攻击方式。它们的目标都是通过消耗服务器资源,导致服务不可用,但攻击方式、威胁程度和防御策略存在显…...
旧物回收小程序,一键解决旧物处理难题
在快节奏的现代生活中,我们常常会面临旧物处理的困扰。扔掉觉得可惜,留着又占空间,而且处理起来还十分麻烦。别担心,我们的旧物回收小程序来啦,只需一键,就能轻松解决你的旧物处理难题! 这款小…...
uniapp小程序获取手机设备安全距离
utils.js let systemInfo null;export const getSystemInfo () > {if (!systemInfo) {systemInfo uni.getSystemInfoSync();// 补充安全区域默认值systemInfo.safeAreaInsets systemInfo.safeAreaInsets || {top: 0,bottom: 0,left: 0,right: 0};// 确保statusBarHei…...
小程序弹出层/抽屉封装 (抖音小程序)
最近忙于开发抖音小程序,最想吐槽的就是,既没有适配的UI框架,百度上还找不到关于抖音小程序的案列,我真的很裂开啊,于是我通过大模型封装了一套代码 效果如下 介绍 可以看到 这个弹出层是支持关闭和标题显示的…...
map与set封装
封装map和set一般分为6步: 1.封装map与set 2.普通迭代器 3.const 迭代器 4.insert返回值处理 5.map operator【】 6.key不能修改的问题 一.红黑树的改造 map与set的底层是通过红黑树来封装的,但是map与set的结点储存的值不一样,set只需要存…...
【C语言基础语法入门】通过简单实例快速掌握C语言核心概念
文章目录 1. Hello World:第一个C程序2. 变量与数据类型3. 运算符4. 控制结构4.1 if-else 条件判断4.2 for 循环4.3 while 循环 5. 函数6. 数组7. 指针8. 结构体总结 📣按照国际惯例,首先声明:本文只是我自己学习的理解࿰…...
Manus AI 突破多语言手写识别技术壁垒:创新架构、算法与应用解析
在人工智能领域,手写识别技术作为连接人类自然书写与数字世界的桥梁,一直备受关注。然而,多语言手写识别面临诸多技术挑战,如语言多样性、书写风格差异、数据稀缺性等。Manus AI 作为该领域的领军者,通过一系列创新技术…...
数字图像处理——图像压缩
背景 图像压缩是一种减少图像文件大小的技术,旨在在保持视觉质量的同时降低存储和传输成本。随着数字图像的广泛应用,图像压缩在多个领域如互联网、移动通信、医学影像和卫星图像处理中变得至关重要。 技术总览 当下图像压缩JPEG几乎一统天下ÿ…...
SGLang和vllm比有什么优势?
环境: SGLang vllm 问题描述: SGLang和vllm比有什么优势? 解决方案: SGLang和vLLM都是在大语言模型(LLM)推理和部署领域的开源项目或框架,它们各自有不同的设计目标和优势。下面我综合目前…...
BeanFactory和FactoryBean的区别
目录 1、Spring-core 2、控制反转(IoC) 2.1、定义 2.2、实现方式 1、BeanFactory 2、ApplicationContext 3、FactoryBean BeanFactory是容器,管理所有Bean(包括FactoryBean),FactoryBean是被管理的Bean,只是它有…...
仓颉开发语言入门教程:搭建开发环境
仓颉开发语言作为华为为鸿蒙系统自研的开发语言,虽然才发布不久,但是它承担着极其重要的历史使命。作为鸿蒙开发者,掌握仓颉开发语言将成为不可或缺的技能,今天我们从零开始,为大家分享仓颉语言的开发教程,…...
火花生态【算力通】公测,助力全球闲置算力训练AI模型
近日,在数字化浪潮迅猛推进的大背景下,人工智能模型训练对算力的需求呈井喷式增长,而全球范围内大量算力资源却处于闲置状态,如何高效整合这些闲置算力,成为推动行业发展的关键命题。在此关键时刻,火花生态旗下的核心产品【算力通】(ComputePower)于 2025 年 5 月 10 日正式开启…...
OpenMV IDE 的图像接收缓冲区原理
OpenMV IDE 的图像接收缓冲区原理与 嵌入式图像处理系统 的数据流控制密切相关。以下是其核心工作原理的分步解析: 一、图像缓冲区架构 OpenMV 的整个图像处理流程基于 双缓冲(Double Buffering)机制,主要分为以下层级࿱…...
如何在LVGL之外的线程更新UI内容
前言 作为一个刚开始学习LVGL和嵌入式开发的新手,学会绘制一个界面之后,遇到了一个问题:在LVGL线程之外的线程,更新UI内容时,会导致程序崩溃。 1、问题分析 首先,需要了解LVGL的基本工作原理。LVGL&#…...
实景VR展厅制作流程与众趣科技实景VR展厅应用
实景VR展厅制作是一种利用虚拟现实技术将现实世界中的展览空间数字化并在线上重现的技术。 这种技术通过三维重建和扫描等手段,将线下展馆的场景、展品和信息以三维形式搬到云端数字空间,从而实现更加直观、立体的展示效果。在制作过程中,首…...
Regmap子系统之六轴传感器驱动-编写icm20607.c驱动
(一)在驱动中要操作很多芯片相关的寄存器,所以需要先新建一个icm20607.h的头文件,用来定义相关寄存器值。 #ifndef ICM20607_H #define ICM20607_H /*************************************************************** 文件名 : i…...
计算机网络-HTTP与HTTPS
文章目录 计算机网络网络模型网络OSITCP/IP 应用层常用协议HTTP报文HTTP状态码HTTP请求类型HTTP握手过程HTTP连接HTTP断点续传HTTPSHTTPS握手过程 计算机网络 网络模型 为了解决多种设备能够通过网络相互通信,解决网络互联兼容性问题。 网络模型是计算机网络中用于…...
Text2SQL在Spark NLP中的实现与应用:将自然语言问题转换为SQL查询的技术解析
概述 SQL 仍然是当前行业中最受欢迎的技能之一 免责声明:Spark NLP 中的 Text2SQL 注释器在 v3.x(2021 年 3 月)中已被弃用,不再使用。如果您想测试该模块,请使用 Spark NLP for Healthcare 的早期版本。 自新千年伊…...
Ubuntu20.04下使用dpkg方式安装WPS后,将WPS改为中文界面方法
Ubuntu20.04下使用dpkg方式安装WPS后,将WPS改为中文界面方法 说明方法 说明 Ubuntu20.04下使用dpkg方式安装WPS后,打开WPS后,发现界面是英文的,如有需要可以按照下面的方法将其改为中文界面。 方法 cd /opt/kingsoft/wps-offic…...
OpenCV CUDA 模块中的矩阵算术运算-----在频域(复数频谱)中执行逐元素乘法并缩放的函数mulAndScaleSpectrums()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 mulAndScaleSpectrums()是OpenCV CUDA模块中用于在频域(复数频谱)中执行逐元素乘法并缩放 的函数。 这个函数主要用于在…...
批量剪辑 + 矩阵分发 + 数字人分身源码搭建全技术解析,支持OEM
在互联网内容生态蓬勃发展的当下,企业与创作者对内容生产与传播效率的要求日益增长。批量剪辑、矩阵分发和数字人分身技术的融合,成为提升内容创作与运营效能的关键方案。从源码层面实现三者的搭建与整合,需要深入理解各功能技术原理…...
Spring Boot 与 RabbitMQ 的深度集成实践(三)
高级特性实现 消息持久化 在实际的生产环境中,消息的可靠性是至关重要的。消息持久化是确保 RabbitMQ 在发生故障或重启后,消息不会丢失的关键机制。它涉及到消息、队列和交换机的持久化配置。 首先,配置队列持久化。在创建队列时…...
部署java项目
1.编写shell脚本部署服务 restart.sh #!/bin/bash # # start the user program # echo "-------------------- start jk service --------------------" LOG_DIR"/home/joy/usr/app/ers-log" LOG_FILE"$LOG_DIR/log_$(date "%Y%m%d").txt&…...
中国城市间交通驾车距离矩阵(2024)
中国城市间交通驾车距离矩阵(2024) 1852 数据简介 中国城市中心的交通驾车距离,该数据为通过审图号GS(2024)0650的中国城市地图得其城市中心距离,再通过高德地图api计算得出其交通驾车最短距离矩阵,单位为KM,方便大家研究使用。…...
物联网数据湖架构
物联网海量数据湖分析架构(推荐实践) ┌──────────────┐ │ IoT设备端 │ └──────┬───────┘│(MQTT/HTTP)▼ ┌──────────────┐ │ EMQX等 │ 可选(也可…...
Python将Excel单元格某一范围生成—截图(进阶版—带样式+批量+多级表头)
目录 专栏导读1、库的介绍2、库的安装3、核心代码4、通用版——带样式5、进阶版(可筛选+自动截图)多级表头版总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该…...
使用Python将 Excel 中的图表、形状和其他元素导出为图片
目录 为什么将 Excel 中的图表、形状和其他元素导出为图片? 工具与设置 Python 将 Excel 图表导出为图片 将图表导出为图片 将图表工作表导出为图片 Python 将 Excel 中的形状和其他元素导出为图片 微软 Excel 是一个功能强大的数据分析和可视化工具ÿ…...
从编程助手到AI工程师:Trae插件Builder模式实战Excel合并工具开发
Trae插件下载链接:https://www.trae.com.cn/plugin 引言:AI编程工具的新纪元 在软件开发领域,AI辅助编程正在经历一场革命性的变革。Trae插件(原MarsCode编程助手)最新推出的Builder模式,标志着AI编程工具…...
AI大模型从0到1记录学习numpy pandas day25
第 3 章 Pandas 3.1 什么是Pandas Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)…...
【云实验】Excel文件转存到RDS数据库
实验名称:Excel文件转存到RDS数据库 说明:把Excel的数据通过数据管理服务DMS(Data Management Service)导入到RDS MySQL数据库中。 流程:创建一个RDS for MySQL的实例,再创建数据库和账号,通过D…...