Krutoy 1 169 Опубликовано: 29 мая, 2019 (проект в разработке) Цель данного проекта - создание нейросети и условий для ее самообучения. В идеале, это будет бомжовый робот минимальной комплектации (возможно даже без жесткого диска), который в зависимости от окружающих условий будет определять свою полезность. Также, он будет "программироваться" снаружи с помощью окружения оставленного другими роботами, формирующими "улей". Апогеем будет саморепликация. Кроме достижения цели, важен и процесс. Наблюдать за самообучением и выбором действий у нейросети очень интересно. Нейросеть изнутри: Мигающие точки - нейроны, линии - синапсы (связи), справа эмулятор мира майнкрафт на движке Love 2d. Нейросети устроены похожим образом. Есть входные значения, скрытые слои и выходные значения. В моей программе робот собирает информацию вокруг себя. На вход подается: Есть ли блоки над, под и перед ним Насколько много клеток он "разведовал" за последнее действие Его позиция в виде значений x,y,z от 0 до 1 Иногда я тестирую со значениями стороны куда он смотрит, возможностью двигаться, расстоянию до последней удачной копки Нейросеть "думает" и выдает 5 значений, которые соответствуют действиям движения 1) вперед, 2) вниз, 3) вверх, 4) вправо, 5) влево. Робот выполняет большее из этих значений. Далее, после действия, я вычисляю коэффициент полезности r [0..1] для этого действия. -- swingSucces: количество вскопанных блоков за действие [0..3] -- input.exploreSucces: коэффициент разведки [0..1], где 0 - уже разводовал все 3 блока, 1 - впервые проверил эти 3 блока -- logic(input.sweetsD < input.old.sweetsD): расстояние до последней удачной копки увеличилось 0, или уменьшилось 1 r = (swingSucces + input.exploreSucces + logic(input.sweetsD < input.old.sweetsD)) / 5 Нейросеь обучается, и в выбранное выходное значение приписывается r a остальные уменьшаются\увеличиваются на 1-r for i=1, #output do output[i] = switch i when actKey (output[i]+val^2)/2 when rndKey (output[i]+(1-val))/2 when oppositeKey (output[i]+(1-val))/4 else output[i] nn:propagate(output) Теперь матан. В начале я использовал обычный Персептрон, найденный готовый на ЛУА, но который мне пришлось править. Проблема в том, что он не может учитывать последние состояния. Нейросети с памятью называются "Long short-term memory" или LSTM, где каждый нейрон выглядит вот так: Найдя библиотеку synaptic.js, хитрыми путями я извлек из нее готовую LSTM сеть, которая получилась на 53 000 строк. Но это не проблема, если зайдет, я перепрограммирую ее на LUA. Текущее состояние сети - отстой. Я неправильно ее обучаю, так как не знаю какие значения выдавать для "обратного распространения ошибки". Круча разные коэффициенты, у меня получилось научить ее двигаться по спирали, как карьерный робот. Сейчас, когда я добавил во входные значения расстояние до последней удачной копки, он научился "кушать" как яблоко, но с огромный количеством лишних действий. В самом майне блоков намного больше и это выглядит вот так. На первом скрине работал 1 робот, на втором штук 6. Сейчас в их действиях слишком много шума. Я специально не даю им кирки, что бы они не унеслись в бесконечность. Скрытый текст Фидбек Мне нужно помощь. Подскажите, что лучше подавать на вход, и как обучать сеть. Главная проблема, что для обучения я должен указать какие значения должны быть на выходах при текущих условиях, а я и сам не знаю. Обычно, робот теряется в пустом пространстве и я не знаю какое действие ему казать как "единственно правильное". А так, буду сюда отписываться и отчитываться о процессе разработки. Update 20.06.19, веб-версия эмулятора Скрытый текст Веб-версия программы для обучения сети: https://krutoy242.github.io/ Будет тормозить, так как я еще не настроил рендер при экспорте на веб страницу. Небольшое описание как пользоваться: Вы можете: Наслаждаться анимационными понтами на 3 FPS Смотреть как связи между нейронами становятся толще. Например, связь между "копнул вверх" (swing up) и желанием двигаться вверх. Пробовать изменять скорость обучения (learning rate) и смотреть как сеть обучается слишком медленно или встает в тупик. Изменять количество нейронов (Hidden 1 and 2) сети и не понимать вместе со мной почему эффективность от этого почти не меняется. 9 7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex 4 683 Опубликовано: 29 мая, 2019 2 часа назад, Krutoy сказал: А так, буду сюда отписываться и отчитываться о процессе разработки. неужели ты к нам вернулся?! п.с. не важно, что подавать на вход... Главное - не пропадай и радуй нас своими программками:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Krutoy Автор темы 1 169 Опубликовано: 29 мая, 2019 2 минуты назад, Alex сказал: неужели ты к нам вернулся?! п.с. не важно, что подавать на вход... Главное - не пропадай и радуй нас своими программками:) Спасибо за радушный прием! Просто, у меня в жизни наконец белая полоса началась и можно заняться любимыми делами. 3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex 4 683 Опубликовано: 29 мая, 2019 3 часа назад, Krutoy сказал: Нейросеть "думает" и выдает 5 значений, которые соответствуют действиям движения 1) вперед, 2) вниз, 3) вверх, 4) вправо, 5) влево. Робот выполняет большее из этих значений. а какая цель сети? Чему она должна обучиться? Как можно скорее и эффективнее скушать ВСЕ блоки в каком-то радиусе и пространстве из блоков и пустот? Что в конечном итоге должен делать "обученный" робот? 3 часа назад, Krutoy сказал: Главная проблема, что для обучения я должен указать какие значения должны быть на выходах при текущих условиях, а я и сам не знаю. Обычно, робот теряется в пустом пространстве и я не знаю какое действие ему казать как "единственно правильное". возможно, что сама среда, в которую помещен робот, имеет очень сильные ограничения для обучения. Ведь на входах сенсоров только наличие блока спереди, сверху и снизу (при чем робот эти блоки сразу сгрызает, как я понял, и уже на следующем шаге обстановка на сенсорном уровне совершенно другая, то есть закономерность входных сигналов очень слабо прослеживается, да и ее и нет практически в безграничном майне из блоков). И на R-выходах робот тоже может совершить движение только на 1 блок(вверх, вниз, вперед) или поворот. В таких условиях, скорее всего, робот всегда будет попадать в такую ситуацию, когда не будет никакого "единственно правильного" или наиболее правильного решения. Он как жук в коробочке. Ты же сам говоришь, что как только на вход стал подавать данные о координатах последней "удачной" копки, робот более осмысленно стал пожирать блоки по закону червя и яблока. Значит, скорее всего, нужно больше данных для обучения сети... и , возможно, большей степени маневренности для робота. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Krutoy Автор темы 1 169 Опубликовано: 29 мая, 2019 1 час назад, Alex сказал: Чему она должна обучиться? Что в конечном итоге должен делать "обученный" робот? Пока я обучаю себя больше чем нейросеть Сеть должна научиться "быть максимально полезной". Что есть польза - задает программист. В будущем, можно будет задать любое действие как "полезное", и робот сам научится. Это может быть копка ресурсов, выращивание пшеницы, строительство улья. Например, робот-королева поставит рабочего, даст ему в руки 64 кактуса, по "феромонам" - меткам оставленными другими роботами - он поймет что "полезно", это когда блок куда то ставится, и робот пойдет исследовать мир в поисках куда поставить кактус. 2 часа назад, Alex сказал: когда не будет никакого "единственно правильного" или наиболее правильного решения Оно всегда есть, даже когда ничего не ясно. Например, если он копал прямо по 3 блока подряд за действие, а потом бац, и сразу 0 блоков, значит самым эффективным будет сделать Направо Вперед Направо И тогда с большей вероятностью робот вернется к срезанию слоя. НО! Если прошлый раз до длительного движения прямо он делал то же самое, повороты должны быть в лево (а-ка зигзаг). По спирали тоже можно копать, но зигзагом эффективнее. Весь сахар в том, что программисту не нужно больше хардкорно кодить как двигаться - нейросеть сама это поймет. 2 часа назад, Alex сказал: больше данных для обучения сети Я весь во внимании! Предлагай, что можно "кормить" нейросети на вход, из того что может "голый" робот, без компонентов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Doob 2 749 Опубликовано: 30 мая, 2019 @Krutoy, ты немного не с того начал. LSTM это конечно, интересно, но не подходит для текущей задачи. Я гонял роботов прямо в майне, для навигации использовал геолайзер, в качестве "нейросети" служит карта потенциальных полей (potential field method), которая накладывается на карту просканированной территории. Получается что-то вроде этого: Шахтер. Для того, чтобы вознаграждать робота, надо точно знать, где есть нужный блок. Например, даем аттракторы на блоки с плотностью около 3, отталкивание на блоки воздуха с силой, зависящей от объема ближайших соседей. Ну и дополнительное отталкивание на пройденный путь, с сокращением на каждый шаг, чтобы не получить ловушки локального минимума. Робот бегает за блоками, за каждый успешно сожженный блок, получает прибавку к коэффициенту доступных шагов и сканов. Но этот алгоритм слишком примитивен, робот просто бегает без всякой пользы для игрока. Чтобы решить задачу, надо ее сначала составить и формализовать. Муравейник с разными профессиями - довольно странное применение для нейросетей. В любом случае, надо будет писать подпрограммы, которые будут выполняться по команде нейросетки. Например, чтобы скрафтить и включить нового робота, придется весь алгоритм захардкодить. Выбираем, что надо получить от робота. Составляем задачу. Разрабатываем решение. Профит. А подкидывать кубики и пытаться получить от этого пользу - не наш метод. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Krutoy Автор темы 1 169 Опубликовано: 30 мая, 2019 52 минуты назад, Doob сказал: но не подходит для текущей задачи Объясни, почему не подходит? 54 минуты назад, Doob сказал: надо точно знать, где есть нужный блок. Так я не могу точно знать. Тир0 робот не может пользоваться геоаналайзером. Для него "точно" лишь блоки под, над и перед ним. Этого слишком мало для потенциальных полей. 56 минут назад, Doob сказал: придется весь алгоритм захардкодить. Выбираем, что надо получить от робота. Составляем задачу. Разрабатываем решение. Профит. Я не против "захардкодить" простые комбинации. Например, я захардкодил ламать блоки со всех сторон после каждого действия. Но вот дальше я не понял. Допустим, я хочу получить максимум срубленных блоков (забавно, ведь без инвентаря робот даже не лутает). Что за "задача"? Что значит "проработать решение"? PROFIT?? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Doob 2 749 Опубликовано: 30 мая, 2019 Программа должна решать какую-то задачу, для этого надо ее составить. Если у задачи нет цели, то невозможно получить результата на нейронке - кнуты и пряники никуда не ведут, обратное распространение ошибки рассчитывать не из чего. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Krutoy Автор темы 1 169 Опубликовано: 30 мая, 2019 1 час назад, Doob сказал: Программа должна решать какую-то задачу, для этого надо ее составить. Если у задачи нет цели, то невозможно получить результата на нейронке - кнуты и пряники никуда не ведут, обратное распространение ошибки рассчитывать не из чего. Ок, сейчас задача - срубить как можно больше блоков за как можно меньшее количество действий. Что дальше? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Krutoy Автор темы 1 169 Опубликовано: 30 мая, 2019 (изменено) Сегодня изменил функцию полезности. Теперь обратное действие (например, поворот направо после поворота налево) имеет в два раза меньше полезности. Робот отреагировал и через 10 поколений по 2000 действий научился срезать по спирали. Правда, он пока не догадался сверху опуститься на 1 блок ниже. Но, я получил рекордный результат - в одно из поколений он вскопал 1500 блоков за 2000 действий. Скрытый текст Но это всё равно всё не то. Я не понимаю, почему он, наример, выезжает за ресурсы и продолжает капать вперед. Кстати, вот так выглядит консоль в Sublime Text. kpd - количество действий на количество копаных блоков. Затем идут показатели на входе. Позиция (3), удаленность от последней копки (1), степень разведки (1), удачные копки со сторон (3) 5 значений выходов соответственно, выделенно самое большое, которое и выполняется Позиция по x y z Количество вскопаных блоков Длинная полоска - коэффициент полезности Вконце те значения, которые я отдаю на "обратное распространение ошибки" (а.к.а обучение) Скрытый текст Изменено 3 июня, 2019 пользователем Alex Установка спойлеров Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Doob 2 749 Опубликовано: 31 мая, 2019 Это очень просто. Надо сохранять координаты блоков, в которых робот уже был, если действие приводит робота в тот же блок - производить перерасчет весов с ошибкой, полученной из количества заходов робота на этот блок, пропущенных через логистическую функцию. Обучающая программа будет служить генератором. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
AtomicScience 76 Опубликовано: 31 мая, 2019 В целом, улей это достаточно крутая идея. И у меня есть парочка идей по этому поводу. 1) В улье должна заправлять "матка" - специальный сервер, который будет подключаться через интернет-карту к реальному компьютеру, исполняющему, допустим, Python-программу (нейросеть на 4МБ ОЗУ - такое себе). Она анализирует (хотя это скорее ИИ, а не нейронка) задачу, которая ей дана - допустим, создание определенного количества роботов, разбивает ее на несколько мелких (создание робота = поиск ресурсов + крафт компонентов + крафт робота) и делегирует их роботам. Основная задача "матки" - недопущение собственной разрядки и разрядки роботов. 2) Роботы также должны иметь нейросеть или ИИ, но куда меньшие, предназначенные для решения "маточных" задач из разряда принеси-подай, добудь-поставь. 2 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Krutoy Автор темы 1 169 Опубликовано: 31 мая, 2019 9 часов назад, Doob сказал: количества заходов робота на этот блок Количество заходов почти ни на что не влияет, так как обычно равно 1 или 0. Например, робот где то на 100 высоте в небе летает - и все блоки первый раз посещает Да и в будущем, будет условие, когда нужно отдавать ресурсы, и тогда он тоже будет посещать блоки не в первый раз. 1 час назад, AtomicScience сказал: через интернет-карту к реальному компьютеру Я думал так сделать, но принципиально хочу остановиться только на возможностях самого майна. Думаю, даже на 4мб можно развиться, главное поднапрячься. Но идея роботов разного уровня конечно нужна. Что бы разные сети занимались разными задачами. Например, что бы просто ходить по направляющим много ума не надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex 4 683 Опубликовано: 31 мая, 2019 2 часа назад, AtomicScience сказал: В целом, улей это достаточно крутая идея. И у меня есть парочка идей по этому поводу. 1) В улье должна заправлять "матка"... 2) Роботы также должны иметь нейросеть или ИИ, но куда меньшие, предназначенные для решения "маточных" задач ... "когда Ипполит Матвеевич услышал про нейросеть и королеву бриллианты, в его голове начало твориться черт знает что. Зазвучали цыганские хоры, задергались грудастые дамские оркестры... Многое представилось Ипполиту Матвеевичу. И лакейская преданность, и оранжевые упоительно дорогие кальсоны. И роботы с ИИ, которые грабят кОрОваны других роботов." п.с. простите, не удержался от флуда Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Doob 2 749 Опубликовано: 31 мая, 2019 Ну я и предлагаю добавить условий. Робот был на этом блоке - пинаем его. Не смог сломать блок или переместиться, пинаем сильнее. Сделал много шагов от точки старта - пинаем пропорционально расстоянию, с учетом первого условия. Пока про будущее разговора не идет, еще с рубкой блоков не разобрались. Допустим, робот научился пожирать землю вокруг, что дальше? Надо расширять функционал. А чтобы расширить функционал, надо расширить сеть. Обученную сеть расширять это довольно странно и больно, к тому же - сколько времени роботу под хвост. Поэтому сначала определяют функционал, условия выполнения, затем подбирают архитектуру сети (или какой-нибудь random forest с svc, ибо не нейронками едиными жив ML) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Seryoga 184 Опубликовано: 1 июня, 2019 @Krutoy Можешь почитать про Reinforcement Learning. Данный алгоритм обучения нейронных сетей разрабатывался для решения подобных задач: выкопать роботом максимальное количество блоков за ограниченное время. В 2013 рвали NIPS со статьями об нейронных сетях, играющих в atari игры. В качестве параметров, я бы выбрал: Скор --- количество блоков выкопанное за время N Действия --- действия робота. Состояние --- блоки от робота в радиусе R ps. Очевидно, что писать проще, чем делать, но должно сработать pss. Для lua есть библиотека Torch, в которой есть модели для обучения сетей используя Q-learning Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Doob 2 749 Опубликовано: 1 июня, 2019 RL сводится к одной цели, блоки добыть не проблема многими способами. Если с RL замахнуться на создание муравейника, придется долго и упорно страдать с ветвлениями. Вон как с CTF приходится извращаться, чтобы добыть скор больше, чем у хуманов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Krutoy Автор темы 1 169 Опубликовано: 2 июня, 2019 В 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 и скомпилированных файлах, а значит из майнкрафта его не запустить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Doob 2 749 Опубликовано: 2 июня, 2019 27 минут назад, Krutoy сказал: А в остальные 4 чего писать? Ничего не писать, если надо упростить - объединяем все выходы в один нейрон. При ошибке, веса будут корректироваться на всех действиях. Тут даже можно на выходной нейрон давать не 0/1, а число в диапазоне, характеризующие "удачность" или "правильность" действия с точки зрения учителя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Krutoy Автор темы 1 169 Опубликовано: 2 июня, 2019 2 минуты назад, Doob сказал: Ничего не писать, если надо упростить - объединяем все выходы в один нейрон. При ошибке, веса будут корректироваться на всех действиях. Тут даже можно на выходной нейрон давать не 0/1, а число в диапазоне, характеризующие "удачность" или "правильность" действия с точки зрения учителя. Что то я не понял. Если у меня будет 1 нейрон на выходе, как я буду выбирать какое действие из 5 мне делать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах