内容列表
Lecture 3 Loss Functions and Optimization
损失函数
说到损失,损失一定要很好的体现出来使用权值而产生结果与最优结果的差值,我们将使用损失函数(Loss Function)(有时也叫代价函数Cost Function或目标函数Objective)来衡量我们对结果的不满意程度。直观地讲,当评分函数输出结果与真实结果之间差异越大,损失函数输出越大,反之越小。针对多个测试数据,损失是整体数据损失的平均值。
多类支持向量机损失
多类SVM损失:一种两分类支持向量机的泛化,具体的损失函数如下:
其中
s
j
s_{j}
sj为非正确类的分数,
s
y
i
s_{y_i}
syi为分类正确的分数,这两者的差值再加上偏置参数1的结果与0取大值,最后对所有得分结果取和,就可以得到该图片最后所得损失结果,注意不计算
j
j
j=
y
i
y_i
yi,具体例子如下:
最后得到的损失为平均值:
提出几个问题来巩固一下这个损失函数的知识:
- 当车辆的分数改变一些会发生什么?
答:当某一类别的分数升高时,在最终结果上只会改变相应的很小一部分。 - 当
j
j
j=
y
i
y_i
yi也被记入损失时,结果会如何?
答:结果只会增加偏置参数的值(最后平均后),一般在写程序时会直接将这一项取0,为不影响损失函数判断。 - 在每次结果使用平均代替相加会有什么变化?
答:最后的损失函数表示的是此分类器的W权重设置优劣,当选择平均时,虽然最后的损失值变小了,但是这也只是在原来的结果上加了一个类别个数的倒数的系数(此例为1/3),并不会对最终的结果产生影响,我们最后想要得到的其实是使W/loss最小化。 - 当我们使用平方时有什么影响?即:
L
i
=
∑
j
≠
y
i
max
(
0
,
s
j
−
s
y
i
+
1
)
2
L_i = \sum_{{j} \ne {y_i}}\max(0,s_j - s_{y_i} + 1)^2
Li=∑j̸=yimax(0,sj−syi+1)2(公式内为
j
j
j不等于
y
i
yi
yi)
答:说到这里必须提一下SVM损失: m a x ( 0 , − ) max(0,-) max(0,−)函数,它常被称为折叶损失(hinge loss)。 有时候会听到人们使用平方折叶SVM损失(即L2-SVM),它使用的是 m a x ( 0 , − ) 2 max(0,-)^2 max(0,−)2,将更强烈(平方地而不是线性地)地惩罚过界的边界值。不使用平方是更标准的版本,但是在某些数据集中,平方折叶损失会工作得更好。可以通过交叉验证来决定到底使用哪个。 - 当在初始化权重矩阵时,w的数值都是很小的所得到的分数也是很小,约等于0,这样得到的损失是多少?
答:是分类数减去1,因为除了正确分类本身,其他每一次max的结果都为1。
#代码实现方法
def L_i_vectorized(x, y, W):
delta = 1.0
scores = W.dot(x)
margins = np.maximum(0, scores - scores[y] + delta)
margins[y] = 0 #将j = yi的损失设为0
loss_i = np.sum(margins)
return loss_i
正则化
当我发现一个权重矩阵,使得损失降为0,这个权重矩阵是唯一的吗?答案是并不是唯一的,因为可以从SVM损失函数中看出,当分类正确的数值大于其他数值时,损失为0,可是当
W
W
W取
λ
W
(
λ
>
1
)
λW(λ > 1)
λW(λ>1)时,会使各个分数都乘以
λ
λ
λ,这样最终结果损失都为0,可是这样的
λ
W
λW
λW会使其他分类错误的的损失也相应的扩大了
λ
λ
λ倍:
这显然不是我们想要的,因为不同的
W
W
W会使其他分类错误的误差成比例增大,那么我们可不可以对
W
W
W也加一些偏好来消除其他分类所带来的模糊性?这个方法就是向损失函数添加一个正则化惩罚
R
(
w
)
R(w)
R(w),正则化惩罚有很多种方式,常见的有
L
1
L1
L1正则化、
L
2
L2
L2正则化、Dropout、BatchNomalization等等:
这样我们的损失函数就由两部分组成:数据损失(data loss),即所有样例的的平均损失
L
i
L_i
Li,以及正则化损失(regularization loss)。完整公式如下所示:
也可以将其展开:
正则化是为了权衡训练损失和用于测试集的泛化损失,最常用的正则化惩罚是
L
2
L2
L2范式,
L
2
L2
L2范式通过对所有参数进行逐元素的平方加和惩罚来抑制大数值的权重,举个例子,假设输入向量
x
=
[
1
,
1
,
1
,
1
]
x=[1,1,1,1]
x=[1,1,1,1],两个权重向量
w
1
=
[
1
,
0
,
0
,
0
]
w_1=[1,0,0,0]
w1=[1,0,0,0],
w
2
=
[
0.25
,
0.25
,
0.25
,
0.25
]
w_2=[0.25,0.25,0.25,0.25]
w2=[0.25,0.25,0.25,0.25]。那么
w
1
T
x
=
w
2
T
=
1
w^T_1x=w^T_2=1
w1Tx=w2T=1,两个权重向量都得到同样的内积,但是
w
1
w_1
w1的
L
2
L2
L2惩罚是
1.0
1.0
1.0,而
w
2
w_2
w2的
L
2
L2
L2惩罚是
0.25
0.25
0.25。因此,根据
L
2
L2
L2惩罚来看,
w
2
w_2
w2更好,因为它的正则化损失更小。从直观上来看,这是因为
w
2
w_2
w2的权重值更小且更分散。既然
L
2
L2
L2惩罚倾向于更小更分散的权重向量,这就会鼓励分类器最终将所有维度上的特征都用起来,而不是强烈依赖其中少数几个维度,这样可以防止过拟合。
Softmax分类器
Softmax分类器又被称为二元逻辑回归分类器(Multinomial Logistic Regression),与SVM分类器相比,Softmax的输出(归一化的分类概率)更加直观,并且从概率上可以解释,在Softmax分类器中,函数映射
f
(
x
i
;
W
)
=
W
x
i
f(x_i;W)=Wx_i
f(xi;W)=Wxi保持不变,但将这些评分值视为每个分类的未归一化的对数概率,并且将折叶损失(hinge loss)替换为交叉熵损失(cross-entropy loss)。公式如下:
这里举一个例子便于理解:
上图中因为猫与车的概率在归一化后分别为0.13与0.87,所以可以看出它在猫这个类别的表现比较差,所以损失为
−
l
o
g
(
0.13
)
=
2.04
-log(0.13)=2.04
−log(0.13)=2.04(一般log为以e为底,在原ppt中出现了两种情况,另一种以10为底,没太搞懂)。
提出几个问题来巩固一下这个损失函数的知识:
- 损失函数的最大值与最小值为多少?
答:最小值为0,最大值为无穷大。 - 在初始化时所有权重参数都很小,使得分数约等于0,最后得到的损失是多少?
答:既然所得分数约为为0,那么他们的exp都为1,这样的到的正确分类的概率为1/分类 数,那么这个值的-log就是log(分类数)。
SVM与Softmax比较
两者在之前的权重参数计算得到的结果是相同的,只在最后评估时不同,看下一个例子:
可以看出来SVM只对分类正确项关注,而当其他分类分数上下浮动时,只要不超过浮动边界(结果不大于0),对最后结果无影响,而softmax则不同,它观测的是所有分类标签的可能性,当其他分类浮动时,结果会产生或大或小的影响。
其实正则化项会对Softmax损失结果产生很大的影响,例如:
这里假如
W
W
W并不是最好的权重,而经过正则化之后变为
1
2
W
\frac{1}{2}W
21W,那么结果看起来就更加分散了:
以下是整体损失示意图:
损失函数网页模型展示:http://vision.stanford.edu/teaching/cs231n-demos/linear-classify/
最优化
对于图像数据 x i x_i xi,如果基于参数集权重参数 W W W做出的分类预测与真实情况比较一致,那么计算出来的损失值 L L L 就很低。最优化是寻找能使得损失函数值最小化的权重参数 W W W的过程。
随机搜索
随机搜索其实就是随机尝试很多不同的权重,然后看其中哪个最好。这真的就是一个完全随机的过程,训练集中找到最好的权重W,在测试集中可能会比完全随机分类好上一些hhh。很好的比喻就是将权重看成一个盆地,你要做的就是蒙着眼睛瞎闪现(因为是随机权重),以求能闪到盆地的最低点,每闪一下你的损失就相当于该点的海拔。
跟随梯度
如果说我们找到了一个很好的权重,为什么不在这个权重上进行更新,这样不是比随机搜索更加有效吗?说干就干!针对损失在这一步长上所产生的导数,即为优化的方向,针对每一个权重因子w,每一次都随机增加或减少一小步,这样能算出因为这一小步损失值的变化,以得到梯度(数值梯度法):
但是这样做的缺点是太耗时,每一次更新都要算出损失,当参数太多时会很笨重;这时,微分就能很好的帮助我们,在实际操作时常常将分析梯度法的结果和数值梯度法的结果作比较,以此来检查其实现的正确性,这个步骤叫做梯度检查。
用SVM的损失函数在某个数据点上的计算来举例:
L
i
=
∑
j
̸
=
y
i
[
m
a
x
(
0
,
w
j
T
x
i
−
w
y
i
T
x
i
+
Δ
)
]
L_i=\displaystyle\sum_{j\not =y_i}[max(0,w^T_jx_i-w^T_{y_i}x_i+\Delta)]
Li=j̸=yi∑[max(0,wjTxi−wyiTxi+Δ)]可以对函数进行微分。比如,对
w
y
i
w_{y_i}
wyi进行微分得到:
∇
w
y
i
L
i
=
−
(
∑
j
̸
=
y
i
L
(
w
j
T
x
i
−
w
y
i
T
x
i
+
Δ
>
0
)
)
x
i
\displaystyle\nabla_{w_{y_i}}L_i=-(\sum_{j\not=y_i}L(w^T_jx_i-w^T_{y_i}x_i+\Delta>0))x_i
∇wyiLi=−(j̸=yi∑L(wjTxi−wyiTxi+Δ>0))xi
上式中
L
(
w
j
T
x
i
−
w
y
i
T
x
i
+
Δ
>
0
)
L(w^T_jx_i-w^T_{y_i}x_i+\Delta>0)
L(wjTxi−wyiTxi+Δ>0)表示当内部条件为真时返回1,否则返回0。
梯度下降
了解了上述所示的数值梯度法和微分梯度法之后就可以进行梯度下降操作了,梯度下降有两个重要的参数,一个是步长(学习速率),即每一次梯度下降所走的长度,另一个是正则化参数,二者平衡之后就是完整的梯度下降算法:
以下为梯度下降演示视频:https://docs.google.com/file/d/0Byvt-AfX75o1ZWxMRkxrUFJ2ZUE/preview
小批量数据梯度下降法
在梯度下降时,训练数据可以达到百万级量级。如果像这样计算整个训练集,来获得仅仅一个参数的更新就太浪费了。小批量数据梯度下降(Mini-batch gradient descent):一个常用的方法是计算训练集中的小批量数据。就是深度学习中一个常说的参数:Batch,将所有数据分为很多个batch的集合,在一次梯度下降时,只针对一个batch,batch大小的选择基于你的CPU(GPU)的能力,这个小批量数据就用来实现一个参数更新:这个方法之所以效果不错,是因为训练集中的数据都是相关的。要理解这一点,可以想象一个极端情况:在ILSVRC中的120万个图像是1000张不同图片的复制(每个类别1张图片,每张图片有1200张复制)。那么显然计算这1200张复制图像的梯度就应该是一样的。对比120万张图片的数据损失的均值与只计算1000张的子集的数据损失均值时,结果应该是一样的。实际情况中,数据集肯定不会包含重复图像,那么小批量数据的梯度就是对整个数据集梯度的一个近似。因此,在实践中通过计算小批量数据的梯度可以实现更快速地收敛,并以此来进行更频繁的参数更新。
随机梯度下降法
小批量数据策略有个极端情况,那就是每个批量中只有1个数据样本,这种策略被称为随机梯度下降(Stochastic Gradient Descent 简称SGD),有时候也被称为在线梯度下降。这种策略在实际情况中相对少见,因为向量化操作的代码一次计算100个数据 比100次计算1个数据要高效很多。即使SGD在技术上是指每次使用1个数据来计算梯度,你还是会听到人们使用SGD来指代小批量数据梯度下降(或者用MGD来指代小批量数据梯度下降,而BGD来指代则相对少见)。小批量数据的大小是一个超参数,但是一般并不需要通过交叉验证来调参。它一般由存储器的限制来决定的,或者干脆设置为同样大小,比如32,64,128等。之所以使用2的指数,是因为在实际中许多向量化操作实现的时候,如果输入数据量是2的倍数,那么运算更快。
需要注意的是,目前在做项目的时候,一般意义上SGD是指代着mini-batch gradient descent的。
图像特征
之前的图像分类大多数都是人为挑选重要的特征或者有利的特征放入SVM分类中进行训练,例如比较常见的颜色特征,边缘梯度特征:
而之后的深度学习中,并不需要人为挑选特征,而是让机器去从像素开始训练,这样的特征提取更加高效,从而完成整个训练过程:
小结
损失函数作为衡量权重参数的效果函数,需要根据情况来选择,本节主要讨论了两个损失函数:
- 多分类SVM损失:
- Softmax分类器:
两者的比较可以看出Softmax更加关注全局分数。
最优化操作是为了寻找最优权重使损失函数最小化的过程,从随机搜索到随机梯度下降,再到后来的Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam越来越多的梯度下降算法应运而生,以后有机会要好好讨论一下这些梯度下降的优缺点(目前别人总结的都很全面了hh)
资料来源:
- 斯坦福CS231n李飞飞计算机视觉视频课程:https://study.163.com/course/courseMain.htm?courseId=1003223001
- CS231n官方笔记授权翻译总集篇:https://zhuanlan.zhihu.com/p/21930884
- CS231n官方PPT:http://vision.stanford.edu/teaching/cs231n/syllabus.html