一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情。
常用激活函数
使用激活函数可以实现网络的高度非线性,这对于建模输入和输出之间的复杂关系非常关键。如果没有非线性激活函数,那么该网络将仅仅能够表达简单的线性映射,即便有再多的隐藏层,其整个网络跟单层神经网络也是等价的,只有加入了非线性激活函数之后,深度神经网络才具备了令人惊异的非线性映射学习能力。 可以在网络中的多个层中应用激活函数。
Sigmoid 激活函数
sigmoid
是使用范围最广的一类激活函数,其取值范围为 [0, 1]
,它可以将一个实数映射到 [0, 1]
的区间,可以将其用于二分类问题。
Sigmoid
函数公式定义如下所示:
使用 Python
实现此函数:
def sigmoid(x):
return 1/(1+np.exp(-x))
函数图像如下所示,可以看到函数的形状如 S 曲线,因此也称为 S 型生长曲线:
sigmoid
函数优点:平滑、易于求导。sigmoid
函数缺点:反向传播求导涉及除法,因此计算量大;反向传播时,很容易就会出现梯度消失的情况,从而限制了深层网络的训练。
Tanh 激活函数
Tanh
是双曲函数的一种,其是 Sigmoid
激活函数的改进,是以零为中心的对称函数,其取值范围为 [-1, 1]
。Tanh
激活函数计算公式如下:
使用 Python
实现此函数:
def tanh(x):
return (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))
函数图像如下所示,它在开区间 (-1, 1)
内是单调递增的奇函数,函数图形关于原点对称:
-
tanh
函数优点:tanh
函数是sigmoid
函数的改进,收敛速度快,不易出现loss
值晃动。 -
tanh
函数缺点:无法解决梯度弥散的问题,函数的计算量同样是指数级的,计算相对复杂。
ReLU 激活函数
修正线性单元 (Rectified Linear Units
, ReLU
) 激活函数是 sigmoid
和 tanh
激活函数的完美替代激活函数,是深度学习领域最重要的突破技术之一。ReLU
激活函数计算公式如下:
使用 Python
实现此函数:
def relu(x):
return np.where(x>0, x, 0)
函数图像如下所示,当输入值 大于等于 0 时,则 ReLU
函数按原样输出。如果输入小于 0,则 ReLU
函数值为 0。因为 ReLU
函数的大于等于 0 的线性分量具有固定导数,而对另一个线性分量导数为 0。因此,使用 ReLU
函数训练模型要快得多。
ReLU
函数优点:不存在梯度消失问题,计算成本很低,收敛速度比sigmoid
和tanh
函数快得多。ReLU
函数缺点:当梯度值过大时,其权重更新后为负数,在ReLU
函数中导数恒为零,导致后面的梯度也不再更新,也被称为dying ReLU
问题。
线性激活函数
线性激活的输出是输入值本身,按原样输出输入值:
使用 Python
实现此函数:
def linear(x):
return x
该函数仅用于解决回归问题的神经网络模型的输出层,注意不能在隐藏层中使用线性激活函数。
Softmax 激活函数
通常,softmax
在神经网络输出最终结果前使用。通常使用 softmax
是为了确定输入在给定场景中属于 n
个可能的输出类别之一的概率。假设我们正在尝试将数字图像分类为可能的 10 类(数字从0到9)之一。在这种情况下,有 10 个输出值,其中每个输出值代表输入图像属于某个类别的概率。Softmax
激活函数计算公式如下:
softmax
激活用于为输出中的每个类别提供一个概率值,其中 表示输出的索引。使用 Python
实现此函数:
def softmax(x):
return np.exp(x) / np.sum(np.exp(x))
softmax
函数一般作为神经网络的最后一层,接受来自上一层网络的输入值,然后将其转化为概率。例如我们要识别一张图片,其可能的标签为 [apple, banana, lemon, pear]
,则网络最后一层值 [1.0, 2.0, 3.0, 4.0]
经过 softmax
函数后输出为 [0.0320586, 0.08714432, 0.23688282, 0.64391426]
。