Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование игр, графики и искусственного интеллекта > XOR-задача. нейронные сети


Автор: almaz1988 12.6.2013, 17:14
Доброго времени суток всем)
Я новичок в нейронных сетях.
Изучаю их по книге Хайкина "Нейронные сети. Полный курс".
Читаю главу за главой и реализовываю все прочитанное на языке С++.

Глава 3. Однослойный персептрон.  - Здесь проблем не возникло. Написал программу в С++ распознающую образы с помощью однослойного персептрона.
Перешел к главе 4 - "Многослойный персептрон". Написал программу, реализующую многослойный персептрон. 
Решил решить задачу XOR:

2 входа, 2 нейрона в скрытом слое и 1 нейрон в выходном слое. 
Веса генерируются рандомно в диапазоне от -0.9 до +0.9. Веса корректируются после каждой обучающей пары, а не после эпохи в целом.
Активационная функция - логистическая: F(x)= 1/ ( 1 + exp( 2 - 4*x ) ).
Обучающая выборка состоит из 4-ех пар:
0  0  |   0
0  1  |   1
1  0  |   1
1  1  |   0

Запускаю - не обучается! Меняю скорость обучения, количество эпох обучения - не помогает. 

Принялся рыть в интернете. Наткнулся на статью:http://21.net78.net/lesson.php?glava=2.
Там приводится решение задачи XOR с той же структурой сети ( 2-1 ) с конкретно заданными стартовыми значениями весов:
1-й нейрон скрытого слоя: -0.082843 и 0.018629.  
2-й нейрон скрытого слоя: - 0.011006 и - 0.071407.
нейрон выходного слоя: 0.032680 и 0.020701.

Запускаю обучение своей сети с этими весами - срабатывает! Сеть обучается!
Но не хочет обучаться с рандомными весами. Меняю диапазоны генерации весов - не помогает.
По-видимому я столкнулся с каким-нибудь эффектом при обучении в сети, но т.к. слабо ориентируюсь в тематике не понимаю с каким именно. Судя по Хайкину - желательно обучать сеть корректируя веса после каждой обучающей выборки в целом, а не после каждой отдельной обучающей пары. Но все же интересно понять в чем суть возникшей проблемы. 
Почему сеть обучается только при определенных сочетаниях весов? Наверняка для опытных кодеров нейронных сетей это детский вопрос) Буду благодарен за разъяснения)
 

Автор: almaz1988 12.6.2013, 20:41
Применил в качестве активационной функции гиперболического тангенс. Помогло! Сеть обучается при рандомных стартовых весах. Но при входных значениях от 0 до 1. Если же ноли заменить на -1, как и должно быть при использовании гиперболического тангенса, то сеть не обучается. В общем непонятно.

Автор: Bitter 19.6.2013, 22:40
Сегодня реализовал тот же самый урок - у меня все отлично работает с логистической функцией. Правда при отладке я нарыл у себя несколько ошибок в алгоритме обучения, но потом исправил и все ок. Может у вас та же проблема?

только там в примере функция немного от вашей отличается - 1 / (1 + exp(-4*(x-0.5))) Может в этом ошибка, Вы ж наверное производную взяли из урока?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)