CS231n作业笔记1.5:Softmax的误差以及梯度计算

来源:互联网 发布:雅可比矩阵公式 编辑:程序博客网 时间:2024/04/28 22:41

CS231n简介

详见 CS231n课程笔记1:Introduction。
本文都是作者自己的思考,正确性未经过验证,欢迎指教。

作业笔记

Softmax的误差函数以及正则项请参考 CS231n课程笔记3.1:线性分类器(SVM,softmax)的误差函数、正则化。
代码部分请参考 python、numpy、scipy、matplotlib的一些小技巧。
注:这里只写了向量化的实现方法,因为非向量方法代码冗长,而且速度慢。

1. 损失函数Loss Function

这里值得注明的有
1. 使用了broadcasting来把sum_exp拓展到所有class label处;
2. 使用了integer array index用于得到真值处的log_loss;
3. 使用了average函数防止sum函数超范围;
4. 做除法的时候加上1e-15用于防止除0。

  scores = X.dot(W)  exp_scores = np.exp(scores)  sum_exp_scores = np.sum(exp_scores,axis=1,keepdims=True)+1e-15  norm_exp_scores = exp_scores/sum_exp_scores  log_loss = -np.log(norm_exp_scores)  log_loss = np.average(log_loss[np.arange(X.shape[0]),y])  loss = log_loss + 0.5*reg*np.sum(W*W)

2. 梯度计算

这里值得注意的有:
1. dlog_loss中只对真值label对应处传播。
2. dsum_exp到dexp传播的时候要对所有class传播。
3. 使用broadcasting的时候注意[d,]以及[d,1]的区别。

  dloss = 1.  dlog_loss = np.zeros(norm_exp_scores.shape)  dlog_loss[np.arange(X.shape[0]),y] = dloss/X.shape[0]  dnorm_exp_scores = -1./norm_exp_scores*dlog_loss  dexp_scores = dnorm_exp_scores / sum_exp_scores  dsum_exp_scores = - dnorm_exp_scores * exp_scores / sum_exp_scores / sum_exp_scores  dexp_scores += np.sum(dsum_exp_scores,axis=1,keepdims=True)  dscores = dexp_scores * exp_scores  dW = X.T.dot(dscores)  dW += reg*W
0 0