![神经网络设计与实现](https://wfqqreader-1252317822.image.myqcloud.com/cover/765/38894765/b_38894765.jpg)
2.3.2 激活函数
截至目前,你已经看到了两种不同的激活函数:阶跃函数和sigmoid。但是,根据任务的不同,多多少少还有其他函数可以使用。
激活函数通常用于引入非线性。没有它,我们将只能通过另一个线性函数得到输入的一个线性组合。
现在,我们将详细介绍一些激活函数及其在Keras中的代码。
1.sigmoid
正如你看到的那样,sigmoid函数是逻辑函数的一个具体实例,它为我们提供了类似于阶跃函数的功能,因此对于二元分类(指示结果的可能性)很有用。该函数是可微的,因此可以对每个点进行梯度下降。它也是单调的,这意味着它总是递增或递减,但其导数不会变化。因此,它将有一个最小值。它迫使所有输出值都在0~1之间。即使值非常高,也只会无限趋向于1,而非常低的值趋向于0。这造成的一个问题是,这些点处的导数约为0。因此,梯度下降过程将找不到非常高或非常低的值的局部最小值,如图2-10所示。
![](https://epubservercos.yuewen.com/96A46E/20422784308285606/epubprivate/OEBPS/Images/2-10.jpg?sign=1738848487-iNZzKXpyfpjvrZl9fAl872jFCz7IeOMS-0-53fe4813849c6f756e90bc438b7ef2f0)
图 2-10
(1)softmax
softmax函数是sigmoid函数的一个泛化形式。sigmoid函数为我们提供二元分类输出的概率,而softmax允许我们将未归一化的向量转换为概率分布。这意味着softmax将输出一个向量,该向量的总和为l,其所有值都将处于0~1之间。
(2)tanh
正如我们之前所说,就逻辑sigmoid而言,高值或低值输入的结果将非常接近于零,可能导致神经网络遇到困难。这将意味着梯度下降将不会更新权重,也不能训练模型。
双曲正切或tanh函数是sigmoid的替代形式,且仍具有S型函数的形状。不同之处在于它将输出一个介于-1~1之间的值。因此,tanh函数会将强负输入映射为负输出(见图2-11)。此外,只有零值输入会被映射为接近零的输出。这些属性会使网络在训练过程中没那么容易遇到困难。
2.ReLU
ReLU是最常用的激活函数之一。当输入大于0时,它的行为类似于线性函数。反之,它将始终等于0。这是电气工程中的半波整流的模拟f(x)=max(0,x):
![](https://epubservercos.yuewen.com/96A46E/20422784308285606/epubprivate/OEBPS/Images/2-11.jpg?sign=1738848487-eICvFZ8gFT2fHthIGuaJBMUyJ04yq6Sd-0-5ebd2490c35fe9f6f3d27735beab8673)
图2-11 双曲正切函数
![](https://epubservercos.yuewen.com/96A46E/20422784308285606/epubprivate/OEBPS/Images/2-12.jpg?sign=1738848487-Jla1ICU7lz9O3wAm8LfcNjjk1vCwOVAv-0-9a055b1c8cc0fca65fdc12c0ebabaf31)
图2-12 ReLU函数
此函数的范围为从0到无穷大,但问题是负值结果会为0,因此其导数将始终为常数。这对于反向传播而言显然是个问题,但是在实际情况下,它没有任何影响。
ReLU有一些变体。最常见的一种是Leaky ReLU,它的目的是在函数不起作用时允许正的小梯度。其公式如下:
![](https://epubservercos.yuewen.com/96A46E/20422784308285606/epubprivate/OEBPS/Images/035-3-i.jpg?sign=1738848487-Cp4VEuOHw00MFsGfbeOatb0cnccj3Wlp-0-7bb8ec0845b8c133a10d0a32c742b577)
这里,a通常为0.01,如图2-13所示。
![](https://epubservercos.yuewen.com/96A46E/20422784308285606/epubprivate/OEBPS/Images/2-13.jpg?sign=1738848487-8xZhEXczJyGmEBySOb23baFKunbR62TS-0-9d9b0bcf7b20b572cd52fc4cd0f9bbce)
图2-13 Leaky ReLU函数