【问题标题】:Updating based on two different loss functions, but with a different optimizer learning rate after each one (pytorch)?基于两种不同的损失函数进行更新,但在每个损失函数之后使用不同的优化器学习率(pytorch)?
【发布时间】:2020-08-30 11:42:12
【问题描述】:

我有一个如下的设置,其中我有一个迭代迭代的外部 for 循环,以及一个迭代批次的内部 for 循环。

在内部 for 循环中,分批使用交叉熵损失,并使用具有一定学习率的 Adam 优化器。

在内部 for 循环之后(在评估所有批次之后),然后我根据输出计算另一个损失函数(自定义损失函数),并进行优化。

但是,我注意到,当我定义具有不同学习率的不同优化器时,它似乎并没有在训练。当我保持相同的优化器时,事情似乎发生了变化,但是当我替换它时,它没有。示例如下:

net = <my defined model, from another function>

optimizer_1 = torch.optim.Adam(net.parameters(), lr=0.1)
optimizer_2 = torch.optim.Adam(net.parameters(), lr=0.01)

for epoch in range(num_epochs):
    for data in training_data: # these are the batches
        <get output here>
        loss1 = <compute loss function>
        optimizer_1.zero_grad()
        loss1.backward()
        optimizer_1.step()

    loss2 = <compute a different loss function here>
    optimizer_2.zero_grad() #use a second optimizer with a different learning rate
    loss.backward()
    loss.step()

当我这样做时,似乎它实际上并没有对第二个损失函数进行第二次优化。为什么是这样?我希望第二个优化具有与第一个不同的学习率。然而,似乎只继续使用第一个优化器,optimizer_1,其各自的学习率似乎有效。

【问题讨论】:

    标签: python machine-learning deep-learning pytorch


    【解决方案1】:

    首先您可以在内部循环中累积loss1。 接下来,您可能需要考虑合并两个损失函数。

    (sum(accumulated_loss1) + loss2).backward()

    这确保了在训练期间都考虑了损失,并且所有梯度都在后向传播中传播

    【讨论】:

    • 我正在计算每个批次(和更新步骤)的损失,然后在完成整个批次后使用激活输出来输入计算我的第二个损失函数的计算。我认为在训练期间仍在考虑第一个损失,因为我仍在使用它进行优化。所以你的意思是我应该做total_loss_1 += loss,然后反向传递这个?另外,这是否意味着改变第二个损失的学习率/优化器无关紧要?
    猜你喜欢
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 2018-03-22
    • 2021-05-31
    相关资源
    最近更新 更多