Python中的ReLu函数

Relu或修正线性激活函数是深度学习领域中最常见的激活函数选择。Relu在提供最先进的结果的同时,计算效率也非常高。

Relu激活函数的基本概念是:

Return 0 if the input is negative otherwise return the input as it is.

我们可以用数学方式表示它,如下所示:

Relu Function

Relu的伪代码如下所示:

if input > 0:
	return input
else:
	return 0

在本教程中,我们将学习如何实现自己的ReLu函数,了解它的一些缺点,并学习一个更好的ReLu版本。

推荐阅读:《机器学习的线性代数》第一篇

我们开始吧!

在Python中实现ReLU函数。

让我们用Python编写自己的Relu实现。我们将使用内置的max函数来实现它。

ReLu的代码如下:

def relu(x):
	return max(0.0, x)

为了测试这个函数,让我们在几个输入上运行它。

x = 1.0
print('Applying Relu on (%.1f) gives %.1f' % (x, relu(x)))
x = -10.0
print('Applying Relu on (%.1f) gives %.1f' % (x, relu(x)))
x = 0.0
print('Applying Relu on (%.1f) gives %.1f' % (x, relu(x)))
x = 15.0
print('Applying Relu on (%.1f) gives %.1f' % (x, relu(x)))
x = -20.0
print('Applying Relu on (%.1f) gives %.1f' % (x, relu(x)))

完整代码

以下是完整的代码。

def relu(x):
	return max(0.0, x)

x = 1.0
print('Applying Relu on (%.1f) gives %.1f' % (x, relu(x)))
x = -10.0
print('Applying Relu on (%.1f) gives %.1f' % (x, relu(x)))
x = 0.0
print('Applying Relu on (%.1f) gives %.1f' % (x, relu(x)))
x = 15.0
print('Applying Relu on (%.1f) gives %.1f' % (x, relu(x)))
x = -20.0
print('Applying Relu on (%.1f) gives %.1f' % (x, relu(x)))

输出:出口

Applying Relu on (1.0) gives 1.0
Applying Relu on (-10.0) gives 0.0
Applying Relu on (0.0) gives 0.0
Applying Relu on (15.0) gives 15.0
Applying Relu on (-20.0) gives 0.0

ReLU函数的梯度

让我们看一下 ReLU 函数的梯度(导数)会是什么。求导后,我们会得到以下函数:

f'(x) = 1, x>=0
      = 0, x<0

我们可以看到,对于小于零的x值,斜率为0。这意味着某些神经元的权重和偏置没有被更新。这可能会在训练过程中成为一个问题。

为了克服这个问题,我们有了泄漏线性整流函数(Leaky ReLu)。接下来让我们了解一下它。

泄露的ReLu函数

破损 ReLu 函数是常规 ReLu 函数的改进。为了解决负值的梯度为零的问题,破损 ReLu 对负输入提供极小的线性部分的 x。

从数学上讲,我们可以将Leaky ReLu表达为:

f(x)= 0.01x, x<0
    = x,   x>=0

从数学角度来看:

  • f(x)=1 (x<0)
  • (αx)+1 (x>=0)(x)

这里的a是一个小常数,就像我们之前取的0.01一样。

以图形形式表示为:

Leaky ReLu function in Python

Leaky ReLu的梯度

让我们来计算Leaky ReLu函数的梯度。梯度可以得出为:

f'(x) = 1,  x>=0
      = 0.01, x<0

在這種情況下,負輸入的梯度不為零。這意味著所有的神經元將被更新。

在Python中实现Leaky ReLu

下面给出了Leaky ReLu的实现方法:

def relu(x):
  if x>0 :
    return x
  else :
    return 0.01*x

让我们现场尝试一下输入。

 
x = 1.0
print('Applying Leaky Relu on (%.1f) gives %.1f' % (x, leaky_relu(x)))
x = -10.0
print('Applying Leaky Relu on (%.1f) gives %.1f' % (x, leaky_relu(x)))
x = 0.0
print('Applying Leaky Relu on (%.1f) gives %.1f' % (x, leaky_relu(x)))
x = 15.0
print('Applying Leaky Relu on (%.1f) gives %.1f' % (x, leaky_relu(x)))
x = -20.0
print('Applying Leaky Relu on (%.1f) gives %.1f' % (x, leaky_relu(x)))

完整的代码

下面是Leaky ReLu的完整代码:

def leaky_relu(x):
  if x>0 :
    return x
  else :
    return 0.01*x
 
x = 1.0
print('Applying Leaky Relu on (%.1f) gives %.1f' % (x, leaky_relu(x)))
x = -10.0
print('Applying Leaky Relu on (%.1f) gives %.1f' % (x, leaky_relu(x)))
x = 0.0
print('Applying Leaky Relu on (%.1f) gives %.1f' % (x, leaky_relu(x)))
x = 15.0
print('Applying Leaky Relu on (%.1f) gives %.1f' % (x, leaky_relu(x)))
x = -20.0
print('Applying Leaky Relu on (%.1f) gives %.1f' % (x, leaky_relu(x)))

輸出:

Applying Leaky Relu on (1.0) gives 1.0
Applying Leaky Relu on (-10.0) gives -0.1
Applying Leaky Relu on (0.0) gives 0.0
Applying Leaky Relu on (15.0) gives 15.0
Applying Leaky Relu on (-20.0) gives -0.2

结论

这个教程是关于 Python 中的 ReLu 函数的。我们还看到了改进版本的 ReLu 函数。Leaky ReLu 解决了 ReLu 函数中负值的零梯度问题。

发表回复 0

Your email address will not be published. Required fields are marked *


广告
将在 10 秒后关闭
bannerAds