Pen*_*uin 2 python machine-learning neural-network pytorch loss-function
我有一个简单的神经网络:
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())
Run Code Online (Sandbox Code Playgroud)
我还有一些输入功能:
features = torch.rand((3,1))
Run Code Online (Sandbox Code Playgroud)
我可以使用一个简单的损失函数来正常训练它,该函数将被最小化:
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()
Run Code Online (Sandbox Code Playgroud)
但是,如果我添加另一个我想要最大化的损失分量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()
Run Code Online (Sandbox Code Playgroud)
由于两种损失的规模不同,它看起来变得不稳定。另外,我不确定这是正确的方法,因为损失如何知道最大化一个部分并最小化另一部分。请注意,这只是一个示例,显然增加权重是没有意义的。
import matplotlib.pyplot as plt
plt.plot(loss2s, c='r')
plt.plot(loss1s, c='b')
Run Code Online (Sandbox Code Playgroud)
而且我相信最小化函数是机器学习训练的常见方法,所以我不确定以某种方式将最大化问题改为最小化问题是否会更好。
表示“最小化”和“最大化”的标准方法是改变符号。如果完成以下操作,PyTorch 总是最小化aloss
loss.backward()
Run Code Online (Sandbox Code Playgroud)
因此,如果另一个loss2
需要最大化,我们添加它的负数
overall_loss = loss + (- loss2)
overall_loss.backward()
Run Code Online (Sandbox Code Playgroud)
因为最小化负数相当于最大化原始正数。
关于“规模”,是的,规模确实很重要。通常会执行以下操作以匹配比例
overall_loss = loss + alpha * (- loss2)
Run Code Online (Sandbox Code Playgroud)
其中alpha
是表示一个损失相对于另一个损失的相对重要性的分数。它是一个超参数,需要进行试验。
抛开技术细节不谈,由此产生的损失是否稳定在很大程度上取决于具体问题和所涉及的损失函数。如果损失相互矛盾,您可能会遇到不稳定的情况。处理它们的方法本身就是一个研究问题,远远超出了这个问题的范围。
归档时间: |
|
查看次数: |
2016 次 |
最近记录: |