当网络中的某些层被冻结时,反向传播如何工作?
How does backpropagation work when some layers are frozen in the network?
假设要使用两个模型:X 和 Y。数据按顺序通过 X 和 Y。只有模型 Y 的参数需要根据模型 Y 的输出计算的损失进行优化。是以下片段是此要求的正确实现。我需要回答的具体问题很少:
with torch.no_grad()
到底有什么作用?
- 由于优化器只注册了模型 Y 的参数,我们是否还需要冻结模型 X 的正确性,还是仅需要减少计算量?
- 更一般地说,我想要解释计算图和反向传播在
with torch.no_grad()
存在的情况下或当通过将相应的 requires_grad
参数设置为 False 来冻结某些层时的行为。
- 另外评论我们是否可以一次冻结网络中的非连续层。
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()
调用的推理非常有用。它节省了内存和计算。
在您的示例中,您可以将 A
、model_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
.
一切尽在链式法则。
假设要使用两个模型:X 和 Y。数据按顺序通过 X 和 Y。只有模型 Y 的参数需要根据模型 Y 的输出计算的损失进行优化。是以下片段是此要求的正确实现。我需要回答的具体问题很少:
with torch.no_grad()
到底有什么作用?- 由于优化器只注册了模型 Y 的参数,我们是否还需要冻结模型 X 的正确性,还是仅需要减少计算量?
- 更一般地说,我想要解释计算图和反向传播在
with torch.no_grad()
存在的情况下或当通过将相应的requires_grad
参数设置为 False 来冻结某些层时的行为。 - 另外评论我们是否可以一次冻结网络中的非连续层。
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()
调用的推理非常有用。它节省了内存和计算。
在您的示例中,您可以将 A
、model_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
.
一切尽在链式法则。