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