如何训练多输出深度学习模型?

Bap*_*ier 6 backpropagation neural-network multipleoutputs deep-learning keras

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

我一直都了解实现的实现方式,并且成功地训练了一个这样的模型,但我不了解如何训练多输出深度学习网络。我的意思是,培训期间网络内部发生了什么?

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

在此处输入图片说明

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

我的直觉是该模型进行两次反向传播,每个输出一次。然后,每个反向传播都会更新退出之前的图层的权重。 但这似乎是不正确的:这里(SO),我得到的信息是,尽管有多个输出,但只有一个反向传播;根据输出对使用的损失进行加权。

但是,我仍然不知道如何训练网络及其辅助分支。由于未直接连接到主输出,辅助分支权重如何更新?网络的辅助分支的根与主输出之间的部分是否受到损失加权的影响?还是权重仅影响连接到辅助输出的网络部分?

另外,我正在寻找有关此主题的好文章。我已经读过GoogLeNet / Inception文章(v1v2-v3),因为该网络正在使用辅助分支。

Dan*_*ler 5

Keras 计算基于图形并且使用一个优化器

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

从数学上讲,它并不复杂,你有一个最终的损失函数:

loss = (main_weight * main_loss) + (aux_weight * aux_loss) #you choose the weights in model.compile
Run Code Online (Sandbox Code Playgroud)

一切由你定义。加上一系列其他可能的权重(样本权重、类权重、正则化项等)

在哪里:

  • 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。您必须将它们传递给fitinmodel.fit(inputs, [main_y, aux_y], ...)
  • 您还有两个损失函数,每个损失函数一个,其中main_losstakemain_ymain_out; 和aux_losstakexaux_yaux_out.
  • 两种损失相加: loss = (main_weight * main_loss) + (aux_weight * aux_loss)
  • 函数的梯度计算loss一次,这个函数连接到整个模型。
    • aux术语将影响lstm_1embedding_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 = ...)
Run Code Online (Sandbox Code Playgroud)

并且损失函数将在loss = (weight1 * loss1) + (weight2 * loss2).
剩下的就是?(loss)/?(weight_i)对每个权重的数学计算。