SVM
写在最前:经过一番思想斗争,决定用latex公式来展示,不拍照不少截图了。
本文对应的程序地址在这里
SVM作业详解
- 数值梯度和实际梯度不一定匹配,误差不大即视为合理。
-
y=wx+b,
b比
WX的维度多一维,因此需要调用hstack()方法。
svm_loss_naive
loss的推导
先看输入数据:
这里将输入
X分成
N个行向量,将权重
W分成
C个列向量,从而直接得出得分
scores。其中
socres的每一行代表着每个样本的得分。
由此可以得到第
i个数据的多类SVM的损失函数:
注意这里W[j],W[yi]均是列向量,跟参考资料上写法不同,但表达的意思是一样的。
由于该函数计算的是
loss,因此需要找出未正确分类的数据,则需要
j̸=yi,只有计算它们的损失才有意义。
因此
L[i]=∑L[i,j](
j̸=yi)
注意到以下事实:
再用文字表述一次:
L[i,j]是一个标量,对
W求梯度,就等于该标量对
W中每个元素求梯度。
因此我们有:
所以,只要计算出
L[i,j]对
W的梯度,就能得到
L[i]对
W的梯度。
到这一步已经可以说
loss和
dW都计算完成了,但正则化有时候是必要的,它能够抑制损失的绝对差值,消除模糊性。
对于
loss:
对于
dW
dW′=dW+2λW
svm_loss_vectorized
SVM的向量化求法与上述的差不多,唯一需要注意的是维度的问题。由于上面的是用循环来实现的,每一个都是“奇怪的”
(D,)型,因此考虑得少一些。
但矩阵求导该怎么办呢?看了解答,说是为了维度匹配,所以要将X转置(即下面的公式所示)
这个解释听起来是因为要将维度匹配,所以才需要转置X,而不是因为结果是这样的,所以表示起来就是X矩阵的转置。那具体是怎样的呢?一起来做一些推导。
矩阵求导
我们来讨论这样一种函数:
f:Rn→Rm即
y=f(x),则
(∂x∂y)ij=∂xj∂yi
例如
y=XW(这里特别规定
X,
y均为行向量),令
W=(W1,W2,…,Wm) 这里
X(NxD矩阵)可以写为:
因此
Xi的shape为
(D,)。
同理,
W(DxC矩阵)可以写成:
其中
Wi(i=1,2,…,c)为列向量,
Wj′(j=1,2,…,D)为行向量。
则可以得到
yi=XWi=j=1∑cXjWij故
∂xj∂yi=Wij,即
∂x∂y=W
回到本题,
(∂x∂l)i=∂xi∂l=j=1∑c∂yj∂l⋅∂xi∂yj=j=1∑c∂yj∂l⋅Wij
这里
l为标量,
xi为行向量,
yj为列向量,
Wij为标量(常数)。
既然
Wij为标量,则满足交换律,于是有
∂xi∂l=j=1∑c∂yj∂l⋅Wij=j=1∑cWij⋅∂yj∂l
我们要验证的是
j=1∑cWij⋅∂yj∂l=WiT⋅∂y∂l
先来看左边,
∑j=1cWij⋅∂yj∂l的结果为
右边
=WiT⋅∂y∂l的结果为
= 左边
从而证毕。
其他部分
其实重点还是矩阵求导部分,理解了矩阵求导,相应的代码看起来就很简单了,不再赘述。
参考资料
线性分类笔记(中):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