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

  • Большая часть задач ИИ может быть сформулирована как задача динамического построения или нахождения функции с заданными свойствами. Слово "динамического" здесь означает "на основе заранее неизвестных входных данных". Классификация, распознавание, оптимальное управление, моделирование временных рядов... Чаще всего "заданные свойства" удобно не пытаться определить строго, а определять в терминах конкуренции (то есть предъявить процедуру определения, какая функция лучше из данного набора, а не задавать требуемые свойства).

  • Существующие общие подходы к решению "интеллектуальных задач" также в большинстве своем можно естественным образом переформулировать на языке изменяющихся функций, принадлежащих некоторому классу. И отличаются друг от друга двумя "почти независимыми" характеристиками: 1) в каком классе функции ищутся, и 2) как именно происходит поиск.

    Например, для нейронных сетей первой характеристике отвечает топология сети, а второй - метод обучения. Для генетических алгоритмов первая характеристика - интерпретация "генетического кода", а вторая - методы скрещивания, отбора, "управления стадом", ... и т.п. Несколько особняком стоит нечеткая логика, которая, однако, тоже оперирует функциями (ибо нечеткие множества и нечеткие отношения - это, на самом-то деле, характеристические функции). Отличие состоит вот в чем: в нечеткой логике не принято эти функции динамически "тестировать" на то, как они "справляются со своим заданием". То, как их будут преобразовывать, задается человеком, и преимущество такого подхода состоит в том, что в нем удобно выражаются практически любые экспертные правила.

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

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

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

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

    Язык, который мы пытались "родить" на форуме - это выражение одного из способов так делать. Вот пример его синтаксиса, думаю, он самодостаточен для любого человека, знающего С, С++, С# или Джаву.

      int func_name( int arg1, float arg2, ... )
      {
        int u1, c1;
        float u2, c2;
        ...
        c1, c2 = mutable Code( arg1, arg2, u1, u2 );
      }
    
    после чего можно поменять мутабельную часть функции так:
      (int,float) func2( int, float, int, float );
      func_name = insert( func_name, Code, func2 );
    
    а еще можно и так:
      func_name = insert( func_name, Code, { return arg1 + u1, arg2 + u2 } );
    
    Слабость его пока состоит в том, что внутренняя структура функции размечается очень "плоско", исключительно только упоминанием, что "вот этот кусок можно поменять".

    Можно было бы подумать о более сложной разметке, например: возможности определить по байт-коду функции ее производной(ых) по параметру, или по крайней мере возможности "следить" за ней, когда функция изменяется; возможности вставить какой-то код "сразу перед первым использованием такого-то входа"; "сразу после последнего изменения такого-то выхода" и т.п.; возможности указывать и использовать, что данная функция имеет заданную (как именно?) группу инвариантных преобразований входа...

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

    Однако все задачи "практического ИИ", в решении которых есть значительные успехи, как мне кажется, проходят именно эти 4 этапа.

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

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

    Насчет возможных продвижений в первых двух пунктах мне рассуждать пока сложно, т.к. не хватает "видения тенденции". Может, кто из "мэтров" подскажет?

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

  • Hosted by uCoz