【问题标题】:How is a multiple-outputs deep learning model trained?如何训练多输出深度学习模型?
【发布时间】:2019-11-30 15:12:15
【问题描述】:

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

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

keras functional api guide的这个网络为例:

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

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

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

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

【问题讨论】:

  • medium.com/@14prakash/… 可能会有所帮助。向您展示反向传播背后的数学原理。
  • 感谢您的问题,但它更关注机器学习的理论方面,因此不适合 SO。您可能更有机会在CrossValidated 上获得答案。此外,不允许在 SO 上请求文章、教程或场外资源。
  • 我明白你的意思。这个问题与理解 Keras 功能 API 如何在那里工作密切相关,因为这个架构是它的主要示例。所以我认为把它贴在那里是相关的。如果在赏金结束后我在这里找不到我的答案,我会在 CrossValidated 中移动问题!

标签: keras neural-network deep-learning backpropagation multipleoutputs


【解决方案1】:

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 的另一个数据集。您必须将它们传递给model.fit(inputs, [main_y, aux_y], ...) 中的fit
  • 您还有两个损失函数,每个一个,其中main_loss 采用main_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) 的数学计算。

【讨论】:

    猜你喜欢
    • 2020-11-10
    • 2021-05-05
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 2020-06-08
    • 2020-04-07
    • 2019-10-20
    相关资源
    最近更新 更多