【问题标题】:How does backpropagation work when some layers are frozen in the network?当某些层在网络中冻结时,反向传播如何工作?
【发布时间】:2022-01-11 14:02:21
【问题描述】:

假设要使用两个模型:X 和 Y。数据依次通过 X 和 Y。仅模型 Y 的参数需要针对模型 Y 的输出计算的损失进行优化。是否如下sn -p 正确执行此要求。我需要回答的几个具体问题:

  1. with torch.no_grad() 到底是做什么的?
  2. 由于只有模型 Y 的参数在优化器中注册,我们还需要冻结模型 X 以使其正确还是只需要减少计算负载?
  3. 更一般地说,我想解释一下计算图和反向传播在存在 with torch.no_grad() 或通过将相应的 requires_grad 参数设置为 False 时冻结某些层时的行为。
  4. 还请评论我们是否可以立即冻结网络中的非连续层。
optimizer = AdamW(model_Y.parameters(), lr= , eps= , ...)

optimizer.zero_grad()
with torch.no_grad():
    A = model_X(data)
B = model_Y(A)
loss = some_function(B)
loss.backward()
optimizer.step()

【问题讨论】:

    标签: python-3.x pytorch gradient-descent


    【解决方案1】:

    torch.no_grad 用作禁用梯度计算的上下文管理器。这对于例如不使用 .backward() 调用的推理非常有用。它节省了内存和计算量。

    在您的示例中,您可以将Amodel_X 的输出)视为您的“输入”:您不会修改与model_X 相关的任何内容。在这种情况下,你不关心梯度 w.r.t model_X:不关心它的参数,也不关心它的输入。用torch.no_grad() 的上下文包装这个调用A = model_X(data) 是安全的。

    但是,在其他情况下,您可能不想修改 model_X 的权重(“冻结”它们),但您可能仍需要通过它们传播渐变 - 如果您想修改馈送 model_X 的元素。
    这一切都在链式法则中。

    【讨论】:

    • 感谢@Shai 指出with torch.no_grad()requires_grad=False 的功能之间的关键区别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    相关资源
    最近更新 更多