卷积神经网络——非线性激活

首先我们回顾一下在《卷积神经网络简介》一文中提到的经典LeNet网络结构,如图1所示:


Python非线性神经网络 非线性神经网络模型_Python非线性神经网络

图 1  LeNet网络结构

我们注意到在每个卷积操作“Convolution”之后紧跟了一个“ReLU”操作,没错,这里的ReLU就是一种非线性激活函数,用于在每个卷积操作后进行附加运算。

ReLU(Rectified Linear Unit),又称为修正线性单元,是一种非线性运算。其输出如下:

                                                                                               

Python非线性神经网络 非线性神经网络模型_深度学习_02


Python非线性神经网络 非线性神经网络模型_深度学习_03

图 2  ReLU

 ReLU是一种按元素的操作(应用于每个像素),并将特征图中的所有负像素值替换为零。 ReLU的目的是在我们的CNN中引入非线性,因为我们希望ConvNet学习的大多数现实世界数据都是非线性的(卷积是线性运算–按元素的矩阵乘法和加法运算),因此我们通过引入诸如ReLU之类的非线性函数来解决非线性问题。

Tips:“大多数现实世界数据都是非线性的”,如何理解这句话呢?举个例子:加入你在寒冷的冬天,手上握着1个火把能让你的体温上升1度,那么握着2个火把可能让你的体温上升1.5度。因为火把的个数和体温上升并不是线性关系。

那我们看一下卷积操作得到的特征图在通过ReLU函数非线性激活之后得到的修正特征图,如图3所示:

问题:细心的小伙伴可能会发现,图像的像素值范围不是0~255吗,为什么特征图里会有负值?(答案在文末)


Python非线性神经网络 非线性神经网络模型_神经网络_04

图 3 ReLU修正特征图

 当然,我们也可以使用其他非线性函数(例如tanh或Sigmoid)代替ReLU,但是已经发现ReLU在大多数情况下的性能更好。不过,ReLU本身也有一些弊端,例如特征图中的负像素可能也包含有价值的信息,ReLU则将其全部置零。因此,人们也对ReLU进行了改进,有了ReLU,Leaky ReLU,PReLU,RReLU等。

答案:确实原始图像的像素值只能是0~255,但是卷积核里的数值可以为负,所以使用卷积核卷积得到的特征图也会有负像素值出现。