| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Программирование игр, графики и искусственного интеллекта > Алгоритм обратного распространения |
| Автор: Deliverer 12.6.2013, 08:47 |
| Здравствуйте. Я захотел реализовать алгоритм обратного распространения. Вроде бы разобрался, закодил, но… Возникает ошибка следующего характера: после прогона всех образов обучающей выборки, начинаю проверку и подаю на вход сети снова, последовательно, образы обучающей выборки и происходит следующее: выход нейронов последнего скрытого слоя почти не изменяется и лежит в диапазоне желаемого выхода последней обучающей выборки + - 0,09. Пример: Желаемый выход последней обучающей выборки 0, 64, Выходы при тесте - 0, 635, 0, 637, 0, 643 и т.д. В качестве учителя использовалась функция y=x^2. Было создано 9 примеров обучения. Сеть имела следующую конфигурацию: 1 вход, 3 скрытых слоя 4-5-1. Изменение числа слоев и увеличение количества нейронов до 1000 результата никакого не дали. Подозреваю, что накосячил в алгоритме, прошу меня перепроверить: 1. Произвожу прямой проход,нахожу локальное поле нейрона получаю выход нейрона. Активационная функция - экспоненциальный сигмоид. Когда рассчитаны все нейроны слоя, произвожу запись значений выходного слоя во входы нейронов следующего слоя. 2. Рассчитываю ошибку выходного слоя. Из требуемого значения вычитаю фактическое. Нахожу производную функции экспоненциального сигмоида. Считаю локальный градиент перемножением производной на ошибку. Получаю сумму перемножений всех входов нейрона на локальный градиент, и умножаю её на скорость коррекции =0,5(варьирование этого параметра не помогает) . Далее к каждому весу прибавляю значение коррекции. 3. Рассчитываю значение коррекции для оставшихся скрытых слоев, делаю следующее: Получаю сумму перемножений значений весовых коэффициентов синаптических связей входов нейронов следующего слоя, связанных с рассчитываемым нейроном, с локальным градиентом нейрона, вес входа которого беру. Если j –текущий слой, k- следующий, то Fsumm+=Wjk*Gradient Умножаю fsumm на производную активационной функции Получаю локальный градиент нейрона. 4. Получаю сумму перемножений всех входов нейрона на локальный градиент, и умножаю её на скорость коррекции =0,5(варьирование этого параметра не помогает) . Далее к каждому весу прибавляю значение коррекции. Непосредственной вычислительной ошибки, такой как банальная путаница в индексах массива у меня нет. Правильность расчетов я проверил. Очень прошу подать мне идеи для нахождения ошибки |
| Автор: Deliverer 12.6.2013, 13:37 | ||||
Да, именно это и имею ввиду. Как я понял из книги Хайкина, такого не должно быть в независимости от типа обучения - последовательного или пакетного... |
| Автор: Bitter 12.6.2013, 13:51 |
| Вы видимо попадаете в локальный минимум из которого сеть не может выбраться. Попробуйте поменять порядок образов, сделать другую выборку, использовать пакетный способ обучения, уменьшить шаг обучения. Ну и если после этих манипуляций результата не будет, тогда можно думать дальше |
| Автор: Deliverer 12.6.2013, 14:23 | ||
Я попробовал функцию y=x+2 и получил в итоге тоже самое. Попробую, конечно, обучить в пакетном режиме, хотя большого смысла не вижу. |