Слой потерь кофе - обратная функция

У меня вопрос об обратной функции в слое потерь Caffe. Я видел реализацию евклидова слоя потерь по адресу: https://github.com/BVLC/caffe/blob/master/examples/pycaffe/layers/pyloss.py

В конце функция назад определяется следующим образом:

def backward(self, top, propagate_down, bottom):
    for i in range(2):
        if not propagate_down[i]:
            continue
        if i == 0:
            sign = 1
        else:
            sign = -1
        bottom[i].diff[...] = sign * self.diff / bottom[i].num

Я знаю, что bottom [0] обозначает прогнозируемое значение, а bottom [1] - целевые значения (истинное значение).
Вы можете помочь мне понять, почему знак - это +1 для прогноза и -1 для целей? Я подумал, что нам не нужно назначать какие-либо значения для bottom [1] .diff для целей.

Если у меня проблема с несколькими метками, как я могу обновить код?


person E.SHV    schedule 02.02.2017    source источник


Ответы (1)


Когда bottom[1] является достоверным, вы должны ожидать, что propagate_down[1] будет False, поэтому градиент не распространяется на метки.
Однако, если вы используете этот слой потерь для сравнения двух обучаемых капель, вы захотите распространить градиенты обоим bottoms.

Знак связан только с производной от этого конкретного убытка, напишите производную, и вы увидите, откуда она взялась.

Единственное, чего мне здесь не хватает, - это top[0].diff. Если я правильно понимаю, он должен содержать loss_weight, определенный для этого слоя ...

person Shai    schedule 02.02.2017