Как умножить матрицы в результате использования правила цепочки в алгоритме обратного распространения

1

Я пытаюсь понять, как 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), так как я могу вычислить это? Спасибо за любую помощь!

Теги:
machine-learning
backpropagation

1 ответ

1
Лучший ответ

Вот примечание от 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).

Для любой дополнительной операции, такой как сигмоид, вы можете связать их назад, как и везде.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню