Использование обозначений Исчисление обратного распространения |Глубокое изучение, глава 4 , у меня есть этот код обратного распространения для 4-уровневой (т.е. 2 скрытых слоя) нейронной сети:
def sigmoid_prime(z):
return z * (1-z) # because σ'(x) = σ(x) (1 - σ(x))
def train(self, input_vector, target_vector):
a = np.array(input_vector, ndmin=2).T
y = np.array(target_vector, ndmin=2).T
# forward
A = [a]
for k in range(3):
a = sigmoid(np.dot(self.weights[k], a)) # zero bias here just for simplicity
A.append(a)
# Now A has 4 elements: the input vector + the 3 outputs vectors
# back-propagation
delta = a - y
for k in [2, 1, 0]:
tmp = delta * sigmoid_prime(A[k+1])
delta = np.dot(self.weights[k].T, tmp) # (1) <---- HERE
self.weights[k] -= self.learning_rate * np.dot(tmp, A[k].T)
Это работает, но:
точность в конце (для моего случая использования: распознавание цифр MNIST) просто в порядке, но не очень хорошая. Намного лучше (т.е. сходимость намного лучше), когда строка (1) заменяется на :
delta = np.dot(self.weights[k].T, delta) # (2)
код из MachineОбучение на Python: обучение и тестирование нейронной сети с набором данных MNIST также предлагает:
delta = np.dot(self.weights[k].T, delta)
вместо:
delta = np.dot(self.weights[k].T, tmp)
(С помощью обозначений этой статьи этоis:
output_errors = np.dot(self.weights_matrices[layer_index-1].T, output_errors)
)
Эти 2 аргумента кажутся согласованными: код (2) лучше, чем код (1).
Однако математика, кажется, показывает обратное (см. видео здесь ; еще одна деталь: обратите внимание, что моя функция потерь умножается на 1/2, тогда как ее нет на видео):
Вопрос: какой из них правильный: реализация (1) или (2)?
В LaTeX:
$$\frac{\partial{C}}{\partial{w^{L-1}}} = \frac{\partial{z^{L-1}}}{\partial{w^{L-1}}} \frac{\partial{a^{L-1}}}{\partial{z^{L-1}}} \frac{\partial{C}}{\partial{a^{L-1}}}=a^{L-2} \sigma'(z^{L-1}) \times w^L \sigma'(z^L)(a^L-y) $$
$$\frac{\partial{C}}{\partial{w^L}} = \frac{\partial{z^L}}{\partial{w^L}} \frac{\partial{a^L}}{\partial{z^L}} \frac{\partial{C}}{\partial{a^L}}=a^{L-1} \sigma'(z^L)(a^L-y)$$
$$\frac{\partial{C}}{\partial{a^{L-1}}} = \frac{\partial{z^L}}{\partial{a^{L-1}}} \frac{\partial{a^L}}{\partial{z^L}} \frac{\partial{C}}{\partial{a^L}}=w^L \sigma'(z^L)(a^L-y)$$