Relu против Sigmoid против Softmax как скрытые нейроны слоя


22

Я играл с простой нейронной сетью только с одним скрытым слоем от Tensorflow, а затем пробовал разные активации для скрытого слоя:

  • Relu
  • сигмоид
  • Softmax (ну, обычно softmax используется в последнем слое ..)

Relu дает лучшую точность поезда и точность проверки. Я не уверен, как это объяснить.

Мы знаем, что Relu обладает хорошими качествами, такими как редкость, например, отсутствие градиента и т. Д., Но

Q: Нейрон Relu в целом лучше нейронов сигмоидной / softmax? Должны ли мы почти всегда использовать Relu нейроны в NN (или даже в CNN)? Я думал, что более сложный нейрон даст лучший результат, по крайней мере, точность обучения, если мы будем беспокоиться о переоснащении.

Спасибо PS: код в основном взят из "Udacity-Machine learning -assignment2", который является распознаванием notMNIST с использованием простого 1-hidden-layer-NN.

batch_size = 128
graph = tf.Graph()
with graph.as_default():
  # Input data. 
  tf_train_dataset = tf.placeholder(tf.float32, shape=(batch_size, image_size * image_size))
  tf_train_labels = tf.placeholder(tf.float32, shape=(batch_size, num_labels))
  tf_valid_dataset = tf.constant(valid_dataset)
  tf_test_dataset = tf.constant(test_dataset)

  # hidden layer
  hidden_nodes = 1024
  hidden_weights = tf.Variable( tf.truncated_normal([image_size * image_size, hidden_nodes]) )
  hidden_biases = tf.Variable( tf.zeros([hidden_nodes]))
  hidden_layer = **tf.nn.relu**( tf.matmul( tf_train_dataset, hidden_weights) + hidden_biases)

  # Variables.
  weights = tf.Variable( tf.truncated_normal([hidden_nodes, num_labels])) 
  biases = tf.Variable(tf.zeros([num_labels]))

  # Training computation.
  logits = tf.matmul(hidden_layer, weights) + biases
  loss = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits(logits, tf_train_labels) )

  # Optimizer.
  optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(loss)

  # Predictions for the training, validation, and test data.
  train_prediction = tf.nn.softmax(logits)
  valid_relu = **tf.nn.relu**(  tf.matmul(tf_valid_dataset, hidden_weights) + hidden_biases)
  valid_prediction = tf.nn.softmax( tf.matmul(valid_relu, weights) + biases) 

  test_relu = **tf.nn.relu**( tf.matmul( tf_test_dataset, hidden_weights) + hidden_biases)
  test_prediction = tf.nn.softmax(tf.matmul(test_relu, weights) + biases)

Ответы:


12

В дополнение к @Bhagyesh_Vikani:

  • Relu ведет себя близко к линейной единице
  • Relu похож на переключатель линейности. Если вам это не нужно, вы «выключаете» его. Если вам это нужно, вы «включаете» его. Таким образом, мы получаем преимущества линейности, но оставляем за собой возможность не использовать его вообще.
  • Производная 1, когда она активна. Вторая производная функции равна 0 почти везде. Таким образом, это очень простая функция. Это делает оптимизацию намного проще.
  • Градиент велик, когда вы хотите, и никогда не насыщать

Есть также обобщения выпрямленных линейных единиц. Выпрямленные линейные единицы и их обобщения основаны на том принципе, что линейные модели легче оптимизировать.

И сигмоид / софтмакс не рекомендуется (глава 6: Иан Гудфеллоу) для ванильной реализации с прямой связью. Они более полезны для рекуррентных сетей, вероятностных моделей, а некоторые автоэнкодеры имеют дополнительные требования, исключающие использование кусочно-линейных функций активации.

Если у вас простой NN (вот в чем вопрос), Relu - ваше первое предпочтение .


5

У Relu есть свои плюсы и минусы:

Плюсы:
1. Не насыщает (в + ve области)
2. В вычислительном отношении, это очень эффективно
3. Как правило, модели с релюрными нейронами сходятся гораздо быстрее, чем нейроны с другими функциями активации, как описано здесь

Минусы:
1. Одна проблема с ними связана с тем, где они умирают, т.е. с мертвым Релусом. Потому что, если активация любых релейных нейронов станет нулевой, то при обратном распространении ее градиенты будут обрезаны до нуля. Этого можно избежать, если мы будем очень осторожны с инициализацией весов и настройкой скорости обучения.

Для более подробной информации: Проверьте эту лекцию-5 из CS231n


Стоит отметить, что подразделения ELU обмениваются вычислительной эффективностью на бессмертие - устойчивость к смерти. arxiv.org/abs/1511.07289
Sycorax сообщает, что восстановит Монику

Спасибо, что включили это. Да, ELU можно использовать, но причина, по которой RELU по-прежнему популярны и используются поверх ELU, заключается в том, что при использовании ELU вводится новый гиперпараметр.
Бхагеш Викани,

1
Там нет по существу никаких причин , вы должны настроить по этому конкретному параметру.
Sycorax сообщает, что восстановит Монику

4

http://cs231n.github.io/neural-networks-1/

сигмоида

Сигмоиды насыщают и убивают градиенты. Сигмоидальные выходы не центрированы по нулю.

TANH

Как и сигмовидный нейрон, его активации насыщаются, но в отличие от сигмовидного нейрона его выход центрирован на ноль. Следовательно, на практике нелинейная нелинейность всегда предпочтительнее сигмовидной нелинейности.

РЕЛУ

Используйте нелинейность ReLU, будьте осторожны со скоростью обучения и, возможно, следите за долей «мертвых» единиц в сети. Если это касается вас, попробуйте Leaky ReLU или Maxout. Никогда не используйте сигмовидную кишку. Попробуйте tanh, но ожидайте, что он будет работать хуже, чем ReLU / Maxout.


2
Я не понимаю, насколько сильно различаются сигмоид и танх, когда узлы смещения могут смещаться один вверх или вниз, чтобы выглядеть как другой.
эндолит
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.