2017CS231n笔记_S3损失函数和优化

目录

S3.1损失函数

S3.2优化


S3.1损失函数

背景

假设有3张图像的训练集,S2.3中使用某个W来进行对图像进行预测,得到了这三张图像分别在10个分类上的得分。得分即是模型的预测值或者输出值。

损失函数(loss function)

损失函数用于度量模型权重W的好坏。损失函数将W作为输入,然后得到一个损失值,定量的估计W的好坏。依据损失函数,就可以评估W是好是坏。使用L_{i}(\hat{y},y)表示样本的损失函数,其中\hat{y}以及s是模型的输出,设\hat{y}=s=f(x_{i},W)y是样本的标签。则整个数据集的损失L是:

L=\frac{1}{N}\sum_{i}^{N}L_{i}(f(x_{i},W),y_{i})

其中N是样本集的个数。假如W使得L为0,那么2W,3W同样使得L为0。由于使得L为0的W不唯一,那么就需要一个准则来确定选择哪个W。为了防止模型过度拟合训练数据从而导致测试集表现不好,在L上加入正则项R(W)。这促使模型以某种方式选择更简单的W。这里的简单取决于任务的规模和模型的种类。同时也体现了奥卡姆剃刀原则。因此,整个数据集的损失L为:

L=\frac{1}{N}\sum_{i}^{N}L_{i}(f(x_{i},W),y_{i})+\lambda R(W)

其中\lambda是平衡数据方面损失和正则项的超参数。这个参数是需要在实际中进行调整的。归一化函数在后面会详细讲解。

对于图像分类任务来说,有多个不同的损失函数L_{i}(\hat{y},y)。这里给出两种损失函数。一种是多分类SVM损失函数,另一种是Softmax损失函数。

1.hinge loss(多分类SVM损失函数)

多分类SVM是处理多分类的SVM。使用C表示类别个数。对于一幅图像,使用c表示该图像真实的类,s_{j}表示该图像在其他类的得分,s_{c}表示该图像在真实的类的得分。则损失函数L_{i}为:

L_{i}=\sum_{j\neq c}^{C}\left\{\begin{matrix} 0 & if s_{c}>s_{j}+1\\ s_{j} -s_{c}+1& otherwise \end{matrix}\right.=\sum_{j\neq c}^{C}max(0,s_{j} -s_{c}+1)

函数中的1是截断值(阈值)。阈值的选择并不是很重要。当某个得分有一点点改变时,由于阈值的存在,损失函数的值不会改变。该损失函数是在所有错误的分类上做和,将正确分类的分数和错误分类的分数进行比较 。如果在所有类别上,正确分类的分数比错误分类的分数高出某个安全的边距(1),则损失为0。损失函数的最小值为0,最大值为无穷大。该损失关心这个分数的相对差值。希望正确类别的输出值远大于不正确类别的输出值。考虑以下情况:

  • 假设最开始使用很小的值来初始化W,并且开始训练,这样的话,训练初期,模型的得分是较小的符合平均分布的值。当所有的得分接近为0时,损失函数的值为C-1。
  • 如果将损失函数由求和变为求平均的话,损失函数的值不变。
  • 如果在max上加个平方,那么损失函数的值会变。损失函数量化不同的错误有多坏。加平方,是指同样的错误会更加的不好。是否加平方,需要看当时的应用。

2.cross-entropy loss(Softmax)

在实际中,更常用的是交叉熵损失。先使用多项逻辑斯蒂回归(multinomial logistic regression)或者Softmax(概率分布函数)来对得分进行转换。在SVM中,类别的得分是没有意义的。而在Softmax中,为这些得分添加了一些其他的含义。Softmax将所有的输出得分转化为0-1之间的概率值,所有的概率值之和为1。该函数的形式为:

P(Y=k|X=x_{i})=\frac{e^{s_{k}}}{\sum_{j}^{C}e^{s_{j}}}

损失函数L_{i}有很多,比如计算KL散度或者最大似然,这里使用如下形式:

L_{i}=-logP(Y=y_{i}|X=x_{i})=-log(\frac{e^{s_{k}}}{\sum_{j}^{C}e^{s_{j}}})

该损失函数希望正确类别对应的概率值应该较高并且接近于1。

归一化方法

归一化是为了减轻模型的复杂度,而不是去试图拟合数据。常见的归一化项R(W)有:

L2归一化和L1归一化的区别在于:L2希望W矩阵更均匀。L1则希望W矩阵更加稀疏。它们对于模型的复杂度有不同的度量方式。


S3.2优化

优化定义

用一种有效的方式,来从W的可行域中,找到最优的W,使得模型的效果最好,使得L最小。在大型深度学习网络以及线性分类器中常使用梯度下降方法。在深度学习中,计算函数的梯度,然后用这些梯度迭代更新参数W。

斜率以及梯度

  • 当样本x是一维的标量,斜率是损失函数的导数。
  • 当样本x是多维向量时,每一维的偏导所组成的向量,称为梯度。梯度和x具有相同的形状。梯度中的每个元素都为损失函数在相关方向上的斜率。梯度指向损失函数函数增加最快的方向,相应的,负梯度方向就指向损失函数降低最快的方向。

梯度的计算方法

  • 有限差分法(数值梯度)。该方法是最简单,但速度很慢。因为深度网络中损失函数的计算十分复杂,且模型输入很多,参数也很多。
  • 解析梯度法。给定损失函数,使用微积分方法,求出梯度的表达式。好处是:非常准确;只需计算梯度的表达式,所以很快。

注意:在实际中使用解析梯度。但数值梯度是一个很简单的调试工具,用于判断梯度的表达式是否准确。当使用数值梯度进行检查时,计算十分缓慢,并且不准确。同时减少问题的参数数量,使得能够在合理的时间内运行。

优化方法

a.梯度下降方法

该方法步骤为:初始化W为随机值;计算损失值和梯度值;向梯度相反的方向更新权重值。不停地计算梯度和更新参数直到网络收敛(相关代码如下所示,代码来自CS231n视频)。步长(step_size,也叫学习率)是计算新权重的一个超参数。该参数表示每次更新权重时,在那个方向前进多少距离。学习率是在训练中首先要调整的参数,随后是模型的大小,正则化参数。找到合适的步长,是首先要做的事情。该方法的一些改进有:带动量的梯度下降,Adam优化器。

while True:
  weights_grad = evaluate_gradient(loss_fun, data, weights)
  weights += -step_size * weights_grad 

当训练样本格式N很大时,损失函数的计算会十分耗时。因为梯度是线性运算符,因此误差函数的梯度值是每个单项梯度误差梯度值的总和,如下图所示。这样的话,在计算梯度时,也十分耗时。所以在实际中,使用随机梯度下降方法。

b.随机梯度下降法

随机梯度下降方法(Stochastic Gradient Descent,SGD)步骤如代码所示。首先从全部训练集中采样,形成小批量样本minibatch,一般minibatch的样本个数为2的幂次方,如32/64/128。使用minibatch计算损失以及梯度。这个损失是全部损失的一个估计值。

while True:
  data_batch = sample_training_data(data, 256)  #sample 256 examples
  weights_grad = evaluate_gradient(loss_fun, data_batch, weights)
  weights += -step_size * weights_grad  #perform parameter update

 图像特征

在深度神经网络之前,一般使用两步走的策略来进行图像分类。该策略就是首先从图像中进行特征提取或者广义的特征映射。这样做的原因是使得在特征空间,样本更容易被区分开。再将特征输入到线性分类器或者SVM中进行分类。常见的特征有颜色直方图,HOG(方向梯度直方图),词袋(Bag of Words)。颜色直方图在全局上看出图像中存在哪些颜色。HOG可以看出图像中有哪些不同类型的边缘,是一个经常用于目标识别的特征表示。词袋是从自然语言处理获得的灵感。词袋的关键在于定义视觉单词词典。首先从图片中进行小的随机块采样,形成图像块集合,然后用K-means等聚类方法将它们聚合成簇,从而得到不同的簇类中心,即为视觉单词词典。两步走的策略是先学习特征,在训练时更新分类器。而对于深度卷积神经网络来说,并不先学习特征,而是在训练时直接从数据中学习特征。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值