关于激活函数的讨论
CNN可以利用不同的激活功能来表达复杂的特征。与人脑神经元模型的功能类似,这里的激活功能是一个单元,决定哪些信息应该传输到下一个神经元。神经网络中的每个神经元接受前一层神经元的输出值作为输入,并将处理后的值传递给下一层。在多层神经网络中,两层之间有一个函数,该函数称为激活函数,其结构如图12所示。
如果未使用激活函数或使用线性函数,则每层的输入将是前一层输出的线性函数。在这种情况下,Heet al.验证无论神经网络有多少层,输出总是输入的线性组合,这意味着隐藏层没有效果。这种情况是原始感知器,它的学习能力有限。因此,引入非线性函数作为激活函数。理论上,具有非线性激活函数的深度神经网络可以逼近任何函数,这大大提高了神经网络拟合数据的能力。
激活函数介绍
sigmoid函数可以将元素的值变换到0和1之间:
下面绘制了sigmoid函数。当输入接近0时, sigmoid函数接近线性变换
依据链式法则, sigmoid函数的导数,当输入为0时, sigmoid函数的导数达到最大值;当输入越偏离0时, sigmoid函数的导数越接近0。
因此,它可以用于二元分类问题。此外,SENet和MobileNet v3需要将注意力机制的输出值转换为(0,1),其中sigmoid是一种合适的实现方式。
与sigmoid不同,tanh函数[参见图13(b)]可以将实数映射到(−1, 1)。由于tanh输出的平均值为0,因此可以实现一种归一化。这使得下一层更容易学习。
此外,ReLU见图13(c)]是另一种有效的激活功能。当x小于0时,其函数值为0;当x大于或等于0时,其函数值为itself。与sigmoid函数和tanh函数相比,使用ReLU函数的一个显著优点是可以加快学习速度。Sigmoid和tanh涉及指数运算,在计算导数时需要除法,而ReLU的导数是常数。此外,在sigmoid和tanh函数中,如果x的值太大或太小,函数的梯度就很小,这会导致函数缓慢收敛。然而,当x小于0时,ReLU的导数为0,当x大于0时,导数为1;因此,它可以获得理想的收敛效果。ILSVRC-2012中的最佳模型AlexNet使用ReLU作为基于CNN的模型的激活函数,这缓解了网络较深时的梯度消失问题,并验证了在较深网络中使用ReLU优于sigmoid。根据前面的讨论,我们可以发现ReLU不包括上限。实际上,我们可以设置一个上限,如ReLU6。
ReLU的另一个变体是PReLU[58][见图13(e)]。与泄漏ReLU不同,PReLU负部分的斜率基于数据,而不是预定义的数据。 Heet al.认为PReLU是在ImageNet 2012分类数据集上超越人类分类水平的关键。
指数线性单位(ELU)函数[见图13(f)]是ReLU的另一个改进版本。由于ReLU是非负激活的,因此其输出的平均值大于0。此问题导致下一层单元的偏移。ELU函数为负值;因此,其输出的平均值接近于0,使得收敛速度比ReLU快。然而,负部分是一条曲线,需要很多复杂的导数。
因一些段落内插入了公式,上传时就保存为了图片,给大家带来不便,请谅解!
参考:Dive_into_DL_Pytorch
A Survey of Convolutional Neural Networks:Analysis, Applications, and Prospects