Поскольку по умолчанию при вызове скаляра он передает [1]
в качестве входных данных для обратной функции. Если это тензор с более чем одним элементом, то вы должны передать [1,1,....1]
в качестве входных данных для обратного.
loss.backward(torch.Tensor([1, 1, 1, 1, 1, 1, ... ,1]))
или
loss.backward(torch.ones(batch_size))
количество единиц = количество элементов в 1D-тензоре в вашем случае.
Чтобы ответить, почему мы используем среднее и все, потому что это действует как нормализующий термин. Вместо того, чтобы вся потеря отдельной партии влияла в огромных количествах, мы нормализуем ее эффект. Это проблема? Скорее, масштабируя, мы получаем гораздо более разумное представление о том, как ведет себя кривая потерь.