所谓激活函数,就是在人工神经网络的神经元上运行的函数,主要负责将神经元的输入映射到输出端.
在神经网络中,激活函数是神经元的一部分,在输入和输出信号之间的正向传播中引入了非线性,可以帮助神经网络学习到数据中的复杂模式.
本文主要对深度学习常见的激活函数进行简要的回顾.
线性激活函数定义输入和输出之间的线性关系,最简单的形式为 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])
单位阶跃函数,该函数和其导数定义如下:
注意上述函数为不连续函数,其倒数在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()
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()
该激活函数也是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])
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])
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])
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取值下,该函数的结果图如下:
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取值下,该函数的结果图如下:
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])
本文对深度学习领域常见的激活函数进行了总结,并绘制了其函数和导函数的具体图像,并给出了完整代码示例.
您学废了吗?
参考链接一
关注公众号《AI算法之道》,获取更多AI算法资讯。
注: 完整代码,关注公众号,后台回复 激活函数 , 即可获取。