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

Крутой робот на нейросетях

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

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% агент посещает один блок только единожды.
Позволяет оценивать и штрафовать бесполезные циклы.

 

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

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

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


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

Как ты его обучаешь?

Я покажу как устроена программа. Код будет на языке Moonscript, но думаю будет понятно.

 

  • При инициализации, я указываю какие параметры будут подаваться на вход. Вторым параметром я указываю зависимость значения на коэффициент полезности. При его подсчете я складываю все значения fn(n) и делю на их количество (в данном случае 8)
addInput "tt_swingSuccesSide", "n"  , {"swing forward", "swing down", "swing up"}
addInput "tt_explored",        "n/3", {"explored forward","explored down","explored up"}
addInput "tt_closerToSweets",  "n*3", {"closer to sweets"}
addInput "wasThere",           "1-n", {"was there",}
  • В цикле действий, я подаю данные на входе для принятия решения, и выбираю самое большое значение - именно оно и будет выполнено роботом
output = nn_activate(input)
actKey, actVal = getHigherkv(output) -- actKey индекс с самым большим значением на выходе
  • Затем делаются все действия и собирается новая информация, которая в следующей итерации подается на вход input
  • В конце рассчитывается полезность действия о которой я говорил в самом верху. Именно это значение устанавливается как целевое для обратного распространения ошибки в выбранное действие. А вот с остальными действиями все сложнее.
    ("конфеткой" я называю блок, в котором  (мы не были) and  (что то копнули) and (хотя бы один из соседних блоков не разведан) )
Q = input\getQuality()

Qi = 1-Q
for i=#output, 1, -1 do
  output[i] = switch i
    when actKey -- Совершенное действие
      Q
    when optimalSide -- Действие, при котором расстояние до последней "конфетки" было бы меньше
      Qi
    when oppositeKey -- Обратное действие (вниз-вверх, влево-вправ)
      output[i]/2
    else
      0

nn_propagate(output)

 

В 16.06.2019 в 05:09, Doob сказал:

  move() - 4 штуки
  turn() - 2 шт.
  swing() - 3 шт.
  detect() - 3 шт.

 

14 бит информации

Детекцию делать в самом простом случае не нужно. swing() уже сам по себе детекция, и говорит, что за блоки у нас вокруг.

Я вообще все действия сократил до 5ти - движение и поворот, кроме движения назад. swing() все равно надежнее всего делать каждое действие.

Вот мой список действий:

robotActions = {
  -> robot.tryMove(sides.forward)
  -> robot.tryMove(sides.down)
  -> robot.tryMove(sides.up)
  -> robot.turnRight() and false
  -> robot.turnLeft() and false
}

 

В 16.06.2019 в 05:09, Doob сказал:

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

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

Я не понял, зачем нам учитывать в расчетах эффективность движения и обхода? Разве нам не плевать как он двигается, если эффективность добычи нулевая? Или если она 100%? Я к тому, что эффективность добычи - единственный решающий параметр для робота.

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


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

Ага, понятно. После каждого действия происходит корректировка или батчами?

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

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

 

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

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


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

Тут чувак интересно рассказывает, ч

Уффф, полтора часа видео в 2019 году... Я попробую посмотреть как нибудь.

 

23 часа назад, Doob сказал:

статичную модель

Я не знаю что такое "статичная" или "динамическая" модель. Поясни.

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


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

Да, нынче нормальное объяснение можно добыть только на ютубе. С текстом туго. Продраться через километровые растекания мыслю по древу не проблема, но найти саму статью - целая история.

 

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

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


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

Веб-версия программы для обучения сети:

https://krutoy242.github.io/

Будет тормозить, так как я еще не настроил рендер при экспорте на веб страницу.

Небольшое описание как пользоваться:

rlMq9ww.png

 

Вы можете:

  1. Наслаждаться анимационными понтами на 3 FPS
  2. Смотреть как связи между нейронами становятся толще. Например, связь между "копнул вверх" (swing up) и желанием двигаться вверх.
  3. Пробовать изменять скорость обучения (learning rate) и смотреть как сеть обучается слишком медленно или встает в тупик.
  4. Изменять количество нейронов (Hidden 1 and 2) сети и не понимать вместе со мной почему эффективность от этого почти не меняется.

 

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

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


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

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

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


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

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

Странно, у меня 1-1 нейроны вообще забивают робота в угол и он крутится вокруг оси.

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


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

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

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

Вы тут затеяли очень интересный проект, как по мне это очень круто.

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

Вообщем я верю в Вас и @Krutoy , надеюсь вы не забросите проект.

Изменено пользователем TaxisT

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


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

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

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

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

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

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

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

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

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


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