前言:上一篇Blog似乎有点冗长,而且大部分知识可以参考c231n课程笔记,所以这篇就主要记录一下主要内容以及自己的一些疑问。
损失函数
上一章的末尾提到了线性分类器,主要介绍了它的原理,它在做什么。。其中说到这种方法应当包含两个部分即评分函数和损失函数。。评分函数上一篇提过了,这里说损失函数
如上图内容所说,损失函数量化一个图片分类与真实标签的差距。。而我们希望尽量降低这个差距,这就可以看作是一个最优化的过程。。。这是这章的两个主要部分,先介绍常用的几种损失函数:
1.多类支持向量机损失Multiclass SVM loss
它的图形很像一个铰链,所以通常称为铰链损失函数,或者折叶损失。
实际上 它将一张图片每个错误分类得分减去正确分类的分数再+1(这里1说是一个冗余的安全度?关于这个数值的设置不是很理解)与0做比较取最大值作为这个图片的损失函数,再将数据集中所有的损失函数相加得到整个数据集的损失函数。
铰链函数存在一个问题,即对于同一个损失函数Li不一定只对应一套权重w,我们就需要做出选择。。。这就引入了正则化的概念,即在损失函数后面添加一个正则化项,它的数值大小可以决定我们选择哪一套权重。
如上,一般有两种正则化,分别是L1和L2。。后面还有更复杂的正则化函数,这里没有详细解释。(那么如何该怎么选择?)
所以正则化的作用其实就是有效的防止过拟合,它使更偏爱更简单的模型参数,使整个模型大而化之
2.Softmax分类器
Softmax分类器也是常用的分类器,它的损失函数通常称为交叉熵损失函数,其实很像最大似然函数。。
Softmax原理就是将一张图片的每一类的分数转换为概率,因为涉及到负分,所以先要做一个指数运算将分数都变为正数,然后再归一化。而交叉熵实际就是最大似然思想里面求得的所有事件都发生的联合概率,只不过这里取了log,叫做交叉熵(这说法是为了方便自己理解,可能不太正确)。还加了一个负号,因为概率在0到1之间,取log为负数,我们希望得到是正数。
最优化
先回顾之前所说的,我们拿到一个数据集,有了评分函数,也有了衡量标准–损失函数。
现在要做的就是,将损失函数降到最低,找到领损失函数最低的参数W和b。这就是最优化,就像是一个下山的过程:
也就是我们通过训练告诉参数走哪条路下山是最快的。优化策略有很多种:
#1: 随机搜索
这其实是一个非常不好的做法,如上,通过随机生成一个权重去生成它的损失函数,然后在这些随机值中找出表现最好的。这种方法通常准确率很低,但也不失为一种方法
#2: 跟随梯度
其实不需要随机寻找方向,因为可以直接计算出最好的方向,这就是从数学上计算出最陡峭的方向。这个方向就是损失函数的梯度(gradient)。也就是下山最快的方向。
梯度的计算也有两种方法:
1.通过给每个权重一个很小的增量如0.0001,得到损失函数的改变值,然后以正切值近似代替梯度
2.微分分析计算梯度
第一种方法肯定是效率不高的而且不够准确,根据微分公式来计算梯度可以准确又迅速,但有时可能会收到数据影响而出错。
梯度下降
现在可以计算损失函数的梯度了,程序重复地计算梯度然后对参数进行更新,这一过程称为梯度下降(注意这里更新公式有负号,因为梯度的方向实际是增大最快的方向,那么它的反方向就是下降最快的方向,所以要加个负号),stepsize就是步长或者学习率,它决定了下山的过程是走”大跨步“还是”小碎步“
小批量数据梯度下降
在大规模的应用中(比如ILSVRC挑战赛),训练数据可以达到百万级量级。如果像这样计算整个训练集,来获得仅仅一个参数的更新就太浪费了。一个常用的方法是计算训练集中的小批量(batches)数据。例如,在目前最高水平的卷积神经网络中,一个典型的小批量包含256个例子,而整个训练集是多少呢?一百二十万个。这个小批量数据就用来实现一个参数更新:
小批量数据策略有个极端情况,那就是每个批量中只有1个数据样本,这种策略被称为随机梯度下降(Stochastic Gradient Descent 简称SGD),有时候也被称为在线梯度下降。这种策略在实际情况中相对少见,小批量数据的大小是一个超参数,但是一般并不需要通过交叉验证来调参。它一般由存储器的限制来决定的,或者干脆设置为同样大小,比如32,64,128等。之所以使用2的指数,是因为在实际中许多向量化操作实现的时候,如果输入数据量是2的倍数,那么运算更快。
参考:
cs231n 官方课件
cs231n 课程笔记
B站同济子豪兄 cs231n课程精讲