• CS231n 2017 学习笔记03——损失函数与参数优化 Loss Functions and Optimization


    本博客内容来自 Stanford University CS231N 2017 Lecture 3 - Loss Functions and Optimization

    课程官网:http://cs231n.stanford.edu/syllabus.html

    从课程官网可以查询到更详细的信息,查看视频需要FQ上YouTube,如果不能FQ或觉得比较麻烦,也可以从我给出的百度云链接中下载。

    课程视频&讲义下载:http://pan.baidu.com/s/1gfu51KJ


    损失函数 Loss Function

    损失函数就是用来衡量一组参数W的好坏程度的,通常损失函数的最低值为0,没有最高值,可以无穷大。

    在计算的时候,一般会遵循这样的公式

    在这里 Li 是在某一个样本 xi 的损失,N 是样本总数,也就是说总损失是每个样本损失的平均值,而根据对 Li 不同的定义就有了不同的损失函数。


    Hinge Loss

    首先解释一下 s 的含义,s 是 score 的首字母,也就是上一讲中,线性模型给某一个样本的分数,事实上s不是一个数字,而是一组数字,因为每个类别都有一个分数。而 sj 就代表对第 j 个类别的分数,这个分数越高就代表样本 xi 越可能属于这个类别。yi 则代表了正确的类别编号,比方说我们有10个类别,在实际计算的时候,我们会给每个类别一个编号,也就对应了 1-10 或者 0-9。yi 就是这其中的一个数字。

    从直观上理解,Hinge Loss 样本 xi 得分 s 的每一个错误类别的分量,如果正确类别的得分比错误类别的得分高出一定的安全距离(这里就是公式中的1),那么就认为在这个得分的小分量中,损失函数为0,而如果没有达到这个条件,还差多少损失就是多少。

    特别要注意的是,1这个安全距离其实是无所谓的,可以定义为任意数值。因为我们事实上只关心样本有没有被正确的分类,而这些得分的绝对大小其实并没有太大意义,我们更关心的是他们之间的相对大小。也就是说,如果把权重W的数值整体放大为原来的两倍,那么得分s也会随之变为原来的两倍,但他们之间的相对大小关系是没有改变的,这个时候就相当于把安全距离从1变成了2。因此,不同的安全距离事实上只能产生一个放缩的作用,最后得出的分类器在本质上是一样的.

    在实际计算的时候,最开始我们会给权重w初始化为一组随机数字,在这个时候得出的所有分数大小都是相近的, 这种情况下根据损失函数的定义,损失函数应该接近 C - 1(C是类别的数量)。这是一个很好的debug技巧,如果最开始的损失函数数值与之相差太远的话,很可能存在bug。


    交叉熵损失 Cross-Entropy Loss

    交叉熵损失首先把得分s变成一个概率分布,即所有分量都在0到1之间,并且所有分量的和为1。

    然后根据得到的概率分布计算Li

    从直观上理解,交叉熵损失是把我们转化而来的概率分布与最理想的概率分布进行对比,衡量了二者之间的差距。最理想的概率分布就是正确的类别概率为1,其他所有类别的概率都是0。

    在实际计算的时候,最开始我们会给权重w初始化为一组随机数字,在这个时候得出的所有分数大小都是相近的, 这种情况下根据损失函数的定义,损失函数应该接近 logC(C是类别的数量)。这是一个很好的debug技巧,如果最开始的损失函数数值与之相差太远的话,很可能存在bug。


    Hinge Loss VS Cross-Entropy Loss

    Hinge Loss 在正确类别的得分比错误类别得分高1之后就不进行优化了,因为此时的损失函数不会再减小了。

    与之相对的是Cross-Entropy Loss,根据定义,想要得到理想的概率分布,势必要让正确类别的得分趋近于正无穷,错误类别的得分趋近于负无穷,所以模型会不断的优化参数,试图去迫近这个最理想的概率分布。


    正则化 Regularization

    考虑如上几个数据点,根据损失函数的定义,我们很可能会最终拟合出这样一条非常曲折的线,而事实上这样是不好的。

    比方说我们有几个这样的测试点,这条曲线就会拟合的很差,这叫过拟合问题,即过度拟合于训练数据,而丧失了一般性。

    而事实上,可能这样的一条直线能够好的拟合所有的数据,为此我们要为我们的损失函数增加一项“正则化损失”,它是用来衡量模型的复杂程度的,强迫模型趋于更加简单。

    公式左侧的是已经讲过的,我们称之为数据损失,而右侧的是新加入的,称为正则化损失。

    λ 是一个超参数,用来确定数据损失和正则化损失之间的相对权重,如果λ比较大,则说明我们更看重正则化损失,如果比较小,就说明更看重数据损失。λ 过大了会造成欠拟合问题,过小会造成过拟合问题。

    而R(W)就是关于正则化损失具体的定义了,常用的有L1正则化和L2正则化。

    可以看出,L1正则化就是系数矩阵所有分量的绝对值之和,而L2正则化则是所有分量平方和。

    他们之间还是有微妙的区别的。

    L1正则化对于所有的损失是线性的,也就是说,10个数据点,每个点误差1个单位 和是完全等价的。

    L2正则化由于平方的原因,对那些偏差特别大的点具有很大的惩罚,1个数据点,误差10单位的惩罚远远大于10个数据点,每个点误差1个单位。

    正是由于这个原因,L2正则化倾向于把权重均匀分布在每一个分量上,而L1正则化则倾向于将更多的权重清零,只保留几个大权重,他们对于模型的“复杂度”的定义是不一样的。


    参数优化 —— 梯度下降算法 Gradient Descent

    采用梯度下降算法进行参数优化,沿梯度的反方向不断迭代更新参数w。

    Numerical gradient —— 利用梯度的定义计算定义依次计算每一项梯度

    这样做的好处是,计算的过程非常直观。缺点是计算的结果只是近似值,并且速度很慢。

    Analytic gradient —— 利用微积分求偏导,写出每一项梯度的公式

    好处是计算的结果更准确,运算速度更快。缺点是求导的过程中很容易出错。

    所以在实际中,经常同时用上述两种方式计算梯度,用 Numerical gradient 来检查 Analytic gradient 是否正确,在肯定了Analytic gradient 的正确性之后,注释掉 Numerical gradient。


    随机梯度下降算法 Stochastic Gradient Descent (SGD)

    因为按照最标准的定义,计算损失函数需要遍历所有数据点。在数据量很大的情况下,这样做花费的时间过长,所以有了随机梯度下降算法,这个算法就是每次抽取一小部分数据点,在这一小部分上计算梯度、更新参数w。这样会大大加快迭代的速度。

  • 相关阅读:
    模块移植-加宏选择性编译
    模块-各个模块的路径所在
    ubuntu-系统卡慢解决(转载)
    meld文件的脚本
    artTemplate模板引擎
    前端完全分离和前端不完全分离
    px em rem的区别
    原型和原型链
    阻止默认事件
    document.ready和onload的区别
  • 原文地址:https://www.cnblogs.com/irran/p/cs231n_learningnotes_03.html
Copyright © 2020-2023  润新知