Pull to refresh

ИИ — Сделай сам

Artificial Intelligence
Очень приятно, что тема искусственного интеллекта не заглохла, а продолжает развиваться. Здесь уже набралось множество статей с прекрасными идеями и интересными комментариями. Глядя на все это многообразие, захотелось вернуться к начатой полгода назад серии публикаций и поделиться некоторыми возникшими с тех пор мыслями и рассуждениями. Все это я попытался скомпоновать в одну большую статью, которая описывает все аспекты того, как будет работать конечный продукт, и содержит соображения по его реализации.

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

Ну и последнее, что я хотел сказать в этом послании. Для многих главной чертой ИИ является его недостижимость. Чтобы как-то расчитывать на их объективность, я постараюсь далее избегать этого определения и называть его просто программой. Тем более, что это и так будет не более, чем программа.

Вступление


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

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

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

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

Постоянная память


Ключевым моментом во всей системе является память. А если точнее, то ее структура. Идея нейросети бесспорно заманчива, но таким образом нам предстоит тягаться с IBM. Чтобы облегчить жизнь нам и избавить IBM от конкурента, возьмем за единицу информации что-то более самодостаточное и понятное, чем бит или уровень сигнала. Я даже затрудняюсь сказать, как назвать эту единицу одним словом (может кто подскажет?). Могу лишь перечислить примеры: буква, слово, словосочетание, предложение, произвольная последовательность из любых предыдущих элементов. Пока все. Зрение и слух оставим до лучших времен вместе с соответствующими им единицами информации.

Для того чтобы все функции, выделенные в первой аксиоме, были просты логически, да что там – очевидны, необходимо максимально оптимизировать под них память. Замечу, эти самые функции являются не чем иным, как обобщением процессов, происходящих в нейронах. С возрастом эти процессы не меняются и не усложняются. Грубо говоря, по какому алгоритму проходил поиск информации у трехлетнего человека, по тому самому он проходит и у тридцатилетнего. А все, что изменилось за это время – память.

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

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

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

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

Основная задача таких типов – это определение содержимого узла, к которому ведет связь. Определение того, что там хранится, в какой форме и как это можно использовать.

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

Очень важная и полезная черта такой структуры – это дискретность ее элементов. Во-первых – память состоит из неделимых элементов. Во-вторых – эти элементы обособлены и могут храниться как угодно и в каком угодно порядке. Они независимы друг от друга в том смысле, что в каждом узле хранятся только те ссылки, которые ведут ОТ него. Узел ничего не знает о ссылках, которые указывают НА него. Так что можно спокойно его редактировать, не думая о том, что информация в других потеряет актуальность.

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

Оперативная память


Кроме постоянной памяти в психологии выделяют еще краткосрочную. Также выделяют содержимое сознания, подсознания и еще много чего… Чтобы не вносить путаницу, представим все это единым и понятным компонентом – оперативная память.

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

Но вернемся к оперативной памяти. Хотя с одной стороны она «оперативная», с другой – она все-таки «память». Поэтому было бы логично организовать ее таким же образом – в виде сети. А чтобы как-то выделить ее, можно создать один узел – «оперативная память». Он будет содержать ссылки на все элементы, которые к ней относятся.

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

Теперь самое время разобраться, какие именно изменения и преобразования будут происходить в оперативной памяти. Раз она состоит из узлов, то вопрос сводится к тому – какие элементарные преобразования можно проводить с узлами.
  • Создание. На самом деле здесь довольно спорный момент. Как известно, в реальной нейросети изначально существует некоторое количество узлов, которое со временем только уменьшается. Но в нашей системе для экономии ресурсов узлы будут создаваться по мере ее работы. Это будет происходить в двух случаях: вся входящая информация преобразуется мини-сеть из свежесозданных узлов, и в процессе «мышления» будут создаваться различные комбинации из копий уже существующих узлов (т. н. воображение). Об этих двух процессах подробнее можно будет прочитать в разделах «общение» и «мышление».
  • Удаление. Здесь идея та же, что и в сборке мусора в .NET или Java. Узел, который уже отработал свое и не нужен в данный момент удаляется из оперативной памяти. Далее он либо записывается в постоянную память, либо удаляется вообще. Все зависит от того – связан ли он с существующими в постоянной памяти узлами. Если нет, то он бесполезен и нет смысла его записывать
  • Поиск. Поиск используется в процессе «вспоминания», так что подробно он будет рассмотрен в соответствующем разделе. Смысл его заключается в том, чтобы вытянуть из постоянной памяти в оперативную необходимые узлы. Выглядит это так – в оперативной памяти находится узел, к которому приходит вызов с указанием типа связи. Если такая связь есть, то в оперативную память переписывается копия элемента «на том конце» из постоянной памяти. Вызов приходит из другого узла. Механизм этих вызовов будет рассмотрен в разделе «мотивации и эмоции». Обычно весь этот процесс проходит организованно среди нескольких узлов.
  • Связывание. Связывание используется в первую очередь для «обучения», которое также удостоилось персонального раздела. Если кратко, то для связывания нужно минимум три узла и один вызов. В итоге один становится «родительским», другой – «дочерним», а третий – типом связи. Как было сказано ранее, все это происходит в оперативной памяти.

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

Промежуточный итог


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

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

Таким образом все сводится к разработке самих узлов. Они и будут теми кирпичиками, из которых будут построены все функции системы.

На сегодня – все. Вот приблизительное содержание следующих разделов и оглавление по совместительству:
  1. Постоянная память.
  2. Оперативная память.
  3. Мотивации и эмоции. (Обзор механизма вызовов и кое что о целостности организма)
  4. Воспоминания. (Довольно подробный обзор использования механизма поиска)
  5. Общение. (Обзор систем ввода-вывода и распознавания)
  6. Обучение. (Довольно подробный обзор использования механизма связывания)
  7. Проблески разума. (Обзор реализации более сложных функций на базе элементарных преобразований)

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

P. S. Искусственный интеллект – это вопрос не философии или религии. Спрашивая «что есть ии?», «есть ли у него душа?», «сможет ли он любить?» и «не поработит ли он мир?», мы не приближаемся к решению проблемы. Все эти вопросы не имеют и не могут иметь ответов, так что ломать над ними голову и клавиши клавиатуры – пустая трата времени.
Искусственный интеллект – это вопрос умения увидеть нужное и отбросить все лишнее.
Tags:
Hubs:
Total votes 80: ↑69 and ↓11 +58
Views 20K
Comments Comments 176