Как ReLu работает с нулевым центром вывода?
В проблеме, которую я пытаюсь решить, мой выходной домен расположен по центру нуля, между -1 и 1. При поиске функций активации я заметил, что ReLu выводит значения в диапазоне от 0 до 1, что в основном означало бы, что все выходные данные являются отрицательными или полностью положительны.
Это можно сопоставить обратно с соответствующим доменом посредством обратной нормализации, но ReLu предназначен для определения "силы" нейрона в одном направлении, но в моей задаче мне нужно определить силу нейрона в одном из двух направлений. Если я использую tanh, мне нужно беспокоиться об исчезающем / взрывном градиенте, но если я использую ReLu, мой вывод всегда будет "смещен" в сторону положительных или отрицательных значений, потому что, по сути, очень маленькие значения должны быть сопоставлены с положительным доменом и большими цени отрицательный домен или наоборот.
Другая информация: я использовал ReLu, и он работает хорошо, но я боюсь, что это по неправильным причинам. Причина, по которой я это говорю, заключается в том, что для области pos или neg, приближающейся к меньшим значениям, будет означать более сильное соединение до той точки, которая вообще не будет активирована. Да, технически сеть может работать (возможно, сложнее, чем нужно), чтобы сохранить всю область выходных данных поезда в положительном пространстве, но если значение превысит пределы обучающего набора, его не будет? когда на самом деле это должно быть еще более активным
Как правильно обращаться с нулевыми центрированными выходными доменами?
3 ответа
Я думаю, что вы должны использовать функцию Sign. Это нулевой центр и -1, 1 на выходе.
Функция подписи: https://helloacm.com/wp-content/uploads/2016/10/math-sgn-function-in-cpp.jpg
Вы могли бы пойти с вариациями ReLU
какие выходные значения со средним значением ближе к нулю или равным нулю (ELU
, CELU
, PReLU
и другие) и имеющие другие интересные специфические черты. Кроме того, это поможет решить проблему умирающих нейронов в ReLU.
В любом случае, я не знаю каких-либо серьезных исследований, доказывающих полезность одного над другим, оно все еще находится в фазе эксперимента и действительно зависит от того, что я помню (пожалуйста, поправьте меня, если я ошибаюсь).
И вы должны действительно проверить, является ли функция активации проблематичной в вашем случае, это может быть совершенно нормально, чтобы пойти с ReLU
,
Во-первых, вам не нужно помещать функцию активации после последнего слоя в вашей нейронной сети. Функция активации требуется между слоями для введения нелинейности, поэтому она не требуется в последнем слое.
Вы можете экспериментировать с различными вариантами:
- Используйте танх. Исчезновение / взрыв градиента иногда не является проблемой на практике в зависимости от архитектуры сети и правильной инициализации весов.
- Ничего не делать. NN должен быть обучен выводить значение от -1 до 1 для "типичных" входов. Вы можете обрезать значение в прикладном слое.
- Обрезать вывод в сети. Например
out = tf.clip_by_value(out, -1.0, 1.0)
- Будьте изобретательны и попробуйте другие идеи.
В конце концов, ML - это процесс проб и ошибок. Попробуйте разные вещи и найдите то, что работает для вас. Удачи.