Перейти к содержимому

Рекомендуемые сообщения

32 минуты назад, Krutoy сказал:
В 01.06.2019 в 17:30, Seryoga сказал:

Скор --- количество блоков выкопанное за время N
Действия --- действия робота.
Состояние --- блоки от робота в радиусе R

Как определять время N? 

Действия? То есть мне на вход подавать выходные значения нормализованные до 0..1 ?

Не, это не входные данные для FFNN, это входные параметры для семейства алгоритмов RL.

N и R нужно определять исходя из окружения, например если нет гео-анализатора, то R=1, иначе выбирать в зависимости от мощности анализатора. N выбирать в зависимости от качества обучения (параметров сети). Я бы выбрал 10-30 сек на попытку.

Обычно для сетей обученных данным алгоритмом:
State[i-H: i] --- входные данные, где H размер истории (опять же выбирается в зависимости от скорости обучения, мощности окружения, мощности компа и тп)
Actions --- выходной one hot encoded вектор размерности A, где A равно количеству действий. Номер действия равен номеру максимального значения в этом векторе. `Максимального` значения, потому что, обычно, на выходе сети стоит softmax, который создаёт не идеальный one hot вектор.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
32 минуты назад, Krutoy сказал:

Если у меня будет 1 нейрон на выходе, как я буду выбирать какое действие из 5 мне делать?

Выходной нейрон - корректирующий, перерасчет весов будет происходить в зависимости от свойств данных.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Последние три для я переписывал нейросеть synaptic.js на ЛУА. И это получилось великолепно. Теперь я могу моделировать любые связи между нейронами а так же смотреть на работу LSTM сетей "изнутри".

 

А вот и наша LSTM сеть.

@Seryoga ты в роде шаришь в сетях, какие параметры в нейронах самые важные что бы их выводить на экран? Я вывожу пока вес связей и активацию.

  • Яркость кружочков отражает из значение активации
  • Белые и голубые линии показывают как сильно значение влияет на связанный нейрон
  • Зеленые и синие сегменты на нейронах указывают на state и bias соответственно 
Скрытый текст

tM8KaS1.gif

 

Я пока под новую сеть не настроил обучение, так что она еще тупее чем раньше =))

20 часов назад, Seryoga сказал:

Не, это не входные данные для FFNN, это входные параметры для семейства алгоритмов RL.

Видимо, мне нужно еще много про RL прочитать. Пока я не понимаю.

 

20 часов назад, Doob сказал:

Выходной нейрон - корректирующий, перерасчет весов будет происходить в зависимости от свойств данных.

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

Я ниче не понял. Поясни пожалуйста, или еще лучше, зарисуй.

Ты хочешь создать типа еще один выходной слой с 1 нейроном, сделать предыдущие 5 нейронов выходных - скрытым слоем?

Изменено пользователем Alex
Установка спойлера

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3 часа назад, Krutoy сказал:

сделать предыдущие 5 нейронов выходных - скрытым слоем?

Точно так. Самый простой способ обучения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
17 часов назад, Doob сказал:

Точно так. Самый простой способ обучения.

Неее, это не сработает. Обучаются то веса связей между нейронами. То есть, будет изменяться не сила выходного значения у скрытого слоя нейронов, а связь с тем самым одним на выходе.

По сути, я получу сеть, которая будет обучаться предсказывать максимальную успешность в текущих условиях

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Все легко настраивается, не вижу никаких проблем с получением нужных результатов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

hl5PPi8.pngИтак, первый кусочек исходного кода.

Это код обычного персептрона, который я использовал в самом начале. Сейчас я юзаю более сложную нейросеть LSTM, но начинал с этой.

 

https://gist.github.com/Krutoy242/e7b6618e8bc180acbe65b515a9ad1755

 

Это форк с другого кода, но я улучшил скорость работы сети, исправил ошибки и добавил удобства в работе с сетью.

В комментах есть описание и пример работы, пользуйтесь на здоровье.

В 04.06.2019 в 12:35, Doob сказал:

Все легко настраивается, не вижу никаких проблем с получением нужных результатов.

Ладно, реализовать такое не сложно, так что попробую.

 

Ну и кто то сказал что на предыдущей гифке ничего не понятно и я добавил больше описаний 

rFupTSX.gif

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Целую неделю вожусь с графикой. Это поможет сделать нейросеть более нагляднее.

 

SE3fIIQ.gif

 

А еще, я собираюсь за эту неделю перевести программу тестирования на HTML5, в браузер, так что каждый сможет попробовать свои собственные формулы для обучения. В интерфейсе можно будет брать любые параметры на входе, рассчитывать их как угодно и выдавать результат нейросети. Посмотрим, вдруг кто то из вас найдет метод лучше чем я.

 

P.S. Зачем удалили сообщения? Норм же общались...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если интерфейс масштабируется, то хватит простенького API, чтобы можно было послать на него состояние и расположение нейронов, отдельно команду роботу.

Хотя, мне бы хватило визуализатора самого робота, а то в 2D поигрался и надоело. 3D мне проще в самом майне тестить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 03.06.2019 в 17:20, Doob сказал:

Точно так. Самый простой способ обучения.

В общем я много думал, и это не вариант.

Если превратить выходные нейроны во внутренний слои и с них снимать значения, то последний один нейрон а.к.а "полезность" просто настроится всегда показывать 0. Для нейросети это беспроигрышный вариант - робот забился в угол, нейросеть определяет что польза будет 0, и ты ей обратным распространением ошибки подкрепляешь и передаешь 0.

В общем, не выйдет так делать.

 

Последние 3 дня работаю над экспортом эмулирующей программы в браузер, но и развлекаюсь добавляя анимации

wnBP4xj.gif

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
7 часов назад, Krutoy сказал:

"полезность" просто настроится всегда показывать 0.

Я так и не понял, как ты оцениваешь действия робота? Как ты его обучаешь? Если он у тебя рандомно бегает без контроля, то после любого такого "обучения" он будет творить дичь. Я ведь приводил примеры, как заставить делать его необходимые действия.

 

 

Задача: построить модель, которая будет добывать максимум блоков.


Такую примитивную задачу можно было бы и захардкодить, т. к. можно представить все возможные ситуации и условия. Ну окей, можно обучить это в дерево решений, результат от нейросетки отличаться не будет, но это тоже не наш метод.


Будем проектировать нейросеть. Для обучения надо определить условия и метрики, функция должна получать полное состояние мира и оценивать действия модели. Если модель дает результаты, отличающиеся от результатов функции оценки, то необходимо корректировать веса.

Имеем следующие действия:
  move() - 4 штуки
  turn() - 2 шт.
  swing() - 3 шт.
  detect() - 3 шт.
Для упрощения, объединим move и swing в одно действие, detect выкинем.
На вход модели можно подать информацию с предыдущего шага. Состояние move отдельно от swing, turn можно было бы засовывать с специальный буфер, но модель любого типа может и сама научиться запоминать пройденные блоки.
Следовательно, на вход надо подавать 14 бит информации в самом простом случае.


Для обучения надо сформировать метрики эффективности:

  • Эффективность добычи [кол-во добытых блоков] / [кол-во действий]

(swing+move это одно действие)
Максимальная эффективность при прямолинейном движении = 100%
Эффективность спирали из точки по этому графику стремится к 100%

To1zgPn.png

Это одномерный и двухмерный случай, для трехмерного начальная эффективность сильно зависит от точки старта, т. к. есть ограничения по вертикальной оси (есть подмножество спиралей, исходящих из двухмерного случая. В идеальной бесконечности по всем осям - объемная наматывающая спираль)

 

  • Эффективность движения/поворотов [кол-во шагов] / [кол-во повторных шагов]

При любой лучшей эффективности добычи равна 100%.
При 100% агент посещает один блок только единожды.
Позволяет оценивать и штрафовать бесполезные циклы.

 

  • Эффективность обхода

Очень сильно зависит от желаемого результата. Если надо, чтобы агент плотно выбирал блоки от стартовой точки, то можно взять такую формулу:
( [половина расстояния от текущего блока до стартовой точки] * [коэффициент притяжения] ) ^ [размерность] / [кол-во добытых блоков]
Расстояние манхэтеннское. Коэффициентом можно регулировать степень свободы движения агента. Если его совсем выкинуть - агент всегда будет немного гулять туда-сюда, относительно фронта добычи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...