Обучение с подкреплением работает не совсем так. И не факт, что подача съедаемых фишек будет плюсом, а не лишним шумом на входе.
@Fell-x27, разве это не любая обратная связь? Да, в стратегии игры - это не самый показательный момент. Но в плане обучения это может дать заметный эффект. Отсмотрел я снимки сетей и немного приуныл. Среди пары десятков отсмотренных нейронов лишь у немногих едва заметные изменения (относительные) весов: Это выходной нейрон на ячейке 56 и его веса синапсов (изначально все были одинаковые). 0 - входной нейрон с ячейки 56 1- горизонталь 56 - 63 2 - вертикаль 0 - 56 3 - диагональ 7-56 4-10 сегменты (от 2х2 до 8х8) примыкающие к этой ячейке. Какая-то тенденция к обучению есть, но уж очень слабая. Сама скорость общего изменения весов достаточно большая. Такое впечатление, что большая часть входных сигналов нейронами воспринимается как шум.
Вот ты сказал, что "удалось уйти от обратного распространения ошибки". А зачем от него уходить? Отличный алгоритм коррекции же. И на что ты его заменил? Может быть наоборот, стоит его использовать?
Этот алгоритм хорош в плане быстрого получения результата, но в природе его не существует. К тому же человек тоже ошибается. И в данном примере я мог бы знать результат только при завершении игры. А в моей модели нейрон при изменении весов опирается только на входные сигналы и выходное значение. P.S.: Но во всем есть свои плюсы - теперь я понял, что при создании архитектуры всем синапсам надо давать одинаковые веса - тогда результат будет точнее и лишен человеческого фактора.
Ну тогда обучение на модели тоже можно назвать обучением с подкреплением. Ты ведь прогоняешь итерацию, смотришь результат, если он не удовлетворяет заданному уровню, ну...среднеквадратичной ошибки, например, ты фиксишь веса. И так до тех пор, пока не начнешь пробиваться через установленный порог, считая, что сеть сошлась. То есть как бы говоришь "верно" или "не верно". Но это не обучение с подкреплением, увы. То, что ты делаешь, больше похоже на генетические алгоритмы. В таком случае, если хочешь развития более активного, вводи в систему фактор мутации. Случайные изменения, полученные не в ходе обучения. И пусть уже такая нейросеть воюет сама с собой. Это может давать очень интересные результаты. Нейросети не про природу, они про математику. Если хочешь сделать что-то, превосходящее живой аналог, выходи за рамки, в которых этот аналог существует.
В данном случае мутации - это игра с человеком. Эволюционирует она после победы (или ничьей) в двух партиях со своей предыдущей версией - сначала черными, а потом белыми после каждой партии с человеком. Я хочу лишь приблизиться к живому аналогу, а не превзойти его. Я бы даже свою сеть назвал интуитивной. В ней логика на последнем месте.
Сбросил все веса на 1. До этого в скрытом слое были мной установлены у нейронов разные веса и во время обучения сеть опиралась на них. Теперь она в свободном плавании. Результат после 30 партий (веса нейрона из скрытого слоя, который связан со всеми нейронами входного слоя): Общее изменение весов - около 60%, а относительное ~1%.
Нет. Мутации - это случайные изменения. Игра с человеком - это уже отбор полезных или вредных мутаций. Слушай.. А у тебя не марковский процесс идет, чтоли? Сеть при выборе хода не учитывает свое предыдущее состояние? Погугли в сторону рекуррентных сетей, мб что понравится.
@Fell-x27, процесс должен быть не марковским. У меня нейроны работают независимо от всей сети. И каждый ход меняют состояние своих весов, что влияет на последующие результаты. Та же рекуррентная сеть получаецца. Отбор полезных мутаций у меня как раз происходит, когда сеть играет сама с собой. Да и кто лучше человека может внести хаос в процесс?
Изменен алгоритм работы сети в игре. Теперь она работает фрагментарно. То-есть раньше делался обход по всем нейронам сети, а теперь запрашиваются только выходные нейроны ячеек, доступных для нее ходов. Они в свою очередь активируют лишь часть нейронов скрытого слоя. Все это позволяет уменьшить шумы для нейронов скрытого и выходного слоев, а так же повысить быстродействие сети. По результатам сеть стала чаще эволюционировать и выигрывать стало сложнее.
Окей, тогда объясни, как у тебя меняются веса у нейронов? Если не бекпропагейшн, то как? Каждый нейрон такой "а сменю-ка я себе вес"? В какую сторону? Почему именно он? В какой момент? Не может ли статься, что у тебя не сеть играет, а каждая клетка на поле сама за себя?
Почти так. Нейрон даже не знает, что он в игру играет. Если у него на выходе получился слабый сигнал, но все-же получился - он увеличивает веса (в соответствии с единым алгоритмом). Если сигнал сильный - уменьшает веса (в соответствии с тем же алгоритмом). Ну и величина изменений зависит от уровня выходного сигнала. Алгоритм почти такой же как в "обратном распространении" используется при "градиентном спуске". Я больше полагаюсь на возможность моей модели опираться на кратковременную память и способность улавливать суть в шумах, если таковые у нее имеются. Пока это лишь гипотеза.
Зачем? Что, если в данной ситуации вес надо сделать еще меньше? Если он все еще слишком большой? То есть...нейроны, в итоге стремятся к тому, чтобы усредниться, а ты удивляешься, что у них так мало отклонений по весам? --- Добавлено --- И как в итоге оценивать успешность конфигурации сети, если за N ходов у тебя происходит N изменений, суть которых в том, чтобы сильный сигнал глушить, а слабый усиливать, а фиксация результата идет только для последней конфигурации, причем по факту победы или проигрыша, что, в общем-то не позволяет посчитать ошибку?
Да. Все так. Нейрон стремится всегда выдавать сигнал 0.5. Но это значение он выдаст только в том случае, если на вход подать строго определенную комбинацию значений. Близкие комбинации дадут близкие к 0.5 значения и нейрон изменит веса незначительно. Так же и в случае, когда на нейрон перестанет поступать ранее изученная комбинация - он начнет приспосабливаться к другой. Вобщем всегда будет искать что-то общее среди всех приходящих на его входы комбинаций. А со скоростью обучения я разобрался - так и должно быть. У меня два коэффициента - сам сигнал (от 0 до 1) и шаг обучения (0.001)
Что-то не так с этой архитектурой, сдается мне. Что-то тут не так.. Вообще, та же альфаго, для игры, собственно, в го, испольщует вообще сверточные сети и технику, сходную с распознаванием изображений. Но тут распознается не изображение, а ситуация на доске, помогая ей строить тактику. Но там, если копнуть глубоко, жесть и содомия творится, и целый кластер из сотен CPU нужен, чтобы она работала.
@Fell-x27, как раз наоборот. Даже в PHP 5.6 с числами с плавающей точкой я проверял ситуацию работы нейросети равную 1 млн нейронов. На моем CPU с 2 ядрами по 2.8 ГГц и 2Гб встроенной оперативки и свопом (который в данном случае не играл роли) этот процесс занял 15-20 секунд, если память мне не изменяет. Что уж говорить о бинарнике с использованием целочисленных операций. P.S.: На серваке (он послабее) 300 нейронов, сон длится 400 итераций в течении 6 секунд - получаем 20 тыс. нейронов в секунду. Итого 1 млн. нейронов за 50 секунд. Хотя правильнее мерить не по нейронам, а по синапсам.
А вот по поводу обучения: Нейрон, который "прослушивает" диагональ 7-56. Синапсы расположены по порядку следования ячеек в диагонали. Уже прослеживается закономерность в выбранных нейроном весах
@Fell-x27, там сверточные сети использовались и количество входных нейронов 17к+ Плюс еще 13 слоев, которые работают по несколько раз за ход И ответ выдает за несколько мкс Нигде нет указания сколько нейронов там за эти 2 мкс обрабатывается. Может это чило - гугл. Но при этом 2 мкс. Моя ход делает за 20 мкс при 300 нейронах. Но сравнивать эти сети практически невозможно. Моя пока даже в реверси выиграть не может и работает на пыхе.
Я в курсе --- Добавлено --- Ну..реверси не такая простая игра. С шашками, например, куда проще. А то, что на пыхе..ну так попробуй не на пыхе, а на C/C++. Через использование библиотек типа php-fann или php-ml.
Решил обучать сеть новой стратегии и проводить турниры между последними версиями сети. Со стратегией занять стороны и углы сеть более менее разобралась (не айс, конечно, но углы занимает) Теперь новая стратегия - занять центр. Выглядит это вот так: После чего можно съесть все фишки. Повторение одного и того же дебюта дало свои плоды - она начала смещать меня к краю, но так и не поняла суть этой стратегии и как с ней бороться. После этого я устроил турнир между последними 8-ю сетями, которые получились в результате серий игр с новой стратегией. Турнир проходил попарно (использовались наиболее близкие версии сети) по 100 партий (поочередно черными и белыми) Вот результаты (первое число в скобках - количество ничейных партий): Код (Text): 1521375561 vs 1521373118 (3 : 44 : 53) 1521373027d vs 1521371725 (4 : 47 : 49) 1521371471 vs 1521350837 (2 : 43 : 55) 1521340048 vs 1521331222d (3 : 59 : 38) Script time 289.09659194946 sec. 1521373118 vs 1521371725 (3 : 57 : 40) 1521350837 vs 1521340048 (3 : 61 : 36) Script time 146.8601500988 sec. 1521373118 vs 1521350837 (2 : 37 : 61) Script time 73.45285987854 sec. А вот как теперь выглядят веса того же нейрона, что отслеживает диагональ 7-56: А вот чему научилась сеть: Хотя итог один, но прогресс заметен. Теперь она поняла, что не стоит занимать ячейки перед углами, но ошибается по мелочам. P.S.: Еще я понял, что игра в поддавки ее особо ничему не учит.
Когда эксперты следили за игрой Седоля и АльфаГо, они тоже подмечали, что Альфа делала нелогичные и ошибочные, с их точки зрения, ходы. А потом херак - и Седоль не успевал понять, что вообще произошло. Я к тому, что логика нейросети может быть несколько за гранью понимания логики человека. Она недостаточно прямая для него.
А ее и не будет. Одна из проблем нейросетей - ты хрена с два продебажишь ее работу в рилтайме и никак не вытащишь логику принятого решения. Вся логика укладывается в "ну так математика отработала". И чем сложнее нейросеть, тем это острее. По этому их и дебажат опосредованно, через среднеквадратичное отклонение, сводящееся к некоему порогу.
Турниры показали, что сеть после сна слабее. И те кто у них выигрывает получают мало опыта, в следствии чего тоже проигрывают. Можно посмотреть по результатам первого турнира - сети после сна с пометкой "d". Поэтому время сна на сервере я сократил вдвое и отключил сохранение после сна. Теперь сеть сохраняет свое состояние только после эволюционирования (выигрывает или играет в ничью две партии со своей предыдущей версией). Сон помогает обучаться но при эволюционировании дает более слабое потомство.