Freezing

Freezing

Freeeeeezing......
twitter
github

スタンフォード CS231n(2017版)-- 講義 3:損失関数と最適化

在 Lecture 2 中的最近邻被否决后,接下来要尝试的是线性分类。

介绍#

我们采用参数化的方法来做分类
image
如上图所示,用一个 103072 的参数矩阵 W,乘上 x(x 是把一个图片上分成 3232 个像素块,每个像素块三个通道值,最后把这 32323 个值展平成一维向量得到的),得到一个 101 的结果,里面包含了 10 种标签分别的分数,分数最高的就是模型预测的标签。
你可能会好奇:这个 W 矩阵要是经过可视化,会长什么样子呢?会不会相当抽象?
我们把 10
3072 的 W 每行的 32323 个值还原到方形的图片,如下
image
在小数据集上能略微看出一点点人眼能识别的特征。

多类 SVM 损失#

这个 W 看起来像是决策的 “大脑”,但里面这么多的数字,我们该如何选择它呢?
我们要引出 “损失函数”,来量化我们对预测结果的不满意程度。
我们用一个更简单的三个类别的例子:青蛙、猫、车

image

想象一个场景:老师叫学生回答一个选择题的答案(标准答案是 A),学生支支吾吾说:“大概率选 A,也有可能选 B”,很显然他对知识的掌握不如那些笃定地回答 A 选项的人。同理,我们希望给猫的最高分要明显大于给车和青蛙的分数,这样表明模型很笃定地选择了正确答案。
多类 SVM 损失就是这么回事,Li=jyimax(0,SjSyi+1)L_i = \sum_{j \neq y_i} \max(0, S_j - S_{y_i} + 1)。当我们预测上面第一张图片的类别时,我们得到了第一列三个分数,这个时候SyiS_{y_i}就是 3.2(实际标签猫对应的分数,哪怕比 5.1 要小),因为我们知道这张图片实际标签是猫。接下来我们就当老师来评估一下这个分类器(也就是权重 W)答题表现如何。我们设定的标准是:真实标签对应的分数要高过别的分数至少 1 分,才能算你真的懂。3.2 - 1 <5.1,完犊子,直接大错特错,狠狠地记过。3.2 - 1> -1.7,不错,没有跟青蛙搞混。最后的Li=2.9L_i = 2.9,要注意!!LiL_i越大说明理解得越烂,所以值越低说明模型理解能力越好。
图二预测得不错,4.9 比另外两个分数都至少大 1;图三预测得最烂,损失直接来到了 12.9。

正则化#

上面那个损失函数看似能够衡量模型的能力,但是,难道在训练集上经过训练得出了一个 W,使得在训练集上训练时的损失值越来越低,就足够了吗?
不够,
image
如下图蓝线所示,如果损失函数只有这一项,那么一味地在训练集上学习可能会导致模型专门去 “琢磨” 训练集,走火入魔,导致给你换一些训练集之外的题,就傻眼了。都说 “大道至简”,一个有好的泛化性能的模型也是这样,我们要让模型 “简单”,并在测试数据上也有很好的表现,如图中绿线所示。
于是我们加上了一个正则项,其中λ\lambda 是一个超参数,用来平衡数据损失和正则化损失。
这个R(W)R(W)和损失函数类似,也有很多的选择:

  • L1 正则化:增加 W 矩阵的稀疏性
  • *L2 正则化:防止过拟合,平滑权重分布。
  • *Elastic net 正则化:兼顾 L1 和 L2 的优点
  • Dropout ……
    image

Softmax#

image
这张图展示了 Softmax 分类器如何将未归一化分数转换为概率,并通过交叉熵损失评估模型性能。其中 syis_{y_i} 是正确类别的未归一化分数,jesj\sum_j e^{s_j} 是所有类别的未归一化分数总和。

Softmax 与 SVM(对比两种损失函数)#

image

顺便看一下这个流程图,非常简洁明了:左下方的xi,yi x_i,y_i是训练集中每张图像的输入和真实标签,剩下的连线把前面讲到的所有过程给囊括了。
image

优化#

前面 blah blah 说了半天,大家心中可能还是有一个疑惑:那么这个 “大脑” 是怎么训练成的呢?也就是说,如何找到最佳的 W?
有几个可能的思路:

  1. 随机搜索:比较垃圾

  2. 跟随斜率:用下山的例子理解。在数学上就是梯度。
    迭代,每一次在 W 的每个数字上加一个小值 h,看损失值变了多少,得到 dW,就像下面这样对每一个 W 中的数字重复操作
    image
    然后从中挑选

    这个方法(本质就是数值梯度)在 W 规模变大后就难以实行,计算量太大了。我们仔细想想,我们要求损失函数对 W 的导数,损失函数本来不就是关于 W 的函数吗,直接用求导的方式就行了啊!

梯度下降#

代码如下:


while True:
  weights_grad = evaluate_gradient(loss_fun, data, weights)
  weights += - step_size * weights_grad

随机梯度下降#


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

用了一个坐标变换:直角坐标到极坐标的例子,把原先不能用线性分类器分开的一群点成功用线性分类器分开了。

特征表示的例子:

  1. 颜色直方图
  2. 方向梯度直方图(HoG)
  3. 词袋模型:构建代码本 → 编码图像

小结#

Lecture3 的内容到此完结,我并没有延伸开很多东西,基本按照课程的内容解读。个人觉得这儿的优化部分讲的不算很好,只能了解个大概。
Lecture4 内容是神经网络和反向传播,移步下一篇笔记~

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。