Понимание ошибки в реализации oop Backprop - PullRequest
1 голос
/ 01 февраля 2020

Добрый вечер всем. Я уже довольно часто использую NN, поэтому я подумал, что пора взглянуть на задний план. В результате я провел довольно много часов с моей реализацией c ++ нейронной сети с нуля. Тем не менее, я не получаю никакой полезной информации.

Моя проблема заключается в чистой OOP и эффективной реализации, особенно в том, что мне нужно для обратного распространения от одного класса Layer к другому. Я знаю, что я просто пропускаю полный расчет / пересылку якобиевых матриц, но, насколько я понимаю, в этом нет необходимости, так как большинство записей будет вырезано.

У меня есть класс softmax с размером n:

прямой проход: он принимает входной вектор ввода длины n и создает выходной вектор вывода размера n.
sum = 0; for (int i = 0; i < n; i++) sum += e^input[ i ].
Затем он вычисляет выходной вектор выходной длины n с:
output [ i ] = e^input [ i ] / sum

Обратный проход: требуется целевой вектор обратной связи размера n, целевое значение.
У меня нет весов или смещений в моем класс softmax, поэтому я просто вычисляю обратную связь вектора обратной связи размером n:
feedback[ i ] = output[ i ] - target[ i ]
. Это то, что я возвращаю из своего слоя softmax.

У меня есть полностью подключенный класс: m -> n

Forward Pass: требуется входной вектор размером m. Я вычисляю net вектор активности net размера n и выходной вектор размера n:
net[ i ] = b[ i ];
for (int j = 0; j < m; j++) net[ i ] += w[ i ][ j ] * input[ i ]
output [ i ] = 1 / (1 + e^-net[ i ])

Обратный проход: Он берет вектор обратной связи размера n из следующего слоя.
b'[ i ] = b[ i ] + feedback[ i ] * 1 * learningRate
w'[ i ][ j ] = w[ i ][ j ] + feedback[ i ] * input[ j ] * learningRate
Новый массив обратной связи размера m:
feedback'[ i ] = 0;
feedback'[ i ] += feedback[ j ] * weights[ i ][ j ] * (output[ j ] * (1 - output[ j ]))

Конечно, обратная связь от одного полностью связанного слоя будет передана следующему, и так далее. Я читал несколько статей и нашел эту статью довольно приятной: https://www.ics.uci.edu/~pjsadows/notes.pdf

Мне кажется, что моя реализация должна быть идентична той, что я читал в таких статьях, но даже после небольшое количество обучающих примеров (~ 100) моя сетевая производительность приближается к постоянной. По сути, как будто это будет зависеть от предвзятости

Итак, кто-то может дать мне подсказку, если я ошибаюсь в своем теоретическом понимании или у меня просто есть некоторые проблемы с моей реализацией?

...