GitHub地址:https://github.com/ZJUFangzh/cs231n
softmax是最常用的分类器之一。
softmax和svm都是常用的分类器,而softmax更为常用。
具体可以参考我这篇的最后,ng老师有讲,softmax
前面数据集的都跟SVM的一样。
直接进入loss和grads推导环节。
Li=−log(efyi∑jefj)
可以看到,计算的公式也就是cross-entropy,即
H(p,q)=−∑iyilog(yhati)
但是,这样有一个缺点,就是指数efyi可能会特别大,这样可能导致内存不足,计算不稳定等问题。那么可以在分子分母同乘一个常数C,一般C取为logC=−maxfj
1 | f = np.array([123, 456, 789]) # 例子中有3个分类,每个评分的数值都很大 |
精确地说,SVM分类器使用的是折叶损失(hinge loss),有时候又被称为最大边界损失(max-margin loss)。Softmax分类器使用的是交叉熵损失(corss-entropy loss)。Softmax分类器的命名是从softmax函数那里得来的,softmax函数将原始分类评分变成正的归一化数值,所有数值和为1,这样处理后交叉熵损失才能应用。注意从技术上说“softmax损失(softmax loss)”是没有意义的,因为softmax只是一个压缩数值的函数。但是在这个说法常常被用来做简称。
求导过程参考:cs231n softmax求导
最终得到的公式是:
softmax代码实现
编辑cs231n/classifiers/softmax.py
,先写一下softmax_loss_naive
函数,依旧是循环:
1 | def softmax_loss_naive(W, X, y, reg): |
验证一下loss和grad得到:
1 | numerical: -0.621593 analytic: -0.621593, relative error: 7.693773e-09 |
向量化softmax
1 | def softmax_loss_vectorized(W, X, y, reg): |
检验一下向量化和非向量化的时间:
1 | naive loss: 2.357905e+00 computed in 0.091724s |
softmax的函数已经编写完成了,接下来调一下学习率和正则化两个超参数:
1 | # rates and regularization strengths; if you are careful you should be able to |
1 | lr 1.000000e-07 reg 2.500000e+04 train accuracy: 0.350592 val accuracy: 0.354000 |