У нас есть список обучающих выборок: sample_data. У каждого из них есть соответствующий вес: loss_weights. Мы пытаемся обучить алгоритм машинного обучения выводить тензор: вывод. Если loss_weights < 0, мы стремимся максимизировать вывод, и наоборот, если loss_weights > 0, мы стремимся минимизировать вывод. Однако более важно минимизировать/максимизировать выходные данные элементов, где величина loss_weights выше.
Я подумал, что очень интуитивно понятным способом кодирования такой проблемы было бы использование линейной функции потерь Loss = sum(loss_weights * выходы) (поэлементное произведение). И я попытался это сделать на своем минимально воспроизводимом примере:
Код: Выделить всё
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
model = nn.Sequential(
nn.Linear(1, 100),
nn.Sigmoid(),
nn.Linear(100, 100),
nn.Sigmoid(),
nn.Linear(100, 1),
nn.Sigmoid(),
)
sample_data = torch.Tensor([
[0.1], [0.2], [0.3], [0.4], [0.5], [0.6], [0.7] # dummy data
])
loss_weights = torch.Tensor([
[2], [-0.1], [0.5], [-1], [0.2], [1], [-0.4] # Loss = loss_weights * output
])
optim = torch.optim.Adam(model.parameters(), lr=1e-3)
for epoch in range(1000):
output = model(sample_data)
optim.zero_grad()
loss = torch.sum(loss_weights * output)
print(torch.autograd.grad(loss, output, retain_graph=True)[0], "dLoss/dOutput")
loss.backward()
optim.step()
print(loss)
plt.plot(loss_weights, color="green")
plt.plot(model(sample_data).detach().numpy(), color="orange")
plt.show()
Однако даже при такой большой модели и небольшом размере выборки (где она должна иметь возможность переобучения) моя модель всегда выводит только 0. Я думал, что это могло быть проблемой с моим кодом, но когда я изменил loss_weights[1] = -2, модель вывела только 1 (максимизируя все выходные данные).
Моя теория заключается в том, что запись с самым высоким значением loss_weights доминирует над всем остальным, заставляя модель выводить одно значение, а не запоминать входные данные. Верна ли эта теория? Если да, то как мне решить эту проблему?
Я понимаю, что могу использовать средневзвешенное значение потерь MSE, но мой реальный вариант использования на самом деле не подходит для типа потерь «только один правильный ответ», поэтому я попробовал нестандартный вариант.
Подробнее здесь: https://stackoverflow.com/questions/798 ... mportances
Мобильная версия