У меня есть нейронная сеть, написанная на стандарте C ++ 11, которая, как мне кажется, правильно следует алгоритму обратного распространения (на основе этот). Однако если вывести ошибку на каждом шаге алгоритма, он, похоже, будет колебаться без затухания с течением времени. Я попытался полностью исключить импульс и выбрать очень малую скорость обучения (0,02), но она все еще колеблется с примерно одинаковой амплитудой на сеть (каждая сеть имеет различную амплитуду в определенном диапазоне).
Кроме того, все входные данные приводят к одному и тому же результату (проблема, которую я нашел опубликованной здесь раньше, хотя для другого языка. Автор также упоминает, что он никогда не работал.)
Код можно найти Вот.
Подводя итог, как я реализовал сеть:
Neuron
с текущими весами нейронам впереди них, предыдущие изменения этих весов и сумма всех входов.Neuron
Можно получить доступ к их значению (сумме всех входов) или вывести результат передачи указанного значения через заданную функцию активации.NeuronLayer
действует как Neuron
контейнеры и установить фактические подключения к следующему слою.NeuronLayer
Они могут отправлять фактические результаты на следующий уровень (вместо извлечения из предыдущего).FFNeuralNetwork
действуют как контейнеры для NeuronLayer
и управлять прямым распространением, вычислением ошибок и обратным распространением. Они также могут просто обрабатывать вводимые данные.FFNeuralNetwork
отправляет свои взвешенные значения (значение * вес) на следующий слой. Каждый нейрон в каждом слое впоследствии выводит взвешенный результат функции активации, если это не смещение, или слой не является выходным слоем (смещения выводят взвешенное значение, выходной слой просто пропускает сумму через функцию активации).Я сделал фундаментальную ошибку в реализации (недоразумение теории), или есть какая-то простая ошибка, которую я еще не нашел? Если это будет ошибка, где это может быть?
Почему ошибка может колебаться в зависимости от величины (около + — (0,2 + — скорость обучения)) даже при очень низкой скорости обучения? Почему все выходы могут быть одинаковыми, независимо от входа?
Я прошел через большую часть этого настолько, что мог бы пропустить что-то, но я думаю, что у меня может быть неправильное понимание теории.
Оказывается, я просто слишком много смотрел на части FFNeuralNetwork и случайно использовал неправильный набор входных данных, чтобы подтвердить правильность сети. Это действительно работает правильно с правильной скоростью обучения, импульсом и количеством итераций.
В частности, в main
Я использовал inputs
вместо меньшего массива in
проверить выходы сети.