问答总结:
损失函数的产生原因是什么,它的定义是什么?
多类别SVM损失函数的定义是什么? 有什么实际意义?
多类别SVM损失函数为什么以1为间隔阈值?以其他为阈值有影响吗?
对于多类别SVM损失函数,我们初始化 W W W非常小,那么 s ≈ 0 s \approx 0 s≈0, 则初始的损失应该为多少?
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 s≈0, 则初始的损失应该为多少?
先使用softmax将分数转换为概率分布,然后使用最大似然思想定义损失函数。最开始时,每个类别概率相同,为 1 C \frac{1}{C} C1, 故损失为logC.
多类别SVM损失函数和softmax损失函数的区别是什么?
梯度的定义是什么,几何意义是什么?计算的方式有哪两种?
随机梯度下降是什么?为什么会有随机梯度下降算法?
图像领域的基本的特征提取方法有哪些?早期基于特征工程和现在基于深度学习方法的区别是什么?
为了让算法能够衡量模型的表现,因此我们提出了损失函数的概念。在一个数据集上的损失函数是所有样本损失的平均。定义如下:
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=N1i∑Li(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为模型参数。
定义多类别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−(syi−sj−1)syi−sj−1≥0else=j!=yi∑max(0,−(syi−sj−1))
这个式子的意义是说: 对一个样本,要没有损失,那么它所属类别的得分必须至少比其他类别的得分高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−(syi−sj)syi−sj>0else
岂不是更简单.难道只是为了写代码方便才按上方这样定义损失函数吗。。
个人理解:
(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 syi−si就可以看做是正确类别和错误类别的相对有向间隔,因此问题转化为尽量使得相对有向间隔大于阈值,因此叫做多类别SVM损失函数。但是个人认为,就损失函数来看,多类别SVM损失函数并没有像SVM那样,找到了最安全的多个超平面.
softmax classifier也叫多项逻辑回归。当分类器输出每个类别分数后。用 s ∈ R C \mathbf{s} \in R^C s∈RC表示分数向量. 我们对其进行归一化,使其变为一个概率分布:
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=k∣X=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(yi∣xi;θ)=−arg θminΠiNp(yi∣xi;θ)=−argθmini∑Nlog(p(yi∣xi;θ))
在实践中,并不会有很大差距。
使用函数去拟合数据的过程中,有很重要的问题就是过拟合。
如图所示,蓝线表示的函数过拟合了,好的函数应该是绿色。如何将蓝色的线变为绿色。我们有两种方式。
(1)直接规定用最高次为1次的函数去拟合数据。
(2)使用高次函数拟合数据,但是增加正则项,以使得曲线接近绿色。
当然正则化不止是添加正则项, 常见的正则化方式有: (1) 添加正则项。(2)使用Dropout(神经网络中)。(3)Batch normalization等
定义了损失函数,那么我们要如何得到最小化损失函数的模型参数呢?这就是一个优化问题了。
为了描述问题的直观性,我们假定模型参数只有两个变量。那么损失函数可以看作三维空间里的平面。
我们优化的目标就是尽可能到达更低的点,更形象地,就是下山地过程。那么,往哪个方向下山呢? 我们知道多元函数的梯度总是指向坡度最陡的方向,那么我们要下山,就沿负梯度方向行走。因此要下山,关键靠梯度指路。
多元函数梯度定义如下
∇ f ( x , y ) = ( ∂ f ∂ x , ∂ f ∂ y ) \nabla f(x,y) = (\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}) ∇f(x,y)=(∂x∂f,∂y∂f)
根据偏导数的定义, 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} ∂x∂f=h→0limhf(a+h,b)−f(a,b)
由此差商定义,我们得到基本的:
(1) 数值计算法: 选取一个小的 h h h比如0.00001,然后依次计算每个变量的偏导数,最终得到梯度。
由于数值计算法需要循环计算,计算量巨大,但是根据基本定义,我们能够推导出很多求导公式和法则,因此有
(2)直接计算法: 由相应公式直接求得梯度表达式,其间涉及到矩阵求导,然后直接由表达式快速计算梯度。
验证: 我们常常使用第一个方法作为第二个方法的测试单元,以确定我们求得的梯度表达式正确。
(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=1∑NLi(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=1∑N∇WLi(xi,yi;W)+λ∇WR(W)
要计算梯度,需要遍历整个数据集,这需要消耗大量的计算力。更具采样的思想,提出随机梯度下降(SGD) 算法。我们每次抽样一个batch的样本,以此代表整体,求得梯度,然后更新。这本质上也是一种计算力和方向准确度的折中。代码框架如下。
直接将图像的像素点放进分类器,效果可能不尽如人意,因此我们可能先根据人的经验,从图像中抽取一些特征。然后将特征放入分类器。这样的本质思想是:特征空间的变换。一个直观的例子如下:
将特征从 ( x , y ) (x, y) (x,y)(笛卡尔坐标系)转换为 ( p , θ ) (p, \theta) (p,θ)(极坐标系). 从而将数据集变为线性可分。