7

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

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

keras 功能 api 指南中的这个网络为例:

在此处输入图像描述

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

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

但是,我仍然不明白网络及其辅助分支是如何训练的;辅助分支权重如何更新,因为它没有直接连接到主输出?辅助分支的根和主输出之间的网络部分是否与损失的权重有关?还是加权只影响连接到辅助输出的网络部分?

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

4

1 回答 1

5

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. 您必须将它们传递给fitinmodel.fit(inputs, [main_y, aux_y], ...)
  • 您还有两个损失函数,每个函数一个,其中main_loss需要main_ymain_out;和aux_losstakexaux_yaux_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)每个重量的数学计算。

于 2019-08-03T01:52:23.307 回答