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正则化则倾向于将更多的权重清零,只保留几个大权重,他们对于模型的“复杂度”的定义是不一样的。

时间: 2024-10-29 19:55:57

CS231n 2017 学习笔记03——损失函数与参数优化 Loss Functions and Optimization的相关文章

CS231n 2017 学习笔记04——反向传播与神经网络 Backpropagation and Neural Networks

本博客内容来自 Stanford University CS231N 2017 Lecture 4 - Backpropagation and Neural Networks 课程官网:http://cs231n.stanford.edu/syllabus.html 从课程官网可以查询到更详细的信息,查看视频需要FQ上YouTube,如果不能FQ或觉得比较麻烦,也可以从我给出的百度云链接中下载. 课程视频&讲义下载:http://pan.baidu.com/s/1gfu51KJ 计算图 Comp

python学习笔记(03):函数

默认参数值:   只有在行参表末尾的哪些参数可以有默认参数值,即 def func(a, b=5 )#有效的 def func( a=5,b )#无效的 关键参数: #!/usr/bin/python # Filename: func_key.py def func(a, b=5, c=10): print 'a is', a, 'and b is', b, 'and c is', c func(3, 7) func(25, c=24) func(c=50, a=100) #输出: $ pyth

Android自定义View学习笔记03

Android自定义View学习笔记03 预备知识 BitMap类 BitMap位图类,其中有一个嵌套类叫Bitmap.Config,内部有四个枚举值.这个类的作用是定义位图存储质量,即存储一个像素的位数,以及是否能显示透明.半透明颜色(Possible bitmap configurations. A bitmap configuration describes how pixels are stored. This affects the quality (color depth) as w

HTTP 学习笔记03

通用信息头 Cache-Control : no-cache(不缓存当前请求) [*] Connection:close(返回当前请求后立即断开)[*] Date:...(HTTP消息产生的时间) Pragma:no-cache (不缓存) [*] Trailer:Date(哪些能放到实体内容后的头字段) Transfer-Encoding:chunked (指定传输编码方式)[*] Upgrade:HTTP/2.0,SHTTP/1.3 (支持的版本) Via:HTTP/1.1 Proxy1,H

C++ GUI Qt4学习笔记03

C++ GUI Qt4学习笔记03 qtc++spreadsheet文档工具resources 本章介绍创建Spreadsheet应用程序的主窗口 1.子类化QMainWindow 通过子类化QMainWindow可以创建一个窗口 图形用户界面(GUI)应用程序通常会使用很多的图片,最常见的为应用程序提供图片的方法是使用Qt的资源机制(resource mechanism) 使用Qt资源系统,必须创建一个资源文件,并且在识别该资源文件的.pro文件中添加一行代码. RESOURCES = spr

mongodb 学习笔记 03 -- 查询表达式

mongodb 学习笔记 03 – 查询表达式 不等于,大于,小于 !=: db.stu.find({name:{$ne:'billvsme'}}) 名字不是'billvsme' > : db.stu.find({age:{$gt:18}}) 年纪大于18 < : db.stu.find({age:{$lt:18}}) 年纪小于18 >=: $gte <=: $lte in/not in/all $in :db.goods.find(stu_id:{$in:[93001,93002

SWIFT学习笔记03

1.断言 let age = -3 assert(age >= 0, "A person's age cannot be less than zero") // 因为 age < 0,所以断言会触发 2.Swift赋值符(=)不返回值,以防止把想要判断相等运算符(==)的地方写成赋值符导致的错误.数值运算符(+,-,*,/,%等)会检测并不允许值溢出. 3.在对负数b求余时,b的符号会被忽略.这意味着 a % b 和 a % -b的结果是相同的,但-a是不一样的. 4.不同

HTML学习笔记03

HTML学习笔记03 一.HTML标题 HTML标题通过<h1>-<h6>等标签进行定义的,<h1>定义最大的标题,<h6>定义最小的标题. 二.HTML水平线 HTML水平线可以用<hr>标签. 三.HTML注释 HTML注释采用设置<!--注释-->进行注释. 四.HTML段落 HTML段落采用<p>标签,还可以使用<br>标签进行换行. 五.文本格式化 <b>定义粗体文本,<big>

【OpenGL 学习笔记03】点画多边形

1.点画多边形 //定义填充多边形的点画模式.mask为32 x 32 的位图指针,1画0不画,使用前必须启用多边形点画功能 void glPloygonStipple(const GLubyte* mask); //绘制一个矩形 void glRectf(GLfloat x1,GLfloat y1,GLfloat x2,GLfloat y2); 2.示例 #include <GL/glut.h> #include <stdlib.h> void display(void) { G