Как ReLu работает с нулевым центром вывода? - PullRequest
0 голосов
/ 11 января 2019

В проблеме, которую я пытаюсь решить, мой выходной домен центрирован по нулю, между -1 и 1. При поиске функций активации я заметил, что ReLu выводит значения в диапазоне от 0 до 1, что в основном означало бы, что ваш вывод - это все отрицательный или все положительные.

Это можно сопоставить обратно с соответствующим доменом посредством обратной нормализации, но ReLu предназначен для определения «силы» нейрона в одном направлении, но в моей проблеме мне нужно определить силу нейрона в одном из два направления. Если я использую tanh, мне нужно беспокоиться об исчезающем / взрывном градиенте, но если я использую ReLu, мой вывод всегда будет «смещен» в сторону положительных или отрицательных значений, потому что, по сути, очень маленькие значения должны быть сопоставлены с положительным доменом и большими значение отрицательного домена или наоборот.

Другая информация: Я использовал ReLu, и он работает хорошо, но я боюсь, что это по неправильным причинам. Причина, по которой я говорю это, заключается в том, что для области pos или neg, приближающейся к меньшим значениям, будет означать более сильное соединение до точки, которая вообще не будет активирована. Да, технически сеть может работать (возможно, сложнее, чем нужно), чтобы сохранить всю область выходных данных поезда в положительном пространстве, но если значение превысит пределы обучающего набора, его не будет? когда на самом деле он должен быть еще более активным

Как правильно обращаться с доменами с нулевым центрированием?

Ответы [ 3 ]

0 голосов
/ 11 января 2019

Я думаю, что вы должны использовать функцию Sign. Это нулевой центр и -1, 1 на выходе.

Знак функции: https://helloacm.com/wp-content/uploads/2016/10/math-sgn-function-in-cpp.jpg

0 голосов
/ 11 января 2019

Вы можете пойти с вариациями ReLU, которые выводят значения со средним значением ближе к нулю или равным нулю (ELU, CELU, PReLU и другие) и имеют другие интересные специфические черты. Кроме того, это помогло бы решить проблему умирающих нейронов в ReLU.

Во всяком случае, я не знаю каких-либо серьезных исследований, доказывающих полезность одного над другим, он все еще находится в фазе эксперимента и действительно зависит от того, что я помню (пожалуйста, поправьте меня, если я ошибаюсь).

И вы должны действительно проверить, является ли функция активации проблематичной в вашем случае, может быть, вполне нормально использовать ReLU.

0 голосов
/ 11 января 2019

Во-первых, вам не нужно ставить функцию активации после последнего слоя в вашей нейронной сети. Функция активации требуется между слоями для введения нелинейности, поэтому она не требуется в последнем слое.

Вы можете экспериментировать с различными вариантами:

  • Используйте танх. Исчезновение / взрыв градиента иногда не является проблемой на практике в зависимости от архитектуры сети и правильной инициализации весов.
  • Ничего не делать. NN должен быть обучен выводить значение от -1 до 1 для «типичных» входов. Вы можете обрезать значение в прикладном слое.
  • Обрезать выход в сети. Например. out = tf.clip_by_value(out, -1.0, 1.0)
  • Будьте изобретательны и попробуйте другие идеи.

В конце концов, ML - это процесс проб и ошибок. Попробуйте разные вещи и найдите то, что работает для вас. Удачи.

...