CS231N实验:SVM

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,并记录最好的。(比较简单暴力)