И давеча пришла простая и очевидная мысль как решить эту проблему.
Обучение НС с многомерным вектором ответа
1. К каждому элементу вектора ответа нейронной сети добавляем небольшую случайную величину от -r до +r.
2. Примитив ходит согласно этому ответу и получает значение поощрения или наказания.
3. Далее происходит обучение обычным методом обратного распространения ошибки по эталону. Для этого сеть вновь пересчитывает значение, теперь уже без добавления случайной величины. И, если примитив поощрили, то эталоном выступает ответ сети с добавлением случайной величины, иначе - обратный вектор.
Таким образом появляются новые неколлинеарные вектора ответов. И это действительно работает.
Это правда работало, но сеть вела себя очень неуверенно. Значения элементов вектора ответов были небольшие и сравнимы с величиной r.
Причина заключалась в распределении случайной величины. Вот пример с багом:
Ситуацию поправил новый принцип добавления случайной величины. Придумывая его, я руководствовался следующими правилами:
1. Чем больше значение элемента вектора ответа, тем более вероятно добавление к нему положительной величины, нежели отрицательной.
2. Ежели ответ равен нулю, то случайная величина может быть равновероятно положительная и отрицательная.
В итоге получилась формула:
Учитывая что neuron.out дает значения из отрезка [-1;1]neuron.out += (random.random() - (1 - neuron.out) / 2) * random_value
После этой модификации, успевший обучиться, Примтив дает уверенный ответ в каком направлении двигаться.
Отсутствие восприятия
Такая эффективность и быстрая обучаемость Примитива зародили в мозгу мысль: "что если убрать всякое восприятие?". Так было сделано и оно работало! Таким образом данная сеть быстро адаптируется к условиям, выдавая n-мерный вектор ответа, обучаясь лишь информацией поощрения\наказания, при этом она запоминает оптимальное поведение, если восприятие присутствует.
Вывод
Посмотреть это безобразие можно здесь:
Исходный код можно скачать тут: https://github.com/zshimanchik/primitive-reflexes/releases/tag/3d-release
Но эта сеть не способна запоминать последовательность действий, это самый обычный перцептрон. И сейчас я работаю над новой моделью, для которой нужна будет сеть, способная обучаться последовательности действий на основе того же поощрения и наказания.



No comments:
Post a Comment