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

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

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

2 часа назад, Krutoy сказал:

А так, буду сюда отписываться и отчитываться о процессе разработки.

неужели ты к нам вернулся?!:)  

п.с. не важно, что подавать на вход... Главное - не пропадай и радуй нас своими программками:)

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


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

неужели ты к нам вернулся?!:)  

 п.с. не важно, что подавать на вход... Главное - не пропадай и радуй нас своими программками:)

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

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


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

Нейросеть "думает" и выдает 5 значений, которые соответствуют действиям движения 1) вперед, 2) вниз, 3) вверх, 4) вправо, 5) влево. Робот выполняет большее из этих значений.

а какая цель сети? Чему она должна обучиться? Как можно скорее и эффективнее скушать ВСЕ блоки в каком-то радиусе и пространстве из блоков и пустот? Что в конечном итоге должен делать "обученный"  робот?

 

3 часа назад, Krutoy сказал:

Главная проблема, что для обучения я должен указать какие значения должны быть на выходах при текущих условиях, а я и сам не знаю. Обычно, робот теряется в пустом пространстве и я не знаю какое действие ему казать как "единственно правильное".


возможно, что сама среда, в которую помещен робот, имеет очень сильные ограничения для обучения. Ведь на входах сенсоров только наличие блока спереди, сверху и снизу (при чем робот эти блоки сразу сгрызает, как я понял, и уже на следующем шаге обстановка на сенсорном уровне совершенно другая, то есть закономерность входных сигналов очень слабо прослеживается, да и ее и нет практически в безграничном майне из блоков). И на R-выходах робот тоже может совершить движение только на 1 блок(вверх, вниз, вперед) или поворот. В таких условиях, скорее всего, робот всегда будет попадать в такую ситуацию, когда не будет никакого "единственно правильного" или наиболее правильного решения. Он как жук в коробочке.

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

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


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

Чему она должна обучиться? Что в конечном итоге должен делать "обученный"  робот?

Пока я обучаю себя больше чем нейросеть :D

Сеть должна научиться "быть максимально полезной". Что есть польза - задает программист. В будущем, можно будет задать любое действие как "полезное", и робот сам научится. Это может быть копка ресурсов, выращивание пшеницы, строительство улья.

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

 

2 часа назад, Alex сказал:

когда не будет никакого "единственно правильного" или наиболее правильного решения

Оно всегда есть, даже когда ничего не ясно. 

Например, если он копал прямо по 3 блока подряд за действие, а потом бац, и сразу 0 блоков, значит самым эффективным будет сделать

  1. Направо
  2. Вперед
  3. Направо

И тогда с большей вероятностью робот вернется к срезанию слоя.
НО! Если прошлый раз до длительного движения прямо он делал то же самое, повороты должны быть в лево (а-ка зигзаг). По спирали тоже можно копать, но зигзагом эффективнее.

Весь сахар в том, что программисту не нужно больше хардкорно кодить как двигаться - нейросеть сама это поймет.

 

2 часа назад, Alex сказал:

больше данных для обучения сети

Я весь во внимании! Предлагай, что можно "кормить" нейросети на вход, из того что может "голый" робот, без компонентов.

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


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

@Krutoy, ты немного не с того начал. LSTM это конечно, интересно, но не подходит для текущей задачи.

Я гонял роботов прямо в майне, для навигации использовал геолайзер, в качестве "нейросети" служит карта потенциальных полей (potential field method), которая накладывается на карту просканированной территории.

 

Получается что-то вроде этого:

 

Шахтер.

Для того, чтобы вознаграждать робота, надо точно знать, где есть нужный блок.

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

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

Но этот алгоритм слишком примитивен, робот просто бегает без всякой пользы для игрока.

 

Чтобы решить задачу, надо ее сначала составить и формализовать.

Муравейник с разными профессиями - довольно странное применение для нейросетей. В любом случае, надо будет писать подпрограммы, которые будут выполняться по команде нейросетки. Например, чтобы скрафтить и включить нового робота, придется весь алгоритм захардкодить.

 

  • Выбираем, что надо получить от робота.
  • Составляем задачу.
  • Разрабатываем решение.
  • Профит.

А подкидывать кубики и пытаться получить от этого пользу - не наш метод.

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


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

но не подходит для текущей задачи

Объясни, почему не подходит?

 

54 минуты назад, Doob сказал:

надо точно знать, где есть нужный блок.

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

 

56 минут назад, Doob сказал:

придется весь алгоритм захардкодить.

  • Выбираем, что надо получить от робота.
  • Составляем задачу.
  • Разрабатываем решение.
  • Профит.

Я не против "захардкодить" простые комбинации. Например, я захардкодил ламать блоки со всех сторон после каждого действия.

Но вот дальше я не понял. 

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

Что за "задача"? Что значит "проработать решение"? PROFIT??

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


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

Программа должна решать какую-то задачу, для этого надо ее составить.

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

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


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

Программа должна решать какую-то задачу, для этого надо ее составить.

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

Ок, сейчас задача - срубить как можно больше блоков за как можно меньшее количество действий. Что дальше?

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


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

Сегодня изменил функцию полезности. Теперь обратное действие (например, поворот направо после поворота налево) имеет в два раза меньше полезности.

 

Робот отреагировал и через 10 поколений по 2000 действий научился срезать по спирали. Правда, он пока не догадался сверху опуститься на 1 блок ниже. Но, я получил рекордный результат - в одно из поколений он вскопал 1500 блоков за 2000 действий.

Скрытый текст

7gKwnoI.png

 

Но это всё равно всё не то. Я не понимаю, почему он, наример, выезжает за ресурсы и продолжает капать вперед.

 

Кстати, вот так выглядит консоль в Sublime Text.

  • kpd - количество действий на количество копаных блоков.
  • Затем идут показатели на входе. Позиция (3), удаленность от последней копки (1), степень разведки (1), удачные копки со сторон (3)
  • 5 значений выходов соответственно, выделенно самое большое, которое и выполняется
  • Позиция по x y z
  • Количество вскопаных блоков
  • Длинная полоска - коэффициент полезности
  • Вконце те значения, которые я отдаю на "обратное распространение ошибки" (а.к.а обучение)
Скрытый текст

WlAa83T.gif

 

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

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


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

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

Обучающая программа будет служить генератором.

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


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

В целом, улей это достаточно крутая идея.
И у меня есть парочка идей по этому поводу.

 

1) В улье должна заправлять "матка" - специальный сервер, который будет подключаться через интернет-карту к реальному компьютеру, исполняющему, допустим, Python-программу (нейросеть на 4МБ ОЗУ - такое себе).
Она анализирует (хотя это скорее ИИ, а не нейронка) задачу, которая ей дана - допустим, создание определенного количества роботов, разбивает ее на несколько мелких (создание робота = поиск ресурсов + крафт компонентов + крафт робота) и делегирует их роботам. Основная задача "матки" - недопущение собственной разрядки и разрядки роботов.
2) Роботы также должны иметь нейросеть или ИИ, но куда меньшие, предназначенные для решения "маточных" задач из разряда принеси-подай, добудь-поставь.

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


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

количества заходов робота на этот блок

Количество заходов почти ни на что не влияет, так как обычно равно 1 или 0. Например, робот где то на 100 высоте в небе летает - и все блоки первый раз посещает

Да и в будущем, будет условие, когда нужно отдавать ресурсы, и тогда он тоже будет посещать блоки не в первый раз.

 

1 час назад, AtomicScience сказал:

через интернет-карту к реальному компьютеру

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

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

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


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

В целом, улей это достаточно крутая идея.
И у меня есть парочка идей по этому поводу.

1) В улье должна заправлять "матка"...
2) Роботы также должны иметь нейросеть или ИИ, но куда меньшие, предназначенные для решения "маточных" задач ...

"когда Ипполит Матвеевич услышал про нейросеть и королеву бриллианты, в его голове начало твориться черт знает что. Зазвучали цыганские хоры, задергались грудастые дамские оркестры... Многое представилось Ипполиту Матвеевичу. И лакейская преданность, и оранжевые упоительно дорогие кальсоны. И роботы с ИИ, которые грабят кОрОваны других роботов."

п.с. простите, не удержался от флуда:)

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


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

Ну я и предлагаю добавить условий. Робот был на этом блоке - пинаем его. Не смог сломать блок или переместиться, пинаем сильнее. Сделал много шагов от точки старта - пинаем пропорционально расстоянию, с учетом первого условия.

 

Пока про будущее разговора не идет, еще с рубкой блоков не разобрались.

Допустим, робот научился пожирать землю вокруг, что дальше? Надо расширять функционал.

А чтобы расширить функционал, надо расширить сеть. Обученную сеть расширять это довольно странно и больно, к тому же - сколько времени роботу под хвост.

Поэтому сначала определяют функционал, условия выполнения, затем подбирают архитектуру сети (или какой-нибудь random forest с svc, ибо не нейронками едиными жив ML)

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


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

@Krutoy

Можешь почитать про Reinforcement Learning. Данный алгоритм обучения нейронных сетей разрабатывался для решения подобных задач: выкопать роботом максимальное количество блоков за ограниченное время. В 2013 рвали NIPS со статьями об нейронных сетях, играющих в atari игры.

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

ps. Очевидно, что писать проще, чем делать, но должно сработать :)
pss. Для lua есть библиотека Torch, в которой есть модели для обучения сетей используя Q-learning

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


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

RL сводится к одной цели, блоки добыть не проблема многими способами.

Если с RL замахнуться на создание муравейника, придется долго и упорно страдать с ветвлениями.

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

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


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

Робот был на этом блоке - пинаем его. Не смог сломать блок или переместиться, пинаем сильнее. Сделал много шагов от точки старта - пинаем пропорционально расстоянию, с учетом первого условия

Я так и делаю. Только, мне не достаточно просто "пинать". У меня есть 5 выходных значений. И если робот ничего не сделал полезного, я в выбранное значение пишу 0. А в остальные 4 чего писать? 

Я пробовал в остальные и рандом значения, и 1. Но это все не то.

В 31.05.2019 в 16:29, Doob сказал:

Обученную сеть расширять это довольно странно и больно,

Поэтому сначала определяют функционал

Не в моем случае. Здесь, я не буду заниматься обучением сети - она должна стартовать с 0 и сама себя обучать.

 

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

Можешь почитать про Reinforcement Learning.

Спасибо, прочитаю!

 

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

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

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

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

 

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

pss. Для lua есть библиотека Torch

Торч работает на .dll и скомпилированных файлах, а значит из майнкрафта его не запустить.

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


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

А в остальные 4 чего писать?

 

Ничего не писать, если надо упростить - объединяем все выходы в один нейрон. При ошибке, веса будут корректироваться на всех действиях. Тут даже можно на выходной нейрон давать не 0/1, а число в диапазоне, характеризующие "удачность" или "правильность" действия с точки зрения учителя.

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


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

 

Ничего не писать, если надо упростить - объединяем все выходы в один нейрон. При ошибке, веса будут корректироваться на всех действиях. Тут даже можно на выходной нейрон давать не 0/1, а число в диапазоне, характеризующие "удачность" или "правильность" действия с точки зрения учителя.

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

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


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

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

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

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

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

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

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

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

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


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