Хабрахабр

Искусственный интеллект общего назначения. ТЗ, текущее состояние, перспективы

В наше время словами «искусственный интеллект» называют очень много различных систем — от нейросети для распознавания картинок до бота для игры в Quake. В википедии дано замечательное определение ИИ — это «свойство интеллектуальных систем выполнять творческие функции, которые традиционно считаются прерогативой человека». То есть из определения явно видно — если некую функцию успешно удалось автоматизировать, то она перестаёт считаться искусственным интеллектом.

Сейчас эта цель называется «Сильный ИИ» или «ИИ общего назначения».
Тем не менее, когда задача «создать искусственный интеллект» была поставлена впервые, под ИИ подразумевалось нечто иное.

Постановка задачи

Сейчас существуют две широко известные постановки задачи. Первая — Сильный ИИ. Вторая — ИИ общего назначения (он же Artifical General Intelligence, сокращённого AGI).
Upd. В комментариях мне подсказывают, что это различие скорее на уровне языка. На русском слово «интеллект» означает не совсем то, что слово «intelligence» на английском

Обычно упоминается, что он должен проходить тест Тьюринга в первоначальной постановке (хм, а люди-то его проходят?), осознавать себя как отдельную личность и уметь достигать поставленных целей. Сильный ИИ — это гипотетический ИИ, который мог бы делать всё то, что мог бы делать человек.

На мой взгляд, польза от такого ИИ в основном исследовательская, потому что в определениях Сильного ИИ нигде не сказано, какие перед ним будут цели. То есть это что-то вроде искусственного человека.

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

Никаких тестов Тьюринга, никакого самосознания, никаких искусственных личностей — исключительно прагматичный ИИ и не менее прагматичные его операторы. В этой статье я буду рассказывать об AGI.

Текущее состояние дел

Сейчас существует такой класс систем, как Reinforcement Learning, или обучение с подкреплением. Это что-то типа AGI, только без универсальности. Они способны обучаться, и за счёт этого достигать целей в самых разных средах. Но всё же они очень далеки от того, чтобы достигать целей в любых средах.

Вообще, как устроены системы Reinforcement Learning и в чём их проблемы?

Есть система управления, в неё через сенсоры (state) входят некоторые сигналы об окружающей реальности и через управляющие органы (actions) она воздействует на окружающую реальность. Любой RL устроен примерно так. В RL-системах подкрепление формируется извне управляющего блока и оно обозначает то, насколько хорошо ИИ справляется с достижением цели. Reward — это сигнал подкрепления. Сколько продал пылесосов за последнюю минуту, например.
Затем формируется таблица вот примерно такого вида (буду её называть таблицей SAR):

В таблице отражено всё, что ИИ делал, всё, что он видел и все сигналы подкрепления. Ось времени направлена вниз. В общем, RL начинается тогда, когда в таблице SAR уже есть хотя бы несколько строчек.
Что происходит дальше? Обычно для того, чтобы RL сделал что-то осмысленное, ему надо для начала какое-то время делать случайные ходы, либо смотреть на ходы кого-то другого.

SARSA

Простейшая форма reinforcement learning.

Например, мы увидим, что (исходя из той таблицы выше) если сказать женщине «будь мужиком, купи пылесос!», то reward будет низким, а если сказать то же самое мужчине, то высоким. Мы берём какую-нибудь модель машинного обучения и по сочетанию S и A (state и action) предсказываем суммарный R на следующие несколько тактов.

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

ИИ получает очередное сообщение или ссылку на очередного клиента. А дальше происходит следующее. То есть осталось назначить некоторое A (action) и ждать подкрепления. Все данные по клиенту вносятся в ИИ извне — будем считать базу клиентов и счётчик сообщений частью сенсорной системы. А если это? ИИ берёт все возможные действия и по очереди предсказывает (с помощью той самой Machine Learning модельки) — а что будет, если я сделаю то? А потом RL выполняет то действие, за которое ожидается максимальная награда. А сколько подкрепления будет за вот это?

SARSA нанимает в игре юнитов, и адаптируется в случае изменения правил игры. Вот такую простую и топорную систему я ввёл в одну из своих игр.

Кроме того, во всех видах обучения с подкреплением есть дисконтирование наград и дилемма explore/exploit.

Например, если дисконтирующий множитель равен 0. Дисконтирование наград — это такой подход, когда RL старается максимизировать не сумму награду за следующие N ходов, а взвешенную сумму по принципу «100 рублей сейчас лучше, чем 110 через год». 9+R2*0. 9, а горизонт планирования равен 3, то модель мы будем обучать не на суммарном R за 3 следующих такта, а на R1*0. 729. 81+R3*0. Затем, что ИИ, создающий профит где-то там на бесконечности, нам не нужен. Зачем это надо? Если RL будет делать то, что его модель полагает оптимальным, он так и не узнает, были ли какие-то стратегии получше. Нам нужен ИИ, создающий профит примерно здесь и сейчас.
Дилемма explore/exploit. Explore — это стратегия, при которой RL делает что-то, что позволяет исследовать окружающую среду в поисках лучших стратегий. Exploit — это стратегия, при которой RL делает то, что обещает максимум награды. Например, можно каждые несколько тактов делать случайное действие. Как реализовать эффективную разведку? Они будут выдавать разные результаты. Или можно сделать не одну предсказательную модель, а несколько со слегка разными настройками. Можно сделать, чтобы действие выбиралось таким, чтобы у него максимальной была величина: M+k*std, где M — это средний прогноз всех моделей, std — это стандартное отклонение прогнозов, а k — это коэффициент любопытства. Чем больше различие, тем больше степень неопределённости данного варианта.

В чём недостатки?

Поехать к цели (которая в 10 км от нас, и дорога до неё хорошая) на автомобиле или пойти пешком. Допустим, у нас есть варианты. А потом, после этого выбора, у нас есть варианты — двигаться осторожно или пытаться врезаться в каждый столб.

Человек тут же скажет, что обычно лучше ехать на машине и вести себя осмотрительно.

А приводило оно вот к чему. А вот SARSA… Он будет смотреть, к чему раньше приводило решение ехать на машине. Да, он умеет водить хорошо. На этапе первичного набора статистики ИИ где-то в половине случаев водил безрассудно и разбивался. У него есть статистика — дальше в половине случаев он выбирал адекватный вариант, а в половине — самоубийственный. Но когда он выбирает, ехать ли на машине, он не знает, что он выберет следующим ходом. Поэтому в среднем лучше идти пешком.

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

Q-Learning

Эта модель рассчитывает для каждого состояния максимально достижимую из него суммарную награду. И записывает её в специальный столбец Q. То есть если из состояния S можно получить 2 очка или 1, в зависимости от хода, то Q(S) будет равно 2 (при глубине прогнозирования 1). Какую награду можно получить из состояния S, мы узнаём из прогнозной модели Y(S,A). (S — состояние, A — действие).

И создаём в таблице следующий столбец — Q2. Затем мы создаём прогнозную модель Q(S,A) — то есть в состояние с каким Q мы перейдём, если из S выполним действие A. То есть максимальное Q, которое можно получить из состояния S (перебираем все возможные A).

Затем мы создаём регрессионную модель Q3(S,A) — то есть в состояние с каким Q2 мы перейдём, если из S выполним действие A.

Таким образом мы можем добиваться неограниченной глубины прогнозирования. И так далее.

На картинке R — это подкрепление.

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

У охотника есть копьё, и он с ним идёт на медведя, по собственной инициативе. Бытовой пример q-learning-поведения. Охотник полагает, что в будущем он станет делать именно наилучшие ходы (а не неизвестно, какие, как в SARSA), а если делать наилучшие ходы, то медведя он победит. Он знает, что подавляющее большинство его будущих ходов имеет очень большой отрицательный реворд (способов проиграть намного больше, чем способов победить), на знает, что есть и ходы с положительным ревордом. То есть для того, чтобы пойти на медведя, ему достаточно уметь делать каждый элемент, нужный на охоте, но необязательно иметь опыт непосредственного успеха.

Если бы охотник действовал в стиле SARSA, он бы предполагал, что его действия в будущем будут примерно такими же, как раньше (несмотря но то, что сейчас у него уже другой багаж знаний), и на медведя пойдёт, только если он уже ходил на медведя и побеждал, например, в >50% случаев (ну или если другие охотники в более чем половине случаев побеждали, если он учится на их опыте).

В чём недостатки?

  1. Модель плохо справляется с изменчивой реальностью. Если всю жизнь нас награждали за нажатие красной кнопки, а теперь наказывают, причём никаких видимых изменений не произошло… QL будет очень долго осваивать эту закономерность.
  2. Qn может быть очень непростой функцией. Например, для её расчёта надо прокрутить цикл из N итераций — и быстрее не выйдет. А прогнозная модель обычно имеет ограниченную сложность — даже у крупной нейросети есть предел сложности, а циклы крутить почти ни одна модель машинного обучения не умеет.
  3. У реальности обычно бывают скрытые переменные. Например, который сейчас час? Это легко узнать, если мы смотрим на часы, но как только мы отвели взгляд — это уже скрытая переменная. Чтобы учитывать эти ненаблюдаемые величины, нужно, чтобы модель учитывала не только текущее состояние, но и какую-то историю. В QL можно это сделать — например, подавать в нейронку-или-что-у-нас-там не только текущее S, но и несколько предыдущих. Так сделано в RL, который играет в игры Атари. Кроме того, можно использовать для прогноза рекуррентную нейросеть — пусть она пробежится последовательно по нескольким кадрам истории и рассчитает Qn.

Model-based системы

А что, если мы будем прогнозировать не только R или Q, но вообще все сенсорные данные? У нас постоянно будет карманная копия реальности и мы сможем проверять на ней свои планы. В этом случае нас гораздо меньше волнует вопрос сложности вычисления Q-функции. Да, она требует на вычисление много тактов — ну так мы всё равно для каждого плана многократно запустим прогнозную модель. Планируем на 10 ходов вперёд? 10 раз запускаем модель, и каждый раз подаём её выходы ей же на вход.

В чём недостатки?

  1. Ресурсоёмкость. Допустим, на каждом такте нам нужно сделать выбор из двух альтернатив. Тогда за 10 тактов у нас соберётся 2^10=1024 возможных плана. Каждый план — это 10 запусков модели. У если мы управляем самолётом, у которого десятки управляющих органов? А реальность мы моделируем с периодом в 0.1 секунды? А горизонт планирования хотим иметь хотя бы пару минут? Нам придётся очень много раз запускать модель, выходит очень много процессорных тактов на одно решение. Даже если как-то оптимизировать перебор планов — всё равно вычислений на порядки больше, чем в QL.
  2. Проблема хаоса. Некоторые системы устроены так, что даже малая неточность симуляции на входе приводит к огромной погрешности на выходе. Чтобы этому противостоять, можно запускать несколько симуляций реальности — чуть-чуть разных. Они выдадут сильно различающиеся результаты, и по этому можно будет понять, что мы находимся в зоне такой вот неустойчивости.

Метод перебора стратегий

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

Никакой SAR-таблицы. То есть никакого прогноза тут нет. Мы просто подбираем стратегию, а она сразу выдаёт Actions.

Это очень дешёвый способ «увидеть чудо». Это мощный и эффективный метод, если вы хотите попробовать RL и не знаете, с чего начать — рекомендую.

В чём недостатки?

  1. Требуется возможность прогонять одни и те же эксперименты по много раз. То есть у нас должна быть возможность перемотать реальность в начальную точку — десятки тысяч раз. Чтобы попробовать новую стратегию.

    Обычно если у нас есть модель интересующего нас процесса, мы можем не создавать хитрую стратегию — мы можем просто составить план, как в model-based подходе, пусть даже тупым перебором. Жизнь редко предоставляет такие возможности.

  2. Непереносимость опыта. У нас есть SAR-таблица по годам опыта? Мы можем о ней забыть, она никак не вписывается в концепцию.

Метод перебора стратегий, но «на живую»

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

А вот ничего подобного. Для меня это звучит несколько неожиданно — казалось бы, QL + Model-Based подход математически идеальны. Кроме того, число тестов тоже нельзя задрать в бесконечность — а значит, стратегию придётся искать в не очень сложном пространстве вариантов. Плюсы у подхода примерно те же, что и у предыдущего — но они слабее выражены, так как стратегии тестируются не очень долго (ну нет у нас тысячелетий на эволюцию), а значит, результаты неустойчивые. Ну и непереносимость опыта никто не отменял. Мало у неё будет «ручек», которые можно «подкрутить». Им надо намного больше взаимодействий с реальностью, чем подходам, использующим машинное обучение. И, по сравнению с QL или Model-Based, эти модели используют опыт неэффективно.

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

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

Модели машинного обучения для RL

Для обучения с подкреплением можно использовать чуть ли не любые модели ML. Нейросети — это, конечно, хорошо. Но есть, например, KNN. Для каждой пары S и A ищем наиболее похожие, но в прошлом. И ищем, какие после этого будут R. Тупо? Да, но это работает. Есть решающие деревья — тут лучше погулить по ключевым словам «градиентный бустинг» и «решающий лес». Деревья плохо умеют улавливать сложные зависимости? Используйте feature engeneering. Хотите, чтобы ваш AI был поближе к General? Используйте автоматический FE! Переберите кучу различных формул, подайте их в качестве фичей для вашего бустинга, отбросьте формулы, увеличивающие погрешность и оставьте формулы, улучшающие точность. Потом подайте наилучшие формулы в качестве аргументов для новых формул, ну и так далее, эволюционируйте.

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

Алгоритмическая регрессия идеально подберёт любую зависимость — за сотни лет. Но нейросети обычно являются компромиссом между выразительностью и сложностью обучения. А нейросеть — это что-то среднее. Решающее дерево отработает очень быстро — но уже y=a+b экстраполировать не сможет.

Перспективы развития

Какие сейчас вообще есть способы сделать именно AGI? Хотя бы теоретически.

Эволюция

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

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

Но как должен выглядеть язык, на котором RL выглядит компактно — чтобы эволюция его нашла — и в то же время чтобы эволюция не находила решений типа «а создам-ка я нейронку на стопятьсот слоёв, чтоб вы все чокнулись, пока я её обучаю!». Проблема в том, что с помощью эволюции вырастить что-то типа RL, конечно, можно. Эволюция же как толпа неграмотных пользователей — найдёт в коде любые недоработки и угробит всю систему.

AIXI

Можно сделать Model-Based систему, основанную на пачке из множества алгоритмических регрессий. Алгоритм гарантированно полон по Тьюрингу — а значит, не будет закономерностей, которые нельзя подобрать. Алгоритм записан кодом — а значит, можно легко рассчитать его сложность. А значит, можно математически корректно штрафовать свои гипотезы устройства мира за сложность. С нейросетями, например, этот фокус не пройдёт — там штраф за сложность проводится очень косвенно и эвристически.

Пока что лучшее, что для этого есть — эволюция, а она непростительно долгая. Осталось только научиться быстро обучать алгоритмические регрессии.

Seed AI

Было бы круто создать ИИ, который будет улучшать сам себя. Улучшать свою способность решать задачи. Это может показаться странной идеей, но это задача уже решена для систем статической оптимизации, типа эволюции. Если получится это реализовать… Про экспоненту все в курсе? Мы получим очень мощный ИИ за очень короткое время.

Как это сделать?

Пусть RL будет тупеньким, но будет уметь создавать себе калькуляторы, записные книжки и компьютеры. Можно попробовать устроить, чтобы у RL часть actions влияли на настройки самого RL.
Либо дать системе RL некоторый инструмент для создания себе новых пред- и пост-обработчиков данных.

Ещё вариант — создать с помощью эволюции некий ИИ, у которого часть actions будут влиять на его устройство на уровне кода.

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

Видимо, они не хотят связываться с комбинаторным перебором и стараются любые свои идеи сделать пригодными к методу обратного распространения ошибки. Впрочем, сейчас и Google, и DeepMind работают в основном с нейросетевыми архитектурами.

Надеюсь, эта обзорная статья оказалась полезна =) Комментарии приветствуются, особенно комментарии вида «я знаю, как лучше сделать AGI»!

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть