基于手写体数字识别的损失函数对比研究
2022-07-07郝雅娴孙艳蕊
郝雅娴 孙艳蕊
(1.山西师范大学 山西省太原市 030000 2.东北大学 辽宁省沈阳市 110000)
1 引言
随着科学水平的不断提高,计算机视觉领域的不断发展,我们进入了智能化的时代。在计算机视觉中,图像识别是核心的一部分,例如现如今比较流行的人脸识别算法,语义分割算法,行人识别等等计算机视觉任务,在进行图像识别时,图像识别算法设计选择很重要,同样重要的有损失函数的选择。卷积神经网络在进行训练时,样本的真实值与预测值之间的差异除了与样本自身信息有关,还与损失函数的选择有关。在机器学习算法中有很多损失函数,但是没有一个损失函数是可以做到完全适用于所有类型的数据,因此损失函数的选择尤为重要。本文首先介绍了两种不同的损失函数,交叉熵损失函数与负对数似然函数。分别对这两个损失函数在公式上进行了理论推导,在数据上进行了算法实验,实验得出针对手写体数据集交叉熵损失函数比负对数似然函数更优。
2 相关知识
2.1 交叉熵损失函数
由定义可知交叉熵描述的是两个分布之间的差异,所以交叉熵的值越小表示两个分布之间的差异越小。在神经网络的多分类问题中,交叉熵损失函数的公式定义为:
其中用y表示样本真实分布的概率,表示样本预测概率,该公式描述了真实值与预测值之间的距离,交叉熵越小,预测越准确,下面给出一个例子。
举例:有一个3分类问题:对手写数字0-2进行图片分类,如果要对数字2进行正确识别,在神经网络多分类问题中,样本标签通常是经过one-hot编码,经过编码后样本的真实值为(0,0,1),如果预测值的输出越接近真实输出,模型的效果就越好。假设现在有2个模型进行预测,第一个模型的输出为(0.5,0.5,0.8),第二个模型的输出为(0.2,0.1,0.7),直观上看第一个模型的预测更好,以为对数字2的预测第一个模型比第二个模型更接近真实预测值1,现在通过计算这两个模型的交叉熵来对比哪个模型预测更加准确:
通过对以上例子交叉熵的计算,可以看出第一个模型所得的交叉熵损失函数值为0.097,第二个模型的交叉熵损失函数值为0.15,因此第二个的预测更加准确。
由于样本的真实分布值为1,即y=1,所以以上交叉熵公式又可以简化为:
2.2 负对数似然损失函数
对上式求最大似然估计即求最小化负对数似然估计
通过观察可知,交叉熵损失函数与负对数似然损失函数在公式的定义上是等价的:
但是不同的是,对于交叉熵损失函数,可以经过onehot编码后的样本数据,也可以处理不经过one-hot编码的数据。而极大似然函数只能处理不经过one-hot编码的数据。
在pytorch中,nn.NLLLoss()函数表示负对数似然函数, nn.CrossEntropyLoss()函数表示交叉熵损失函数。nn.NLLLoss()损失函数在使用one-hot编码后会报错,nn.CrossEntropyLoss()在使用one-hot编码后不会报错。
3 基于手写体数据集的对比研究
3.1 数据集
本文所用的MNIST数据集是在美国国家标准和技术研究所(NIST)提供的手写数字字符NIST 数据库基础上发展而来的。数据集由包括60000*785个数值的训练集图像样本和包含10000 *785个数值的测试集样本两个部分组成。第一列为标签也就是0~9的手写阿拉伯数字的图像,第2列到第785列是第1列手写阿拉伯数字的像素值。其中,训练集(training set)由来自250个不同的人手写的数字构成,其中50%是高中学生,50%是人口普查局的工作人员,测试集(test set)也是由同样比例的手写数字构成现在我们来看训练集,它由785列构成。每张图像的分辨率是28×28。因此,784列表示对应每个数字的所有像素,最后一列表明这些像素实际表示的数字。我们来看看图像和数据集的预览效果(参见图1)。
图1:MNIST数据集
3.2 实验结果分析
首先建立一个卷积神经网络模型对手写体数据进行分类,本文定义的卷积神经网络结构中,包含两个卷积层conv1和conv2,每个层均包含卷积层与激活函数层、池化层。fc层包含两个全连接层和激活函数层,out层由一个全连接层构成,卷积神经网络的网络结构图如图2所示。
图2:卷积神经网络结构图
本文实验对手写体数据集训练Epoch=5轮,每轮进行100次迭代之后输出损失值,并同时计算出算法在测试集合上的精度值。
图3中的左图是损失函数为交叉熵损失函数时所得到的训练集损失函数曲线,由图可知,当损失函数为交叉熵损失函数的时候,收敛曲线在刚开始的Epoch中进行迭代时,损失值下降较快,随着迭代此时与Epoch的次数增加,逐渐下降速度趋于平稳,在小幅波动情况下近似趋于收敛,总体呈下凸函数。
图3右图是损失函数为负对数似然函数时所得到的训练集损失函数曲线,由图可知,当损失函数为负对数似然函数的时候,收敛曲线整体呈上凸函数,在最开始的几轮Epoch中,训练集的损失值变化不大,但随着迭代次数的增加,训练集的损失值一直在下降,通过观察损失函数值,可知其损失函数值为负值,说明在利用负对数似然函数作为损失值时,样本x分到y类的预测概率值 大于1,虽然在理论上,我们知道 得值时不应该大于1的,但是在样本的训练中,因为 的取值是来源于样本本身的标签属性,所以在实际训练中, 的值是可以取到大于1的。
图3:交叉熵损失函数与负对数似然损失函数在训练集上的训练损失收敛曲线
因此在对比了交叉熵损失函数于负对数似然损失函数在训练集上的损失值,我们可以得出结论:在进行手写体数字识别时,采用交叉熵损失函数比负对数似然函数更好一些,图4所描述的测试集的精度值也说明这一点。
图4:交叉熵损失函数与负对数似然损失函数在测试集上的训练精度曲线
图4中蓝色的曲线表示的是损失函数为交叉熵损失函数时所得到得在测试集上得精度曲线,绿色得曲线是损失函数为负对数似然函数时所得到得在测试集上得精度曲线,由图可知,当损失函数为交叉熵损失函数时,算法得在测试集上得精度随着训练次数得增加不断升高,联系图3得训练集损失图像可知,卷积神经网络算法选择损失函数为交叉熵损失函数时,算法对数据得拟合度较好。反之,在损失函数为负对数似然函数时,测试集上得精度值一直不增长,说明算法在数据集上得拟合程度不好,因此我们可以得出结论:在进行数据分析时,损失函数得选择尤为重要,直接影响算法整体效率
4 总结
本文针对两种不同的损失函数进行分析,即交叉熵损失函数与负对数似然函数,虽然这两个函数在公式上的定义是一致的,但是在实际多分类问题中,损失函数不同直接影响算法在数据集上的拟合效果。因此我们得出,数据集在进行训练时候,样本的真实值与预测值之间的差异除了与样本自身信息有关,还与损失函数的选择有关。在机器学习算法中,我们定义过很多损失函数,但是没有一个损失函数是可以做到完全适用于所有类型的数据,因此损失函数的选择尤为重要。损失函数的选择有多种因素构成,最常见的是判断数据是否具有离群点,以及机器学习算法的选择,在进行梯度下降训练时候的时间效率,这也是今后进一步的研究方向。