Keras深度学习——深度学习中常用激活函数

564 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情

常用激活函数

使用激活函数可以实现网络的高度非线性,这对于建模输入和输出之间的复杂关系非常关键。如果没有非线性激活函数,那么该网络将仅仅能够表达简单的线性映射,即便有再多的隐藏层,其整个网络跟单层神经网络也是等价的,只有加入了非线性激活函数之后,深度神经网络才具备了令人惊异的非线性映射学习能力。 可以在网络中的多个层中应用激活函数。

Sigmoid 激活函数

sigmoid 是使用范围最广的一类激活函数,其取值范围为 [0, 1],它可以将一个实数映射到 [0, 1] 的区间,可以将其用于二分类问题。

Sigmoid 函数公式定义如下所示:

sigmoid(x)=11+exsigmoid(x)=\frac 1 {1+e^{-x}}

使用 Python 实现此函数:

def sigmoid(x):
     return 1/(1+np.exp(-x))

函数图像如下所示,可以看到函数的形状如 S 曲线,因此也称为 S 型生长曲线:

sigmoid.png

  • sigmoid 函数优点:平滑、易于求导。
  • sigmoid 函数缺点:反向传播求导涉及除法,因此计算量大;反向传播时,很容易就会出现梯度消失的情况,从而限制了深层网络的训练。

Tanh 激活函数

Tanh 是双曲函数的一种,其是 Sigmoid 激活函数的改进,是以零为中心的对称函数,其取值范围为 [-1, 1]Tanh 激活函数计算公式如下:

tanh(x)=exexex+ex=2sigmoid(2x)1tanh(x) =\frac {{e^x} -e^{-x}} {{e^x} +e^{-x}}=2sigmoid(2x)-1

使用 Python 实现此函数:

def tanh(x):
    return (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))

函数图像如下所示,它在开区间 (-1, 1) 内是单调递增的奇函数,函数图形关于原点对称:

tanh.png

  • tanh 函数优点:tanh 函数是 sigmoid 函数的改进,收敛速度快,不易出现 loss 值晃动。

  • tanh 函数缺点:无法解决梯度弥散的问题,函数的计算量同样是指数级的,计算相对复杂。

ReLU 激活函数

修正线性单元 (Rectified Linear Units, ReLU) 激活函数是 sigmoidtanh 激活函数的完美替代激活函数,是深度学习领域最重要的突破技术之一。ReLU 激活函数计算公式如下:

relu(x)={0,x<0x,x0relu(x) = \begin{cases} 0, & {x<0} \\ x, & {x\ge0} \end{cases}

使用 Python 实现此函数:

def relu(x):
    return np.where(x>0, x, 0)

函数图像如下所示,当输入值 大于等于 0 时,则 ReLU 函数按原样输出。如果输入小于 0,则 ReLU 函数值为 0。因为 ReLU 函数的大于等于 0 的线性分量具有固定导数,而对另一个线性分量导数为 0。因此,使用 ReLU 函数训练模型要快得多。

ReLU.png

  • ReLU 函数优点:不存在梯度消失问题,计算成本很低,收敛速度比 sigmoidtanh 函数快得多。
  • ReLU 函数缺点:当梯度值过大时,其权重更新后为负数,在 ReLU 函数中导数恒为零,导致后面的梯度也不再更新,也被称为 dying ReLU 问题。

线性激活函数

线性激活的输出是输入值本身,按原样输出输入值: linear(x)=xlinear(x) = x 使用 Python 实现此函数:

def linear(x):
    return x

linear.png

该函数仅用于解决回归问题的神经网络模型的输出层,注意不能在隐藏层中使用线性激活函数。

Softmax 激活函数

通常,softmax 在神经网络输出最终结果前使用。通常使用 softmax 是为了确定输入在给定场景中属于 n 个可能的输出类别之一的概率。假设我们正在尝试将数字图像分类为可能的 10 类(数字从0到9)之一。在这种情况下,有 10 个输出值,其中每个输出值代表输入图像属于某个类别的概率。Softmax 激活函数计算公式如下:

softmax(xi)=eij=0Nejsoftmax(x_i)=\frac {e^i} {\sum _{j=0} ^N e^j}

softmax 激活用于为输出中的每个类别提供一个概率值,其中 ii 表示输出的索引。使用 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]