Использование функции линейных потерь для взвешивания выходной важностиPython

Программы на Python
Ответить
Anonymous
 Использование функции линейных потерь для взвешивания выходной важности

Сообщение Anonymous »

Я пытаюсь решить задачу машинного обучения, в которой одни образцы имеют большее значение, чем другие. Мой минимальный воспроизводимый пример дает пример такой проблемы, которую я повторю здесь:
У нас есть список обучающих выборок: 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[0] имеет самую высокую величину. И мы меньше всего заботимся о минимизации вывода[1], поскольку loss_weights[1] имеет самую низкую величину.
Однако даже при такой большой модели и небольшом размере выборки (где она должна иметь возможность переобучения) моя модель всегда выводит только 0. Я думал, что это могло быть проблемой с моим кодом, но когда я изменил loss_weights[1] = -2, модель вывела только 1 (максимизируя все выходные данные).
Моя теория заключается в том, что запись с самым высоким значением loss_weights доминирует над всем остальным, заставляя модель выводить одно значение, а не запоминать входные данные. Верна ли эта теория? Если да, то как мне решить эту проблему?
Я понимаю, что могу использовать средневзвешенное значение потерь MSE, но мой реальный вариант использования на самом деле не подходит для типа потерь «только один правильный ответ», поэтому я попробовал нестандартный вариант.

Подробнее здесь: https://stackoverflow.com/questions/798 ... mportances
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»