Комментарии 30

Коммент про биткоин-фермы навел на параноидальную мысль что биткоины — изобретение уже существующего ИИ с целью создать большой пул вычислительных мощностей, потом обрушив биткоины ИИ скупит эти мощности дешево для собственной работы.

Эти мощности умеют только считать SHA-1 хеши. В отрыве от биткоина довольно бесполезная задача.
> Были идеи сделать то же для игры шашки или го, однако, для этого у меня уже не хватило времени.

Как писал Норберт Винер, человека вполне можно передать по телеграфу, но в настоящий момент технические сложности представляются непреодолимыми.
С го вполне можно попробовать для начала на доске с небольшим количеством клеток.
Сложность была не столько техническая, сколько личная — мало свободного времени для программирования.
Да не, вы клёвую штуку сделали, и я понимаю, что, в принципе, это дело должно масштабироваться и под более сложные задачи. Ирония была про то, что в более сложных задачах частенько вылезают досадные мелочи, масштаб которых (и затраты времени, соответственно) бывает очень сложно оценить заранее :)
непонятно конечно, где же тут ИИ, если все четко алгоритмировано, и по факту состояние всегда зависит только от внешних сигналов, но никакой накопленной памяти нет
никакой накопленной памяти нет

Память есть. ИИ берет данные из нулевого адреса (ячейка ввода) и может складывать их внутрь себя, далее обрабатывать их и выводить с учетом этого какой-либо результат.
то есть вся память это значение одной ячейки? но тогда будет очень мало вариантов развития событий, если бы была комбинация из 10 ячеек, тут уже можно было бы говорить о сложной памяти
Все, что ИИ положил «в себя», т.е. запомнил, так в нем и остается до тех пор, пока он играет с ботом.
Обратите внимание на этот интересный проект


(ссылка на скачивание в описании к видео)

Neural Guppies
В этой симуляции автор реализовал простой самообучающийся ИИ с использованием генетического алгоритма.

Из пояснений к видео:
Goopies — это двумерные существа, которые живут в виртуальной среде.
Каждое существо оснащено нейронной сетью и набором датчиков, которые позволяют
«видеть» и «чувствовать» окружающую их среду.
Там так же есть запперы, гранулы и трупы.
запперы (синего цвета) при контакте с Гуппи забирают их энергию.
Гранулы (зеленый) и трупы (красный) напротив, восстанавливают энергию Гуппи.
Энергия также может переходить между Гуппи в зависимости от их текущего цвета (красного, зеленого и синего) как в «камень-бумага-ножницы» (красный бьет зеленый, зеленый бьет синий, синий бьет красный). Гуппи могут менять свой цвет, используя свои нейронные сети.
Когда Гуппи умирают, выбираются наиболее подходящие особи для производства нового поколения. Их гены смешиваются с применением случайной мутации. Те особи, которые выживают дольше всех, имеют более высокую вероятность на передачу своих генов следующему поколению.
Этот алгоритм имитирует «естественный отбор». На протяжении многих поколений можно ожидать что Гуппи будут становиться все более «умными», т.к. их нейронные сети станут более адаптированными к среде обитания.
По вашей наводке я обратил внимание на данный проект и… испытал горечь от того, что исходниками автор не делится. Не делится видимо из скромности, хотя графическое отображение происходящего очень и очень интересное. Больше всего в этом плане мне понравилась первая часть.
Тема очень интересная, и у меня возник ряд вопросов. Если найдете время ответить, буду очень признателен!

1. Почему геном содержит именно 256 генов? Чем обусловлена эта цифра?
2. Допустим ген содержит цифру 42 (или любую другую из возможных). И что это значит на практике? Как соотносится значения генов и действия, выполняемые Вашим ИИ?
3. Как происходит процесс «обдумывания» очередного хода (крестики-нолики)? Или обученный таким образом ИИ на основе уже сделанных ходов просто «знает» какой ход ему нужно сделать. Значит ли это, что каждый раз на одни и те же действия бота будет один и тот же ответ ИИ?
  1. В зависимости от сложности задачи, можно сделать геном больше, но вычисления будут больше времени занимать. В моем случае этой длинны оказалось достаточно. Поскольку геном — это и код, и адреса памяти. Удобно использовать значения типа Byte — от 0 до 255, чтобы любые значения могли ссылаться на полный диапазон ячеек генома. Для более сложной задачи можно использовать тип данных Word от 0 до 65 535, тогда размер генома целесообразно делать 65 536 ячеек.
  2. Допустим, ячейка N15 содержит цифру 42. При запуске с этого места операнд A будет обращаться к 42 ячейке памяти: возьмет от туда данные для добавления к адресу B. Адрес B будет взят из 16-ой ячейки (15 + 1).
  3. Процесс обдумывания хода у ИИ достаточно сложный. Я пытался анализировать то, что он делает, но понять это достаточно трудно. Видно только, что он что-то «усиленно» считает перед тем, как дать ответ.
    Здесь можно сделать по-разному. Я перезагружал ИИ после каждого боя с ботом, поэтому он начинал всякий раз одинаково и действовал однотипно. Можно между боями перегрузу не делать, тогда ИИ будет модифицироваться в процессе боя и вести себя всякий раз по-разному.
Спасибо, буду разбираться, т.к. подход достаточно необычный и заслуживает внимания.
Да забавная статья! И что еще более забавно, что ИИ превзошел создателя, если опираться на п3. :)
А можно посмотреть все исходники проекта? Может выложите на github?
Нельзя сказать, что ИИ превзошел создателя. Дело в том, что код из одной инструкции — это просто набор чисел. Поэтому, глядя на числа, очень трудно понять суть того, что происходит. Это только Нео из Матрицы умел делать :)

Код выложить могу, но позже, т.к. желательно провести рефакторинг и сделать минимальные инструкции, а на это нужно время.
Да было бы очень интересно посмотреть на завершенный проект, а то в общих словах как-то не очень понятно.
Понял только что буфер 256байт, есть набор примитивных инструкций 2или 3 работающих с этим буфером. То что «это» как-то работает это понятно и то что «ОНО» что-то вычисляет тоже понятно, непонятно другое: как оно взаимодействует и вообще хотелось бы отдельную более подробную статью про то как ОНО играет в крестики нолики…
Вовремя, кстати, статья подоспела, так как на этих выходных я решил-таки разобраться с генетическим алгоритмом в играх nes. Попробовал два разных подхода, первый — lua-скрипт в эмуляторе, работает почти идеально, за сутки решает уровень, но только для двух версий марио, а второй — самообучающаяся программа, которая может проходить довольно много игр. Очень интересно сделана, нужно сначала записать небольшой реплей с прогрессом, скормить обучалке, она сама проанализирует и решит, какой цели нужно добиваться. Процесс, правда, долгий, за сутки в 6 потоков набирается минута-две геймплея, но в любом случае, наблюдать за этим интересно.

В принципе, если кому-нибудь интересно, могу попробовать написать гайд по запуску, так как в процессе нарвался на несколько неочевидных вещей.
В первой (простой) игре во всех вехах система баллов была одинаковая:
— один балл за запрос ввода;
— один балл за вывод чего-либо после ввода;
— один балл за правильный ответ.
И так по кругу, до тех пор пока ИИ не совершит ошибку.

В крестиках-ноликах система баллов была другой:
— по одному очку за правильный ввод и вывод;
— 100 очков за победу;
— 50 за ничью;
— 0 за поражение.
Запрос ввода и вывода был один раз в такт?
Что запрашивало и что выводило, поконкретнее? Например, в крестиках-ноликах опрашивалось содержание каждого поля и ставился крестик (нолик)?
В крестиках-ноликах бот ждал, когда ИИ начнет запрашивать данные на ввод. ИИ мог совершить некоторое количество вычислений перед тем, как запросить данные. То же и с выводом. Т.е. процесс ввода и вывода занимал у ИИ не по одному такту.

На ввод и вывод подавалось значение от 0 до 255. Занимаемая ячейка была той, что соответствовала остатку от целочисленного деления на 9. Например вводится «142»: 142 mod 9 = 7. Значит заполняется ячейка номер 7. Если она занята, то заполняется следующая свободная.

Ячейки нумеровались так:
0 1 2
3 4 5
6 7 8
интересно посмотреть, как будет меняться скорость вычислений у работоспособных потомков разных эволюций, в каждой из которых система распределений очков награды была бы разной.
Вы генетическим алгоритмом сделали автоматический аппроксиматор дерева решений крестиков-ноликов в код «одноинструкторного» процессора. Методы ИИ тут условно присутствует, конечно, но ИИ — не выращенный код, а сам генетический алгоритм, ищущий «дерево решений крестиков-ноликов в виде кода одноинструкторного процессора». (Возможно, моя критика не очень понятна и кажется лишь претензией к терминологии.)

Для применения генетического алгоритма необходима модель искомого «фенотипа решателя» (выращиваемого ИИ) такая, чтобы малые изменения генотипа приводили с высокой степенью вероятности либо к «летальному исходу», либо к малому изменению адаптивного успеха особи (т.е., чтобы случайными мутациями «нащупывался» неслучайный градиент приспособленности на условном ландшафте «репродуктивного успеха»). И в случае проекции «алгоритм игры в крестики-нолики ⇔ код одноинструкторного процессора» это не так (по сути, для «голого» одноиструкторного процессора вообще трудно придумать полезную задачу, в которой бы малые изменения кода приводили к малым изменениям успеха в решении задачи). Да, вы вручную ввели дополнительные условия (ваша таблица «вех эволюции»), чтобы как-то создать «градиент репродуктивного успеха», однако на этапе уже непосредственно отбора на успех в игре в крестики-нолики ваш генетический алгоритм, по-сути, вырождается в что-то типа метода Монте-Карло (вариант полного перебора, в котором все варианты просто перемешиваются в случайно порядке). Дерево решений крестиков-ноликов просто очень маленькое, и потому с высокой вероятностью умещается в ваши параметры размера генотипа и размера поколения, но успех отбираемой особи в игре, по сути, уже не зависит от успеха своих родителей (им важно лишь дожить до этапа 3). Для любой другой мало-мальски сложной задачи ваш метод не сработает.

Чтобы таки вырастить универсальный ИИ, необходимо обеспечить возможность эволюционной организации фенотипа (чтобы особи могли обособлять и развивать отдельные «органы», которые и будут являться суб-моделями происходящего в окружающей среде, и «органы» управления ими, которые могли бы уже и выражаться одноинструкторным процессорами, и всё это с возможностью наращивать бесконечные иерархии). Бесструктрный код одноинструкторного процессора, выращиваемый генетически, сам внутри себя к такой организации фенотипа тоже мог бы прийти (т.е., чтобы все эти «органные абстракции» сами родились внутри него, не требуя от программиста сложного описания «иерархичного фенотипа», чтобы этот код сам разбивался на подпрограммы), но тогда нужно обеспечить в генетическом механизме кластеризацию генов, так, чтобы возникала конкуренция не только отдельных генов, но и их сцепок (для простых задач будет достаточно ввести хотя бы рекомбинацию в «половом процессе», т.е., организовать кластера генов М и Ж).
xxx: Я написал ИИ который умеет одну команду.
yyy: Фи, вы не написали Скайнет!
#irony, #именаизменены
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.