【问题标题】:Should Decoder Prediction Be Detached in PyTorch Training?PyTorch 训练中是否应该分离解码器预测?
【发布时间】:2020-04-17 02:21:21
【问题描述】:

大家好,我最近开始使用 PyTorch 进行需要编码器-解码器框架的研究。 PyTorch关于这方面的教程很精彩,但是有个小问题:在没有teacher forcing的情况下训练decoder时,也就是说将当前时间步的预测作为下一个时间步的输入,预测应该是detached吗?

this PyTorch tutorial 中,使用了detach (decoder_input = topi.squeeze().detach() # detach from history as input ),但在this one (top1 = output.max(1)[1]; output = (trg[t] if teacher_force else top1)) 中却不是这样。

两个教程都是基于 RNN 的,所以我不确定基于 Transformer 的架构。如果有人能指出哪个是更好的做法,将不胜感激:)。

【问题讨论】:

    标签: python nlp pytorch


    【解决方案1】:

    是的,您应该将其分离。分离张量会将其从计算图中删除,因此不再跟踪梯度计算,这正是您想要的。由于前一个令牌可以看作是一个定义起点的常数,因此它将在一个时间步后被丢弃。但是,如果你不分离它,它仍然会挂起,因为它在计算图中被跟踪,这会消耗不必要的内存。

    实际上,内存开销通常很小,因此只有在您有很多时间步并且处于 GPU 内存使用上限时才会注意到它。只是将其视为微优化。

    在某些情况下,您绝对需要分离张量以避免不必要的反向传播,但这通常发生在两个不同模型中使用相同输入时,因为默认情况下反向消耗图并且如果两个不同的反向传播尝试通过相同的路径将不再可用并失败。

    【讨论】:

    • 内存(即编码器的输出)是否同样适用?如果我在没有教师强制的情况下训练变压器,我应该为每个时间戳分离编码器的输出吗?
    猜你喜欢
    • 2021-09-14
    • 2019-01-15
    • 2019-09-11
    • 2018-02-20
    • 2019-11-26
    • 2021-01-03
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多