在否决了 Lecture 2 中的 Nearest Neighbor 之后,接下来要尝试的是 Linear Classification。
Introduction#
我们采用参数化的方法来做分类
如上图所示,用一个 103072 的参数矩阵 W,乘上 x (x 是把一个图片上分成 3232 个像素块,每个像素块三个通道值,最后把这 32323 个值展平成一维向量得到的),得到一个 101 的结果,里面包含了 10 种 label 分别的 score,score 最高的就是模型预测的标签。
你可能会好奇:这个 W 矩阵要是经过可视化,会长什么样子呢?会不会相当抽象?
我们把 103072 的 W 每行的 32323 个值还原到方形的图片,如下
在小数据集上能略微看出一点点人眼能识别的特征。
Multiclass SVM loss#
这个 W 看起来像是决策的 “大脑”,但它里面这么多的数字,我们该如何选择他呢?
我们要引出 “Loss Function”,来量化我们对预测结果的不满意程度。
我们用一个更简单的三个类别的例子:frog cat car
想象一个场景:老师叫学生回答一个选择题的答案(标准答案是 A),学生支支吾吾说:“大概率选 A,也有可能选 B”,很显然他对知识的掌握不如那些笃定地回答 A 选项的人。 同理,我们希望给 cat 的最高分要明显大于给 car 和 frog 的分数,这样表明模型很笃定地选择了正确答案。
Multicalss SVM loss 就是这么回事, 。当我们预测上面第一张图片的类别时,我们得到了第一列三个分数,这个时候就是 3.2(实际标签 cat 对应的分数,哪怕比 5.1 要小),因为我们知道这张图片实际标签是 cat。接下来我们就当老师来评估一下这个 classifier (也就是权重 W) 答题表现如何。我们设定的标准是:真实标签对应的分数要高过别的分数至少 1 分,才能算你真的懂。3.2 - 1 < 5.1,完犊子,直接大错特错,狠狠地记过。3.2 - 1 > -1.7,不错,没有跟 frog 搞混。 最后的, 要注意!!越大说明理解得越烂,所以值越低说明模型理解能力越好。
图二预测得不错,4.9 比另外两个分数都至少大 1;图三预测得最烂,Losses 直接来到了 12.9。
Regularization#
上面那个 Loss Function 看似能够衡量模型的能力,但是,难道在 training set 上经过训练得出了一个 W,使得在 training set 上训练时的 Loss 值越来越低,就足够了吗?
不够,
如下图蓝线所示,如果 Loss Function 只有这一项,那么一味地在训练集上学习可能会导致模型专门去 “琢磨” 训练集,走火入魔,导致给你换一些训练集之外的题,就傻眼了。都说 “大道至简”, 一个有好的泛化性能的模型也是这样,我们要让模型 “simple”,并在 test data 上也有很好的表现,如图中绿线所示。
于是我们加上了一个正则项,其中是一个超参数,用来平衡 data loss 和 regularization loss
这个和 loss function 类似,也有很多的选择:
- L1 正则化: increasing sparsity in the W matrx
- *L2 正则化: 防止过拟合,平滑权重分布。
- *Elastic net 正则化: 兼顾 L1 和 L2 的优点
- Dropout ……..
Softmax#
这张图展示了 Softmax Classifier 如何将未归一化分数转换为概率,并通过交叉熵损失评估模型性能。其中 是正确类别的未归一化分数, 是所有类别的未归一化分数总和
Softmax vs. SVM (对比两种 loss function)#
顺便看一下这个流程图,非常简洁明了:左下方的是训练集中每张图像的 input 和 真实标签,剩下的连线把前面讲到的所有过程给囊括了。
Optimization#
前面 blah blah 说了半天,大家心中可能还是有一个疑惑:那么这个 “大脑” 是怎么训练成的呢?也就是说,How to find the best W?
有几个可能的思路:
-
random search: 比较垃圾
-
follow the slope:用下山的例子理解。在数学上就是梯度。
iteratively, 每一次在 W 的每个数字上加一个小值 h, 看 loss 值变了多少,得到 dW,就像下面这样对每一个 W 中的数字重复操作
然后从中挑选这个方法(本质就是 numerical gradient)在 W 规模变大后就难以实行,计算量太大了。我们仔细想想,我们要求 Loss function 对 W 的导数,Loss function 本来不就是关于 W 的函数吗,直接用求导的方式就行了啊!
Gradient Descent (梯度下降)#
代码如下:
while True:
weights_grad = evaluate_gradient(loss_fun, data, weights)
weights += - step_size * weights_grad
Stochastic Gradient Descent(随机梯度下降)#
while True:
data_batch = sample_training_data(data, 256)
weights_grad = evaluate_gradient(loss_fun, data, weights)
weights += - step_size * weights_grad
http://vision.stanford.edu/teaching/cs231n-demos/linear-classify/ 在这个交互可视化界面中可以看到整个训练的过程。
Image Features#
用了一个坐标变换:直角坐标到极坐标的例子,把原先不能用 linear classifier 分开的一群点成功用 linear classifier 分开了
Feature Representation 的例子:
- Color Histogram
- Histogram of Oriented Gradient (HoG)
- Bag of words: Build codebook → Encode images
小结#
Lecture3 的内容到此完结,我并没有延伸开很多东西,基本按照课程的内容解读。个人觉得这儿的 Optimization 部分讲的不算很好,只能了解个大概。
Lecture4 内容是 neural networks 和 backpropagation, 移步下一篇笔记~