PS: 本文默认已学习CS231N相关课程并掌握相关知识。
SVM的实验部分分为以下内容:
- 计算loss和grad
- 随机梯度下降
- 模型调参
计算loss和grad
MultiClass SVM的方程为
\[ f(x) = x * W \]
其中, \(x\) 为 \(1*k\), W为 \(k*C\) ( \(C\) 是label种类)
\(loss function\) 定义为
\[ L = \frac{1}{m}\sum_{i=1}^{m}{\sum_{j \neq y[i]}{max{(0, f(X[i])[j] - f(X[i])[y[i]] + 1)}}}\]
实验中已经帮我们实现了 \(loss function\) ,接下来我们要做的就是计算 \(grad\) 。众所周知,\(grad = \frac{\partial L}{\partial W}\) 。 \(loss function\) 只是简单的相加,所以我们考虑每一项不为0的组成部分对导数的贡献。
\[\begin{align} dW[:, l] & = \frac{\partial (f(X[i])[j] - f(X[i])[y[i]] + 1)}{\partial W[:, l]} \\ & = {\begin{cases} X[i], & l = j \\ -X[i], & l = y[i] \\ 0, & other \\ \end{cases} } \end{align}\]这样,我们就求出了 \(dW\) 。
随机梯度下降
首先我们要从数据中随机获取 \(batch\_size\) 样本(使用numpy.randomchoice),然后用这些数据进行一轮迭代,获得grad,再进行下降。
模型调参
SVM模型有各种不同的参数。我们用多重循环,得到每种参数的组合的train accuracy和val accuracy,并记录最好的。(比较简单暴力)