Пример обратного распространения - PullRequest
1 голос
/ 10 апреля 2020

Я пытаюсь реализовать свою собственную нейронную сеть, но я не очень уверен, что моя математика верна.

Я делаю распознавание MNIST di git, поэтому у меня установлен softmaxed вывод 10 вероятностей. в качестве вывода. Затем я вычисляю свой дельта-вывод следующим образом:

delta_output = vector of outputs - one-hot encoded actual label

delta_output - это матрица с размером 10 x 1.

Затем я вычисляю дельту для весов последнего скрытого слоя следующим образом:

delta_hidden = weight_hidden.transpose * delta_output * der_hidden_activation(output_hidden)

Предполагая, что в последнем скрытом слое имеется N узлов, weight_hidden является матрицей измерения N на 10, delta_output сверху равен 10x1, а результат der_hidden_activation (output_hidden) равен N x 1.

Теперь мой первый вопрос: должны ли умножения delta_output и der_hidden_activation (output_hidden) возвращать матрицу 10 x N с использованием внешнего продукта? Я думаю, что мне нужно сделать продукт Адамара из этой результирующей матрицы с нетронутыми весами, чтобы delta_hidden по-прежнему был N x 10.

Наконец, я умножил это delta_hidden на свою скорость обучения и вычел ее из исходного веса. последнего скрытого слоя, чтобы получить мои новые веса.

Мой второй и последний вопрос здесь, я что-то пропустил?

Заранее спасибо.

1 Ответ

0 голосов
/ 10 апреля 2020

Предполагая, что в последнем скрытом слое имеется N узлов, weight_hidden является матрицей измерения N на 10, значение delta_output сверху равно 10x1, а результат der_hidden_activation (output_hidden) равен N x 1.

При переходе от слоя из N нейронов (скрытый слой) к слою из M нейронов (выходной слой) при умножении матрицы размеры матрицы веса должны быть M x N. Таким образом, для стадии обратного распространения, переходящей от слоя M нейронов (выход) к слою N нейронов (скрытый слой), используйте transpose матрицы весов, которая даст вам матрицу измерения ( N x M).

Теперь, мой первый вопрос: должны ли умножения delta_output и der_hidden_activation (output_hidden) возвращать матрицу 10 x N, используя внешний продукт? Я думаю, что мне нужно сделать продукт Адамара из этой результирующей матрицы с нетронутыми весами, чтобы сделать delta_hidden равным N x 10.

Да, вам нужно использовать hadamard product однако вы не можете умножать delta_output и der_hidden_activation (output_hidden), поскольку это матрицы разных размеров (10 x 1 и N x 1 соответственно). Вместо этого вы умножаете транспонирование матрицы hidden_weight (N x 10) на delta_output (10 x 1), чтобы получить матрицу N x 1, а затем выполняете произведение hadamard с der_hidden_activation (output_hidden).

Если I я перевожу это правильно ...

hidden_weight matrix = image

delta_output = image

delta_hidden = image

der_hidden_activation(output_hidden) = image

Plugging this into the BP formula...

image

As you can see, you need to multiply the transpose of the weight_hidden (N x 10) with delta_output (10 x 1) first to produce a matrix (N x 1), and then you use hadamard product with der_hidden_activation(output_hidden).

Finally I multiply this delta_hidden by my learning rate and subtract it from the original weight of the last hidden layer to get my new weights.

You don't multiply delta_hidden by the learning rate. You need to use the learning rate on a bias and delta weight matrix...

The delta weight matrix is a matrix of the same dimensions as your (hidden) weight matrix and is calculated using the formula...

image

And then you can easily apply the learning rate...

image

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

...