深度学习时代的计算机视觉算法
上QQ阅读APP看书,第一时间看更新

1.4.3 CNN的其他组件

激活函数又被称为非线性映射函数,是CNN中不可或缺的一个关键模块,激活函数的广泛使用使得CNN等深度网络模型具有了更好的特征表示能力。激活函数接收一组输入信号,通过阈值限制来模拟神经元的激活和兴奋状态,并产生输出。当前深度神经网络中常用的激活函数主要有Sigmoid函数、tanh函数、线性修正单元(Rectified Linear Unit,ReLU)、参数化ReLU(PReLU)、指数化ReLU(ELU)等。

Sigmoid函数的数学表达式是σx)=1/(1+e-x)。它输入实数值,并将其压缩至[0,1],更具体地说,将很小的负数变成0,将很大的正数变成1。Sigmoid函数曾经由于对神经元的激活频率有良好的解释而得到了广泛的使用,但现在已经很少使用了,这是因为在Sigmoid函数两端大于5(或小于-5)的区域,函数值会被压缩到1(或0),带来梯度的“饱和效应”。求导之后,梯度很容易趋近于0,造成“梯度消失”问题,神经元无法继续向前层传递误差,进而导致整个网络无法正常训练。此外,Sigmoid函数值域的均值是非0的,这并不符合神经网络内数值的均值应为0的设想。

tanh函数是在Sigmoid函数的基础上为了解决均值问题提出的激活函数,数学表达式为tanh(x)=2σ(2x)-1,它将实数值压缩到[-1,1],值域是0均值的。但是该函数也依然存在饱和问题。

ReLU是近些年被广泛使用的一种激活函数,表达式为:

与前两个激活函数相比,ReLU函数的梯度在x≥0时为1,反之为0;对x≥0的部分有效消除了Sigmoid函数的梯度饱和问题。在计算消耗上,相比前两个指数型的函数,ReLU的计算消耗也更低。不过ReLU函数也有自身缺陷,即在x<0时,梯度为0。也即对于小于0的这部分卷积结果来说,一旦变为负值将无法对网络训练产生影响。

为了解决上述问题,PReLU将ReLU函数中x<0的部分调整为fx)=αxα是一个通过网络学习得到的数量级较小的超参数,依据链式法则进行更新。具体的推导和训练细节可以参见相关文献,相关的实验结果表明,将PReLU作为激活函数的网络要优于使用ReLU的网络。

ELU于2016年提出,表达式为:

ELU有效解决了ReLU函数存在的“死区”问题,不过其指数操作在运算中会略微增大计算量。

CNN和很多其他神经网络模型通常使用随机梯度下降法完成模型的训练和参数更新,网络性能与收敛得到的最优解直接相关,而收敛效果又很大程度上取决于网络参数的初始化质量。理想的网络参数初始化会使模型训练事半功倍,反之则不仅会影响网络收敛,甚至会导致“梯度弥散”等问题,致使训练失败。Xavier是当前应用比较广泛的一种初始化方法,它一般使用randn函数产生一个零均值和一定标准差的高斯分布随机数,同时需要通过除以输入数据量的平方根来调整其数值范围,将神经元输出的方差进行归一化,维持输入输出数据分布方差的一致性。

过拟合问题是指一种算法在训练集上表现优异,但在测试集上的结果却不尽如人意,这是机器学习领域经常遇见的问题之一。出现过拟合问题意味着模型的泛化能力偏弱,没有推广能力,进而导致模型或算法失去实用价值。正则化(Regularization)是机器学习中一种通过显式地控制模型复杂度来避免过拟合的技术,也是解决过拟合问题的最常用手段。许多浅层学习器,如支持向量机(Support Vector Machine,SVM)等,为了提高泛化性往往要依赖模型正则化,深度学习更是如此。相比浅层学习器,深度网络模型极高的模型复杂度是一把双刃剑,即在保证模型更强大的表示能力的同时,也使模型蕴藏着更大的过拟合风险。深度模型的正则化是整个深度模型搭建的最后一步,也是很重要的一步。下面介绍几种实践中常用的CNN正则化方法。

(1)l2正则化

l2正则化是机器学习模型中十分常见的正则化方法,基本原理是通过惩罚目标函数中所有参数的平方来约束模型的复杂度。假设待正则的网络层参数为ωl2正则化的形式为:

其中,λ是正则化强度,用于控制正则项的大小,较大的λ取值会更大程度地约束模型复杂度。l2正则化可以直观理解为它对大数值的权重会进行严厉惩罚,倾向于更加分散的权重向量。

(2)l1正则化

l2正则化相似,对于待正则的网络层参数ωl1正则化为:

l1正则化除了同l2正则化一样能约束参数量级外,还能起到稀疏参数的作用,使优化后的参数一部分为0,另一部分为非零实值。此外,l1正则化和l2正则化也可以联合使用,表示为:

(3)随机失活

随机失活(Dropout)是目前绝大部分配置了全连接层的深度CNN在使用的一种正则化方法。随机失活在约束网络复杂度的同时,还是一种针对深度模型的高效集成学习(Ensemble Learning)方法,其在一定程度上缓解了神经元之间复杂的协同适应性,降低了神经元间的依赖,可以尽量避免网络过拟合。Dropout基本原理比较简单:对于某层的每个神经元,在训练阶段均以概率p随机将该神经元权重置0,因此被称作“随机”失活。测试阶段所有神经元均呈激活态,但其权重需乘以(1-p)以保证训练和测试阶段各自权重拥有相同的期望。