我有一個簡單的神經網路:
import torch
import torch.nn as nn
import torch.optim as optim
class Model(nn.Module):
def __init__(self):
super(Model, self).__init__()
self.fc1 = nn.Linear(1, 5)
self.fc2 = nn.Linear(5, 10)
self.fc3 = nn.Linear(10, 1)
def forward(self, x):
x = self.fc1(x)
x = torch.relu(x)
x = torch.relu(self.fc2(x))
x = self.fc3(x)
return x
net = Model()
opt = optim.Adam(net.parameters())
我還有一些輸入功能:
features = torch.rand((3,1))
我可以用一個最小化的簡單損失函式正常訓練它:
for i in range(10):
opt.zero_grad()
out = net(features)
loss = torch.mean(torch.square(torch.tensor(5) - torch.sum(out)))
print('loss:', loss)
loss.backward()
opt.step()
但是,如果我要添加另一個我想要最大化的損失組件 - loss2:
loss2s = []
for i in range(10000):
opt.zero_grad()
out = net(features)
loss1 = torch.mean(torch.square(torch.tensor(5) - torch.sum(out)))
loss2 = torch.sum(torch.tensor([torch.sum(w_arr) for w_arr in net.parameters()]))
loss2s.append(loss2)
loss = loss1 loss2
loss.backward()
opt.step()
由于 2 個損失具有不同的規模,它看起來變得不穩定。另外,我不確定這是正確的方法,因為損失如何知道最大化一個部分并最小化另一個部分。請注意,這只是一個示例,顯然增加權重沒有意義。
import matplotlib.pyplot as plt
plt.plot(loss2s, c='r')
plt.plot(loss1s, c='b')

而且我相信最小化函式是在 ML 中訓練的常用方法,所以我不確定以某種方式將最大化問題改為最小化問題是否會更好。
uj5u.com熱心網友回復:
表示“最小化”和“最大化”的標準方法是改變符號。如果完成以下操作,PyTorch 總是最小化aloss
loss.backward()
所以,如果另一個loss2需要最大化,我們添加它的負數
overall_loss = loss (- loss2)
overall_loss.backward()
因為最小化一個負數等同于最大化原來的正數。
關于“規模”,是的,規模確實很重要。通常執行以下操作以匹配比例
overall_loss = loss alpha * (- loss2)
其中alpha是表示一種損失相對于另一種損失的相對重要性的分數。它是一個超引數,需要進行試驗。
撇開技術問題不談,由此產生的損失是否穩定在很大程度上取決于所涉及的具體問題和損失函式。如果損失相互矛盾,您可能會遇到不穩定。處理它們的方法本身就是一個研究問題,遠遠超出了這個問題的范圍。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/312755.html
