Нейронная сеть дает одинаковый выход для разных входов, не учится

У меня есть нейронная сеть, написанная на стандарте C ++ 11, которая, как мне кажется, правильно следует алгоритму обратного распространения (на основе этот). Однако если вывести ошибку на каждом шаге алгоритма, он, похоже, будет колебаться без затухания с течением времени. Я попытался полностью исключить импульс и выбрать очень малую скорость обучения (0,02), но она все еще колеблется с примерно одинаковой амплитудой на сеть (каждая сеть имеет различную амплитуду в определенном диапазоне).

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

Код можно найти Вот.

Подводя итог, как я реализовал сеть:

  • Neuronс текущими весами нейронам впереди них, предыдущие изменения этих весов и сумма всех входов.
  • NeuronМожно получить доступ к их значению (сумме всех входов) или вывести результат передачи указанного значения через заданную функцию активации.
  • NeuronLayerдействует как Neuron контейнеры и установить фактические подключения к следующему слою.
  • NeuronLayerОни могут отправлять фактические результаты на следующий уровень (вместо извлечения из предыдущего).
  • FFNeuralNetworkдействуют как контейнеры для NeuronLayerи управлять прямым распространением, вычислением ошибок и обратным распространением. Они также могут просто обрабатывать вводимые данные.
  • Входной слой FFNeuralNetwork отправляет свои взвешенные значения (значение * вес) на следующий слой. Каждый нейрон в каждом слое впоследствии выводит взвешенный результат функции активации, если это не смещение, или слой не является выходным слоем (смещения выводят взвешенное значение, выходной слой просто пропускает сумму через функцию активации).

Я сделал фундаментальную ошибку в реализации (недоразумение теории), или есть какая-то простая ошибка, которую я еще не нашел? Если это будет ошибка, где это может быть?

Почему ошибка может колебаться в зависимости от величины (около + — (0,2 + — скорость обучения)) даже при очень низкой скорости обучения? Почему все выходы могут быть одинаковыми, независимо от входа?

Я прошел через большую часть этого настолько, что мог бы пропустить что-то, но я думаю, что у меня может быть неправильное понимание теории.

3

Решение

Оказывается, я просто слишком много смотрел на части FFNeuralNetwork и случайно использовал неправильный набор входных данных, чтобы подтвердить правильность сети. Это действительно работает правильно с правильной скоростью обучения, импульсом и количеством итераций.

В частности, в mainЯ использовал inputs вместо меньшего массива in проверить выходы сети.

0

Другие решения