Алгоритм искусственного интеллекта с обучением. Выращивание искусственного интеллекта на примере простой игры. Основные алгоритмы принятия решений искусственным интеллектом

Для начала, что вообще такое искусственный интеллект. Под ИИ подразумевают набор алгоритмов и направление исследования по автоматизации задач, решаемых человеческим мозгом, а также имитация деятельности человеческого мозга для улучшения решения вычислительных задач. Например:

  • Распознавания образов, анализ зрительной информации.
  • Распознавание звуковой информации.
  • Рассуждения, принятия решений.
  • Творчество, интуиция.

Основная идея состоит в том, что многие задачи мозг решает лучше, чем компьютер, поэтому есть смысл использовать в программировании тот подход, который использует наш мозг в решении задач. Благодаря такому подходу, например, компьютер «научили» играть в шахматы и даже выигрывать у знаменитых гроссмейстеров, хотя изначала эта задачу представляло собой сложную проблему: количество комбинаций в шахматной игре такое большое, что компьютер не в состоянии обсчитать их за все время существования Вселенной. Проблема была решена с изобретением эвристических алгоритмов. Суть эвристики состоит в том, что мы просчитываем не все варианты, каким-то образом выбираем, какие варианты анализировать.

Теперь о некоторых типичных направлениях ИИ.

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

Результатом работы стало то, что ИИ, не зная правил, самостоятельно освоил игру крестики-нолики и нашел слабости ботов, которые играли против него. Но начал я с еще более простой задачи.

Набор команд

Все началось с подготовки набора команд, которым мог располагать ИИ. Языки высокого уровня содержат сотни различных операторов. Чтобы выделить необходимый минимум, я решил обратиться к языку Ассемблер. Однако, оказалось, что и он содержит множество команд.

Мне требовалось, чтобы ИИ мог читать и выводить данные, работать с памятью, выполнять вычисления и логические операции, делать переходы и циклы. Я наткнулся на язык Brainfuck, который содержит всего 8 команд и может выполнять любые вычисления (т.е. полон по Тьюрингу). В принципе, он подходит для генетического программирования, но я пошел дальше.

Я задался вопросом: какое минимальное количество команд необходимо для реализации любого алгоритма? Как оказалось - одна!

Процессор URISC содержит всего одну команду: вычесть и пропустить следующую инструкцию, если вычитаемое было больше уменьшаемого. Этого достаточно для построения любого алгоритма.

Олег Мазонка пошел еще дальше, он разработал команду BitBitJump и доказал, что она полна по Тьюрингу. Команда содержит три адреса, копирует один бит из первого по второму адресу памяти и передает управление на третий адрес.

Позаимствовав идеи Олега, для упрощения работы, я разработал команду SumIfJump. Команда содержит четыре операнда: A, B, C, D и выполняет следующее: к ячейке по адресу B прибавляет данные из ячейки по адресу A, если значение получилось больше заданного*, то переходит по адресу C, иначе переходит по адресу D.

Примечание

*В данном случае использовалось 128 - половина от длинны генома.


Когда операнд A обращается к ячейке памяти N0, происходит ввод данных, а когда к ячейке N1, то вывод.

Ниже представлен код SumIfJump на FreePascal (бесплатный аналог Delphi).

Procedure RunProg(s: TData); var a, b, c, d: TData; begin Inc(NStep); if NStep > MaxStep then begin ProgResult:= "MaxStep"; Exit; end; a:= s; b:= s + 1; c:= s + 2; d:= s + 3; a:= Prog[a]; b:= Prog[b]; c:= Prog[c]; d:= Prog[d]; if a = 0 then begin ProgResult:= "Input"; Exit; end; if a = 1 then begin ProgResult:= "Output"; Exit; end; Prog[b] := Prog[b] + Prog[a]; if Prog[b] < ProgLength div 2 then RunProg(c) else RunProg(d); end;
SumIfJump реализует самомодифицируемый код. Может выполнять любые алгоритмы, доступные на обычном языке программирования. Код легко изменяется и выдерживает любые манипуляции.

Простая задача

Итак, у нашего ИИ всего одна команда. Пока крестики-нолики для него очень сложная игра, и я начал с более простой.

Бот выдает случайное число, а ИИ должен считать данные и дать ответ. Если число больше среднего (от диапазона случайных чисел), ИИ должен выдать число меньше среднего и наоборот.

Геном нашего ИИ состоит из 256 ячеек со значениями от 0 до 255. Каждое значение - это и память, и код, и адрес. Количество шагов выполнения кода ограничено 256. Операнды читаются друг за другом.

Первоначально геном формируется набором случайных чисел, поэтому ИИ не знает, во что ему нужно играть. Более того, он не знает, что нужно последовательно вводить и выводить данные, отвечая боту.

Популяция и отбор

Первая популяция состоит из 256 ИИ, которые начинают играть с ботом. Если ИИ совершает правильные действия, например, запросил данные на ввод, а потом что-то вывел, то ИИ получает очки. Чем больше правильных действий, тем больше очков.

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

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

Эволюция


Между значимыми событиями проходили тысячи смен поколений. Программа была запущена в несколько потоков на Core i7. Вычисления заняли около 15 минут.

  1. Когда ИИ «лидер» совершал случайную ошибку и не набирал достаточное количество очков, популяция начинала деградировать, т.к. потомство формировалось из «второстепенных» родителей.
  2. Бывало так, что в потоке с аутсайдерами, которые топтались на месте, происходила удачная мутация, обеспечивающая взрывной рост набираемых очков. После чего этот поток становился лидером.
  3. Иногда в течение долгого времени не происходило никаких удачных мутаций, и даже 500 тыс. поколений не хватало, чтобы завершить отбор.

Заключение

В заключение я проделал то же с игрой крестики-нолики. Размер генома использовал тот, что и в первом случае. Количество шагов было увеличено до 1024, а размер популяции до 64 (для более быстрого расчета). Расчет занял несколько больше времени. Все происходило примерно по тому же сценарию.

Сначала ИИ играл против «рандомайзера». Я так назвал бота, который ходит случайным образом. Довольно быстро ИИ начал его обыгрывать, заполняя какую-либо строчку. Далее я усложнил задачу, добавив рандомайзеру немного разума: занимать линию, если есть возможность, либо защищаться. Однако, и в этом случае ИИ нашел слабости бота и стал обыгрывать его. Пожалуй, рассказ об этом - это тема для отдельной статьи.

Сын просил написать программу, чтоб ИИ играли между собой, а не с ботом. Были идеи сделать то же для игры шашки или го, однако, для этого у меня уже не хватило времени.

Единственный метод, который я применял для получения новых особей, - это мутация. Можно также использовать кроссовер и инверсию. Возможно, эти методы ускорят получение требуемого результата.

В конце родилась идея: дать ИИ возможность управлять всеми процессами на ПК и бороться за ресурсы компьютера. Подключить ПК к интернету, а в качестве вычислительных мощностей использовать пул старых биткойн ферм…

Как сказал, проводя аналогичный эксперимент, блогер

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

Теперь вернемся к знаку «стоп». Незаметно поправив пиксели изображения - эксперты называют такое вмешательство «пертурбациями» - можно обмануть компьютер и заставить думать, что знака «стоп», в сущности, и нет.

Аналогичные исследования, проведенные в Лаборатории эволюционного искусственного интеллекта в Университете Вайоминга и Корнеллского университета, произвели довольно много оптических иллюзий для искусственного интеллекта. Эти психоделические образы абстрактных узоров и цветов ни на что не похожи для людей, но быстро распознаются компьютером в виде змей или винтовок. Это говорит о том, как ИИ может смотреть на что-то и не видеть объект, либо видеть вместо него что-то другое.

Эта слабость распространена во всех типах алгоритмов машинного обучения. «Можно было бы ожидать, что каждый алгоритм имеет брешь в броне», говорит Евгений Воробейчик, доцент кафедры информатики и вычислительной техники в Университете Вандербильта. «Мы живем в очень сложном многомерном мире, и алгоритмы по своей природе затрагивают лишь небольшую его часть».

Воробейчик «крайне уверен», что, если эти уязвимости существуют, кто-то выяснит, как ими воспользоваться. Вероятно, кто-то уже это сделал.

Рассмотрим спам-фильтры, автоматизированные программы, которые отсеивают любые неуклюжие электронные письма. Спамеры могут попытаться обойти этот заслон, изменив написание слов (вместо виагры - ви@гра) или добавив список «хороших слов», которые обычно встречаются в нормальных письмах: вроде «ага», «меня», «рад». Между тем спамеры могут попытаться убрать слова, которые часто появляются в спаме, например, «мобильный» или «выигрыш».

До чего могут дойти мошенники в один прекрасный день? Самоуправляемый автомобиль, обманутый наклейкой на знак «стоп», является классическим сценарием, который был придуман экспертами в этой области. Дополнительные данные могут помочь порнографии проскочить через безопасные фильтры. Другие могут попытаться увеличить количество чеков. Хакеры могут подправить код вредоносного программного обеспечения, чтобы ускользнуть от органов правопорядка.

Нарушители могут понять, как создавать пропускающие данные, если заполучат копию алгоритма машинного обучения, которое хотят обмануть. Но чтобы пробраться сквозь алгоритм, это и не обязательно. Можно просто сломать его грубой силой, набрасывая на него немного разные версии электронной почты или изображений, пока они не пройдут. Со временем это можно будет даже использовать для совершенно новой модели, которая будет знать, что ищут хорошие ребята, и какие производить данные, чтобы их обмануть.

«Люди манипулируют системами машинного обучения с тех пор, как они были представлены впервые», говорит Патрик Макдэниел, профессор компьютерных наук и инженерии в Пенсильванском университете. «Если люди используют эти методы, мы можем даже об этом не знать».

Этими же методами могут воспользоваться не только мошенники - люди могут скрываться от рентгеновских глаз современных технологий.

«Если вы какой-нибудь политический диссидент при репрессивном режиме и хотите проводить мероприятия без ведома спецслужб, вам может понадобиться избегание автоматических методов наблюдения на основе машинного обучения», говорит Лоуд.

В одном из проектов, опубликованных в октябре, исследователи из Университета Карнеги — Меллона создали пару очков, которые могут тонко ввести в заблуждение систему распознавания лиц, заставив компьютер ошибочно принимать актрису Риз Уизерспун за Рассела Кроу. Это звучит смешно, но такая технология может пригодиться кому-нибудь, кто отчаянно пытается избежать цензуры со стороны власть имущих.

Что же со всем этим делать? «Единственный способ полностью избежать этого - создать идеальную модель, которая будет всегда правильной», говорит Лоуд. Даже если мы смогли бы создать искусственный интеллект, который превзошел бы людей во всех отношениях, мир все еще может подсунуть свинью в неожиданном месте.

Алгоритмы машинного обучения обычно оценивают по их точности. Программа, которая распознает стулья в 99% случаев, будет явно лучше, чем та, которая распознает 6 стульев из 10. Но некоторые эксперты предлагают другой способ оценки возможности алгоритма справиться с атакой: чем жестче, тем лучше.

Другое решение может заключаться в том, чтобы эксперты могли задавать программам определенный темп. Создайте свои собственные примеры атак в лаборатории, исходя из возможностей преступников на ваш взгляд, а затем покажите их алгоритму машинного обучения. Это может помочь ему стать более устойчивым с течением времени - при условии, конечно, что тестовые атаки будут соответствовать типу, который будет проверен в реальном мире.

«Системы машинного обучения - инструмент для осмысления. Мы должны быть разумными и рациональными в отношении того, что мы им даем и что они нам говорят», считает Макдэниел. «Мы не должны относиться к ним как к совершенным оракулам истины».

16 сентября 2017 в 22:08

Выращивание искусственного интеллекта на примере простой игры

  • Искусственный интеллект ,
  • Логические игры
  • Recovery Mode

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

Результатом работы стало то, что ИИ, не зная правил, самостоятельно освоил игру крестики-нолики и нашел слабости ботов, которые играли против него. Но начал я с еще более простой задачи.

Набор команд

Все началось с подготовки набора команд, которым мог располагать ИИ. Языки высокого уровня содержат сотни различных операторов. Чтобы выделить необходимый минимум, я решил обратиться к языку Ассемблер. Однако, оказалось, что и он содержит множество команд.

Мне требовалось, чтобы ИИ мог читать и выводить данные, работать с памятью, выполнять вычисления и логические операции, делать переходы и циклы. Я наткнулся на язык Brainfuck, который содержит всего 8 команд и может выполнять любые вычисления (т.е. полон по Тьюрингу). В принципе, он подходит для генетического программирования, но я пошел дальше.

Я задался вопросом: какое минимальное количество команд необходимо для реализации любого алгоритма? Как оказалось - одна!

Процессор URISC содержит всего одну команду: вычесть и пропустить следующую инструкцию, если вычитаемое было больше уменьшаемого. Этого достаточно для построения любого алгоритма.

Олег Мазонка пошел еще дальше, он разработал команду BitBitJump и доказал, что она полна по Тьюрингу. Команда содержит три адреса, копирует один бит из первого по второму адресу памяти и передает управление на третий адрес.

Позаимствовав идеи Олега, для упрощения работы, я разработал команду SumIfJump. Команда содержит четыре операнда: A, B, C, D и выполняет следующее: к ячейке по адресу B прибавляет данные из ячейки по адресу A, если значение получилось больше заданного*, то переходит по адресу C, иначе переходит по адресу D.

Примечание

*В данном случае использовалось 128 - половина от длинны генома.


Когда операнд A обращается к ячейке памяти N0, происходит ввод данных, а когда к ячейке N1, то вывод.

Ниже представлен код SumIfJump на FreePascal (бесплатный аналог Delphi).

Procedure RunProg(s: TData); var a, b, c, d: TData; begin Inc(NStep); if NStep > MaxStep then begin ProgResult:= "MaxStep"; Exit; end; a:= s; b:= s + 1; c:= s + 2; d:= s + 3; a:= Prog[a]; b:= Prog[b]; c:= Prog[c]; d:= Prog[d]; if a = 0 then begin ProgResult:= "Input"; Exit; end; if a = 1 then begin ProgResult:= "Output"; Exit; end; Prog[b] := Prog[b] + Prog[a]; if Prog[b] < ProgLength div 2 then RunProg(c) else RunProg(d); end;
SumIfJump реализует самомодифицируемый код. Может выполнять любые алгоритмы, доступные на обычном языке программирования. Код легко изменяется и выдерживает любые манипуляции.

Простая задача

Итак, у нашего ИИ всего одна команда. Пока крестики-нолики для него очень сложная игра, и я начал с более простой.

Бот выдает случайное число, а ИИ должен считать данные и дать ответ. Если число больше среднего (от диапазона случайных чисел), ИИ должен выдать число меньше среднего и наоборот.

Геном нашего ИИ состоит из 256 ячеек со значениями от 0 до 255. Каждое значение - это и память, и код, и адрес. Количество шагов выполнения кода ограничено 256. Операнды читаются друг за другом.

Первоначально геном формируется набором случайных чисел, поэтому ИИ не знает, во что ему нужно играть. Более того, он не знает, что нужно последовательно вводить и выводить данные, отвечая боту.

Популяция и отбор

Первая популяция состоит из 256 ИИ, которые начинают играть с ботом. Если ИИ совершает правильные действия, например, запросил данные на ввод, а потом что-то вывел, то ИИ получает очки. Чем больше правильных действий, тем больше очков.

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

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

Эволюция


Между значимыми событиями проходили тысячи смен поколений. Программа была запущена в несколько потоков на Core i7. Вычисления заняли около 15 минут.

  1. Когда ИИ «лидер» совершал случайную ошибку и не набирал достаточное количество очков, популяция начинала деградировать, т.к. потомство формировалось из «второстепенных» родителей.
  2. Бывало так, что в потоке с аутсайдерами, которые топтались на месте, происходила удачная мутация, обеспечивающая взрывной рост набираемых очков. После чего этот поток становился лидером.
  3. Иногда в течение долгого времени не происходило никаких удачных мутаций, и даже 500 тыс. поколений не хватало, чтобы завершить отбор.

Заключение

В заключение я проделал то же с игрой крестики-нолики. Размер генома использовал тот, что и в первом случае. Количество шагов было увеличено до 1024, а размер популяции до 64 (для более быстрого расчета). Расчет занял несколько больше времени. Все происходило примерно по тому же сценарию.

Сначала ИИ играл против «рандомайзера». Я так назвал бота, который ходит случайным образом. Довольно быстро ИИ начал его обыгрывать, заполняя какую-либо строчку. Далее я усложнил задачу, добавив рандомайзеру немного разума: занимать линию, если есть возможность, либо защищаться. Однако, и в этом случае ИИ нашел слабости бота и стал обыгрывать его. Пожалуй, рассказ об этом - это тема для отдельной статьи.

Сын просил написать программу, чтоб ИИ играли между собой, а не с ботом. Были идеи сделать то же для игры шашки или го, однако, для этого у меня уже не хватило времени.

Единственный метод, который я применял для получения новых особей, - это мутация. Можно также использовать кроссовер и инверсию. Возможно, эти методы ускорят получение требуемого результата.

В конце родилась идея: дать ИИ возможность управлять всеми процессами на ПК и бороться за ресурсы компьютера. Подключить ПК к интернету, а в качестве вычислительных мощностей использовать пул старых биткойн ферм…

Как сказал, проводя аналогичный эксперимент, блогер

Статьи по теме: