@Abyss, я думаю "беседы" самое то. Нашел способ коррекции "ошибок". Если при определенной комбинации фишек на игровом поле "дергать" тот выходной нейрон, куда (по мнению учителя) должна совершить ход сеть, то его выходной сигнал подтянется к 0.5 и у этого нейрона в этой ситуации будет приоритет. НО! У меня большие сомнения на счет того стоит ли форсировать события и давать возможность человеку решать, что правильно, а что нет?
Решил доверить этот процесс не человеку, а компьютеру. Теперь после каждой игры с человеком нейросеть "переосмысляет" свои ходы. Т.е.: если она проиграла то ей на вход подается последовательность состояний игрового поля и на выходе запрашиваются все доступные варианты ходов, кроме тех, что она выбирала. Если она выиграла - тогда в этой последовательности запрашиваются на выходе нейроны совпадающие с ее ходами. Вобщем попытка показать разницу между поражением и победой. При поражении ей принудительно дается шанс подумать о других возможных ходах. При победе выбранные ходы закрепляются.
Из-за обнаруженного "бага" состояние сети пришлось откатить на 3 дня назад, для сохранения чистоты эксперимента. Тактический прием с захватом центра пришлось учить заново, но результаты (как мне кажется) лучше:
За счет последних новшеств удалось трехдневный процесс обучения уложить в один день. Веса распределились похожим образом, но разница все же есть. Нейрон 7-56 до обнаружения "бага": Он же после сброса состояния на 3 дня назад и переобучения: Разницы практически нет, если не считать небольшого смещения весов в сторону синапса ячейки 56 Но вот на нейроне, отслеживающем все игровое поле разница куда более заметна. До обнаружения "бага": После переобучения: По другим показателям из-за отключения сохранения после сна сеть эволюционирует реже. Про плюсы в обучении пока ничего не могу сказать - подвижки имеются, но пока не выигрывает. Вот тут она меня подловила: Но закрепить преимущество не смогла, вследствии чего и проиграла.
Удалось обнаружить, что длительный и частый сон теперь вредит сети. Поэтому время сна сократил еще вдвое и интервал увеличил до 50+ партий. Жалко было терять обученные сети - провел турнир между 64 снимками сетей, которые обучались с ошибкой в коде. В победители вышла одна из последних версий. Вот какими стали веса синапсов у нейрона, следящего за всем игровым полем: Веса стали выравниваться, что не может не радовать. Ей даже пару раз удалось у меня выиграть, но потом она была автоматически погружена в сон (на локальном сервере он длится намного дольше), после чего стала делать глупости. Я и решил, что такой сон в данной ситуации вредит. Может и вообще вреден, а может надо точнее его настраивать. Этот вопрос еще предстоит исследовать. Но в начале обучения он помогает подогнать веса под рабочие значения. Эту версию сети не стал загружать на сервер - слишком много "мутаций".
@Maputo и каким же образом ты отказался от обратного распостранения ошибок? 600 нейронов на 5 слоёв? если бы это была фанн то структура крайне неудачная --- Добавлено --- @Maputo как на счёт сна который активируется после Н проигышей? так как после выигрыша учится то нечему
@abrdabr, от обратного распространения ошибки через всю сеть. Похожий алгоритм у меня используется внутри нейрона, независимо от "ошибки" всей сети. Зейчас 300 нейронов на 3 слоя. То была первая "ленивая" архитектура. Сон помогает частично избавиться от шумов (правда, бывают полезные шумы), а они есть и при выигрыше и при проигрыше. К тому же и победы закреплять тоже надо. Вообще все партии сети еще и "переосмысляют".
@Maputo можно полную структуру увидеть? типа распределение нейронов по слоям. так чем сон отличается от "эпохи обучения"? но сравнивая с человеческим сном и видюшкой с ютуба о "ходе бога", рекомендую вставить в сон рандомный ход, что позволит не толлько перенимать опыт но и "творить" полагаю сейчас у тебя дизбаланс "закреплялок" и "переобучалок", что нейтрализовать выйдет только математическим угадыванием )))) --- Добавлено --- вау, я выиграл))) только сегодня научился играть, но телефон меня делал как лоха, сложность была "глубина просчёта один ход". Всётаки нейросеть знает чего я хочуDDDDDDDDDDDD
По сути так и есть, даже больше - на вход подаются рандомные числа (тот же шум, но не имеющий никакой логики, кроме логики алгоритма псевдослучайной последовательности). Возможно его действие больше похоже на электрошок, чем на сон. Входной слой - 64 нейрона Скрытый слой (178 нейронов) состоящий из нейронов отслеживающих горизонтали, вертикали, диагонали и сегменты (2х2, 3х3, 4х4, 5х5, 6х6, 7х7, 8х8) Выходной слой 64 нейрона (каждый из которых связан с одним нейроном входного слоя и несколькими нейронами скрытого слоя, чьи синапсы подключены к этому же нейрону входного слоя) Ее же обучал в основном я)))) А я сам плохо в реверси играю)
@Maputo с одним скрытым далеко не уедешь, оч уж ограничена будет в вариациях. сча дай бог склероза провангую оптимальную последовательность 64-40-(72или96)-х-64 х потомучто не помню формулу((( но вроде тоже 40 или просто с меня плохая ванга.... может её пора ставить против программ? типа перенести на локалку и как соперника запустить прогу какуюнить? но если сам учишь то вот мой опыт за сегодня: ходить нужно по углам DDDD
Возможно. Но судя по весам - она еще далека от среднего уровня обучения. Я хочу посмотреть как она будет играть при разнице в весах более 50% на всех нейронах. Возможно она сама подскажет какие связи избыточны. Но она так же обладает и памятью. Я надеюсь, что ее должно хватить на все дерево возможных состояний доски. Пока она обучается в турнирах сама с собой. Точнее несколько версий эволюционировавшей сети. И не всегда выигрывает последняя версия.
@Maputo нее на всё дерево её полюбому не хватит, точнее у тебя ресов не хватит на всё дерево. Да и при малейшей смене архитектуры произойдёт огромнейшее перестроение связей, что потребует переобучения, вставить лишний слой в обученую неросеть будет куда хуже чем провести пару эпох обучения. тогда откатывай эволюцию назад и отправляй спать снова)))) но на мой взгляд чего-то не хватает, на рандоме многому не научишься, а лишнее обучение на старых данных это лишь трата ресурсов... как реализовал взаимодействие между сетками? ну типа шмоп, файлы, сокеты?
По поводу смены архитектуры я думал. Процесс не должен сопровождаться катастрофическими последствиями (по моему предположению). Сеть должна сама решать как использовать дополнительные ресурсы. Я пробовал обнулять выходной слой - он восстанавливался. Просто при встраивании нового нейрона в сеть надо правильно подобрать веса синапсов, присоединенных к его выходу нейронов. По моим расчетам его вес стоит брать наименьшим из имеющихся весов и выровнять общую сумму. А при надстраивании слоев вообще не должно быть проблем. Финалисты турнира загружаются на сервер. При этом в игру грузится победитель, а первая эволюция будет в случае победы над проигравшим. Просто файлы. Загружается последний. Противник самой сети - предпоследний. При эволюционировании сеть сохраняется в новый файл и указатель из-за этого смещается. Спойлер: рейскондишн Про рейскондишн я тоже думал, но серьезных последствий не должно быть - на крайняк при одновременном сохранении либо чья-то сеть не запишется, либо затрет одну версию другая, но сами сети хранятся во время игры в сессии
Провел турнир между последними сетями. Залезаю на сервер, чтобы загрузить последнюю версию, а тут сюрприз в виде еще нескольких снимков сети: Спасибо) Последняя - моя. Разница в 3 секунды. Проведу завтра турнир с учетом этих версий.
@gruth, с коннектом бывает беда, но она не так происходит. Приходят старые состояния игры. Думал добавить токен, но решил, что это у меня с инетом проблемы. А когда несколько ходов за раз - это в пределах правил. Если у противника нет доступных ходов, то он пропускает ход. Это часть стратегии - отжать край и двигаться от этого края, съедая все фишки. Вот например: Последние ходы по 4 и по 3 за раз она сделала, потому что у меня не было доступных ходов.
Исследовал веса синапсов в скрытом и выходном слое. По результатам можно сказать, что нейроны скрытого слоя переходят в завершающую стадию обучения. Чего не скажешь о нейронах выходного слоя - они еще в самом начале. Возможно сказывается, то что теперь сеть работает фрагментарно и выходные нейроны запрашиваются реже нейронов скрытого слоя, а может то что нейроны скрытого слоя не находились в равновесии. Нейрон на диагонали 7-56 (скрытый слой) Нейрон следящий за всем игровым полем (скрытый слой) Нейрон выходного слоя на ячейке 56
А вот почему я еще возлагаю надежды на положительное действие "сна": Это тот же нейрон выходного слоя на ячейке 56 после 50000 итераций "сна". Разница между весами усилилась. Но в игре себя такая сеть показала ужасно. Память стерта напрочь. Последнее время я играл 4 идентичных партии, которые заканчивались в несколько ходов. Удалось добиться от нее изменения дебюта, а после длительного "сна" это все забылось и не пыталось переучиваться, даже после проведения турнира между 12-ю сонными версиями, которые получились в результате поиска оптимальных настроек "сна": Если судить по выходным значениям (циферки между ходами - абсолютное отклонение от 0.5) - сеть играет пальцем в небо. Когда она уверена в своем ходе - значение должно быть близко к 0. Эту версию не загружал на сервер.
@Maputo я тоже когда начинал то думал чем больше эпох и нейронов, тем умнее будет сетка, но оказалось всё не так просто... могу предложить тогда ещё один эксперимент, который мне делать лень, а результат интересен: младенец рождается с большим числом синапсов чем у взрослого человека, в результате обучения разрушается до 80% их. так вот по аналогии не прибавлять слои\нейроны\синапсы, а убавлять типа создать сеть с более-менее сложной структурой и проверить реакцию на удаление нейрона, затем сетки, или их обнуления. Если надумаешь делать, то отпиши результаты.
@abrdabr, для такого эксперимента нужна обученная сеть. У меня пока такой нет. Могу лишь сказать, что предыдущая сеть была инвалидом из-за ошибки в коде. Когда я исправил ошибку - она играла совершенно ужасно (даже не могу слова подобрать). Но до исправления ошибки она приспособилась делать неплохие ходы. Потом я взял срез из 64 таких сетей-инвалидов и устроил между ними турнир. Победитель после этого смог пару раз меня обыграть. То-есть сеть адаптируется к новым обстоятельствам. Нет такого чтобы все рушилось из-за одного нейрона.
@Maputo в больших нейросетях да, особенно после дополнительных эпох обучения, но в маленьких с разрушения фательны, точнее не столько фатальны, сколько уменьшают результативность. К примеру возьмём сетку(фанн) 1-40-2 которая определяет подано ли положительное-отрицательное число, дадим ей три-четыре примера и сотню эпох обучений, результат будет 0.99 добавим один нейрон и результат будет 0.7 я про то что на результативность нейросети влияет в первую очередь структура, а не количество эпох, количество входных данных и структуру нейросети в большинстве своём приходится делать наугад, опираясь лишь на интуицию. Для мелких, математических нейросетей мне удалось выработать несколько правил, формул оптимизирующих структуру, но потом я это дело кинул)))) Так вот, а этот эксперимент, позволил бы подтвердить моё предположение.