Я строю нейронную сеть с архитектурой:
input layer
--> fully connected layer
--> ReLU
--> fully connected layer
--> softmax
Я использую приведенные здесь уравнения DeepLearningBook для реализации обратного распространения. Я думаю, что моя ошибка в уравнении. 1. При дифференциации я рассматриваю каждый пример независимо, дающий матрицу N x C (количество примеров x количество классов), или вместе, чтобы получить матрицу N x 1?
# derivative of softmax
da2 = -a2 # a2 comprises activation values of output layer
da2[np.arange(N),y] += 1
da2 *= (a2[np.arange(N),y])[:,None]
# derivative of ReLU
da1 = a1 # a1 comprises activation values of hidden layer
da1[a1>0] = 1
# eq. 1
mask = np.zeros(a2.shape)
mask = [np.arange(N),y] = 1
delta_2 = ((1/a2) * mask) * da2 / N
# delta_L = - (1 / a2[np.arange(N),y])[:,None] * da2 / N
# eq.2
delta_1 = np.dot(delta_2,W2.T) * da1
# eq. 3
grad_b1 = np.sum(delta_1,axis=0)
grad_b2 = np.sum(delta_2,axis=0)
# eq. 4
grad_w1 = np.dot(X.T,delta_1)
grad_w2 = np.dot(a1.T,delta_2)
Как ни странно, закомментированная строка в ур. 1 возвращает правильное значение смещения, но я не могу оправдать использование этого уравнения, поскольку оно возвращает матрицу N x 1, которая умножается на соответствующие строки da2.
Редактировать: я работаю над проблемами назначения курса CS231n, которые можно найти здесь: CS231n