Вход
Регистрация

Помогите с алгоритмом обратного распространения ошибки

Здравствуйте! У меня такая проблема: пишу программу по созданию и обучению нейронных сетей для диплома, в качестве теоретической основы использую книгу Станислава Осовского "Нейронные сети для обработки информации", так вот, я остановился на нахождении градиента, дело в том, что градиент, найденный с помощью предложенного в книге метода потоковых графов, не указывает в направлении наибольшего роста функции.. как я это установил - нахожу направление градиента, потом беру и прибавляю к весам сети этот градиент с разными коэффициентом обучения, например сто точек со знаком "-" и сто точек со знаком "+" равномерно, например
-1, -0.99, -0.98, .... -0.01, 0, 0.01, 0.02, .... 0.99, 1
или так
for(int i=-100; i< 100; i++)
{
step.Add(i * 0.01);
}
причем, я брал шаги и 0.1 и 0.01 и всякие другие вплоть до 0.00000000001
И что я вижу - в месте прохождения точки 0 у меня целевая функция (которая берется как предложено в книге: сумма разности координат в квадрате деленное на 2) то возрастает, то убывает, а должна все время возрастать, как я понимаю, ведь я же двигаюсь этими точками по направлению градиента.
Немного о сетях, которые я брал:
распределение начальных весов в интервале [-1; 1]
беру 1-4 скрытых слоя, примерно по 4-10 нейронов, входной вектор 5 или 8, выходной брал 1 или 7
(тестовые данные для проверки сети есть только в формате 5 координат во входном векторе 1 в выходном или 8 во входе 7 в выходе)
Причем, в программе ошибок нету... просто брал тестовую сетку и просчитывал все слои в прямом проходе и в обратном для сопряженного графа, считал градиент вручную (по алгоритмам Осовского через те же потоковые графы)
Функции активации - сигмоидальная биполярная и униполярная (с обоими одинаковые проблемы).

Так вот.. может я что-то не так понял в приминении потоковых графов, но, вроде, там все просто. Может есть какие-то ограничения на их использование? Как я понял они применимы для всех гладких функций активации или нет?
Еще я заметил, что если подавать на вход сети вектора без отрицательных координат, то вероятность, что градиент будет указывать в неправильную сторону сильно падает и правильный результат встречается с вероятностью 0.9
Что это может быть???
Подскажите, пожалуйста ... если подробнее нужно рассказать про эксперемент задайте вопросы, я постораюсь объяснить подробнее.