gar_anat » 01 сен 2012, 22:40
В Ваших постах я увидел критику в мой адрес по поводу того, что не дал четкое ТЗ и не обозначил свой интерес. Прошу прощения.
Немного попробую внести ясность.
ТЗ: собрать некий модуль управления роботом, который будет самостоятельно подстраивать свои алгоритмы исходя из условий окружающей среды. Адекватно оценивая свои силы, я поставил себе задачу разработать этот самый модуль для простейших двухколесных роботов. Например, расположив положительные элементы (то, что хорошо), в определенном порядке мы сможем из одной и той же конструкции получить либо простейшего «БИМ», либо «Ланй рейсер», либо еще что-либо. Отрицательные элементы (что плохо) необходимы для самосохранения, чтобы элементарно робот не разбил себе «табло» с разбегу о стену.
Почему ИНС? Потому что нейрон – универсальный программный блок, ИМХО. Меняя архитектуру ИНС, можно добиться различных результатов.
Мой интерес: отличный ребус, который мне мешает спать по ночам. При этом я получаю колоссальное удовольствие, пытаясь решить его.
Что я уже имею:
1. Некий прообраз нейрона. Его я так называю нейроном, т.к. он схож по внешнему строению.
2. Общее понимание взаимодействия нейронов в сети, решающих данную задачу.
Почему не нейрон с википедии:
1. Реакция у него однозначная, либо сработать либо нет. Мне нужен такой, который с состояния «не знаю» мог перейти в состояние «скорее сработаю, чем не сработаю», «конечно сработаю», «не сработаю» и т.д.
2. Или не понял, или он не срабатывает в комбинации «или - или», «и - или».
3. Не понял, как ему настраивать весовые значения, чтобы выполнялся пункт 2.
Основная проблема реализации – в процессе проработки алгоритма взаимодействия всплывают всевозможные подводные камни в понимании процесса, например, сейчас думаю, как избавиться от шума, поступающего с внешней среды.
Могу объявить требования к моим нейронам без элемента «плохо»:
1. Прежде чем действовать, слой нейронов должен запросить «разрешение» у элемента, стоящего выше. Самый первый слой «просит» разрешение у блока «хорошо/плохо». Остальные слои запрашивают разрешение у вышестоящих слоев.
2. Реакция на сигналы у нейрона происходит случайным характером, по принципу, если должно быть «хорошо», то вероятность срабатывания выше, если никак, то ближе к нулю, но не ноль. Соответственно, в процессе обучения вес варьируется от «ближе к нулю», до максимального значения.
3. Весовые диапазоны нейрона должны растягиваться или сужаться в зависимости от частоты положительного подкрепления. Например, если элементов «хорошо» много, то диапазон сужается. А если между «хорошо» и «хорошо» необходимо долго работать вхолостую, весовые диапазоны растягиваются.
4. Если ни один нейрон в слое не сработал, слой «дает разрешение» нижестоящему слою решить задачу. Необходимо для сложных действий, например, если есть задача оттолкнуться «ногой», то для начала эту ногу нужно подтянуть под себя и упереться.
Алгоритм:
1. Запросить разрешение на активацию нейрона
2. Считать входные показатели
3. Срабатывание (0/1)
4. Выполнение команды
5. Проверка блока удовольствия/боли (оценка реакции)
6. Корректировка весовых значений
7. Возвращение в исходное состояние
К вопросу реализации:
Продолжайте кидать в меня камни, но я владею поверхностно только Delphi (в мое детство еще в школе давали азы программирования, было интересно – немного освоил)
Поэтому, реализация для начала, алгоритмы и блок схемы. Вопрос, где эти алгоритмы реализовывать не рассматривается, т.к. это уже следующий шаг.
Дорогу осилит идущий.