Создание пользовательской функции нетривиальных потерь в pytorch - PullRequest
0 голосов
/ 08 ноября 2018

Я только начал с pytorch и пытаюсь понять, как работать с пользовательскими функциями потерь, особенно с некоторыми нетривиальными.

Задача 1 . Я хотел бы стимулировать мой nn, чтобы максимизировать истинный положительный показатель и в то же время минимизировать уровень ложных открытий. Например, увеличьте общий балл на +2 для истинного положительного результата и уменьшите на -5 для ложного положительного.

def tp_fp_loss(yhat, y):
    total_score = 0
    for i in range(y.size()):
        if is_tp(yhat[i],y[i]):
            total_score += 2
        if is_fp(yhat[i],y[i]):
            total_score -= 5
    return -total_score

Задача 2 . В случае, когда у - список положительных и отрицательных вознаграждений (у = [10, -5, -40, 23, 11, -7]), стимулировать nn, чтобы максимизировать сумму вознаграждений.

def max_reward_loss(yhat,y):
    r = torch.autograd.Variable(torch.Tensor(y[yhat >= .5]), requires_grad=True).sum()                    
    return -r

Может быть, я не совсем понимаю некоторую механику автограда, функции, которые я реализовал, правильно рассчитывают потери, но обучение с ними не работает :( Что я делаю не так? Кто-нибудь может мне помочь с некоторым рабочим решением любой из этих проблем?

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

@ Шай уже подвел итог: ваша функция потерь не дифференцируема.

Один из способов думать об этом состоит в том, что ваша функция потерь должна быть построена на графике, а наклон «вниз» должен «катиться» к желаемому выходу модели. Чтобы построить график функции потерь, исправьте y_true=1, затем график [loss(y_pred) for y_pred in np.linspace(0, 1, 101)], где loss - это функция потерь, и убедитесь, что ваша функция потерь на графике имеет требуемый наклон. В вашем случае это звучит так, как будто вы хотите взвесить убыток сильнее, когда он находится на неправильной стороне порога. До тех пор, пока вы можете построить его, а уклон всегда будет направлен к вашему целевому значению (нет ровных пятен или уклонов на склоне на пути от действительного прогноза к целевому значению), ваша модель должна извлечь из него уроки.

Также обратите внимание, что если вы просто пытаетесь принять во внимание какую-то бизнес-цель, которая отдает приоритет точности по сравнению с отзывом, вы можете достичь этого путем обучения конвергенции с перекрестной энтропией или некоторой известной функцией потерь, а затем путем настройки своей модели. порог в зависимости от вашего варианта использования. Более высокий порог обычно устанавливает приоритет точности, а более низкий порог обычно определяет приоритет отзыва. После того, как вы пройдете обучение, вы сможете оценить свою модель с различными пороговыми значениями и выбрать наиболее подходящий.

0 голосов
/ 09 ноября 2018

Ваша функция потерь не дифференцируема - вы не можете вычислить ее градиент (попробуйте и попробуйте).
Вы должны выглядеть примерно так: Потеря infogain

...