Разница между № 1 и 2 в основном: поскольку sum
приведет к большему, чем mean
, величина градиента от операции sum
будет больше, но направление будет таким же.
Вот небольшая демонстрация, давайте сначала объявим необходимые переменные:
x = torch.tensor([4,1,3,7],dtype=torch.float32,requires_grad=True)
target = torch.tensor([4,2,5,4],dtype=torch.float32)
Теперь давайте вычислим градиент для x
, используя L2
убыток с sum
:
loss = ((x-target)**2).sum()
loss.backward()
print(x.grad)
Это выводит: tensor([ 0., -2., -4., 6.])
Теперь используется mean
: (после сброса x
град)
loss = ((x-target)**2).mean()
loss.backward()
print(x.grad)
И это выводит: tensor([ 0.0000, -0.5000, -1.0000, 1.5000])
Обратите внимание, что более поздние градиенты равны 1/4 от градиента sum
, потому что здесь тензоры содержат 4 элемента.
О третьем варианте, если я вас правильно понимаю, это невозможно. Вы не можете выполнять обратное распространение до объединения отдельных ошибок пикселей в скаляр, используя sum
, mean
или что-либо еще.