如何训练多输出模型?

时间:2019-07-22 15:42:18

标签: keras deep-learning backpropagation multipleoutputs

我想我不理解多输出网络。

通过我了解实现的方式并成功地训练了这样的模型,我不了解如何训练多输出深度学习网络。我的意思是,网络内部正在发生什么?

以keras功能性API指南中的以下网络为例:

enter image description here

source: keras functional API

您可以看到两个输出(aux_output和main_output)。反向传播如何运作?

我的直觉是该模型进行两次反向传播,每个输出一次。 然后,每个反向传播都会更新退出之前的图层的权重。 如果是这样,那么反向传播过程将以什么顺序进行?

此外,如果有人知道一些有关此类网络的好文章,我很感兴趣!

1 个答案:

答案 0 :(得分:3)

Keras计算基于图形,并且仅使用一个优化程序

优化器也是图形的一部分,并且在其计算中它会获得整个权重组的梯度。 (不是两组渐变,每个输出一组,而是整个模型的一组渐变)。

从数学上讲,这并不是很复杂,您有一个由以下组成的最终损失函数:

loss = (main_weight * main_loss) + (aux_weight * aux_loss) #you choose the weights in model.compile

全部由您定义。加上一系列其他可能的权重(样本权重,类权重,正则化条件等)

位置:

  • main_lossfunction_of(main_true_output_data, main_model_output)
  • aux_lossfunction_of(aux_true_output_data, aux_model_output)

所有权重的梯度仅为∂(loss)/∂(weight_i)

优化器一旦具有渐变,它将执行一次优化步骤。

问题:

  

由于辅助分支权重未直接连接到主输出,该如何更新?

  • 您有两个输出数据集main_output的一个数据集,aux_output的另一个数据集。您必须将它们传递给fit
  • 中的model.fit(inputs, [main_y, aux_y], ...)
  • 您还有两个损失函数,每个损失函数一个,其中main_lossmain_ymain_out;和aux_loss Takex aux_yaux_out
  • 两个损失相加:loss = (main_weight * main_loss) + (aux_weight * aux_loss)
  • 一次为函数loss计算梯度,并且此函数连接到整个模型。
    • aux一词将在反向传播中影响lstm_1embedding_1
    • 因此,
    • 因此,在下一个向前传递中(权重更新之后),它将最终影响主分支。 (是好是坏取决于aux输出是否有用)
  

损失权重是否是辅助分支的根与主输出之间的网络部分?还是权重仅影响连接到辅助输出的网络部分?

权重是简单的数学。您将在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)的数学计算。