Природа против фон Неймана против нейронных сетей

Neural Quine: реален ли самовоспроизводящийся ИИ?

Рассказ о воспроизводстве в биологии, машинах и искусственном интеллекте

Мы уже привыкли видеть влияние ИИ повсюду вокруг нас не только в цифровой жизни (от рекомендаций на Netflix до распознавания голоса Siri и Alex), но и в физической: Amazon Go, видеонаблюдение и такси без водителей, и это действительно сделало нас живет лучше. Что немного разочаровывает, так это то, что «интеллект» совсем не похож на человеческий или даже биологический интеллект, потому что это просто набор математических моделей, которые соответствуют своим степеням свободы на основе некоторых эмпирических наблюдений. Чего мы ждем от разумного существа? Помимо чистого интеллекта, он, вероятно, мог бы обладать чувством юмора, состраданием, способностью интерпретировать свои собственные решения и, конечно же, способностью к воспроизведению. Все, кроме последнего, уже было успешно реализовано в некоторой алгоритмической форме, поэтому в этой статье мы сосредоточимся на попытке построить такой ИИ (здесь искусственная нейронная сеть), который способен копировать себя, т.е. самовоспроизводится как простейший форма воспроизведения.

Мы рассмотрим историю самовоспроизводящихся машин, соответствующие концепции и закодируем собственные нейронные сети, которые могут это делать. В ходе этого исследования возникнут очень интересные, но естественные вопросы: полезно ли такое самовоспроизведение для алгоритмов? Как они балансируют между воспроизводством и другими задачами, которым мы хотим их научить? Наверное, мы можем чему-то научиться из этого эксперимента как люди? На эту статью сильно повлияла работа Neural Quines. Как всегда, вы можете найти весь исходный код и попробовать провести эксперимент самостоятельно в моем GitHub.

Самовоспроизведение в природе

Как сообщает Википедия, по своей природе процесс репликации - это, по сути, воспроизведение:

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

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

Самовоспроизводящиеся машины

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

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

Следующим шагом он назвал Универсальный копир B:

По сути, это «Куайн Тьюринга», который буквально выводит собственный исходный код, в нашем случае инструкцию Ф (X). Что дальше? Собственно, как-то нам нужно объединить Универсальный Конструктор A и Универсальный копир B. К сожалению, мы не можем просто объединить их в режиме (A + B), потому что тогда что произойдет, если описание Φ (A + B) будет введено в автомат (A + B)? В результате должна получиться дополнительная копия как автомата, так и его описания.

И снова фон Нейман представил третий управляющий автомат C с исполнительным контролем над действиями (A + B), чтобы гарантировать, что символьное описание ввода Φ (A + Б) используется в правильной роли в нужное время, т. Е. Либо для создания, либо для копирования. Просмотрите бумагу, чтобы увидеть объяснение того, почему трех автоматов-узлов (A + B + C) на самом деле достаточно для простейшей самовоспроизводящейся машины Тьюринга, что, впрочем, несложно.

Зачем нужен самовоспроизводящийся ИИ?

Похоже, идея самовоспроизведения имеет смысл в природе (спасибо cap) и в алгоритмах разных масштабов. Но зачем он нужен в программах ИИ?

  • Если биологическая жизнь началась с первого саморепликатора, то если мы уже вдохновлены биологическими методами на создание искусственного интеллекта, не должны ли мы начать с той же отправной точки?
  • Последние исследования в области нейронных сетей очень сфокусированы на обучении правильному представлению, поэтому сегодня активно обсуждаются многие гипотезы, влияющие на веса, такие как генеративное или многозадачное моделирование. Разве самосознание и самовоспроизведение не должны быть такой репрезентативной целью?
  • Это также важно для безопасности, например, если программа ИИ может выводить собственный «исходный код» и, следовательно, блокировать другие возможности для чтения весов из файла или как-то его реконструировать.
  • Еще одно приятное свойство самовоспроизводящейся системы - способность самовосстанавливаться от повреждений, как это уже делают некоторые живые существа.
  • Помимо технологических проблем, людям нравится становиться всемогущими богами, и создание чего-то, что может воссоздать себя, может выглядеть привлекательно с точки зрения «создания искусственной жизни».

Quines

Говоря о компьютерных программах, такие программы, которые способны воспроизводить себя (то есть возвращать собственный исходный код), в течение некоторого времени известны как quines. Например, в Python код, который выводит сам себя, может выглядеть следующим образом, вы можете найти больше теории и сложных примеров здесь:

s = ’s = %r\nprint(s%%s)’
print(s%s)

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

Название куайн было придумано Дугласом Хофштадтером в его научно-популярной книге Гёдель, Эшер, Бах в честь философа Уилларда Ван Ормана Куайна (1908–2000), который провел обширное исследование косвенной ссылки на себя, и, в частности, для следующего порождающего парадокс выражения, известного как парадокс Куайна: Дает ложь, если ей предшествует цитата, порождает ложь, если ей предшествует его цитата.

В нашем случае с машинным обучением нам предстоит решить несколько задач:

  • Как определить математическую установку, которая позволит нейронной сети предсказывать собственные веса?
  • Как заставить такую ​​нейронную сеть решать другие полезные задачи, при этом воспроизводя себя?
  • Что означает эта самовоспроизведение после построения такой модели? Помогает ли это тренировкам? Что мы узнаем из этого?

Neural Quines

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

Идея, описанная в оригинальной статье Neural Quines, действительно гениальна и основана на HyperNEAT, методе нейроэволюции для проектирования нейронных архитектур. Вместо того, чтобы прогнозировать все веса в одно и то же время на выходе, мы можем использовать координату (или индекс) каждого веса в качестве входных данных и иметь единственное число, которое представляет значение этого веса в качестве выходных данных. Таким образом, мы обеспечиваем минимально возможное измерение как для ввода, так и для вывода без каких-либо ограничений на внутреннюю архитектуру и, следовательно, на веса! Схематично архитектура будет выглядеть следующим образом:

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

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

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

В коде PyTorch архитектура будет выглядеть следующим образом (также проверьте исходный код на GitHub):

AuxiliaryQuine(
  (embedding): Embedding(4096, 64)
  (linear): Linear(in_features=64, out_features=64, bias=False)
  (output): Linear(in_features=64, out_features=1, bias=False)
  (class_output): Linear(in_features=64, out_features=10, bias=False)
)

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

Эксперименты

Для проверки идеи я выбрал относительно простые многослойные персептроны с одним скрытым слоем. В качестве вспомогательной задачи классификации я поиграл с набором данных MNIST с изображениями, масштабированными до 8x8 пикселей, чтобы ускорить сходимость и сохранить очень ограниченное количество реплицируемых весов (‹5000). Может быть несколько настроек того, как тренировать нейронные лозы. Опять же, авторы статьи показывают, что есть возможности обучать эти нейронные сети, как мы «привыкли»: используя подходы на основе градиента, обратное распространение и эволюционные алгоритмы. Оба этих подхода ориентированы на прямую оптимизацию самовоспроизводящихся потерь. Но помимо этого существует еще так называемый метод регенерации:

Мы делаем это, заменяя текущий набор параметров прогнозами веса, сделанными quine. Каждая такая замена называется регенерацией. Затем мы чередуем выполнение регенерации и раунд оптимизации для достижения низких, но нетривиальных самовоспроизводящихся потерь.

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

Ванильный нейральный квин

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

VanillaQuine(
  (embedding): Embedding(10000, 100)
  (linear): Linear(in_features=100, out_features=100, bias=False)
  (output): Linear(in_features=100, out_features=1, bias=False)
)

и сначала обучите его с помощью обычной градиентной оптимизации. Что мы в конце концов тренировали?

Как мы видим, визуально мы не очень хорошо предсказали веса. Средняя ошибка среднего и среднеквадратическая ошибка также далеки от нуля (0,012, 0,0005 соответственно). Тогда попробуем метод регенерации?

Похоже, что по метрикам (MAE 6.490128e-08, MSE 6.623671e-15) и визуальной картине мы действительно можем очень хорошо предсказать веса ... но подождите, если все они почти равны нулю, это похоже на нашу регенеративную нейронную кайну просто сошлись на так называемом тривиальном нулевом кайне! Эффект уменьшения весов до величины, очень близкой к нулю, уже известен в теории регуляризации, что, безусловно, хорошо, но нам все еще нужно проверить, действительно ли это помогает обучению некоторым стандартным задача машинного обучения, как это происходит с регуляризацией. В противном случае я начну спрашивать себя, нужно ли нам вообще воспроизводство, если оно не помогает достичь целей (по крайней мере, с точки зрения ИИ) ...

Вспомогательная лоза

Давайте теперь попробуем добавить дополнительную задачу в наш quine и посмотрим, как самовоспроизводящаяся цель может выжить с некоторой классификацией, скажем, чисел MNIST :) Для простоты визуализации и конвергенции я уменьшил изображения до 8x8 пикселей, что, следовательно, не сильно повлияло на точность обычной нейронной сети. Архитектура следующая:

AuxiliaryQuine(
  (embedding): Embedding(4096, 64)
  (linear): Linear(in_features=64, out_features=64, bias=False)
  (output): Linear(in_features=64, out_features=1, bias=False)
  (class_output): Linear(in_features=64, out_features=10, bias=False)
)

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

Похоже, что эти модели могут очень и очень точно предсказывать веса, но как насчет точности? В наборе тестовых данных они равны соответственно 0,8648, 0,847 и 0,8455… не так много, но, по крайней мере, давайте сравним это с обычным MLP, который не умеет предсказывать собственный вес!

Индивидуальная классификация

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

Выводы

Помимо решения интересного упражнения в мире машинного обучения, мы выяснили несколько интересных открытий, связанных с самовоспроизведением в алгоритмах ИИ. Прежде всего, мы ясно видим, что vanilla quine имеет тенденцию очень быстро сходиться к тривиальному решению с нулевым весом, которое даже похоже на регуляризацию, имеет совершенно другое значение. Вместо того, чтобы избавляться от лишних весов для оптимизации потерь, самовоспроизведение просто обрезает их до нуля, потому что этому легче научиться. Это не то, чего мы хотим :)

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

И последнее, но не менее важное: это заставило меня задуматься о компромиссе между самовоспроизведением и достижением целей в реальной жизни. Следуем ли мы, люди, той же логике? Наши естественные звонки «отвлекают» нас от других целей и занимают слишком много возможностей в наших нейронных сетях? Это хороший момент для обсуждения;)

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

Это эссе является частью серии рассказов на математические темы, опубликованных в еженедельном издании Medium Cantor’s Paradise. Спасибо за чтение!