Tensorflow 中的损失函数 —— loss 专题汇总

回归和分类是监督学习中的两个大类。自学过程中,阅读别人代码时经常看到不同种类的损失函数,到底 Tensorflow 中有多少自带的损失函数呢,什么情况下使用什么样的损失函数?这次就来汇总介绍一下。

一、处理回归问题

1. tf.losses.mean_squared_error:均方根误差(MSE) —— 回归问题中最常用的损失函数

优点是便于梯度下降,误差大时下降快,误差小时下降慢,有利于函数收敛。
缺点是受明显偏离正常范围的离群样本的影响较大

# Tensorflow中集成的函数
mse = tf.losses.mean_squared_error(y_true, y_pred)
# 利用Tensorflow基础函数手工实现
mse = tf.reduce_mean(tf.square(y_true -  y_pred))

2. tf.losses.absolute_difference:平均绝对误差(MAE) —— 想格外增强对离群样本的健壮性时使用

优点是其克服了 MSE 的缺点,受偏离正常范围的离群样本影响较小。
缺点是收敛速度比 MSE 慢,因为当误差大或小时其都保持同等速度下降,而且在某一点处还不可导,计算机求导比较困难。

maes = tf.losses.absolute_difference(y_true, y_pred)
maes_loss = tf.reduce_sum(maes)

3. tf.losses.huber_loss:Huber loss —— 集合 MSE 和 MAE 的优点,但是需要手动调超参数

核心思想是,检测真实值(y_true)和预测值(

<think>嗯,用户这次明确询问的是BatchLoss的概念和计算方法,看来ta正在学习深度学习训练过程中的基础指标。虽然上次讨论的是Epoch层面的损失,但这次更聚焦于微观的Batch级别。注意到用户引用的参考材料似乎有些错位——引用[1]提到的是神经网络学习规则与成本函数的关系,引用[2]关于随机森林,引用[3]涉及优化算法,但用户真正需要的应该是BatchLoss本身的定义。这说明用户可能是在查阅资料时收集了各种片段,但核心需求很明确:理解BatchLoss技术细节。结合专业经验,BatchLoss计算需要强调三个关键点:基础定义、计算公式的数学表达、以及代码实现示例。特别要区分BatchLoss和EpochLoss的差异,避免混淆。在解释公式$L_b=\frac{1}{n}\sum_{i=1}^{n}L(y_i,\hat{y}_i)$时,需要明确每个变量的含义:$n$是本批次的样本数而非总样本量,这个细节初学者常弄错。用户可能是刚接触深度学习实践的开发者,所以准备用PyTorch实现作为实例会更直观。考虑到上次对话提过Epoch,会在比较维度加入与Epoch的对比表,这样知识衔接更自然。另外损失函数类型需要举例说明——交叉熵和MSE最常用,但不宜展开过深以免偏离主题。最后生成的问题要聚焦BatchLoss的衍生知识:学习率影响、批次划分策略都是紧密相关的实践要点。用户上次对优化技术很关注(引用[3]提到SVRG等算法),但这次问题更基础,推测ta在系统构建知识体系。</think> 好的,我们来详细解析机器学习/深度学习中**Batch Loss(批次损失)** 的概念和计算方法。 ### 一、Batch Loss 的核心概念 1. **定义**: * Batch Loss 是指**模型在单个训练批次(Batch)的所有样本上计算出的损失函数值的平均数**。 * 它是模型在当前参数 $\theta$ 下,对该特定一小部分数据(即一个Batch)预测效果的量化衡量。 2. **作用**: * **参数更新的核心依据**:深度学习模型通常使用基于梯度的优化算法(如 SGD, Adam)。优化器计算的就是 Batch Loss $L_b(\theta)$ 相对于模型参数 $\theta$ 的梯度 $\nabla_\theta L_b(\theta)$。梯度方向指示了如何调整参数以使该 Batch 上的损失减少,然后参数根据此梯度进行更新[^1]。 * **模型训练过程的微观监控**:观察每个 Batch 的损失变化是监控模型是否在有效学习的最直接方式。理想情况下,随着训练的进行,每个 Batch 的损失平均值(Avg Train Loss)应呈现下降趋势。 * **与 Epoch Loss 的关系**: * 一个 **Epoch(训练轮次)** 表示模型完整遍历一次整个训练数据集。 * 一个 Epoch 包含多个 Batch。 * **Epoch Loss(或 Avg Train Loss)** 是一个 Epoch 内**所有 Batch Loss 的平均值**,反映了模型在一个完整数据周期上的整体表现。 ### 二、Batch Loss 的计算方法 1. **基本公式**: 假设一个 Batch 包含 $n$ 个样本。模型对第 $i$ 个样本的预测为 $\hat{y}_i$,其真实标签为 $y_i$。选定的损失函数为 $L(y_i, \hat{y}_i)$ (例如交叉熵、均方误差等)。 则该 Batch 的损失 $L_b$ 计算为: $$ L_b = \frac{1}{n} \sum_{i=1}^{n} L(y_i, \hat{y}_i) $$ * $L(y_i, \hat{y}_i)$: 第 $i$ 个样本的个体损失值。 * $\sum_{i=1}^{n}$: 将 Batch 内所有样本的个体损失值相加。 * $\frac{1}{n}$: 计算平均值,得到 Batch Loss。 2. **常见损失函数举例**: * **均方误差(Mean Squared Error, MSE)** (常用于回归问题): $$ L(y_i, \hat{y}_i) = (y_i - \hat{y}_i)^2 $$ Batch Loss: $$ L_b^{\text{MSE}} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 $$ * **交叉熵损失(Cross-Entropy Loss)** (常用于分类问题): * 对于二分类(假设使用 Sigmoid 输出): $$ L(y_i, \hat{y}_i) = - \big[y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i)\big] $$ * 对于多分类(假设使用 Softmax 输出): $$ L(y_i, \hat{y}_i) = - \sum_{c=1}^{C} y_{i, c} \log(\hat{y}_{i, c}) $$ 其中 $C$ 是类别总数,$y_{i, c}$ 是第 $i$ 个样本在第 $c$ 个类别上的真实标签(one-hot 向量形式),$\hat{y}_{i, c}$ 是模型预测该样本属于类别 $c$ 的概率。 Batch Loss: $$ L_b^{\text{CE}} = \frac{1}{n} \sum_{i=1}^{n} L(y_i, \hat{y}_i) $$ ### 三、Batch Loss 在训练循环中的位置(PyTorch 伪代码示例) ```python model = ... # 定义模型 optimizer = ... # 定义优化器 (如 optim.SGD, optim.Adam) criterion = ... # 定义损失函数 (如 nn.MSELoss(), nn.CrossEntropyLoss()) for epoch in range(num_epochs): # 遍历每个Epoch for inputs, labels in train_loader: # 遍历每个Batch (由 DataLoader 提供) optimizer.zero_grad() # 清零上一Batch的累积梯度 outputs = model(inputs) # 前向传播:模型在当前Batch上做预测 loss = criterion(outputs, labels) # 计算当前Batch Loss [^1] loss.backward() # 反向传播:计算Batch Loss相对于模型参数的梯度 optimizer.step() # 根据梯度更新模型参数 current_batch_loss = loss.item() # 获取当前Batch Loss数值用于记录 # ... (通常在此处记录或累积current_batch_loss) ``` * 关键行 `loss = criterion(outputs, labels)` 计算的就是 **Batch Loss**。PyTorch (及类似框架如 TensorFlow, Keras) 中的损失函数在设计上,默认对输入的整个 Batch 计算平均损失[^1]。 ### 四、Batch Loss 的特点与影响因素 1. **噪声性**: * 由于 Batch Loss 只基于一部分数据计算,它相比 Epoch Loss 具有更大的**随机性**或**噪声**。即使整体学习趋势良好,单个 Batch 的损失也可能暂时上升或波动。 * 这是因为单个 Batch 的数据分布可能不能完美代表整个训练集(尤其是 Batch Size 较小时)。 2. **Batch Size 的影响**: * **小 Batch Size** (e.g., 32, 64): * Batch Loss 噪声更大。 * 参数更新频率更高(在一个Epoch内)。 * 可能有助于模型找到更广的极小值点(对泛化有利)。 * **大 Batch Size** (e.g., 1024, 整个训练集 - Full Batch): * Batch Loss 更接近 Epoch Loss / 总体损失,噪声更小。 * 梯度计算更精确(方向更接近整个数据集的梯度)。 * 每个Epoch的参数更新次数更少。 * 计算每个Batch所需内存/计算资源更多。 | 特性 | 小 Batch Size | 大 Batch Size | | :--------------- | :------------------------------ | :------------------------------ | | **Loss 噪声** | 高 | 低 | | **更新频率/轮次** | 高 | 低 | | **梯度方向估计** | 随机性大,可能引入正则化效果 | 更精确,近似全集梯度 | | **内存需求** | 低 | 高 | | **稳定性** | 较低 (波动大) | 较高 (波动小) | ### 五、与 Epoch Loss 的对比总结 | 特性 | Batch Loss | Epoch Loss (Avg Train Loss) | | :----------- | :----------------------------------- | :-------------------------------------- | | **计算基础** | 单个 Batch 上的损失平均值 | 一个 Epoch 内所有 Batch Loss 的平均值 | | **噪声程度** | 高 (受单个 Batch 数据分布影响大) | 低 (多个 Batch 平均,平滑了噪声) | | **作用** | **参数更新**的直接依据 | **训练过程宏观监控**的主要指标 | | **主要用途** | 梯度计算,优化器更新参数 | 评估一轮训练整体效果,监控收敛,早停 | | **更新频率** | 每个 Batch 后计算并用于更新 | 每个 Epoch 结束时计算 | | **可视化** | 常以高密度点线图或滑动平均形式观察 | 常以单个点(每个Epoch一个点)连线形式 | **理解关键**:深度学习的训练过程本质上是通过在**连续不断的批次(Batch)** 上计算损失(Batch Loss)、求梯度并更新参数来驱动的。Epoch Loss 是为了宏观监控整个数据集上的学习趋势和收敛情况而对所有批次损失的汇总。 --- **
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WitsMakeMen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值