keras 如何处理多重损失?

问题描述 投票:0回答:3

如果我有类似的东西:

model = Model(inputs = input, outputs = [y1,y2])

l1 = 0.5
l2 = 0.3
model.compile(loss = [loss1,loss2], loss_weights = [l1,l2], ...)

Keras 对损失做了什么以获得最终损失? 是不是类似:

final_loss = l1*loss1 + l2*loss2

另外,训练期间这意味着什么? loss2 是否仅用于更新 y2 所在层的权重?或者它是否用于模型的所有层?

deep-learning keras backpropagation loss-function
3个回答
76
投票

来自

model
文档

loss:字符串(目标函数名称)或目标函数。见损失。如果模型有多个输出,您可以通过传递字典或损失列表来在每个输出上使用不同的损失。模型将最小化的损失值将是所有单独损失的总和。

...

loss_weights:指定标量系数(Python 浮点数)的可选列表或字典,用于对不同模型输出的损失贡献进行加权。模型将最小化的损失值将是所有单独损失的加权和,并由

loss_weights
系数加权。如果是列表,则预计与模型的输出有 1:1 的映射。如果是张量,则期望将输出名称(字符串)映射到标量系数。

所以,是的,最终损失将是“所有个体损失的加权总和,由

loss_weights
系数加权”。

您可以查看计算损失的代码

另外,训练期间这意味着什么? loss2 是否仅用于更新 y2 所在层的权重?或者它是否用于模型的所有层?

权重通过反向传播进行更新,因此每个损失只会影响将输入连接到损失的层。

例如:

                        +----+         
                        > C  |-->loss1 
                       /+----+         
                      /                
                     /                 
    +----+    +----+/                  
 -->| A  |--->| B  |\                  
    +----+    +----+ \                 
                      \                
                       \+----+         
                        > D  |-->loss2 
                        +----+         
  • loss1
    会影响 A、B 和 C。
  • loss2
    会影响 A、B 和 D。

15
投票

对于反向传播的多个输出,我认为这不是 Fábio Perez 提到的完整答案。

另外,训练期间这意味着什么? loss2是否仅用于 更新 y2 来自的层的权重?或者它用于 模型的所有图层?

对于输出C和输出D,keras将计算最终损失F_loss=w1 * loss1 + w2 * loss2。然后,将最终损失 F_loss 应用于输出 C 和输出 D。最后,使用相同的 F_loss 进行反向传播,从输出 C 和输出 D 进行反向传播。


0
投票

背后发生了什么

model.fit

损失计算:

loss_values = [] 
for loss_obj, loss_weight in zip(*zip_args):
    loss_value *= loss_weight
    loss_values.append(loss_value)
    reg_loss = math_ops.add_n(regularization_losses)
    loss_values.append(reg_loss)
total_loss = math_ops.add_n(loss_values)

梯度计算和权重更新:

gradients = tape.gradient(loss, trainable_variables)
optimizer.apply_gradients(zip(gradients, trainable_variables))

注意

tape.gradient will auto gradient, here 
loss
 is the node in graph, auto gradient will trace all gradient in the graph,
total_loss = loss1 + loss2`

所以:

  • loss1 会影响 A、B 和 C。
  • loss2 会影响 A、B 和 D。
© www.soinside.com 2019 - 2024. All rights reserved.