当网络中的某些层被冻结时,反向传播如何工作?

How does backpropagation work when some layers are frozen in the network?

假设要使用两个模型:X 和 Y。数据按顺序通过 X 和 Y。只有模型 Y 的参数需要根据模型 Y 的输出计算的损失进行优化。是以下片段是此要求的正确实现。我需要回答的具体问题很少:

  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()

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

在您的示例中,您可以将 Amodel_X 的输出视为您的“输入”:您不会修改与 model_X 相关的任何内容。在这种情况下,您不关心梯度 w.r.t model_X:不关心 w.r.t 它的参数,也不关心 w.r.t 它的输入。使用 torch.no_grad().

的上下文包装此调用 A = model_X(data) 是安全的

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