深度学习课程 DAY 6 - 图像分类问题:手写数字识别案例(四)
Chapter 3 图像分类问题
3.5 模型优化之损失函数
(1)概述
上一节尝试通过更复杂的模型(经典的全连接神经网络和卷积神经网络),提升手写数字识别模型训练的准确性。本节探讨损失函数的优化对模型训练效果的影响。
损失函数是模型优化的目标,用于在众多的参数取值中,识别最理想的取值。损失函数的计算在训练过程的代码中,每一轮模型训练的过程都相同,分如下三步:
① 先根据输入数据正向计算预测输出。
② 再根据预测值和真实值计算损失。
③ 最后根据损失反向传播梯度并更新参数。
(2)分类任务的损失函数
在之前的方案中,我们复用了房价预测模型的损失函数-均方误差。从预测效果来看,虽然损失不断下降,模型的预测值逐渐逼近真实值,但模型的最终效果不够理想。究其根本,不同的深度学习任务需要有各自适宜的损失函数。我们以房价预测和手写数字识别两个任务为例,详细剖析其中的缘由如下:
① 房价预测是回归任务,而手写数字识别是分类任务,使用均方误差作为分类任务的损失函数存在逻辑和效果上的缺欠。
② 房价可以是大于0的任何浮点数,而手写数字识别的输出只可能是0-9之间的10个整数,相当于一种标签。
③ 在房价预测的案例中,由于房价本身是一个连续的实数值,因此以模型输出的数值和真实房价差距作为损失函数(loss)是符合道理的。但对于分类问题,真实结果是分类标签,而模型输出是实数值,导致以两者相减作为损失不具备物理含义。实数减去标签,两者量纲都不同。
那么,什么是分类任务的合理输出呢?分类任务本质上是“某种特征组合下的分类概率”,下面以一个简单案例说明,如图所示。
在本案例中,医生根据肿瘤大小 x x x作为肿瘤性质 y y y的参考判断(判断的因素有很多,肿瘤大小只是其中之一),那么我们观测到该模型判断的结果是 x x x和 y y y的标签(1为恶性,0为良性)。而这个数据背后的规律是不同大小的肿瘤,属于恶性肿瘤的概率。
观测数据是真实规律抽样下的结果,分类模型应该拟合这个真实规律,输出属于该分类标签的概率。
简单来说,分类问题输出的是分类标签,回归问题输出的是实数值。分类问题期望模型输出某一种标签的概率,如何将实数输出变为标签概率呢?下面的Softmax函数则能解决这个问题。
1)Softmax函数
如果模型能输出10个标签的概率,对应真实标签的概率输出尽可能接近100%,而其他标签的概率输出尽可能接近0%,且所有输出概率之和为1。这是一种更合理的假设!与此对应,真实的标签值可以转变成一个10维度的one-hot向量,在对应数字的位置上为1,其余位置为0,比如标签“6”可以转变成[0,0,0,0,0,0,1,0,0,0]。
为了实现上述思路,需要引入Softmax函数,它可以将原始输出转变成对应标签的概率,公式如下,其中C是标签类别个数。
从公式的形式可见,每个输出的范围均在0~1之间,且所有输出之和等于1,这是变换后可被解释成概率的基本前提。对应到代码上,我们需要在网络定义部分修改输出层:self.fc = Linear(input_dim=10, output_dim=1, act='softmax')
,即是对全连接层的输出加一个softmax运算。
一个三个标签的分类模型(三个分类)使用的softmax输出层,从中可见原始输出的三个实数3、1、-3,经过softmax层后转变成加和为1的三个概率值0.88、0.12、0。softmax运算经过是先将x变为以e为底的指数,将三个指数的和作为分母,三个指数的值作为分子,则能计算概率值。
上文解释了为何让分类模型的输出拟合概率的原因,但为何需要对x取指数呢?即为何偏偏用softmax函数完成这个职能? 下面以二分类问题(只输出两个标签)进行探讨。
对于二分类问题,使用两个输出接入softmax作为输出层,等价于使用单一输出接入Sigmoid函数。如图所示,利用两个标签的输出概率之和为1的条件,softmax输出0.6和0.4两个标签概率,从数学上等价于输出一个标签的概率0.6。
假设模型为一层且没有激活函数,将权重相乘加和,通过sigmoid进行预测输出。当模型预测为1的概率即为sigmoid函数的输出,模型预测为0的概率就是1-sigmoid函数的输出。
在这种情况下,只有一层的模型为S(wTxi),S为Sigmoid函数。模型预测为1的概率为S(wTxi),模型预测为0的概率为1−S(wTxi)。
下图是肿瘤大小和肿瘤性质的数据图。左图的x轴为肿瘤大小,y轴为良恶性的输出。
从图中可发现,往往尺寸越大的肿瘤几乎全部是恶性,尺寸极小的肿瘤几乎全部是良性。只有在中间区域,即边界区域会出现稍大点的是良性,稍小的是恶性的情况。肿瘤的恶性概率会从0逐渐到1(绿色区域),这种数据的分布是符合多数现实问题的规律。
如果用线性函数的输出去模拟整个问题,相当于红色的直线,会发现这个线性会被拉平。但实际上我们希望拟合曲线0-1的区域与真实的分类边界区域重合。那么,怎么样的函数能更好的将中间部分落到0-1之间的概率输出呢?可以分为三段,第一段斜率小,直线较平缓;第二段为中间交错部分,斜率大,直线较陡;第三段斜率小,直线较平缓。
因此,观察下Sigmoid的曲线趋势可以满足我们对这个问题的一切期望,0-1的输出会集中在相对比较窄的区域内,即它的概率变化会集中在一个边界区域,有助于模型提升边界区域的分辨率。
这就类似于公共区域使用的带有恒温装置的热水器温度阀门。由于人体适应的水温在34度-42度之间,我们更期望阀门的水温条件集中在这个区域,而不是在0-100度之间线性分布。
因此,使用sigmoid函数能将原始的实数输出变为概率输出。但概率输出依然不能和分类标签进行比较,依然存在量纲等问题。下面的交叉熵函数则能解决这个问题。
2)交叉熵
在模型输出为分类标签的概率时,直接以标签和概率做比较也不够合理,人们更习惯使用交叉熵误差作为分类问题的损失衡量。
交叉熵损失函数的设计是基于最大似然思想:最大概率得到观察结果的假设是真的。如一次试验,从盒子取球且不放回的例子。
( P ( D ∣ h ) ) (P(D|h)) (P(D∣h))为从盒子取出一个黑球的概率, ( P ( h ∣ D ) ) (P(h|D)) (P(h∣D))为一个黑球从盒中取出的概率。 D D D是观测的数据,即白球黑球; h h h是模型,即甲乙盒子。这就是贝叶斯公式所表达的思想:
P ( h ∣ D ) ∝ P ( h ) ⋅ P ( D ∣ h ) P(h∣D)∝P(h)⋅P(D∣h) P(h∣D)∝P(h)⋅P(D∣h)
【P(A|B)=P(B|A)*P(A)/P(B) 描述两个条件概率的关系】
依据贝叶斯公式,假设某二分类模型“生成”n个训练样本的概率:
P(x1)⋅S(wTx1)⋅P(x2)⋅(