Tuesday, June 16, 2015

Обучение НС с многомерным вектором ответа

Продолжаю разрабатывать свои идеи касающиеся моделирования условных рефлексов из этого поста. Самая главная проблема там решена весьма криво, хоть все и работало. Я говорю о случае с многомерным действием, когда Примитив может двигаться вправо\влево и вверх\вниз. Мы можем лишь поощрить его, либо наказать, но никак не сообщить по какому направлению  насколько ему лучше идти. Это терзало меня и не давало спать по ночам. =)
И давеча пришла простая и очевидная мысль как решить эту проблему.

Обучение НС с многомерным вектором ответа


1. К каждому элементу вектора ответа нейронной сети добавляем небольшую случайную величину от -r до +r.
2. Примитив ходит согласно этому ответу и получает значение поощрения или наказания.
3. Далее происходит обучение обычным методом  обратного распространения ошибки по эталону. Для этого сеть вновь пересчитывает значение, теперь уже без добавления случайной величины. И, если примитив поощрили, то эталоном выступает ответ сети с добавлением случайной величины, иначе - обратный вектор.
Таким образом появляются новые неколлинеарные вектора ответов. И это действительно работает.
Это правда работало, но сеть вела себя очень неуверенно. Значения элементов вектора ответов были небольшие и сравнимы с величиной r.
Причина заключалась в распределении случайной величины. Вот пример с багом:
Случайная величина укорачивает вектор, и если направление было верным, то вместо того, чтобы устремиться в ту сторону, нейронная сеть обучится более короткому вектору. И, так как прямоугольник случайных величин равнораспределен, вектор равновероятно может увеличиться или уменьшиться,  а учитывая еще и случаи с наказанием, стремящий вектор к нулю, можно понять почему значения были так невелики, и Примитив был так неуверен.
Ситуацию поправил новый принцип добавления случайной величины. Придумывая его, я руководствовался следующими правилами:
1. Чем больше значение элемента вектора ответа, тем более вероятно  добавление к нему положительной величины, нежели отрицательной.
2. Ежели ответ равен нулю, то случайная величина может быть равновероятно положительная и отрицательная.
В итоге получилась формула:
neuron.out += (random.random() - (1 - neuron.out) / 2) * random_value
Учитывая что neuron.out дает значения из отрезка [-1;1]
После этой модификации, успевший обучиться, Примтив дает уверенный ответ в каком направлении двигаться.

Отсутствие восприятия

Такая эффективность и быстрая обучаемость Примитива зародили в мозгу мысль: "что если убрать всякое восприятие?". Так было сделано и оно работало! Таким образом данная сеть быстро адаптируется к условиям, выдавая n-мерный вектор ответа, обучаясь лишь информацией поощрения\наказания, при этом она запоминает оптимальное поведение, если восприятие присутствует.

Вывод

Посмотреть это безобразие можно здесь:
Исходный код можно скачать тут: https://github.com/zshimanchik/primitive-reflexes/releases/tag/3d-release
Но эта сеть не способна запоминать последовательность действий, это самый обычный перцептрон. И сейчас я работаю над новой моделью, для которой нужна будет сеть, способная обучаться последовательности действий на основе того же поощрения и наказания.













 

No comments:

Post a Comment