CS231n lecture2 Note

import numpy as np

总结KNN
KNN训练阶段所耗费的时间很短,就只是对于训练数据以及对应的标签进行memorizing
而测试时间端耗费很多时间,需要将当前的测试样例与训练数据集中的每个样本计算L2距离
然后挑选出距离最近的前k个训练样本所对应的标签,标签再进行投票
故而KNN训练时间短,测试时间长,

K折交叉验证  cross validation
对于超参数的每个数值,将第k个部分的数据作为validation dataset,剩下的k-
1份作为training dataset
则对于超参数的每个数值,都会得到k个在validation dataset的accuracy,取平均值则得到在当前超参数
设置下的accuracy,则可以找到最优的超参数设定

线性分类器 linear classification
对于CFAR10的数据集,输入图像shape=
32*32*3=3072,线性分类器的输入就有3072维度的特征
假设分成10个类别,则 f(W,x)输出10个类别的probability,W表示模型的参数
其中的10个分数值是与类别corresponding的概率值
假设W仅有一层全连接层,则W=[
10,32*32*3],x=[32*32*3,1]
f(W,x)=Wx+b   b=[
10,1]  f(W,x)=[10,1]表示当前输入图像属于10个前景类别的概率得分
b为偏置项,假设训练数据集中本身存在类别不平衡,则样本数量较多的某个类别的偏置值会很大

通过进行KNN作业的编写,可以发现,使用vector向量化的操作运算速度会快很多
以一张测试图像x为例,x=[
3072,1],W=[10,3072],则矩阵W的每一行1*3072都可以理解为
对应到某个类别的template vector模板向量,再与x进行向量内积计算两个向量(输入图像与
类别模板图像的特征向量)之间的similarity相似性,得到相似性得分,再加上偏置项,
得到测试图像属于当前类别的概率值得分,如果使用全部向量化的操作,则
f(W,X)=W*X+B
W=[
10,3072]   X=[3072,num_train] B=[10,num_train] f(W,X)=[10,num_train]
输出结果矩阵中的每一列表示当前输入图像属于10个类别的概率值
故而linear classification的问题还可以被看作是模板匹配问题(template matching approach)
也就是说对于每个类别只有一张template image,这对于图像分类问题是极为不利的
因为图像分类问题要求模型具有平移不变性,尺度不变性,旋转不变性等等
linear classifier在数据特征空间画出的decision boundary是线性的
图像分类问题的一个challenge就是类内的variance,希望分类器具有不变性

那么如何训练线性分类器?
1)定义在损失函数 loss function,loss函数的变量是W,定义在当前W值下的loss值
(即由W所预测的结果与ground truth结果之间的差异)
2)optimization:如何优化权值W

数据集中的每个样本,包含两个部分:x特征和y标签,假设数据集中包含N个样本
则每个样本都具有其3072维度的特征x和ground truth label标签类别索引值y
损失函数定义为:在当前训练集下,由当前的模型参数W所计算的到的prediction results
与ground truth label之间的差异,也就是当前的W有多糟糕
loss(W;x,y)=(
1/N)summation( L(f(W,x),y) )
对于分类问题而言,数据集中每个样本所对应的类别标签通常是int数值。
对于线性分类器,使得classification loss函数值最小(loss函数最小值通常为0)的权值系数(coefficients)通常不是唯一的,因为如果W可以使loss最小,则2*W也可以。



1.loss function in image classification
损失函数是用来衡量模型参数有多么badness
1)multi class SVM loss
对于训练数据集合中的每个样本都要计算多个类别的SVM损失值,再在N个训练样本上求loss的平均值。对于单个训练样本计算SVM loss的公式如下:首先获得当前训练样本属于10个前景类别的分数值(linear classifier的output),然后对于所有不是当前样本ground truth label的其他9个类别,如果 模型对于正确类别所预测的分数值(s(i))-模型对于错误类别所预测的分数值(s(j)) > 11刚好就是SVM分类器的safe distance,则当前错误类别的loss为0,否则当前错误类别的loss=s(j)-s(i)+1。这样对于每个训练样本,将会得到9个loss,对这9个loss值求和(summarize all incorrect categories),得到当前训练样本的loss,然后再整个训练数据集上求loss的平均值(take the average of whole training dataset)。对于每个incorrect category s(j)而言,在横坐标上给出s(j)的数值(即网络模型对于错误类别j的prediction score),如果s(i)的值大于s(j)+1,表现在坐标轴上是在s(j)右边的1以外的区间范围上,则hinge loss=0,否则hinge loss=s(j)-s(i)+1,可以看出hinge loss>=0恒成立。
使用multi
class SVM loss时,进行debugging的方法:在iteration=0时,线性回归器对于C个类别的预测score都差不多(差值不会大于1),则多个类别的SVM loss=C-1(只对incorrect categories计算损失)



2)regularization term in classification loss
训练数据集的任务是给模型提供训练数据和对应标签,让模型从中学习到更多知识,而不是让模型拟合训练数据,如果模型在training dataset上面的loss值为0,那么这个模型参数W好吗?当然不好,机器学习训练出来的模型都希望能在测试数据集上具有好的表现,而不是在训练数据集上无限地拟合训练数据,故而并不care在training dataset上面的performance。反而如果让模型参数一味地拟合训练数据,则很可能模型就会过拟合训练数据从而丧失泛化性能,则在测试数据集上面的表现就会很差。机器学习中通常用来解决over fitting过拟合的工具有:batch normalization,dropout,regularization(L1 norm和L2 norm)。奥卡姆剃刀原则:如果由多个模型或者方法都能达到相同的performance,则应该选择简单的模型。
通常使用的是L2normalization。L1是权值系数项,倾向于让权值矩阵中的数值都为0.L2是权值衰减项,倾向于让权值矩阵中的值模长都很小(但不为0)
https://blog.csdn.net/zouxy09/article/details/
24971995
过拟合:high variance,low bias,欠拟合:high bias,low variance。



3)softmax loss
将 f(W*x+b) 预测输出的分数转换成概率形式,即根据分数高低,将模型对于当前输入图像所预测的10个类别的score经过softmax层,softmax层的输出是根据分数预测的该地转换成对应的概率值形式,当前输入图像属于每个类别的概率值之和为1.然后让softmax层输出的概率分布无限接近于当前输入图像真实的概率值分布(one hot 形式)
softmax loss只针对于ground truth label标签类别进行计算,希望模型对于正确类别的概率预测值接近于1,则softmax loss为0。也就是说对于individual training sample,其softmax loss中只包含对于ground truth label那一项计算的。





对softmax loss进行debugging的方法:当iteration=1时,网络模型对于所有的前景概率值都是随机猜测的,故而经过softmax层的输出概率值都为1/C,则softmax loss=-log(1/C)

2.optimization
优化过程就是通过梯度下降法找到损失函数的极小值点,梯度是多元函数值上升最快的方向,则负的梯度方向就是函数值下降最快的方向。
计算损失函数相对于网络模型中某个权值w的梯度有如下两种方法:
1)numerical gradient:已知当前模型参数下的损失函数值loss_old,将权值w增加delta_w,比如从0.78增加到0.78+0.0001,然后在使用相同的输入数据集(使用什么数据集取决于上一次训练使用什么样的数据集),通过网络的前向传播后,得到新的损失函数值loss_new,则loss相对于w的梯度值为(loss_new-loss_old)/0.0001
2)analytic gradient:使用数学公式计算梯度。根据loss函数的计算公式,用loss对W进行求导,得到梯度值。
在编写代码时,通常可以用numerical gradient的计算结果来检验analytic gradient计算出来的梯度值是否正确,这个过程称之为梯度校验(gradient check),这也是进行code debugging的技巧。
梯度更新的过程中会引入超参数:step size或者称为learning rate,即每个iterations在negative gradient的方向上走多远。



到目前为止,无论是KNN还是linear classifier,使用的都是输入图像最原始的灰度值特征进行分类,但是原始的灰度值特征并不能很好地分类,深度学习中的通常做法是:先使用卷积神经网络对于输入图像提取卷积特征,得到卷积特征图之后,将输入图像所对应的卷积特征图送入分类器中进行分类。在深度学习中经典的分类网络都是前面的convolutional layers提取从convolutional feature,然后再接上fully connected layers进行分类。也就是说,全连接层作为分类器,再加上softmax function和cross entropy。


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值