Keras 计算是基于图形的,并且只使用一个优化器。
优化器也是图的一部分,在它的计算中它得到了整个权重组的梯度。(不是两组梯度,一个用于每个输出,而是一组梯度用于整个模型)。
从数学上讲,它并不是很复杂,你有一个最终的损失函数:
loss = (main_weight * main_loss) + (aux_weight * aux_loss) #you choose the weights in model.compile
一切由你定义。加上一系列其他可能的权重(样本权重、类权重、正则项等)
在哪里:
main_loss
是一个function_of(main_true_output_data, main_model_output)
aux_loss
是一个function_of(aux_true_output_data, aux_model_output)
梯度仅∂(loss)/∂(weight_i)
适用于所有权重。
一旦优化器有了梯度,它就会执行一次优化步骤。
问题:
辅助分支权重如何更新,因为它没有直接连接到主输出?
- 您有两个输出数据集。一个数据集
main_output
和另一个数据集aux_output
. 您必须将它们传递给fit
inmodel.fit(inputs, [main_y, aux_y], ...)
- 您还有两个损失函数,每个函数一个,其中
main_loss
需要main_y
和main_out
;和aux_loss
takexaux_y
和aux_out
.
- 两个损失相加:
loss = (main_weight * main_loss) + (aux_weight * aux_loss)
- 为该函数计算一次梯度
loss
,该函数连接到整个模型。
- 该
aux
术语将影响反向lstm_1
传播embedding_1
。
- 因此,在下一次正向传递中(在权重更新后),它将最终影响主分支。(是好是坏只取决于辅助输出是否有用)
辅助分支的根和主输出之间的网络部分是否与损失的权重有关?还是加权只影响连接到辅助输出的网络部分?
权重是简单的数学。您将在以下位置定义它们compile
:
model.compile(optimizer=one_optimizer,
#you choose each loss
loss={'main_output':main_loss, 'aux_output':aux_loss},
#you choose each weight
loss_weights={'main_output': main_weight, 'aux_output': aux_weight},
metrics = ...)
并且损失函数将在loss = (weight1 * loss1) + (weight2 * loss2)
.
其余的是∂(loss)/∂(weight_i)
每个重量的数学计算。