Tensorflow 多个损失函数合成与多个损失函数多次操作的区别(Tensorflow: Multiple loss functions vs Multiple training ops)

本文探讨了在深度学习中联合训练与交替训练的区别。联合训练适用于共享特征的多任务模型,如目标检测中的分类与回归。而交替训练则适用于多输出但特征独立的任务,如多语言翻译。文章分析了两种方法的适用场景与潜在问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码样例

第一种情况

final_loss = tf.reduce_mean(loss1+loss2)
train_op = tf.train.AdamOptimizer().minimize(final_loss)

第二种情况

train_op1 = tf.train.AdamOptimizer().minimize(loss1)
train_op2 = tf.train.AdamOptimizer().minimize(loss2)
final_train_op = tf.group(train_op1 train_op2)

上述两种情况的差别分析

第一种情况是一种混合训练(joint training),这种方式是统一同时考虑多个loss的影响;这种方式常用在使用同一数据集进行训练,使用同一feature但是不同输出任务的模型训练过程中,比如目标检测领域的分类与回归任务要求采用同样的feature [1]。
第二种情况是一种选择性学习(alternative training),这并不是同时考虑两种loss的约束,而是试图在两种任务中取得某种平衡,一般而言会使用在模型有多个输出,但是这多个输出并不使用同样的feature;比如在指引第一个op时可能使用某些feature导致的结果,而在使用第二个op时可能使用的是另外一些featrue的结果。

上述两种情况可用下图进行归纳:
在这里插入图片描述
上图是 Alternative training,可见使用了不同的layer导出的结果

在这里插入图片描述
上图是 Joint training ,可见使用的是同样的feature进行的判断

如何选择上述两种方法

第二种方法常用于这样的场合: 你具有两种不同的数据集,并且需要执行不同的任务,但是网络设计的feature 提取部分确需要是相同的,比如你需要将英文转变为法文,与此同时你也需要模型能将同样的英文输入转为德文;但是这种方法的使用往往取决于你的样本数量,如果样本数量严重不匹配,比如法文数据集远大于德文数据集,那么训练时很容易造成同法文翻译相关的某些bias 难以适应德文,因而造成训练困难。
第一种方法适合于处理上述第二种方法的缺陷,这相当于是迫使loss做困难样本的在线挖掘并加强处理;另外采用第一种方法需要注意的是,如果存在有的loss 的返回值远小于其他loss的情况,如果在送入优化器之前直接相加这会导致这些loss的信息被忽略;一个有效的办法是采用第二种办法进行训练,同时采用Adam优化器,因为Adam优化器在loss输入后会进行normalize处理,同具体的loss值大小关系不大。

总的来说,我个人比较倾向于采用第二种方案来进行训练,因为大体上来讲可以将不同种类的loss设置不同的优化方案,并且在大多数情况下第二种和第一种的差距十分小。

参考文献

[1] https://jg8610.github.io/Multi-Task/

### 定义 #### L1 Loss (绝对误差损失) L1 Loss 表示预测值实际值之间差异的绝对值总和。对于单个样本而言,其计算方式如下: \[ \text{L1 Loss} = |y_{\text{pred}} - y_{\text{true}}| \] 其中 \( y_{\text{pred}} \) 是模型给出的预测结果,\( y_{\text{true}} \) 则代表真实的标签值。 在多维情况下,则是对所有维度上的差取绝对值得到向量后再求和[^1]。 ```python import torch.nn as nn criterion_l1 = nn.L1Loss() output = criterion_l1(torch.tensor([0.8]), torch.tensor([1.0])) print(output.item()) ``` #### L2 Loss (均方误差损失) L2 Loss 计算的是预测值目标值之间的平方差平均数,在数学上也被称为欧几里得距离或欧式距离。具体表达式为: \[ \text{L2 Loss} = (y_{\text{pred}} - y_{\text{true}})^2 \] 同样地,在处理多个特征时会先逐元素相减并平方之后再累加起来除以样本数量得到最终的结果[^2]。 ```python import torch.nn.functional as F def mse_loss(input, target): return F.mse_loss(input, target) output = mse_loss(torch.tensor(0.9), torch.tensor(1.0)) print(output.item()) ``` ### 区别 - **对离群点敏感程度不同**: L2 Loss 对于较大的残差更加敏感,因为它是基于二次幂运算;而 L1 Loss 只考虑绝对偏差大小,因此相对更稳健一些,不易受到极端数据的影响[^3]。 - **导数特性有异**: 当接近最优解附近时,由于 L2 Loss 函数曲线较为平坦,所以能够提供较小但持续存在的梯度来帮助优化过程收敛;相反,L1 Loss 在零处不可微分,这可能导致某些算法难以有效工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值