【问题标题】:Does it make sense to backpropagate a loss calculated from an earlier layer through the entire network?在整个网络中反向传播从较早层计算的损失是否有意义?
【发布时间】:2021-08-26 08:20:56
【问题描述】:

假设您有一个包含 2 层 A 和 B 的神经网络。A 获取网络输入。 A 和 B 是连续的(A 的输出作为输入馈送到 B)。 A 和 B 都输出预测(预测 1 和预测 2)Picture of the described architecture 在第一层 (A) 和目标 (target1) 之后直接计算损失 (loss1)。您还可以使用自己的目标 (target2) 在第二层 (loss2) 之后计算损失。

使用 loss1 和 loss2 之和作为误差函数并在整个网络中反向传播这个损失是否有意义?如果是这样,为什么它“允许”通过 B 反向传播 loss1,即使它与它无关?

这个问题与这个问题有关 https://datascience.stackexchange.com/questions/37022/intuition-importance-of-intermediate-supervision-in-deep-learning 但它没有充分回答我的问题。 就我而言,A 和 B 是不相关的模块。在上述问题中,A 和 B 将是相同的。目标也是一样的。

(附加信息) 我问的原因是我试图从这个paper 中理解LCNN(https://github.com/zhou13/lcnn)。 LCNN 由 Hourglass 主干组成,然后将其输入到 MultiTask Learner(创建loss1),然后再输入到 LineVectorizer 模块(loss2)。然后将 loss1 和 loss2 相加here,然后通过整个网络反向传播here

尽管我参加了几次深度学习讲座,但我并不知道这是“允许的”或有意义的做法。我本来希望使用两个loss.backward(),每个损失一个。或者 pytorch 计算图在这里做了什么神奇的事情? LCNN 收敛并优于其他试图解决相同任务的神经网络。

【问题讨论】:

    标签: python tensorflow neural-network pytorch


    【解决方案1】:

    是的,这是“允许的”,也是有道理的。

    从这个问题中,我相信您已经了解了大部分内容,因此我不会详细说明为什么这种多损失架构有用。我认为让你感到困惑的主要部分是为什么“loss1”会通过“B”反向传播?,答案是:不会。事实上,loss1 是使用以下公式计算的:

    loss1 = SOME_FUNCTION(label, y_hat)
    

    y_hat(prediction1) 仅依赖于它之前的层。因此,这种损失的梯度只流过该部分(A)之前的层,而不是它之后的层(B)。为了更好地理解这一点,您可以再次查看mathematics of artificial neural networks。另一方面,损失 2 在整个网络(包括 A 部分)中反向传播。当你使用累积损失 (Loss = loss1 + loss2) 时,像 Pytorch 这样的框架会自动跟随每个预测标签的梯度到第一层。

    【讨论】:

    • 谢谢!您的回答以及解释 pytorch autograd (youtube.com/watch?v=MswxJw-8PvE) 的视频帮助我理解了它。对于那些想知道的人:当做 loss1 和 loss2 的总和时,pytorch autograd 会记住总和的元素来自哪里。然后在损失上调用后向函数时,它将遍历其所有部分并单独跟随它并计算梯度。重要的是要记住,在计算损失时,您应该始终使用框架张量,因为它会在后台进行一些记账。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 2019-11-06
    • 1970-01-01
    • 2022-06-19
    • 1970-01-01
    • 2019-07-04
    • 2017-06-20
    相关资源
    最近更新 更多