[基础]斯坦福cs231n课程视频笔记(一) 图片分类之使用线性分类器
线性分类器的基本模型: f = Wx
Loss Function and Optimization
1. LossFunction
衡量在当前的模型(参数矩阵W)的效果好坏
Multiclass SVM Loss:
-
Hinge Loss
样本 \(i\) 的损失:\(L_i = \sum_{j \neq y_i} \max(0, s_j-s_{y_i}+1)\), \(y_i\) 是样本 \(i\) 的正确标签. 损失取值范围是0~正无穷
- 当网络初始化的时候,参数随机初始化为比较小的值,输出 即属于各个类别的概率可能差不多(\(s_j \approx s_{y_i}\)) ,且值也比较小,因此单个样本的损失应为C-1 (C为类别总数)这个规律便于调试:如果一开始跑网络的时候得到的损失不符合以上规律 则可能代码有问题
- 另一个trick,是在损失函数中max项的基础上再求平方,这样能够加大对判断失误的惩罚。不过这和原本的hinge loss不一样,具有非线性。
-
Softmax Classifier(Multinomial Logistic Regression)
原本分类器得到的分数是没有实际意义的,得分可以粗略认为只是模型的输出。
-
HingeLoss关心的只是:对于一个样本分类到各个类别的得分中,在真实类别的得分应该比其他类别的得分要高,从而loss更小;而Softmax将这些分数转换成概率,从原本的"分类到各个类别的得分"转换成"分类到各个类别的概率",从而得到概率分布 \(P(Y=C_i|X=X_i)\),\(X_i\)为该样本,\(C_i\)为各个类别,而target probability distribution是只有在真实类别的概率值为1,其余类别为0
假设该样本要分到四类中的一类,其真实类别是第一类
期望得到的概率分布是:\([1,0,0,0]\), Softmax算出的概率分布是:\([0.4, 0.4, 0.15, 0.05]\) ,
则损失函数为:最大化对数似然函数
\(L_i=-\sum_ky_k \cdot \log P(Y=y_k|X=X_i) =-\log P(Y=Y_i|X=X_i)\),
\(Y_i\)是该样本的真实类别, \(y_k\) 取0或1,即类别标签使用one-hot编码。
-
另一个角度也可以理解成计算这两个概率分布的距离(KL散度or交叉熵)
-
损失的最小可能取值是0,最大取值是正无穷:损失为0,要求原本的分数中,真实类别的分数为正无穷,其他类别的分数都为负无穷;损失为正无穷,要求原本的分数中,真实类别的分数为负无穷。这些都是实际运算达不到的,所以损失的最小值只能理论上取到0。
-
当网络初始化的时候,所有分数的取值都几乎相同且都接近0,则得到的损失值大约为log(1/C), C为类别总数. 当W很小时, scores=X.dot(W)约等于0,对应的\(e^{scores}\)=1,归一化后变成1/C
https://zhuanlan.zhihu.com/p/29376573 在具体实现Softmax时需要注意的地方 为了解决计算机中位数的overflow 通过引入一个常数偏移来调整
https://zhuanlan.zhihu.com/p/25723112 softmax的求导
-
正则项,用于防止过拟合,避免模型为了在训练数据上表现好而过于复杂 不能适应于新的测试数据,【设计一个模型,最终关心的其实是在测试数据上的表现!】
-
L2范数,类似欧式norm,倾向于更稠密且取值更小的参数矩阵
-
L1范数,恰好相反,倾向于更稀疏的参数矩阵
2.Optimization
如何得到更好的参数矩阵W
梯度下降,及其变种
Linear Classification VS ConvNet
从提取特征的角度看它们的区别:
-
Linear Classification
-
最开始是直接将图像像素作为线性模型的输入,计算output=Wx,但是存在局限性
-
改用特征表示 feature representation,即人为定义一些特征,然后将图像用这些特征来代表,再输入到分类器。简单列举常用的一些特征:
- 直方图 color histogram 统计整幅图中各个灰度级的出现次数
- HoG Histogram of Oriented Gradients 统计整幅图中各个小区域的edge direction [gradient]
- bag of words 根据一系列图像构建一个codebook of visual words, [随机选取图像的patch然后聚类得到],再通过codebook里的word来编码图像 将图像用图中含有的word及其出现次数来表示
-
需要注意的是,这些传统的方法在训练模型时只会改变参数,而不会改变特征【特征已经提前计算好了 可以这样理解:假设原图是x,通过z=g(x)提取特征,然后再输入到分类器 f = Wz,训练过程中改变的只有W 】
-
-
ConvNet
- 将多层卷积层堆叠起来,可以认为每一层卷积层都是提取特征的过程,在训练时整个网络一起被训练(所有层的参数都会被调整)
- 个人粗略猜测:是不是可以认为 layer1_output = W1* x, layer2_output=W2 * (layer1_output), layer3_output=W3 * (layer2_output) 类推...因此用卷积网络时特征并不是已经人为规定好的,而是从数据中学习到的?