Я пытаюсь понять, как backpropagation работает математически и хочет реализовать его в python с numpy. Я использую прямую нейронную сеть с одним скрытым слоем для своих вычислений, сигмоид как функцию активации, среднеквадратическую ошибку как функцию ошибки. Это скриншот результата моих вычислений, и проблема в том, что существует множество матриц, и я не могу их полностью размножать, потому что они не имеют одинаковых размеров. (На снимке экрана L - это выходной уровень, L-1 - скрытый уровень, L-2 - это уровень ввода, W - вес, E - функция ошибки, строчная буква A - активация)
(В коде первый уровень имеет 28 * 28 узлов, [потому что я использую базу данных MNIST из 0-9 цифр как данные обучения], скрытый уровень - 15 узлов, выходной уровень - 10 узлов).
# ho stands for hidden_output
# ih stands for input_hidden
def train(self, input_, target):
self.input_ = input_
self.output = self.feedforward(self.input_)
# Derivative of error with respect to weight between output layer and hidden layer
delta_ho = (self.output - target) * sigmoid(np.dot(self.weights_ho, self.hidden), True)) * self.hidden
# Derivative of error with respect to weight between input layer and hidden layer
delta_ih = (self.output - target) * sigmoid(np.dot(self.weights_ho, self.hidden), True)) * self.weights_ho * sigmoid(np.dot(self.weights_ih, self.input_), True) * self.input_
# Adjust weights
self.weights_ho -= delta_ho
self.weights_ih -= delta_ih
В delta_ho =...
размерность матриц равна (10x1 - 10x1) * (10x1) * (1x15), так как я могу вычислить это? Спасибо за любую помощь!
Вот примечание от CS231 Стэнфорда: http://cs231n.github.io/optimization-2/.
Для обратного распространения с матрицей/векторами следует помнить, что градиент wrt (относительно) переменной (матрицы или вектора) всегда имеет ту же форму, что и переменная.
Например, если потеря равна l
, в вычислении потерь выполняется операция умножения матрицы: C = A.dot(B)
. Пусть пусть A
имеет форму (m, n)
а B
имеет форму (n, p)
(следовательно, C
имеет форму (m, p)
). Градиент по C
является dC
, который также имеет форму (m, p)
. Чтобы получить матрицу, которая имеет форму A
с использованием dC
и B
, мы можем только до dC.dot(BT)
которая является умножением двух матриц формы (m, p)
и (p, n)
чтобы получить dA
, градиент потери по A
Аналогично, градиент потери по B равен dB = ATdot(dC)
.
Для любой дополнительной операции, такой как сигмоид, вы можете связать их назад, как и везде.