欢迎大家关注我的B站:
偷吃薯片的Zheng同学的个人空间-偷吃薯片的Zheng同学个人主页-哔哩哔哩视频 (bilibili.com)
目录
1 神经元的一般模型
一个基本的架构就是多个输入通过不同权重求加权和并加上偏置,这得到的结果通过一个非线性函数就得到了该神经元的输出。而这个非线性函数就是我们要讨论的激活函数。
2 激活函数的特点
(1)激活函数一般是非线性的,这样多层神经网络就能拟合出各种想要的函数
(2)优化器一般采用梯度下降去更新参数,因此要求激活函数可导
(3)激活函数单调,使得优化问题变成凸优化问题,使全局最优解易得,防止陷入局部极值
(4)满足有界性能够使较大的负输入问题得到解决,同时解决过拟合问题
(5)结构简单,为了计算量小,训练速度快,函数形式不能过于复杂
(6)当参数初始化为随机小值时,f (x) 近似等于 x,神经网络更稳定
3 常见激活函数
3.1 sigmoid及其改进型
3.1.1 sigmoid介绍
优点:sigmoid 函数是平滑的,输入输出连续变化,易求导。同时范围限制在 0~1 之间,相当于做了一个归一化。
缺点:存在幂运算,计算量大,训练耗时。容易产生梯度消失。
下面是Python定义 sigmoid 的代码
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-10,10,50)
y = 1 / (1 + np.exp(-x))
fig = plt.figure()
plt.plot(x, y)
plt.show()
3.1.2 sigmoid的导数介绍
下面是Python定义 sigmoid 的一阶导数的代码
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-10,10,50)
y = 1 / (1 + np.exp(-x))
y = y*(1-y)
fig = plt.figure()
plt.plot(x, y)
plt.show()
sigmoid 的一阶导数范围在 0~0.25 之间,链式求导往往是多层导数相乘,由于是小于1 的数多次相乘,梯度将像指数那样趋近于零,会产生梯度消失的问题。
3.1.3 Mesh
下面是Python定义 Mesh 的代码
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-10,10,50)
y = 1 / (1 + np.exp(-x))
fig = plt.figure()
plt.plot(x, y)
plt.show()
3.1.4 swish
下面是Python定义 swish 的代码
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-10,10,50)
y = x / (1 + np.exp(-beta*x))
fig = plt.figure()
plt.plot(x, y)
plt.show()
beta 是个可训练的参数或固定的常数。
3.2 relu及其改进型
3.2.1 relu 介绍
优点:relu 在正输入时是线性的,收敛速度快,计算速度快,同时符合恒等性的特点。当输入为正时,由于导数是1 ,能够完整传递梯度,不存在梯度消失的问题。
缺点:relu 在小于0的时候梯度为零,导致了某些神经元永远被抑制,最终造成特征的学习不充分。这是典型的 Dead relu 问题,所以需要改进随机初始化,避免将过多的负数特征送入relu。relu的输出为0或正数,说明relu不是以 0 为中心的函数。
下面是Python定义 relu 的代码
x = np.linspace(-10,10,50)
y = np.zeros(x.shape)
for i,v in enumerate(x):
if v >= 0:
y[i] = v
else:
y[i] = 0
fig = plt.figure()
plt.plot(x, y)
plt.show()
3.2.2 relu的导数介绍
下面是Python定义 relu 的一阶导数的代码
x = np.linspace(-10,10,50)
y = np.zeros(x.shape)
for i,v in enumerate(x):
if v >= 0:
y[i] = 1
else:
y[i] = 0
fig = plt.figure()
plt.plot(x, y)
plt.show()
3.2.3 Leaky relu
下面是Python定义 Leaky relu 的一阶导数的代码
import numpy as np
import matplotlib.pyplot as plt
x1 = np.linspace(-10,10,50)
y1 = np.zeros(shape = x1.shape[0])
for i,v in enumerate(x1):
if v > 0:
y1[i] = v
else:
y1[i] = 0.1*v
fig = plt.figure()
plt.plot(x1, y1)
plt.show()
理论上 Leaky relu 继承了relu的大多数优点,同时解决了 Dead relu 的问题,但是实际实验中并没有优于relu。
3.2.4 Prelu
ai为可学习的参数,如果ai=0,则退化为relu,若ai恒定则退化为 Leaky relu。
3.2.5 ELU
融合了sigmoid 与 relu,左侧有软饱和性,右侧无饱和性,抗干扰能力强。
4 软饱和硬饱和
5 激活函数的选择
对于初学者,激活函数的选择有如下建议
(1)选择relu
(2)学习率设置较小
(3)初始参数符合正态分布
对于进阶者,对激活函数的选择需要考虑很多因素,详情参考为神经网络选择正确的激活函数_deephub的博客-CSDN博客_神经网络回归问题用什么激活函数