CS231n: (3) Loss Functions and Optimization

问答总结:

  • 损失函数的产生原因是什么,它的定义是什么?

  • 多类别SVM损失函数的定义是什么? 有什么实际意义?

  • 多类别SVM损失函数为什么以1为间隔阈值?以其他为阈值有影响吗?

  • 对于多类别SVM损失函数,我们初始化 W W W非常小,那么 s ≈ 0 s \approx 0 s0, 则初始的损失应该为多少?

    C-1(C为类别数量)

  • 为什么说多类别SVM损失函数中,任何缩放操作都不会有影响?(个人理解, 待探究)

    (1) 在分类问题中: 本质上我们只在乎真实类别的分数要高于其他类别,高多少无所谓.
    (2) 线性分类器中,模型参数成倍缩放并不改变超平面。

  • 如何从几何直观,样本空间和贝叶斯角度理解正则化。常见的 L 1 L_1 L1 L 2 L_2 L2正则化有什么特点?

  • 使用softmax分类器的过程是怎样的? 我们初始化 W W W非常小,那么 s ≈ 0 s \approx 0 s0, 则初始的损失应该为多少?

    先使用softmax将分数转换为概率分布,然后使用最大似然思想定义损失函数。最开始时,每个类别概率相同,为 1 C \frac{1}{C} C1, 故损失为logC.

  • 多类别SVM损失函数和softmax损失函数的区别是什么?

  • 梯度的定义是什么,几何意义是什么?计算的方式有哪两种?

  • 随机梯度下降是什么?为什么会有随机梯度下降算法?

  • 图像领域的基本的特征提取方法有哪些?早期基于特征工程和现在基于深度学习方法的区别是什么?


一、损失函数

1、来源与定义

为了让算法能够衡量模型的表现,因此我们提出了损失函数的概念。在一个数据集上的损失函数是所有样本损失的平均。定义如下:
L = 1 N ∑ i L i ( f ( x i , W ) , y i ) L = \frac{1}{N}\sum_{i}L_i(f(x_i,W),y_i) L=N1iLi(f(xi,W),yi).
其中 { x i , y i } i = 1 N \{x_i,y_i\}_{i=1}^{N} {xi,yi}i=1N为训练集, f f f为模型, W W W为模型参数。

2、多类别SVM损失函数

定义多类别SVM损失函数如下:
L i = ∑ j ! = y i { 0 s y i − s j − 1 ≥ 0 − ( s y i − s j − 1 ) e l s e = ∑ j ! = y i m a x ( 0 , − ( s y i − s j − 1 ) ) \begin{aligned} L_i &=\sum_{j !=y_i}\begin{cases} 0 & s_{y_i}-s_j -1 \ge 0 \\ -(s_{y_i}-s_j-1) & else \end{cases} \\ &= \sum_{j != y_i}max(0, -(s_{y_i} -s_j-1)) \end{aligned} Li=j!=yi{0(syisj1)syisj10else=j!=yimax(0,(syisj1))
在这里插入图片描述
这个式子的意义是说: 对一个样本,要没有损失,那么它所属类别的得分必须至少比其他类别的得分高1.,至于为什么是高1, 因为这里的阈值1和二分类SVM中的函数间隔相似,我们可以通过缩放分类器中的参数 W → λ W W \to \lambda W WλW, b → λ b b \to \lambda b bλb,将阈值固定为1,而不影响优化结果。因此这只是一个为了简单而选择的阈值,选择其他大于0的阈值也可以


个人疑惑: SVM本质上是要最大化样本点和超平面的几何间隔。缩放超平面系数不会改变超平面,因此可以将函数间隔设定为1. 从而简化优化目标。

但是,在多类别SVM损失函数中,似乎并没有体现SVM的思想,因为根本就没有最大化间隔的概念,它的核心思想就是正确类别的分数应该大于其他类别,然后莫名其妙定义了一个阈值1。如果是这样,损失函数定义为:
L i = ∑ j ! = y i { 0 s y i − s j > 0 − ( s y i − s j ) e l s e L_i =\sum_{j !=y_i}\begin{cases} 0 & s_{y_i}-s_j > 0 \\ -(s_{y_i}-s_j) & else \end{cases} Li=j!=yi{0(syisj)syisj>0else
岂不是更简单.难道只是为了写代码方便才按上方这样定义损失函数吗。。

  • (1) 为什么要像课件那样定义损失函数呢?
  • (2) 为什么要叫做多类别SVM损失损失函数呢?

个人理解
(1) 如果是定义为第二种损失函数,是没有办法处理 s y i = s j s_{y_i}=s_j syi=sj的情况的,因此需要给定一个间隔阈值,线性分类器本质上也是找高维空间分类平面,因此参数可以缩放,所以间隔可以任意给定,可能是为了简单,给了个1.
(2) 类别分数的计算是这样的 s i = w i x + b i s_i = w_ix+b_i si=wix+bi, 这个可以看做样本距类别 i i i的超平面的有向间隔,有向间隔越大说明越可能在这个类别中。那么 s y i − s i s_{y_i} - s_i syisi就可以看做是正确类别和错误类别的相对有向间隔,因此问题转化为尽量使得相对有向间隔大于阈值,因此叫做多类别SVM损失函数。但是个人认为,就损失函数来看,多类别SVM损失函数并没有像SVM那样,找到了最安全的多个超平面.


3、softmax+最大似然损失函数

softmax classifier也叫多项逻辑回归。当分类器输出每个类别分数后。用 s ∈ R C \mathbf{s} \in R^C sRC表示分数向量. 我们对其进行归一化,使其变为一个概率分布:
P ( Y = k ∣ X = x i ; θ ) = e s k ∑ j e s j P(Y=k | X = x_i; \theta)= \frac{e^{s_k}}{\sum_je^{s_j}} P(Y=kX=xi;θ)=jesjesk
其中 θ \theta θ为模型参数,然后由最大似然思想,我们需要求解下式:
a r g   max ⁡ θ Π i N p ( y i ∣ x i ; θ ) = − a r g   min ⁡ θ Π i N p ( y i ∣ x i ; θ ) = − a r g min ⁡ θ ∑ i N l o g ( p ( y i ∣ x i ; θ ) ) \begin{aligned} arg \ \max_{\theta}\Pi_i^{N}p(y_i|x_i;\theta) &= -arg \ \min_{\theta}\Pi_i^{N}p(y_i|x_i;\theta) \\ &= -arg \min_{\theta}\sum_{i}^Nlog(p(y_i|x_i;\theta)) \end{aligned} arg θmaxΠiNp(yixi;θ)=arg θminΠiNp(yixi;θ)=argθminiNlog(p(yixi;θ))

4、两个损失函数的区别

  • 多类别SVM损失函数:当得分超过某个阈值边放弃优化,见好就收
  • softmax损失函数:不断将概率质量向正确类别聚集,永无止境

在实践中,并不会有很大差距。

二、正则化

使用函数去拟合数据的过程中,有很重要的问题就是过拟合在这里插入图片描述
如图所示,蓝线表示的函数过拟合了,好的函数应该是绿色。如何将蓝色的线变为绿色。我们有两种方式。
(1)直接规定用最高次为1次的函数去拟合数据。
(2)使用高次函数拟合数据,但是增加正则项,以使得曲线接近绿色

当然正则化不止是添加正则项, 常见的正则化方式有: (1) 添加正则项。(2)使用Dropout(神经网络中)。(3)Batch normalization等

三、优化

1、寻找方向:梯度

定义了损失函数,那么我们要如何得到最小化损失函数的模型参数呢?这就是一个优化问题了。
为了描述问题的直观性,我们假定模型参数只有两个变量。那么损失函数可以看作三维空间里的平面。
在这里插入图片描述
我们优化的目标就是尽可能到达更低的点,更形象地,就是下山地过程。那么,往哪个方向下山呢? 我们知道多元函数的梯度总是指向坡度最陡的方向,那么我们要下山,就沿负梯度方向行走。因此要下山,关键靠梯度指路。

2、梯度计算

多元函数梯度定义如下
∇ f ( x , y ) = ( ∂ f ∂ x , ∂ f ∂ y ) \nabla f(x,y) = (\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}) f(x,y)=(xf,yf)
根据偏导数的定义, f ( x , y ) f(x,y) f(x,y)在点(a, b)关于 x x x的偏导数为:
∂ f ∂ x = lim ⁡ h → 0 f ( a + h , b ) − f ( a , b ) h \frac{\partial f}{\partial x}= \lim_{h \to 0}\frac{f(a+h,b)-f(a,b)}{h} xf=h0limhf(a+h,b)f(a,b)
由此差商定义,我们得到基本的:
(1) 数值计算法: 选取一个小的 h h h比如0.00001,然后依次计算每个变量的偏导数,最终得到梯度。

由于数值计算法需要循环计算,计算量巨大,但是根据基本定义,我们能够推导出很多求导公式和法则,因此有
(2)直接计算法: 由相应公式直接求得梯度表达式,其间涉及到矩阵求导,然后直接由表达式快速计算梯度。

验证: 我们常常使用第一个方法作为第二个方法的测试单元,以确定我们求得的梯度表达式正确。

3、梯度下降与随机梯度下降

(1) 梯度下降

得到梯度,我们就找到了方向。这样我们随机初始化一个起始点weights,然后根据损失函数计算梯度weight_grad,设定超参数step_size, 然后更新。基本的代码框架如下:
在这里插入图片描述

(2) 随机梯度下降
但是很明显,对于损失函数:
L ( W ) = 1 N ∑ i = 1 N L i ( x i , y i ; W ) + λ R ( W ) L(W) = \frac{1}{N}\sum_{i=1}^NL_i(x_i,y_i;W) + \lambda R(W) L(W)=N1i=1NLi(xi,yi;W)+λR(W)
其梯度为:
∇ W L ( W ) = 1 N ∑ i = 1 N ∇ W L i ( x i , y i ; W ) + λ ∇ W R ( W ) \nabla_WL(W) = \frac{1}{N}\sum_{i=1}^N\nabla_WL_i(x_i,y_i;W) + \lambda \nabla_WR(W) WL(W)=N1i=1NWLi(xi,yi;W)+λWR(W)
要计算梯度,需要遍历整个数据集,这需要消耗大量的计算力。更具采样的思想,提出随机梯度下降(SGD) 算法。我们每次抽样一个batch的样本,以此代表整体,求得梯度,然后更新。这本质上也是一种计算力和方向准确度的折中。代码框架如下。

在这里插入图片描述

特征工程

1、思想

直接将图像的像素点放进分类器,效果可能不尽如人意,因此我们可能先根据人的经验,从图像中抽取一些特征。然后将特征放入分类器。这样的本质思想是:特征空间的变换。一个直观的例子如下:
在这里插入图片描述
将特征从 ( x , y ) (x, y) (x,y)(笛卡尔坐标系)转换为 ( p , θ ) (p, \theta) (p,θ)(极坐标系). 从而将数据集变为线性可分。

2、方法

在图像领域,常见的特征提取方法有:
(1): 色彩直方图:
在这里插入图片描述
(2): 图像的方向梯度
在这里插入图片描述
(3) 词袋模型演变
在这里插入图片描述

不过在进入深度学习时代后,基本可以省去特征工程,将特征交给模型去学习了。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值