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

代码样例

第一种情况

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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值