Я играл с простой нейронной сетью только с одним скрытым слоем от 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)
источник
Ответы:
В дополнение к @Bhagyesh_Vikani:
Есть также обобщения выпрямленных линейных единиц. Выпрямленные линейные единицы и их обобщения основаны на том принципе, что линейные модели легче оптимизировать.
И сигмоид / софтмакс не рекомендуется (глава 6: Иан Гудфеллоу) для ванильной реализации с прямой связью. Они более полезны для рекуррентных сетей, вероятностных моделей, а некоторые автоэнкодеры имеют дополнительные требования, исключающие использование кусочно-линейных функций активации.
Если у вас простой NN (вот в чем вопрос), Relu - ваше первое предпочтение .
источник
У Relu есть свои плюсы и минусы:
Плюсы:
1. Не насыщает (в + ve области)
2. В вычислительном отношении, это очень эффективно
3. Как правило, модели с релюрными нейронами сходятся гораздо быстрее, чем нейроны с другими функциями активации, как описано здесь
Минусы:
1. Одна проблема с ними связана с тем, где они умирают, т.е. с мертвым Релусом. Потому что, если активация любых релейных нейронов станет нулевой, то при обратном распространении ее градиенты будут обрезаны до нуля. Этого можно избежать, если мы будем очень осторожны с инициализацией весов и настройкой скорости обучения.
Для более подробной информации: Проверьте эту лекцию-5 из CS231n
источник
http://cs231n.github.io/neural-networks-1/
сигмоида
Сигмоиды насыщают и убивают градиенты. Сигмоидальные выходы не центрированы по нулю.
TANH
Как и сигмовидный нейрон, его активации насыщаются, но в отличие от сигмовидного нейрона его выход центрирован на ноль. Следовательно, на практике нелинейная нелинейность всегда предпочтительнее сигмовидной нелинейности.
РЕЛУ
Используйте нелинейность ReLU, будьте осторожны со скоростью обучения и, возможно, следите за долей «мертвых» единиц в сети. Если это касается вас, попробуйте Leaky ReLU или Maxout. Никогда не используйте сигмовидную кишку. Попробуйте tanh, но ожидайте, что он будет работать хуже, чем ReLU / Maxout.
источник