Всем привет. Праздники не прошли даром. Представляю на ваше обозрение игру "Реверси", в которой против Вас играет нейросеть нового типа. Это моя собственная разработка. Чем то тип сети похож на нейросеть Кохонена, но все-таки это другой тип сетей. Мне удалось избавиться от процесса обратного распространения ошибки (backpropogation). Каждый нейрон живет собственной жизнью и обучается постоянно. Так же удалось реализовать процесс "сна", который помогает в обучении и особенно актуален при решении задач с малыми обучающими выборками. По моим расчетам данный тип сети не так чувствителен к криворукости архитектора. Кривая архитектура может быть скомпенсирована большим количеством нейронов и большим временем обучения до получения результата. Вобщем сама игра по адресу http://neyrolab.lp-gk.ru Количество нейронов 600+ количество синапсов 3000+ Количество слоев 5 PHP 5,6 числа с плавающей точкой Эволюция. После каждой игры с пользователем нейросеть играет два раза со своей предыдущей версией. Если ни разу не проиграла - сохраняет свое состояние и все последующие игроки будут загружать эту версию сети. Сон. Когда нейросеть сыграет 30+ партий - она принудительно отправляется в сон, который в текущей версии я ограничил в 400 итераций (1 итерация = 1 ход в игре), чтобы не перегружать сервак. После сна сеть так же сохраняется. Цель проекта не создать "живую" игру, а получить побольше данных (снимков нейросети) для анализа. P.S.: По завершении игры, чтобы начать новую - просто щелкните по любой клетке.
несколько раз пытался читать про нейронный сети.. и каждый раз почему то решил что потом почитаю.. вообще не могу раздуплиться как они работают))
@Алекс8, мне помогла книга по нейросетям (не помню уже название). Там в самом начале описывались довольно подробно процессы и анатомия реальных нейронов. @nospiou, начинают черные. Ход можно совершить только в ту клетку, где между Вашими фишками и новой будут стоять фишки противника (по горизонтали, вертикали или диагонали). Фишки противника становятся Вашими. Выигрывает тот у кого к концу игры будет больше фишек. Не важно чем закончится игра - заполнением всего поля или отсутствием ходов. Возможные ходы подсвеченв голубоватым цветом. Победитель в следующей игре играет черными. В первой игре черными играет пользователь. Нейросеть еще не особо обучена - она часто проигрывает, отсутствует стратегия и еще плохо понимает, что надо занимать углы. P.S.: у кого-то уже сеть эволюционировала)))) Спасибо) P.P.S.: Страницу можно обновлять - сама игра подгрузится, очистится только лог ходов справа.
Deep Learning A-Z™: Hands-On Artificial Neural Networks зацени на рутрекере --- Добавлено --- Да это какая то читерская игра. Я бы лучше с альфазеро сыграл)
я писал нейросеть https://github.com/VasyaSh/live/blob/master/neuralNetwork.2016.php но в довольно примитивном виде. @Maputo круто затащил, респект Когда где-нибудь описывать нейросеть "на пальцах", это какое-то ООПшное фуфло, из которого ничего не понятно. Итак, срыв покровов. Вот схема того самого нейрона: Иксы - это входные данные, 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. А потом придумал взять несколько нейронов, обучить разным картинкам, подписать чему он каждого обучил, и с их помощью классифицировать картинки. А потом вообще догадался на входы нейронов подавать выходы с других нейронов, и понеслось! Фиг знает, настоящую историю я не помню --- Добавлено --- По скольку всё это циферки, для реального быстродействия они должны храниться в плоском массиве с какой-нибудь постоянной структурой, например X,W,X,W,X,W и если у нас 100 нейронов, то будем иметь (100 * число_синапсов * 2) элементов, тупо обходить циклом и считать. --- Добавлено --- @Maputo сколько у тебя слоёв?
@[vs], слоев у меня 5. Но первый слой можно не считать - это входной слой без синапсов. В нем только нормализуются входные сигналы. У Вас в примере связан каждый нейрон со всеми нейронами предыдущего слоя? Тоже хочу так попробовать, но в этом случае с моей моделью придется изначально каждому нейрону определять разные веса, чтобы хоть как-то их поведение отличалось. Вообще изначально было 3 слоя. Входной (64 нейрона), скрытый (210 нейронов) и выходной (64 нейрона). Потом я решил добавить нейроны и просто скопировал два последних слоя. Получился бутерброд из 5 слоев (64+210+64+210+64 = 612 нейронов).
Слушай вот я также хотел бы сделать какуюнибудь простейшую нейросеть но по php что то очень мало материала видел либу php-ml и FUNN. Меня больше интересовала 1-я так как вторая насколько я понял под ubuntu а у меня винда. По первой очень мало информации в доках по ней были примеры вот один из них PHP: require_once __DIR__ . '/vendor/autoload.php'; use Phpml\Classification\KNearestNeighbors; $samples = [[1, 3], [1, 4], [2, 4], [3, 1], [4, 1], [4, 2]]; $labels = ['a', 'a', 'a', 'b', 'b', 'b']; $classifier = new KNearestNeighbors(); $classifier->train($samples, $labels); $classifier->predict([3, 2]); // return 'b' Только я не понял что он считает и как с ним работать. Ну что в итоге полуаю тоже не понятно. Буду рад подсказкам.
@Dron-Boy, если честно я смотрел только встроенные в PHP классы на предмет совпадения имен. По тому примеру, что Вы привели все предельно просто. Первый массив содержит серию входных сигналов. Во втором - соответствующие им выходные данные. Оба эти массива используются в обучении, а в последней строчке уже обученная сеть по входным данным должна выдать ответ. Сама архитектура сети, как я понимаю, скрыта от вмешательств.
Количество элементов в перовом массиве и втором может отличаться? и на основе чего формируется первый массив?
Количество элементов в первом и втором массиве должно быть одинаковым. Данные берутся из конкретной задачи: вес, размер, скорость, количество символов - любые известные числа, при которых должно быть на выходе определенное значение
Это сеть в работе. Данный метод возвращает одно из значений массива $labels. Числа, которые в него передаются - это рабочие значения. Тут хороший пример - всего два входных значения. Можно поставить на плоскости точки с координатами входного массива $samples и прочертить границу между точками "a" и "b". тогда точка с координатами (3,2) должна попасть на территорию "b"
@Dron-Boy входными данными в этой реализации может быть массив любых чисел. Если ты начнешь подавать ей массивы из частот звучащих в песне звуков, и сопоставлять с именами во втором массиве, она начнет распознавать песни. Кстати, ты думал о том, что даже 10-теребайтный файл - это непрерывно записанное длиннющее число? Целое, одно число. Его даже можно перевести в десятичную систему,.
Архитектура нейросети обновлена по результатам работы предыдущей версии. Теперь слоев 3, нейронов 300+, синапсов 2500+. P.S.: Если кто будет играть - начинайте с одних и тех же дебютов - помогает в обучении.
Нейронку сам реализовывал? Православно-математично-сигмоидно-тангенсно, или нейроны - это классы с конкретной логикой и научить эту сеть чему-то окромя игры в реверси нельзя? P.S. Сам сейчас активно курю тему нейронок, работаю с FANN под php. Нраицца. --- Добавлено --- Чот страшно представить даже, откуда и накой столько? Расскажи подробнее. --- Добавлено --- Счет: 1 - 0 Вы выиграли. Какая модель обучения у тебя используется? С подкреплением или просто аппроксимация к эталонной модели? --- Добавлено --- Удалось даже ее сожрать, оставив кучу пустых клеток. --- Добавлено --- А вообще неплохо, оно действительно имеет некоторый прогресс между партиями. Опиши архитектуру подробнее, плз.
@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, но потом нейросеть изменила дебют. Хотя, все равно проигрывает.
В нейросеть не заложено желание выиграть - она должна к этому прийти в результате эволюции, потому как выживает только тогда когда не проигрывает сама себе.
@Fell-x27, Вы мне подкинули идею. Надо добавить на вход еще и количество съедаемых фишек - тогда будет обучение с подкреплением.