Сигмоид х 1 - PullRequest
       93

Сигмоид х 1

0 голосов
/ 21 мая 2018

Я только что прочитал книгу "Создай свою собственную нейронную сеть".Сейчас я пытаюсь создать класс NeuralNetwork в Python.Я использую функцию активации сигмоида.Я написал основной код и попытался проверить его.Но моя реализация не работала должным образом.После долгой отладки и сравнения кода из книги я обнаружил, что сигмоид очень большого числа равен 1, потому что Python округляет его.Я использую numpy.random.rand() для генерации весов, и эта функция возвращает только значения от 0 до 1. После суммирования всех произведений весов и входных данных я получаю очень большое число.Я исправил эту проблему с помощью функции numpy.random.normal(), которая генерирует случайные числа из диапазона, (-1, 1), например.Но у меня есть несколько вопросов.

  • Является ли сигмоид хорошей функцией активации?
  • Что делать, если выходные данные узла все еще так велики, а Python округляет результат до 1, что невозможно для сигмоида?
  • Как я могу запретить Python округлять числа с плавающей точкой, которые очень близки к целому числу
  • Любые советы для меня как новичка в нейронных сетях (книги, техники и т. Д.).

1 Ответ

0 голосов
/ 21 мая 2018
  1. Ответ на этот вопрос, очевидно, зависит от контекста.Что это значит под «хорошо».Функция активации сигмоида приведет к выходам, которые находятся между 0 и 1. Как таковые, они являются стандартными выходными активациями для двоичной классификации, где вы хотите, чтобы ваша нейронная сеть выводила число между 0 и 1 - с выходом, интерпретируемым как вероятностьВаш вход находится в указанном классе.Однако, если вы используете функции активации сигмоида по всей вашей нейронной сети (то есть также на промежуточных уровнях), вы можете рассмотреть возможность переключения на функцию активации RELU .Исторически функция активации сигмоида использовалась во всех нейронных сетях как способ введения нелинейности, чтобы нейронная сеть могла выполнять больше, чем приближенные линейные функции.Однако было обнаружено, что сигмовидные активации сильно страдают от проблемы исчезающих градиентов, потому что функция настолько плоская, что далеко от 0. Таким образом, в настоящее время большинство промежуточных слоев будут использовать функции активации RELU (или что-то еще более необычное - например, SELU / Leaky RELU/ etc.) Функция активации RELU равна 0 для входов, меньших 0, и равна входу для входов, превышающих 0. Было обнаружено, что ее достаточно для введения нелинейности в нейронную сеть.

  2. Как правило, вы не хотите находиться в режиме, когда ваши результаты настолько велики или настолько малы, что это становится вычислительно нестабильным.Как упоминалось ранее, один из способов решения этой проблемы - использовать другую функцию активации (например, RELU).Другой способ и, возможно, даже лучший способ помочь решить эту проблему - лучше инициализировать веса с помощью, например, схемы Xavior-Glorot initialization или просто инициализировать их меньшими значениями, например, в диапазоне [-.01,+0,01].По сути, вы масштабируете случайные инициализации так, чтобы ваши выходы находились в хорошем диапазоне значений, а не в каком-то гигантском или крошечном числе.Вы, конечно, также можете делать и то и другое.

  3. Вы можете использовать более точные числа с плавающей точкой, чтобы Python сохранял больше десятичных знаков.Например, вы можете использовать np.float64 вместо np.float32 ... однако это увеличивает вычислительную сложность и, вероятно, не является необходимым.Большинство нейронных сетей сегодня используют 32-разрядные числа с плавающей точкой, и они работают просто отлично.Смотрите пункты 1 и 2 для лучшей альтернативы решению вашей проблемы.

  4. Этот вопрос слишком широкий.Я бы сказал, что курс и специализация профессора Эндрю Нг - моя самая сильная рекомендация в плане обучения нейронным сетям.

...