1
写在前面
在上一篇文章《计算机视觉那些事 | 深度学习基础篇(上)》中我们从基本的神经网络开始,介绍了从单层感知机到多层感知机(MLP),从前向传播到反向传播,以及常用激活函数的相关内容。在这篇文章中,我们会对深度学习中常用的损失函数和梯度下降优化算法进行介绍。同时,我们将进一步从全连接神经网络过渡到卷积神经网络,介绍卷积的相关知识。
2
常见的损失函数
在神经网络中,由于非线性激活函数的引入,使得通过求解法来寻找最优化的网络结构参数变得非常困难。因此网络参数需要通过梯度下降法进行多次迭代更新才能达到一个较优的组合。
在这个过程中,损失函数起到了举足轻重的作用。因为我们首先需要根据损失函数计算网络输出值(预测值f(X))与实际标签值(目标值Y)之间的误差,从而给网络的参数优化指明一个方向。有了合适的损失函数,配合梯度下降算法和反向传播就可以实现对网络参数的迭代优化。
在实际应用中,常用的损失函数主要有以下几种类型。
1)0-1损失函数
0-1损失函数是指样本的预测值与目标值相等则为0,否则为1,数学表达式如下所示:
在上一篇文章介绍的感知机中,一般所用的损失函数就是这种0-1损失函数。有时候为了留出一定的余地,会适当放开条件,从而得到以下表达式:
2)绝对值损失函数和平方损失函数
绝对值损失函数如下式所示,该损失函数常用于对收敛结果有严格要求的场合,比如目标检测中对物体大小和位置的预测、图像翻译任务中网络输出图像的计算等。
此外,对绝对值损失函数计算平方,我们可以得到平方损失函数。
3)对数损失函数
对数损失函数用到了极大似然估计的思想,被广泛地应用于分类任务中,是最常用的损失函数之一,其数学表达式如下所示:
以上是机器学习和深度学习中常用的三种损失函数,特别是后两个损失函数更是在深度学习中拥有各种改进的计算表达式,在后续的文章中我们会结合多种不同的网络模型对其进一步介绍。
3
梯度下降的前世今生
在深度学习中,除了网络结构和损失函数,梯度下降及其优化算法也是深度学习中的关键组成部分。梯度下降算法从每次更新所需的样本数量上看,可以分为以下三种类型。
1)全局梯度下降法
全局梯度下降法在整个训练数据集上计算损失函数关于参数θ的梯度,然后根据学习率η更新参数。在执行每次更新时,我们都需要先在整个数据集上计算所有的梯度,所以此梯度下降法的速度会很慢,同时所能处理的数据集大小也受到限制。此外,全局梯度下降法不能在线更新样本。因此在实际训练当中,全局梯度下降法应用的场合十分受限。
2)随机梯度下降法
随机梯度下降法根据每一条训练样本xi和标签yi按照下面的表达式更新参数θ。随机梯度下降法具有运行速度快和可用于在线学习等优点,但是其会以高方差频繁更新,导致目标函数出现较大的波动。这种波动性既使得其跳到新的和潜在更好的局部最优,同时也会使得收敛到特定最小值的过程变得复杂。
3)小批量梯度下降算法
小批量梯度下降算法结合了以上两种梯度下降算法的优点,即每次更新时使用n个小批量训练样本,表达式如下所示。这种方法既减少了参数更新的方差,使其可以得到更加稳定的收敛结果,同时在计算过程中也可以利用最新的深度学习库中高度优化的矩阵优化方法,高效地求解每个小批量数据的梯度。当训练神经网络模型时,小批量梯度下降法是最常用的算法。
随着对深度学习研究的不断深入,梯度下降算法从最初的SGD发展出了各式各样变种,如Momentum、Adagrad、RMSprop和Adam等方法。下面我们分别对这些方法进行简单的对比介绍。
这里的SGD即上面我们提到的小批量梯度下降算法,通过每一次迭代计算小批量训练样本的梯度,从而对网络参数进行更新。
Momentum在SGD的基础上加入了动量的概念,使参数的更新不仅与当前的梯度(gt)相关还与过去的梯度相关。相比原始梯度下降算法,可以减少训练的震荡过程,有助于加速收敛。表达式如下所示:
与SGD和Momentum这类学习率固定的优化算法不同,Adagrad是一种学习率自适应的梯度下降算法,其参数的更新策略如下所示:
从上述表达式可以看出,在进行参数更新时,学习率要除以积累梯度平方项的平方根,其中加上一个很小值ε是为了防止除0的出现。由于该项是逐渐增加的,所以学习速率会一直衰减。虽然此举可以对过大的梯度进行约束,但同时也导致训练后期学习速率很小,使训练过早停止。
为了解决这一问题,RMSprop在Adagrad上进行了改进,在积累梯度平方项进行衰减,解决了学习率过快衰减的问题。数学表达式如下所示:
在RMSprop的基础上,Adam进一步加入了Momentum的思想。相比Momentum算法,其学习速率是自适应的,相比RMSprop,其增加了动量项。两者优点的结合让Adam成为了性能较好的算法。数学表达式如下所示:
当前在实际应用中,比较常用的梯度下降算法是SGD和Adam。一般而言,SGD会收敛到一个较好的结果,而Adam会很快地收敛到一个合适的结果,在实践中是选择SGD还是Adam最终还是要根据自己的数据和模型以及具体需求来决定。
4
从全连接到卷积
在以上两节内容中,我们介绍了深度神经网络常用的损失函数和优化策略。接下来我们将会从全连接神经网络过渡到广泛应用于计算机视觉任务中的卷积神经网络。
一个用于图像分类任务的经典卷积神经网络结构图如下所示。从图中我们可以直观地看到,输入图像经过卷积、池化和全连接的操作后输出了分类所属的类别。下面我们分别对其中的卷积和池化操作进行介绍。
卷积操作是卷积神经网络的关键组成部分,利用卷积对图像进行计算可以实现对图像特征的有效提取。下图(图片来源于网络)展示了卷积具体的计算过程。从左至右依次是输入的图像或特征图、卷积核和输出的特征图。
在卷积神经网络中,卷积核是我们要迭代求解的参数之一。卷积运算即将卷积核的数值与图像中的对应位置的数值相乘求和。通过设定固定的滑动步长(步长就是控制卷积核移动的距离),滑动卷积核对应特征图上的位置,就可以对整幅特征图进行卷积运算得到新的特征图。
与全连接神经网络相比,卷积具有以下优势:1)局部感受野:全连接是全局计算方式,而卷积是局部计算方式(如下图所示)。这更符合图像数据的特点,即图像中局部的像素联系比较紧密,距离较远的像素相关性则较弱,因此只需对局部区域进行感知,而不需要对全局图像进行感知。同时局部连接也使得参数量大幅下降;2)权值共享:对一个卷积核来说,卷积在滑动计算的过程中参数都是共享的,这又进一步减少了参数量。
卷积操作需要关心的超参数主要有卷积核大小、滑动步长、对输入特征图的填充大小和卷积组数。例如在下图中,一个输入为5x5的特征图,经过卷积核大小为3x3、滑动步长为1、填充尺寸为1x1、卷积组数为1的卷积操作之后,输出的特征图大小为5x5。
为了提升计算效率,卷积计算在实现过程中可以转化为矩阵乘法来操作。一般我们将特征图被转化为k*n的矩阵,其中k表示为实际卷积核的高与宽的乘积,n表示输出特征图的宽与高的乘积。通过这种转化后,将其与卷积核进行乘法运算,卷积的操作可以变为高效的矩阵乘法。
在卷积神经网路中,除了卷积操作外,池化也是其重要组成部分。池化可以进一步缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性。池化操作主要有最大池化和平均池化两种类型。在池化操作中不改变特征图的数量,只会改变特征图的大小。
上图展示了两种池化操作的计算过程。池化操作其实是一种特殊的卷积操作,与卷积类似,池化所涉及的超参数主要有池化核大小、填充大小和滑动步长。以上图为例,池化核和滑动步长均为2x2。对于平均池化,可以看成是卷积核大小固定为1除以池化核大小的卷积操作;最大池化则可以看成是卷积核在最大值对应的位置是1,其余全是0的卷积操作。
5
写在最后
在这篇文章中,我们对深度学习中常用的损失函数和梯度下降算法进行了对比,也进一步介绍了卷积和池化的相关操作。通过对这些基础知识的回顾和学习,为我们正式开启计算机视觉之旅做好了准备。在接下来的文章中,我们将会从图像分类开始,介绍各个计算机视觉任务中常用模型的细节和实践经验,和大家一步步走进计算机视觉的世界。
长按二维码关注我们
往期热门
点个 “在看”,支持「视说」原创