Python可视化神经网络常见的激活函数

1 引言

所谓激活函数,就是在人工神经网络的神经元上运行的函数,主要负责将神经元的输入映射到输出端.
在神经网络中,激活函数是神经元的一部分,在输入和输出信号之间的正向传播中引入了非线性,可以帮助神经网络学习到数据中的复杂模式.
本文主要对深度学习常见的激活函数进行简要的回顾.

2 线性函数

线性激活函数定义输入和输出之间的线性关系,最简单的形式为 y=x ,此时原函数和导函数的定义如下:

此时我们使用如下代码绘制二者图像:

def test1():
    v = np.linspace(-10, 10, 1000)
    phi = v
    phi_prime = v * 0 + 1
    plt.plot(v, phi, label='liner')
    plt.plot(v, phi_prime, '--', label='derivada')
    displayPlot(ylim=[-8, 8])

得到结果如下:

该函数的一些变形如下:

对应图像如下:

3 单位阶跃函数

单位阶跃函数,该函数和其导数定义如下:

注意上述函数为不连续函数,其倒数在v=0处不存在.
我们采用以下代码绘制其图像:

def test3():
    v = np.linspace(-10, 10, 1000)
    phi = v >= 0
    phi_prime = ~(v != 0)
    plt.plot(v, phi, label='heaviside')
    plt.plot(v, phi_prime, '--', label='derivada')
    displayPlot()

结果如下:

4 Sigmoid 函数

Sigmoid 函数是一种常见的S函数,该函数起初阶段为指数增长,然后随之开始变得饱和,增加变慢,最后增加停止.其函数和导函数的数学定义如下:

我们采用以下代码绘制其图像:

def test4():
    v = np.linspace(-10, 10, 1000)
    phi = 1 / (1 + np.exp(-v))
    phi_prime = phi * (1 - phi)
    plt.plot(v, phi, label='Sigmoid')
    plt.plot(v, phi_prime, '--', label='derivada')
    displayPlot()

结果如下:

该函数的一些变形如下:

对应图像如下:

5 tanh 双曲正切函数

该激活函数也是S形,为双曲正切函数,其数学表达式和导函数的定义如下:

我们采用以下代码绘制其图像:

def test6():
    v = np.linspace(-10, 10, 1000)
    phi = 2 / (1 + np.exp(-2 * v)) - 1
    phi_prime = 1 - phi ** 2
    plt.plot(v, phi, label='tanh')
    plt.plot(v, phi_prime, '--', label='derivada')
    displayPlot(ylim=[-1.1, 1.1])

结果如下:

相应地,该函数的一些变形如下:

对应图像如下:

6 SoftSign 函数

SoftSign是Tanh激活函数的替代选择, 该函数的数学表达式和导函数的定义如下:

我们采用以下代码绘制其图像:

def test8():
    v = np.linspace(-10, 10, 1000)
    phi = v / (1 + np.abs(v))
    phi_prime = 1 / (1 + np.abs(v)) ** 2
    plt.plot(v, phi, label='softsign')
    plt.plot(v, phi_prime, '--', label='derivada')
    displayPlot(ylim=[-1.1, 1.1])

结果如下:

相应地,该函数的一些变形如下:

结果如下:

7 ReLU 函数

ReLU函数是深度学习中比较流行的一种激活函数,其数学表达式和导函数的定义如下:

我们采用以下代码绘制其图像:

def test10():
    v = np.linspace(-10, 10, 1000)
    phi = v * (v >= 0)
    phi_prime = (v >= 0)
    plt.plot(v, phi, label='relu')
    plt.plot(v, phi_prime, '--', label='derivada')
    displayPlot(xlim=[-2, 2], ylim=[-0.1, 1.1])

结果如下:

相应地,该函数的一些变形如下:

对应图像如下:

8 PReLU 函数

PReLU函数是ReLU激活函数的改进版,该函数和其导函数的定义如下:

我们采用以下代码绘制其图像:

def test12():
    v = np.linspace(-10, 10, 1000)
    a = 0.2
    phi = np.where(v >= 0, v, a * v)
    phi_prime = np.where(v >= 0, 1, a)
    plt.plot(v, phi, label='PReLU (α = {0})'.format(a))
    plt.plot(v, phi_prime, '--', label='derivada')
    displayPlot(xlim=[-2, 2], ylim=[-0.6, 1.1])

结果如下:

相应地, 不同alpha取值下,该函数的结果图如下:

9 ELU 函数

ELU函数也是ReLU函数的一种扩展,其函数定义和导函数的数学公式如下:

我们采用以下代码绘制其图像:

def test14():
    v = np.linspace(-10, 10, 1000)
    a = 1
    phi = np.where(v >= 0, v, a * (np.exp(v) - 1))
    phi_prime = np.where(v >= 0, 1, phi + a)
    plt.plot(v, phi, label='ELU (α = {0})'.format(a))
    plt.plot(v, phi_prime, '--', label='derivada')
    displayPlot(xlim=[-2, 2], ylim=[-1.1, 1.1])

结果如下:

相应地, 不同alpha取值下,该函数的结果图如下:

10 SoftPlus 函数

SoftPlus函数定义和导函数的数学公式如下:

我们采用以下代码绘制其图像:

def test16():
    v = np.linspace(-10, 10, 1000)
    phi = np.log(1 + np.exp(v))
    phi_prime = 1 / (1 + np.exp(-v))
    plt.plot(v, phi, label='SoftPlus')
    plt.plot(v, phi_prime, '--', label='derivada')
    displayPlot(ylim=[-0.1, 2])

结果如下:

相应地,该函数的一些变形如下:

对应图像如下:

11 总结

本文对深度学习领域常见的激活函数进行了总结,并绘制了其函数和导函数的具体图像,并给出了完整代码示例.

您学废了吗?