За последние 24 часа нас посетили 20463 программиста и 1126 роботов. Сейчас ищут 687 программистов ...

Нейросеть, которая обучается во сне

Тема в разделе "Беседы", создана пользователем Maputo, 13 мар 2018.

  1. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Всем привет. Праздники не прошли даром.
    Представляю на ваше обозрение игру "Реверси", в которой против Вас играет нейросеть нового типа.
    Это моя собственная разработка. Чем то тип сети похож на нейросеть Кохонена, но все-таки это другой тип сетей.
    Мне удалось избавиться от процесса обратного распространения ошибки (backpropogation). Каждый нейрон живет собственной жизнью и обучается постоянно. Так же удалось реализовать процесс "сна", который помогает в обучении и особенно актуален при решении задач с малыми обучающими выборками.
    По моим расчетам данный тип сети не так чувствителен к криворукости архитектора. Кривая архитектура может быть скомпенсирована большим количеством нейронов и большим временем обучения до получения результата.
    Вобщем сама игра по адресу http://neyrolab.lp-gk.ru
    [​IMG]
    Количество нейронов 600+
    количество синапсов 3000+
    Количество слоев 5
    PHP 5,6
    числа с плавающей точкой

    Эволюция. После каждой игры с пользователем нейросеть играет два раза со своей предыдущей версией. Если ни разу не проиграла - сохраняет свое состояние и все последующие игроки будут загружать эту версию сети.
    Сон. Когда нейросеть сыграет 30+ партий - она принудительно отправляется в сон, который в текущей версии я ограничил в 400 итераций (1 итерация = 1 ход в игре), чтобы не перегружать сервак. После сна сеть так же сохраняется.

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

    P.S.: По завершении игры, чтобы начать новую - просто щелкните по любой клетке.
     
    Walk, askanim, artoodetoo и 4 другим нравится это.
  2. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    несколько раз пытался читать про нейронный сети.. и каждый раз почему то решил что потом почитаю..
    вообще не могу раздуплиться как они работают))
     
  3. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Как то сложно для меня. Нужно гуглить. Правила не помешают.
     
  4. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    @Алекс8, мне помогла книга по нейросетям (не помню уже название). Там в самом начале описывались довольно подробно процессы и анатомия реальных нейронов.
    @nospiou, начинают черные. Ход можно совершить только в ту клетку, где между Вашими фишками и новой будут стоять фишки противника (по горизонтали, вертикали или диагонали). Фишки противника становятся Вашими. Выигрывает тот у кого к концу игры будет больше фишек. Не важно чем закончится игра - заполнением всего поля или отсутствием ходов. Возможные ходы подсвеченв голубоватым цветом. Победитель в следующей игре играет черными. В первой игре черными играет пользователь.
    Нейросеть еще не особо обучена - она часто проигрывает, отсутствует стратегия и еще плохо понимает, что надо занимать углы.

    P.S.: у кого-то уже сеть эволюционировала)))) Спасибо)
    P.P.S.: Страницу можно обновлять - сама игра подгрузится, очистится только лог ходов справа.
     
    #4 Maputo, 14 мар 2018
    Последнее редактирование: 14 мар 2018
  5. acho

    acho Активный пользователь

    С нами с:
    28 дек 2016
    Сообщения:
    854
    Симпатии:
    210
    Адрес:
    Санкт-Петербург
    "Вы выйграли."
    Где вас этому учат?
     
    Maputo нравится это.
  6. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Deep Learning A-Z™: Hands-On Artificial Neural Networks зацени на рутрекере
    --- Добавлено ---
    Да это какая то читерская игра. Я бы лучше с альфазеро сыграл)
     
  7. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Исправил, спасибо.
     
    acho нравится это.
  8. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.734
    Симпатии:
    1.315
    Адрес:
    Лень
    победил
     
    Maputo нравится это.
  9. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    @nospiou, если брать туториалы, то мне понравились видео этого парня
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    колдовская магия волшебства
    я в нейронках ни бум-бум
     
  11. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    я писал нейросеть
    https://github.com/VasyaSh/live/blob/master/neuralNetwork.2016.php
    но в довольно примитивном виде. @Maputo круто затащил, респект :D
    Когда где-нибудь описывать нейросеть "на пальцах", это какое-то ООПшное фуфло, из которого ничего не понятно. Итак, срыв покровов. Вот схема того самого нейрона:
    [​IMG]
    Иксы - это входные данные, 1 или 0, W - это число, Y - это 0 или 1. Каждый X перемножается на свой W, всё это суммируется в S, а сама S работает так: return S > ПОРОГ, где ПОРОГ - число от балды программиста.
    Всё! В схеме нейтрона есть только то, что на ней нарисовано, и больше ничего нет.
    Сделаем нейрону 10000 входов, возьмем монохромную пикчу тролфейса 100х100 и других картинок. Прогоним их сто раз через нейрон по принципу "черный пиксель = 1". Если мы "показываем" тролфейс, а в Y false, то увеличивая W тех синапсов, которым достался черный пиксель. Если "показываем" другую картинку, а на Y имеем true, то уменьшаем W. Через некоторое время такого обучения связи установятся такими, что в Y будет true только когда на входе что-то очень похожее на тролфейс.
    Профессор, который это придумал, еще через 5 секунд придумал использовать не только булевы X, не только булев Y, и не только один оператор внутри S. А потом придумал взять несколько нейронов, обучить разным картинкам, подписать чему он каждого обучил, и с их помощью классифицировать картинки. А потом вообще догадался на входы нейронов подавать выходы с других нейронов, и понеслось! Фиг знает, настоящую историю я не помню :D
    --- Добавлено ---
    По скольку всё это циферки, для реального быстродействия они должны храниться в плоском массиве с какой-нибудь постоянной структурой, например X,W,X,W,X,W и если у нас 100 нейронов, то будем иметь (100 * число_синапсов * 2) элементов, тупо обходить циклом и считать.
    --- Добавлено ---
    @Maputo сколько у тебя слоёв?
     
    #11 [vs], 14 мар 2018
    Последнее редактирование: 14 мар 2018
    Dmitriy A. Arteshuk и Maputo нравится это.
  12. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    @[vs], слоев у меня 5. Но первый слой можно не считать - это входной слой без синапсов. В нем только нормализуются входные сигналы. У Вас в примере связан каждый нейрон со всеми нейронами предыдущего слоя? Тоже хочу так попробовать, но в этом случае с моей моделью придется изначально каждому нейрону определять разные веса, чтобы хоть как-то их поведение отличалось.
    Вообще изначально было 3 слоя. Входной (64 нейрона), скрытый (210 нейронов) и выходной (64 нейрона). Потом я решил добавить нейроны и просто скопировал два последних слоя. Получился бутерброд из 5 слоев (64+210+64+210+64 = 612 нейронов).
     
    #12 Maputo, 14 мар 2018
    Последнее редактирование: 14 мар 2018
  13. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    Слушай вот я также хотел бы сделать какуюнибудь простейшую нейросеть но по php что то очень мало материала видел либу php-ml и FUNN. Меня больше интересовала 1-я так как вторая насколько я понял под ubuntu а у меня винда. По первой очень мало информации в доках по ней были примеры вот один из них
    PHP:
    1. require_once __DIR__ . '/vendor/autoload.php';
    2.  
    3. use Phpml\Classification\KNearestNeighbors;
    4.  
    5. $samples = [[1, 3], [1, 4], [2, 4], [3, 1], [4, 1], [4, 2]];
    6. $labels = ['a', 'a', 'a', 'b', 'b', 'b'];
    7.  
    8. $classifier = new KNearestNeighbors();
    9. $classifier->train($samples, $labels);
    10.  
    11. $classifier->predict([3, 2]);
    12. // return 'b'
    Только я не понял что он считает и как с ним работать. Ну что в итоге полуаю тоже не понятно. Буду рад подсказкам.
     
  14. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    @Dron-Boy, если честно я смотрел только встроенные в PHP классы на предмет совпадения имен.
    По тому примеру, что Вы привели все предельно просто.
    Первый массив содержит серию входных сигналов. Во втором - соответствующие им выходные данные. Оба эти массива используются в обучении, а в последней строчке уже обученная сеть по входным данным должна выдать ответ.
    Сама архитектура сети, как я понимаю, скрыта от вмешательств.
     
  15. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    Количество элементов в перовом массиве и втором может отличаться? и на основе чего формируется первый массив?
     
  16. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Количество элементов в первом и втором массиве должно быть одинаковым. Данные берутся из конкретной задачи: вес, размер, скорость, количество символов - любые известные числа, при которых должно быть на выходе определенное значение
     
  17. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    PHP:
    1. $classifier->predict([3, 2]);
    понял. А вот здесь что указывается?
     
  18. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Это сеть в работе. Данный метод возвращает одно из значений массива $labels. Числа, которые в него передаются - это рабочие значения.

    Тут хороший пример - всего два входных значения. Можно поставить на плоскости точки с координатами входного массива $samples и прочертить границу между точками "a" и "b". тогда точка с координатами (3,2) должна попасть на территорию "b"
     
    #18 Maputo, 15 мар 2018
    Последнее редактирование: 15 мар 2018
  19. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    @Dron-Boy входными данными в этой реализации может быть массив любых чисел. Если ты начнешь подавать ей массивы из частот звучащих в песне звуков, и сопоставлять с именами во втором массиве, она начнет распознавать песни.
    Кстати, ты думал о том, что даже 10-теребайтный файл - это непрерывно записанное длиннющее число? Целое, одно число. Его даже можно перевести в десятичную систему,.
     
  20. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    Подписался на тему...
     
  21. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Архитектура нейросети обновлена по результатам работы предыдущей версии. Теперь слоев 3, нейронов 300+, синапсов 2500+.
    P.S.: Если кто будет играть - начинайте с одних и тех же дебютов - помогает в обучении.
     
  22. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Нейронку сам реализовывал? Православно-математично-сигмоидно-тангенсно, или нейроны - это классы с конкретной логикой и научить эту сеть чему-то окромя игры в реверси нельзя?

    P.S. Сам сейчас активно курю тему нейронок, работаю с FANN под php. Нраицца.
    --- Добавлено ---
    Чот страшно представить даже, откуда и накой столько? Расскажи подробнее.
    --- Добавлено ---
    Счет: 1 - 0
    Вы выиграли.

    Какая модель обучения у тебя используется? С подкреплением или просто аппроксимация к эталонной модели?
    --- Добавлено ---
    Удалось даже ее сожрать, оставив кучу пустых клеток.

    upload_2018-3-17_1-22-49.png
    --- Добавлено ---
    А вообще неплохо, оно действительно имеет некоторый прогресс между партиями.

    Опиши архитектуру подробнее, плз.
     
  23. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    @Fell-x27, у меня три класса: Синапс, Нейрон, Нейросеть - они универсальные.
    А для игры Создано еще 5 классов:
    - Игровое поле, которое рассчитывает доступные ходы и конвертирует состояние игры во входные сигналы
    - Обертка для сети, которая выдает уровни выходных нейронов для ячеек игрового поля
    - Класс игры с пользователем
    - Класс игры нейросеть - нейросеть
    - Класс самой игры
    Пока я не разобрался с архитектурой - я засомневался, что данная версия научится играть в Реверси. Адаптировать ее можно под любую задачу.
    На вход нейронов подается число, а на выходе сигмоида, преобразующая сумму входных сигналов перемноженных на веса в число в диапазоне от 0 до 1
    Сейчас уменьшил количество нейронов и слоев
    Это входной и выходной слои по 64 нейрона и скрытый слой состоящий из нейронов отслеживающих горизонтали, вертикали, диагонали и сегменты (2х2, 3х3, 4х4, 5х5, 6х6, 7х7, 8х8) - итого 178 нейронов. 64 + 178 + 64 = 306
    выходные нейроны связаны с входным нейроном с тем же номером и со всеми нейронами скрытого слоя, где участвует этот же номер. Например выходной нейрон ячейки 0 связан с входным нейроном 0, диагональ 0-63, горизонталь 0-7, вертикаль 0-56, и 7 сегментов, примыкающих к входному нейрону 0.
    По сути три процесса: собственное обучение, выживание (эволюция, аппроксимация к предыдущей версии) и сон (очистка от шумов и выделение закономерностей в предшествующих сну обучающих выборок)
    У мненя тоде такое было - я даже запомнил ходы и повторил игру раз 5, но потом нейросеть изменила дебют. Хотя, все равно проигрывает.
     
    #23 Maputo, 17 мар 2018
    Последнее редактирование: 17 мар 2018
  24. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    В нейросеть не заложено желание выиграть - она должна к этому прийти в результате эволюции, потому как выживает только тогда когда не проигрывает сама себе.
     
  25. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    @Fell-x27, Вы мне подкинули идею. Надо добавить на вход еще и количество съедаемых фишек - тогда будет обучение с подкреплением.
     
    #25 Maputo, 17 мар 2018
    Последнее редактирование: 17 мар 2018