SVM实现详解

SVM

写在最前:经过一番思想斗争,决定用latex公式来展示,不拍照少截图了。
本文对应的程序地址在这里

SVM作业详解

  • 数值梯度和实际梯度不一定匹配,误差不大即视为合理。
  • y = w x + b y = wx+b b b W X WX 的维度多一维,因此需要调用hstack()方法。

svm_loss_naive

loss的推导

先看输入数据:
img1
这里将输入 X X 分成 N N 个行向量,将权重 W W 分成 C C 个列向量,从而直接得出得分 s c o r e s scores 。其中 s o c r e s socres 的每一行代表着每个样本的得分。
由此可以得到第 i i 个数据的多类SVM的损失函数:
img2
注意这里W[j],W[yi]均是列向量,跟参考资料上写法不同,但表达的意思是一样的。
由于该函数计算的是 l o s s loss ,因此需要找出未正确分类的数据,则需要 j y i j \ne y_i ,只有计算它们的损失才有意义。
因此 L [ i ] = L [ i , j ] L[i] = \sum L[i,j] j y i j \ne yi
注意到以下事实:
img3
再用文字表述一次: L [ i , j ] L[i,j] 是一个标量,对 W W 求梯度,就等于该标量对 W W 中每个元素求梯度。
因此我们有:
img4
所以,只要计算出 L [ i , j ] L[i,j] W W 的梯度,就能得到 L [ i ] L[i] W W 的梯度。
img5img6

到这一步已经可以说 l o s s loss d W dW 都计算完成了,但正则化有时候是必要的,它能够抑制损失的绝对差值,消除模糊性。
对于 l o s s loss
loss function
对于 d W dW d W = d W + 2 λ W dW' = dW + 2 \lambda W

svm_loss_vectorized

SVM的向量化求法与上述的差不多,唯一需要注意的是维度的问题。由于上面的是用循环来实现的,每一个都是“奇怪的” ( D , ) (D,) 型,因此考虑得少一些。
但矩阵求导该怎么办呢?看了解答,说是为了维度匹配,所以要将X转置(即下面的公式所示)
有疑问的公式
这个解释听起来是因为要将维度匹配,所以才需要转置X,而不是因为结果是这样的,所以表示起来就是X矩阵的转置。那具体是怎样的呢?一起来做一些推导。

矩阵求导

我们来讨论这样一种函数: f : R n R m f:R^n \rightarrow R^m y = f ( x ) y=f(x) ,则 ( y x ) i j = y i x j \left(\dfrac{\partial y}{\partial x} \right)_{ij} = \dfrac{\partial y_i}{\partial x_j}
例如 y = X W y = XW (这里特别规定 X X , y y 均为行向量),令 W = ( W 1 , W 2 , , W m ) W = (W_1, W_2, \ldots, W_m) 这里 X X (NxD矩阵)可以写为:
AJ6JYV.jpg
因此 X i X_i 的shape为 ( D , ) (D,)
同理, W W (DxC矩阵)可以写成:
AJ6YWT.jpg
其中 W i ( i = 1 , 2 , , c ) W_i(i = 1,2,\ldots,c) 为列向量, W j ( j = 1 , 2 , , D ) W_j^{'}(j = 1,2,\ldots,D) 为行向量。

则可以得到 y i = X W i = j = 1 c X j W i j y_i = XW_i = \sum_{j=1}^{c}X_{j}W_{ij} y i x j = W i j \dfrac{\partial y_i}{\partial x_j} = W_{ij} ,即 y x = W \dfrac{\partial y}{\partial x} = W

回到本题,
( l x ) i = l x i = j = 1 c l y j y j x i = j = 1 c l y j W i j \left(\frac{\partial l}{\partial x}\right)_i = \frac{\partial l}{\partial x_i} = \sum_{j=1}^{c}\frac{\partial l}{\partial y_j} · \frac{\partial y_j}{\partial x_i} = \sum_{j=1}^{c}\frac{\partial l}{\partial y_j} · W_{ij}
这里 l l 为标量, x i x_i 为行向量, y j y_j 为列向量, W i j W_{ij} 为标量(常数)。
既然 W i j W_{ij} 为标量,则满足交换律,于是有
l x i = j = 1 c l y j W i j = j = 1 c W i j l y j \frac{\partial l}{\partial x_i} = \sum_{j=1}^{c}\frac{\partial l}{\partial y_j} · W_{ij} = \sum_{j=1}^{c}W_{ij} · \frac{\partial l}{\partial y_j}
我们要验证的是 j = 1 c W i j l y j = W i T l y \sum_{j=1}^{c}W_{ij} · \frac{\partial l}{\partial y_j} = W_i^T · \frac{\partial l}{\partial y}
先来看左边, j = 1 c W i j l y j \sum_{j=1}^{c}W_{ij} · \frac{\partial l}{\partial y_j} 的结果为
AJW8RP.jpg
右边 = W i T l y = W_i^T · \frac{\partial l}{\partial y} 的结果为
AJWGxf.jpg
= = 左边
从而证毕。

其他部分

其实重点还是矩阵求导部分,理解了矩阵求导,相应的代码看起来就很简单了,不再赘述。

参考资料

线性分类笔记(中):https://zhuanlan.zhihu.com/p/20945670?refer=intelligentunit
矩阵求导术(上):https://zhuanlan.zhihu.com/p/24709748
矩阵求导术(下):https://zhuanlan.zhihu.com/p/24863977
矩阵求导i:https://zhuanlan.zhihu.com/p/58138737?utm_source=wechat_session&utm_medium=social&from=singlemessage&isappinstalled=0

猜你喜欢

转载自blog.csdn.net/HollyRan/article/details/88926887