Relu vs Sigmoid vs Softmax作为隐藏层神经元


22

我正在使用Tensorflow制作的只有一个隐藏层的简单神经网络,然后尝试对隐藏层进行不同的激活:

  • 露露
  • 乙状结肠
  • Softmax(嗯,通常在最后一层使用softmax。)

Relu提供最佳的列车精度和验证精度。我不确定如何解释这一点。

我们知道Relu具有良好的品质,例如稀疏性(例如无梯度消失)等,但是

问:Relu神经元通常比乙状结肠/ softmax神经元好吗?我们是否应该几乎总是在NN(甚至CNN)中使用Relu神经元? 我认为,如果我们担心过度拟合,则更复杂的神经元会带来更好的结果,至少可以提高训练的准确性。

谢谢PS:该代码基本上来自“ Udacity-Machine learning -assignment2”,它是使用简单的1层-NN识别notMNIST的。

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)

Answers:


12

除了@Bhagyesh_Vikani:

  • Relu的行为接近线性单位
  • Relu就像是线性开关。如果不需要,可以将其“关闭”。如果需要,可以“打开”它。因此,我们获得了线性收益,但保留了不完全使用它的选择。
  • 导数处于活动状态时为1。函数的二阶导数几乎在任何地方都是0。因此,这是一个非常简单的功能。这使优化变得容易得多。
  • 渐变很大,只要您想要就可以,而且永远不会饱和

也有整流线性单元的概括。校正的线性单位及其概括性基于以下原则:线性模型更易于优化。

不鼓励使用乙状结肠/ softmax(第6章:伊恩·古德费洛)香草前馈实施。它们对于循环网络,概率模型更有用,并且某些自动编码器还有其他要求,这些要求排除了使用分段线性激活函数的可能性。

如果您有一个简单的NN(就是这个问题),那么Relu是您的首选


5

Relu有其优点和缺点:

优点:
1.不饱和(以+已经区)
2.在计算上,这是非常有效
3.一般用RELU神经元模型收敛速度远远超过其他激活功能的神经元,如所描述这里

缺点:
1.与他们打交道的一个问题是他们死在哪里,即死了的露露丝。因为如果任何relu神经元的激活变为零,则其反向传播的梯度将被限制为零。如果我们非常小心权重初始化和调整学习率,可以避免这种情况。

有关更多详细信息:请检查CS231n的讲座5


值得注意的是,ELU单元将计算效率换成永生不死的能力-免疫死亡。arxiv.org/abs/1511.07289
Sycorax表示莫妮卡(Monica)

感谢您的加入。是的,可以使用ELU,但是RELU仍然比ELU流行和使用的原因是因为在使用ELU时,引入了新的超参数。
Bhagyesh Vikani

1
有基本上没有原因,你必须调整在特定的参数。
Sycorax说恢复莫妮卡

4

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

乙状结肠

乙状结肠饱和并杀死梯度。乙状结肠输出不是零中心的。

像乙状结肠神经元一样,它的激活是饱和的,但是与乙状结肠神经元不同,它的输出是零中心的。因此,实际上,tanh非线性总是比S形非线性更可取。

ReLU

使用ReLU非线性,注意您的学习率,并可能监视网络中“死”单元的比例。如果这与您有关,请尝试Leaky ReLU或Maxout。切勿使用乙状结肠。尝试使用tanh,但希望它的性能比ReLU / Maxout差。


2
当偏置节点可以上下移动一个看起来像另一个时,我不知道S型和tanh有何显着不同。
endolith '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.