Необходимость нейро-символической интеграции

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

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

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

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

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

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

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

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

Проблема

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

Эту ситуацию можно понять на примере визуального ответа на вопрос (VQA). В самом деле, надежные и исчерпывающие символические описания, которых было бы достаточно для ответов на вопросы с помощью рассуждений, не могут быть извлечены снизу вверх на основе данных. Даже люди детально анализируют изображения в зависимости от своих целей (например, вопросов). Например, все ли лодки на той же стороне реки, что и велосипеды и автомобили на следующем изображении?

А теперь попробуем ответить еще на несколько вопросов. Сколько там было деревьев с зелеными листьями? Сколько там было лодок с людьми? Большинству из нас нужно будет еще раз взглянуть на изображение. Остальные смогут вспомнить само изображение, не глядя на него. Но никто из нас не сможет ответить на произвольные вопросы без лишней обработки визуальной информации.

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

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

По-видимому, и символическое мышление, и когнитивная обратная связь необходимы, чтобы иметь дело как с богатыми неоднозначными естественными изображениями, так и с композиционными вопросами (хотя исследование можно провести и на примере синтетических наборов данных).

Как мы описывали в наших предыдущих постах (это и это), более глубокая нейросимволическая интеграция в OpenCog может быть легко достигнута с использованием обоснованных предикатов в Atomese (язык представления знаний OpenCog), которые оцениваются в ходе рассуждений. Это можно рассматривать либо как пристальное внимание, уделяемое символьной системой, основанной на знаниях, подсимволическим / нейронным моделям зрения, либо как способ сборки нейронных модульных сетей на лету с использованием общего механизма декларативных рассуждений вместо использования специализированных императивный программный механизм выполнения, который обычно используется в этом классе моделей VQA.

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

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

Идея

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

Рассмотрим в качестве примера модель Transparency by Design (TbD). Он содержит несколько классов для разных модулей, например. OrModule, AndModule, AttentionModule, QueryModule, SameModule и т. Д. Один класс может быть реализован во многих объектах (определенных нейронных модулях, соответствующих определенным концепциям). Например, для каждого цвета (красный, зеленый и т. Д.), Для каждой формы (куб, цилиндр и т. Д.), Материала (металл, дерево и т. Д.) Существуют сети как внимания (фильтр), так и запроса (классификация).

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

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

Атомезе

Как описано в предыдущем посте, в OpenCog Atomspace можно использовать такие знания, как

InheritanceLink
  ConceptNode "red"
  ConceptNode "color"

и обоснованные предикаты (как атомы) могут быть привязаны к DNN через внешние функции таким образом, что запросы, подобные приведенным ниже, могут обрабатываться OpenCog посредством обоснованных рассуждений.

AndLink
  InheritanceLink
    VariableNode “$X”
    ConceptNode “color”
  EvaluationLink
    GroundedPredicateNode “py:filter”
    ConceptNode “cylinder”
  EvaluationLink
    GroundedPredicateNode “py:filter”
    VariableNode “$X”

В частности, этот запрос может помочь узнать, какого цвета цилиндр. Однако, как упоминалось выше, EvaluationLink, оцененный в ходе рассуждений, должен возвращать TruthValue OpenCog, которые могут быть объединены правилами Вероятностной логической сети. Это нарушает вычислительные графики библиотек глубокого обучения и препятствует сквозному обучению. Мы хотели бы сохранить и объединить оба модуля DNN с возможностью их обучения и представление знаний Atomspace с возможностью выполнения запросов с помощью символьных рассуждений.

CogNets

CogNets - это прототип нейросимвольного фреймворка с DNN-ориентированным дизайном. То есть он предоставляет средства для удобного расширения моделей DNN с помощью OpenCog на Python, а не для расширения OpenCog с помощью DNN на Atomese. Базовым классом является CogModule, унаследованный от torch.nn.Module. Если кто-то хочет использовать свою нейронную сеть PyTorch в рассуждениях, достаточно изменить ее базовый класс, например с class AttentionModule(nn.Module) по class AttentionModule(CogModule). CogModule сделает все необходимые обертывания. Единственное, что необходимо, - это предоставить Atom конструктору, к которому будет привязан создаваемый экземпляр. Это будет действующая программа на Python:

class AttentionModule(CogModule):
  def __init__(self, atom):
    super().__init__(atom)
    #initializing DNN parameters...
  def forward(self, x):
    #processing...
InheritanceLink(ConceptNode("red"), ConceptNode("color"))                       InheritanceLink(ConceptNode("green"), ConceptNode("color"))                       net1 = AttentionModule(ConceptNode("red"))                       net2 = AttentionModule(ConceptNode("green"))

Созданные сети будут вести себя так же, как оригинальные сети PyTorch. Например, можно выполнить net1(image) на некотором вводе тензора. Однако у них будет и другой способ выполнения - через запросы Atomese. Для удобства можно создать InputModule, единственной целью которого является запоминание входного тензора и привязка его к некоторому Atom в Atomspace, чтобы сделать его доступным для OpenCog. InputModule определен в CogNets и может быть легко использован, поэтому можно записать, например InputModule(batch, Concept("batch")), где batch - это тензор PyTorch для обработки.

Затем можно сформировать запрос Atomese почти в той же форме, что и в OpenCog, например

BindLink(
  TypedVariableLink(VariableNode("$X"), TypeNode("ConceptNode")),
  AndLink(
    InheritanceLink(VariableNode("$X"), ConceptNode("color")),
    evaluate(VariableNode("$X"), execute(ConceptNode("batch"))),
  VariableNode("$X"))

Здесь evaluate и execute заменяют EvaluationLink и ExecutionLink и создают необходимые оболочки для передачи тензоров от одного нейронного модуля к другому (они не выполняют эти модули напрямую, но сообщают OpenCog, как их выполнять; поэтому мы можем использовать VariableNode внутри них).

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

Значения тензорной истины

Прямое выполнение BindLink приводит к обработке AndLink в четком логическом стиле и к потере возможности определять дифференцируемую функцию потерь. Напротив, PLN имеет дело с непрерывными значениями истинности. PLN реализован как набор правил для Unified Rule Engine. В частности, эти правила могут вычислять значения истинности логических выражений на основе значений истинности их составляющих. Уравнения для вычисления этих истинностных значений реализованы в виде узлов GoundedSchema.

Мы ввели тензорные значения истинности в Atomese и реализовали версию PLN, которая работает с ними, используя PyTorch поверх тензоров. В результате на выходе PLN становится тензор PyTorch, связанный со всем вычислительным графом, собранным в процессе рассуждений. Таким образом, можно построить дифференцируемую функцию потерь и выполнить оптимизацию градиентного спуска. Интересно, что тензорные значения истинности могут быть присвоены IhneritanceLink или ImplicationLink, которые являются частью базы знаний, а также могут быть оптимизированы в процессе обучения.

Еще одна задача, которую можно решить с помощью той же самой системы рассуждений, проиллюстрирована на следующем рисунке. Эта задача рассматривалась в статье о DeepProbLog.

Заключение

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

Более подробную информацию можно найти в репозитории и в наших последних статьях по дифференцируемым PLN и CogNets (препринт).