Действительно, во втором случае обратное прохождение не проходит через сигмоид. Очень сложно изменить данные внутри функции потерь.
Причина в том, что это плохо, потому что тогда вы будете возвращать ошибку на выходе, которая не является реальной ошибкой, которую создает сеть.
Объясняя себя с простого случая: у вас есть метки в двоичной форме сказать тензором [0, 0, 1, 0]
Если сигмовидной находится внутри вашей пользовательской функции потерь, вы можете иметь результаты, которые выглядят как этот [-100, 0, 20, 100],
сигмовидной в вашей потере преобразит это во что-то похожее примерно как tihs: [0, 0.5, 1, 1]
Ошибка, которая будет возвращена обратно, будет [0, -0.5, 0, -1]
. Обратное распространение будет не учитывать сигмоид, и вы примените эту ошибку непосредственно к выходу. Вы можете видеть, что величина ошибки не отражает всю величину ошибки выхода: последнее значение равно 100 и должно быть на отрицательной территории, но модель будет возвращать небольшую ошибку -1 на этом уровне.
Подводя итог, сигмоид должен находиться в сети, так что обратное распространение учитывает его при обратном прохождении ошибки.
Не могли бы вы предоставить нам код, который вы используете - на самом деле это действительно интересно. –