У меня проблема, когда я пытаюсь создать нейронную сеть для 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: Pybrain "trainUntilConvergence" также не дает мне полностью обученную сеть, но это делает 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.