two-layer-net
首先完成神经网络对scores和损失函数的计算,其中激活函数使用RELU函数,即max(0,x)函数。
neural_net.py的loss()函数
# *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****
h1 = np.maximum(0,X.dot(W1) + b1)
scores = h1.dot(W2) + b2
pass
# *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****
# *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****
# 求指数 (N,C)
exp_scores = np.exp(scores)
# 求和,变为 (N,1)
row_sum = np.sum(exp_scores, axis=1).reshape(N, 1)
norm_scores = exp_scores / row_sum
data_loss = - 1 / N * np.sum(np.log(norm_scores[np.arange(N),y]))
reg_loss = 0.5 * reg * (np.sum(W1 * W1) + np.sum(W2 * W2))
loss = data_loss + reg_loss
pass
# *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****
接下来是反向传播计算梯度,这部分有一定的难度,下面我将我自己的理解记录下来。
整体算法步骤,使用链式求导法则。每一个变量的梯度与该变量的原始大小保持一致。
下面是计算图,从左到右为神经网络正向传递,横线上方为计算得到的值;从右到左为反向传播,横线下方为梯度。
约定,所有的导数均为Loss对该变量的导数,即 d L o s s d 变 量 \frac{d_{Loss}}{d_{变量}} d变量dLoss,因此在程序中 d L o s s d_{Loss} dLoss省略不写,只写出分母。
- 计算 d s c o r e s d_{scores} dscores,即数学表达为 d L o s s d s c o r e s \frac{d_{Loss}}{d_{scores}} dscoresdLoss,因为在data_loss计算过程中将正确分类的得分减去了,故在计算导数过程中需要对正确分类的导数值减一。
- d b 2 d_{b2} db2= d s c o r e s d_{scores} d