pytorch: как ведет себя потеря при приходе из двух сетей? - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь реализовать следующий алгоритм в этой книге, раздел 13.5 , в pytorch.

enter image description here

Это будетпотребуются две отдельные нейронные сети (в этом вопросе model1 и model2).Потеря одного зависит только от его собственного выхода [через дельта] (параметризованного с помощью w), другого (параметризованного с помощью theta), зависящего как от его собственного выхода [через ln (pi)], так и от выхода другого [снова, черезdelta].

Я хочу обновить каждую по отдельности

Предположим, что следующие модели реализуют nn.Module:

model1 = Mynet1()
model2 = Mynet2()

val1 = model1(input1)
val2 = model2(input2)

self.optimizer1 = optim.Adam(model1.parameters(), lr1)
self.optimizer2 = optim.Adam(model2.parameters(), lr2)

loss1 = f(val1)
loss2 = f(val1, val2)#THIS IS THE INTERESTING PART

optim1.zero_grad()
loss1.backward
optim1.step()

optim2.zero_grad()
loss2.backward
optim2.step()

Я понимаю, что применениев обратном направлении при потере 1 и последующем шаге в оптимизаторе обновятся параметры model1.

Мой вопрос: что происходит при активации этого параметра в loss2, model2, optimizer2, где потеря2 зависит от выходов model1 и model2?

Как сделать так, чтобы обновление loss2 не влияло на параметры model1?

1 Ответ

0 голосов
/ 13 февраля 2019

, поскольку optim2 имеет только параметр model2, он обновит только model2, если вы выполните optim2.step(), как это делается.

Однако loss2.backward() будет вычислять градиенты для параметров модели1 и модели2 иесли вы сделаете optim1.step() после этого, он обновит параметры model1.Если вы не хотите вычислять градиенты для параметра model1, вы можете сделать val1.detach(), чтобы отделить его от вычислительного графа.

...