Допустим, у меня есть следующий проход вперед, который приводит к двум отдельным потерям:
forward(self, input)
x = self.layer1(input)
y = self.layer2(x)
z = self.layer3(y)
return y, z
Затем мы рассчитываем потери 1 (у) и потери 2 (г).Тогда мы можем оптимизировать loss = loss1 + loss2
с помощью одного оптимизатора.
Но у меня есть два предостережения: (1) я хочу, чтобы d_loss1 вычислялся только для layer2 (без layer1), и (2) я хочу d_loss2рассчитывается в отношении layer3 и layer1 - без layer2.По сути, я хочу обучать непоследовательные части сети отдельно с отдельными потерями.
Я полагаю, что могу решить (1), введя стоп-градиент на входе для layer2 следующим образом:
forward(self, input)
x = self.layer1(input)
y = self.layer2(x)
y_stop_gradient = self.layer2(Variable(x.data))
z = self.layer3(y)
return y_stop_gradient, z
Но как я могу решить (2)?Другими словами, я хочу, чтобы градиенты loss2 «пропускали» layer2 , в то же время сохраняя layer2 обучаемым в отношении loss1.