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

机器算法验证 机器学习 神经网络 卷积神经网络 张量流 S形曲线
2022-01-20 10:11:41

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

  • 热路
  • 乙状结肠
  • Softmax(嗯,通常softmax用在最后一层..)

Relu 提供了最好的训练精度和验证精度。我不知道如何解释这一点。

我们知道 Relu 有很好的特性,比如稀疏性,比如 no-gradient-vanishing 等,但是

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

谢谢 PS:代码基本上来自“Udacity-Machine learning -assignment2”,它是使用简单的 1-hidden-layer-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)
3个回答

除了@Bhagyesh_Vikani:

  • Relu 的行为接近线性单元
  • Relu 就像一个线性开关。如果你不需要它,你可以“关闭”它。如果你需要它,你可以“打开”它。因此,我们获得了线性优势,但保留了一个不完全使用它的选项。
  • 导数在激活时为 1。该函数的二阶导数几乎处处为 0。因此,这是一个非常简单的功能。这使得优化更容易。
  • 渐变很大,只要你想要它,永远不会饱和

还有整流线性单元的推广。整流线性单元及其推广是基于线性模型更容易优化的原理。

不鼓励使用 sigmoid/softmax (第 6 章:Ian Goodfellow)来实现原版前馈。它们对于循环网络、概率模型更有用,并且一些自动编码器有排除使用分段线性激活函数的额外要求。

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

Relu 有自己的优点和缺点:

优点:
1. 不饱和(在 +ve 区域)
2. 计算上非常有效
3. 通常具有 relu 神经元的模型比具有其他激活函数的神经元收敛得更快,如此处所述

缺点:
1. 与他们打交道的一个问题是他们死去的地方,即死去的 Relus。因为如果任何 relu 神经元的激活变为零,那么它的梯度将在反向传播中被剪裁为零。如果我们对权重初始化和调整学习率非常小心,就可以避免这种情况。

更多细节:查看CS231n 的这个第 5 讲

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

乙状结肠

Sigmoids 饱和并杀死梯度。Sigmoid 输出不是以零为中心的。

与 sigmoid 神经元一样,它的激活是饱和的,但与 sigmoid 神经元不同的是,它的输出是以零为中心的。因此,在实践中,tanh 非线性总是优于 sigmoid 非线性。

ReLU

使用 ReLU 非线性,注意学习率,并可能监控网络中“死”单元的比例。如果这让你担心,试试 Leaky ReLU 或 Maxout。永远不要使用 sigmoid。尝试 tanh,但希望它比 ReLU/Maxout 更糟糕。