如果我有类似的东西:
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 所在层的权重?或者它是否用于模型的所有层?
model
文档:
loss:字符串(目标函数名称)或目标函数。见损失。如果模型有多个输出,您可以通过传递字典或损失列表来在每个输出上使用不同的损失。模型将最小化的损失值将是所有单独损失的总和。
...
loss_weights:指定标量系数(Python 浮点数)的可选列表或字典,用于对不同模型输出的损失贡献进行加权。模型将最小化的损失值将是所有单独损失的加权和,并由
系数加权。如果是列表,则预计与模型的输出有 1:1 的映射。如果是张量,则期望将输出名称(字符串)映射到标量系数。loss_weights
所以,是的,最终损失将是“所有个体损失的加权总和,由
loss_weights
系数加权”。
您可以查看计算损失的代码。
另外,训练期间这意味着什么? loss2 是否仅用于更新 y2 所在层的权重?或者它是否用于模型的所有层?
权重通过反向传播进行更新,因此每个损失只会影响将输入连接到损失的层。
例如:
+----+
> C |-->loss1
/+----+
/
/
+----+ +----+/
-->| A |--->| B |\
+----+ +----+ \
\
\+----+
> D |-->loss2
+----+
loss1
会影响 A、B 和 C。loss2
会影响 A、B 和 D。对于反向传播的多个输出,我认为这不是 Fábio Perez 提到的完整答案。
另外,训练期间这意味着什么? loss2是否仅用于 更新 y2 来自的层的权重?或者它用于 模型的所有图层?
对于输出C和输出D,keras将计算最终损失F_loss=w1 * loss1 + w2 * loss2。然后,将最终损失 F_loss 应用于输出 C 和输出 D。最后,使用相同的 F_loss 进行反向传播,从输出 C 和输出 D 进行反向传播。
背后发生了什么
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`
所以: