各位同学好,最近学习了CS231N斯坦福计算机视觉公开课,讲的太精彩了,和大家分享一下。

已知一张图像属于各个类别的分数,我们希望图像属于正确分类的分数是最大的,那如何定量的去衡量呢,那就是损失函数的作用了通过比较分数与真实标签的差距,构造损失函数,就可以定量的衡量模型的分类效果,进而进行后续的模型优化和评估。

构造损失函数之后,我们的目标就是将损失函数的值最小化,使用梯度下降的方法求得损失函数对于每个权重的偏导数。

损失函数公式如下,f 代表一张图像属于每个类别的分数yi 代表真实的标签Li 代表每张图像的损失将所有数据点的损失值求平均,得到最终要优化的损失函数 L

python 绘制损失函数变化 损失函数图怎么画_机器学习

下面介绍几种典型的损失函数


1. 铰链损失函数( hinge loss )

铰链损失函数公式如下,sj 代表一张图片属于错误分类的分数syi 代表一张图片属于正确类别的分数

python 绘制损失函数变化 损失函数图怎么画_人工智能_02

举个例子,如下图。

计算猫图像的损失函数,先分别求出该图片属于汽车和青蛙两个类别的分数,减去属于猫的分数,再加1,和0比较,取最大值。得到猫图片的铰链损失函数值。

猫的损失函数:max[0, (5.1-3.2+1)] + max[0, (-1.7-3.2+1)] = 2.9 + 0 = 2.9

汽车的损失函数:max[0, (1.3-4.9+1)] + max[0, (2.0-4.9+1)] = 0 + 0 = 0

青蛙的损失函数:max[0, (2.2+3.1+1)] + max[0, (2.5+3.1+1)] = 6.3 + 6.6 = 12.9

将这三个样本的铰链损失值求平均,就得到了最终的损失函数值 L = (2.9 + 0 + 12.9) / 3

python 绘制损失函数变化 损失函数图怎么画_python 绘制损失函数变化_03


铰链损失函数的特点

(1)以图像car属于汽车类别的分数等于4.9为例,图像car属于错误类别的分数都小于3.9的话,那么图像car的损失函数值就等于0。铰链损失函数只会惩罚与正确类别分数相近的错误类别。

(2)铰链损失的最小值是0,最大值是正无穷。因为分类错误的分数可以是非常大的数

(3)刚开始训练时,所有的权重都是随机初始化的,导致图片属于每个类别的分数都是相近的。此时的铰链损失函数是分类错误的类别数。如果有三分类,L= max[0, (score-score+1)] + max[0, (score-score+1)]=2

(4)如果铰链损失函数的公式变成求平方,如下。也称为平方损失函数,分类错误的值经过平方之后就会变得非常大。这时我们重点优化损失函数值特别大的。如上图的青蛙图片的平方损失值就变成了12.9^2

python 绘制损失函数变化 损失函数图怎么画_机器学习_04

(5)同一个损失函数值对应很多组不同的权重。如果铰链损失函数的值等于0,有很多组权重都能使得损失函数等于0。举个例子,比如我们对所有的权重都乘以2,权重都为0

python 绘制损失函数变化 损失函数图怎么画_深度学习_05


2. 正则化

如果现在一个损失函数值对应了多组权重,那要怎么做选择呢。这时候就要引入正则化的概念了

在之前构造的损失函数后面再加一个正则化项

python 绘制损失函数变化 损失函数图怎么画_机器学习_06

 表示正则化强度。正则化是为了让模型更加简单,让参数和权重更加小。

L2正则化,计算每个权重值的平方,再求和。 

python 绘制损失函数变化 损失函数图怎么画_神经网络_07

 L1正则化,先给每个权重值取绝对值,再把每个权重的绝对值求和。 

python 绘制损失函数变化 损失函数图怎么画_深度学习_08

弹性网络,既考虑L1正则化又考虑L2正则化,使用参数

python 绘制损失函数变化 损失函数图怎么画_神经网络_09

衡量对L1和L2的关注程度。 

python 绘制损失函数变化 损失函数图怎么画_python 绘制损失函数变化_10

正则化的目的是为了防止过拟合,让权重更简单,让模型有更强的泛化能力,让模型更简单

除了直接在损失函数后面加一个正则化项以外,还有Dropout、Batch Normalization等防止过拟合的方法

python 绘制损失函数变化 损失函数图怎么画_python 绘制损失函数变化_11


举个例子

w有两组权重项,x是输入图片,w*x 线性求和之后的结果都是1。那怎么选择这两组权重呢。

通过L2正则化方法w1模型的正则化结果=1,w2模型的正则化结果=(0.25^2)x4,明显w2的正则化结果较小。正则化就能选出每个权重元素协同工作的最好的模型。使用L1正则化的话,会发现这两组权重的计算结果是一样的。

python 绘制损失函数变化 损失函数图怎么画_人工智能_12


3. Softmax 分类器

现在有了图像属于各个类别的分数,我们希望得到的是图像属于各个类别的概率,概率都是属于0-1之间,并且概率和等于1。softmax步骤如下:

(1)首先对图片属于每个类别的分数使用指数函数

python 绘制损失函数变化 损失函数图怎么画_人工智能_13

,既能将负数分数变为正数,又能保留其单调性。

(2)对指数函数的结果归一化。得到图片属于每个类别的概率在0-1之间,并且概率和等于1。如下图,图像属于car类别的概率是最高的,转换成概率后它的概率值也是最高的。

Softmax 的作用是将分数变成概率,并且保留了分数之间的大小关系。softmax本身不需要任何权重,只进行数学计算。

Softmax 能将图片属于正确和错误类别的分数尽可能的放大、分开,经过softmax函数变换后,如果分数的最大值和其他分类数值之间相差很大的话,softmax就会将这种差别放大。就算相差比较小也会将这个差别放大。

python 绘制损失函数变化 损失函数图怎么画_深度学习_14


4. 交叉熵损失函数

熵在物理中衡量混乱程度,熵越小,表明分类正确和分类错误越显著

计算完图像属于每个分类的概率之后就要构建交叉熵损失函数,又称为对数似然损失函数

公式为:Li = -log( 图像属于正确类别的概率 )

python 绘制损失函数变化 损失函数图怎么画_深度学习_15

由公式可知,图像属于正确分类的概率越接近1,那么交叉熵损失函数值就越接近0

此时,交叉熵损失函数值就和图片属于错误分类的概率值就没有关系了,只关心图片属于正确分类的概率

python 绘制损失函数变化 损失函数图怎么画_python 绘制损失函数变化_16


极大似然估计

极大似然估计是使得所有的图片都被正确分类的这一事件发生的联合概率

上面计算的 Li 是一张图片属于正确类别的交叉熵损失。那如果我现在有一千张图像,将它们属于各自正确类别的概率相乘起来,就能得到所有图片都分类正确的概率。这个结果数是非常非常小的,为了解决这个问题我们就可以在外面求一个对数。

只需要将  

python 绘制损失函数变化 损失函数图怎么画_机器学习_17

  变成  

python 绘制损失函数变化 损失函数图怎么画_神经网络_18


(1)每张图片分类正确的概率越接近1,那么最终的交叉熵损失函数结果就越接近0

(2)刚开始训练时,图片属于每个分类的概率是几乎是相同的,那么这个时候的一张图像的交叉熵损失值是多少呢。

假设此时一共有C分类,那么该图像的交叉熵损失为:

python 绘制损失函数变化 损失函数图怎么画_机器学习_19


5. 总结

我们现在有一个训练集,求得了每张图像属于各个类别的分数。

使用铰链损失函数可以计算各类别的分数和真实标签之间的距离,计算出铰链损失函数值。

这个分数经过 Softmax 函数变换后,可以计算交叉熵损失函数。

为了使模型更加简单可以在损失函数后面加一个正则化项。

python 绘制损失函数变化 损失函数图怎么画_人工智能_20