2016-09-22 6 views
5

Я играю с нейронной сетью. Я реализовал сам себя: это тривиальная прямая сеть, использующая RPROP как алгоритм обучения как единственный «плюс» по сравнению с базовым дизайном.Нейронные сети и функция XOR

Оценка сети оценивается прилично, когда я тестирую ее против MNIST или когда я пытаюсь выполнить сжатие изображения, но когда я пытаюсь моделировать что-то простое, как функция XOR, иногда во время обучения он попадает в локальные минимумы и выводит следующая истина таблица:

0 XOR 0 = 1.4598413968251171e-171 
1 XOR 0 = 0.9999999999999998 
0 XOR 1 = 0.9999999999999998 
1 XOR 1 = 0.5 

Часто результат после тренировки правильно, но иногда 1 XOR 1 выход 0,5 вместо 1, как это должно быть. Это не всегда происходит с XOR (1,1), но с другими входами. Являясь функцией XOR как «классической» в литературе по обратному распространению, я задаюсь вопросом, что здесь происходит, особенно учитывая, что моя сеть, как представляется, изучает более сложные (но, возможно, менее нелинейные) задачи.

Мое дикое предположение - это что-то не так с предубеждениями.

Подсказка?

Примечание 1: расположение сети выше 2 | 3 | 1, но не сильно меняет, когда я использую более скрытые блоки, некоторые попытки обучения по-прежнему идут не так.

Примечание 2: Я поставил реализацию в Сущностью: https://gist.github.com/antirez/e45939b918868b91ec6fea1d1938db0d

+0

какая функция вы используете? вы можете поделиться? – ACV

+0

Я просто gisti-fied всю реализацию здесь: https://gist.github.com/antirez/e45939b918868b91ec6fea1d1938db0d Это очень простой материал. EDIT: просто добавлен файл заголовка. – antirez

+0

На самом деле, тестируя больше, я обнаружил, что это не просто ошибка XOR (1,1), но и другие могут выдавать 0.5. – antirez

ответ

2

Проблема была из-за ошибки в моей реализации: смещения единицы NN непосредственно перед выходной блок не рассчитывалась правильно. После исправления кода функция XOR всегда вычисляется правильно.