一、Leaky ReLU激活函数
激活函数是神经网络模型中非常重要的一部分,通常被用于在神经元之间传递信号。在深度学习中,ReLU(Rectified Linear Unit)激活函数是最常用的函数之一,而Leaky ReLU是ReLU的一种改进版本,它在ReLU的基础上添加了一个小的负斜率,也就是所谓的“泄露部分”,使得在输入是负数的情况下,激活函数不为0并有一个比ReLU更小的导数。这样可以避免神经元的死亡,同时也可以改善神经网络的收敛速度。
二、Leaky ReLU和ReLU的区别
ReLU是一个非常简单的非线性函数,它取输入值x,返回max(0,x),即当x大于等于0时返回x,当x小于0时返回0。ReLU的优点在于它的计算简单,但有时会遇到ReLU的神经元死亡问题,即在训练过程中,某些神经元永远不会被激活,导致网络无法收敛。这时,引入了Leaky ReLU。与ReLU不同的是,Leaky ReLU在输入为负值时,其函数值为alpha * x,其中alpha是一个非常小的数(通常为0.01)。这样,在输入为负数时,Leaky ReLU仍然具有微弱的激活作用,避免了神经元死亡问题。
三、Leaky ReLU函数中Alpha参数
在Leaky ReLU函数中,引入了一个超参数alpha,它控制了Leaky ReLU函数在输入为负值时的斜率。alpha一般设置为一个非常小的常数,通常是0.01,也有一些文献中将alpha设置为0.2。如果将alpha设置为0,那么Leaky ReLU函数就变成了ReLU函数。在实际应用中,正确选择alpha值可以大大提高神经网络的性能。
四、Leaky ReLU函数实现
Leaky ReLU函数的实现非常简单,以下是一个Python实现:
def leaky_relu(x, alpha = 0.01): return np.maximum(alpha*x, x)
其中np.maximum()函数用于获取两个张量中的最大值。首先计算alpha * x,然后比较alpha * x和x的大小,将大值保留下来作为函数的输出。如果alpha = 0,那么函数就变成了普通的ReLU函数。
五、ReLU函数图像
为了帮助更好地理解Leaky ReLU和ReLU之间的区别,下面展示了两个函数的图像。如下图所示,当输入为负数时,ReLU的输出为0,而Leaky ReLU的输出为一个带负斜率的直线。
六、ReLU函数优缺点
ReLU函数的优点是非常显著的:它计算简单、收敛速度快,并且在实际应用中证明了良好的性能。然而,ReLU函数存在一些缺点。其主要缺点是激活神经元不是恒定的函数,这将导致 固定正对数值区间 内的节点。例如,如果神经元输入范围的负值,那么神经元只会输出0。这可能导致许多神经元在训练过程中永远不会被激活,从而导致梯度消失和神经元死亡问题。因此,Leaky ReLU作为ReLU的一个改进版本,广泛用于深度学习中。
七、代码示例
以下是一个使用Leaky ReLU函数优化MNIST分类器的例子。
import tensorflow as tf (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data() x_train = x_train.astype('float32') / 255.0 x_test = x_test.astype('float32') / 255.0 model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), tf.keras.layers.Dense(128), tf.keras.layers.LeakyReLU(alpha=0.1), tf.keras.layers.Dense(10, activation='softmax') ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train, epochs=5, validation_data=(x_test, y_test)) test_loss, test_acc = model.evaluate(x_test, y_test) print('Test accuracy:', test_acc)
该模型使用Leaky ReLU作为激活函数,在模型中加入参数alpha。模型的训练结果也证明了Leaky ReLU在这个案例中的有效性。