У меня есть проблема, когда я пытаюсь создать нейронную сеть для Tic-Tac-Toe.Однако, по какой-то причине, обучение нейронной сети приводит к тому, что она выдает почти одинаковый выход для любого заданного ввода.
Я взглянул на Тест искусственных нейронных сетей , но моя реализация сетипостроен для нейронов с одинаковой функцией активации для каждого нейрона, то есть без постоянных нейронов.
Чтобы убедиться, что проблема не только в моем выборе обучающего набора (1218 состояний доски и ходы, генерируемые генетическималгоритм), я пытался обучить сеть для воспроизведения XOR.Была использована функция логистической активации.Вместо того, чтобы использовать производную, я умножил ошибку на output*(1-output)
, так как некоторые источники предположили, что это эквивалентно использованию производной.Я могу поместить исходный текст на Haskell в HPaste, но на это немного неловко смотреть.Сеть имеет 3 уровня: первый уровень имеет 2 входа и 4 выхода, второй имеет 4 входа и 1 выход, а третий имеет 1 выход.Увеличение до 4 нейронов во втором слое не помогло, равно как и увеличение до 8 выходов в первом слое.
Затем я вычислял ошибки, выход в сеть, обновления смещения и обновления веса вручную, основываясь наhttp://hebb.mit.edu/courses/9.641/2002/lectures/lecture04.pdf чтобы убедиться, что в этих частях кода не было ошибки (не было, но я, вероятно, сделаю это снова, просто чтобы убедиться).Поскольку я использую пакетное обучение, я не умножил на x
в уравнении (4).Я добавляю изменение веса, хотя http://www.faqs.org/faqs/ai-faq/neural-nets/part2/section-2.html предлагает вместо этого вычесть это.
Проблема сохранялась даже в этой упрощенной сети.Например, это результаты после 500 эпох пакетного обучения и дополнительного обучения.
Input |Target|Output (Batch) |Output(Incremental)
[1.0,1.0]|[0.0] |[0.5003781562785173]|[0.5009731800870864]
[1.0,0.0]|[1.0] |[0.5003740346965251]|[0.5006347214672715]
[0.0,1.0]|[1.0] |[0.5003734471544522]|[0.500589332376345]
[0.0,0.0]|[0.0] |[0.5003674110937019]|[0.500095157458231]
Вычитание вместо сложения приводит к той же самой проблеме, за исключением того, что все равно 0,99 что-то вместо 0,50 что-то.5000 эпох дает тот же результат, за исключением того, что сеть с обучением по пакетам возвращает точно 0,5 для каждого случая.(Черт, даже 10 000 эпох не работали для пакетного обучения.)
Есть ли вообще что-нибудь, что могло бы вызвать такое поведение?
Кроме того, я посмотрел на промежуточные ошибки для инкрементального обучения,и хотя входы скрытого / входного слоев варьировались, ошибка для выходного нейрона всегда была +/- 0,12.Для пакетного обучения ошибки увеличивались, но очень медленно, и все ошибки были чрезвычайно малы (x10 ^ -7).Разные начальные случайные веса и смещения также не имели значения.
Обратите внимание, что это школьный проект, поэтому советы / руководства будут более полезными.Хотя изобретать велосипед и создавать свою собственную сеть (на языке, которого я не очень хорошо знаю!) Было ужасной идеей, я чувствовал, что это будет более уместно для школьного проекта (так что я знаю, что происходит ... в теории,по крайней мере, в моей школе, кажется, нет учителя информатики.)
РЕДАКТИРОВАТЬ: два слоя, входной слой с 2 входами на 8 выходов и выходной слой с 8 входами на 1 выход, дает почти одинаковые результаты: 0,5 +/- 0,2 (или около того) для каждого случая обучения.Я также играю с pyBrain, чтобы посмотреть, будет ли работать какая-либо структура сети.
Редактировать 2: Я использую скорость обучения 0,1.Извините, что забыл об этом.
Редактировать 3: "TrainUntilConvergence" из Pybrain также не дает мне полностью обученную сеть, как 20000 эпох, с 16 нейронами в скрытом слое.10000 эпох и 4 нейрона, не так много, но близко.Итак, в Haskell с входным слоем, имеющим 2 входа и 2 выхода, скрытым слоем с 2 входами и 8 выходами и выходным слоем с 8 входами и 1 выходом ... У меня такая же проблема с 10000 эпохами.И с 20000 эпохами.
Редактировать 4: Я снова запустил сеть вручную на основе MIT PDF, приведенного выше, и значения совпадают, поэтому код должен быть правильным, если я не понимаю эти уравнения.
Часть моего исходного кода находится по адресу http://hpaste.org/42453/neural_network__not_working; Я работаю над тем, чтобы немного очистить свой код и поместить его в Github (а не в частный Bitbucket) репозиторий.
Весь соответствующий исходный код теперь находится на https://github.com/l33tnerd/hsann.