О добавлении синапсов отрицательной обратной связи в нейронную сеть

Недостающее звено в глубоких нейронных сетях

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

Возьмем, к примеру, эту простую схему триггера:

Если оба входа A и B активны, то в этой цепи возможны два взаимоисключающих состояния: либо C активен, но не D или наоборот. Этот пример зависит от того, был ли активирован первым: A или B. Но что, если мы не позволим времени определять, какое состояние активируется? Что, если целевая функция измеряет силу каждого из состояний? Таким образом, мы могли систематически искать оптимальное общее состояние в сети.

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

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

Так как же могла бы выглядеть такая целевая функция? Что, если бы мы могли облегчить значения активации наших нейронов для определения целевой функции? Если мы просто построим сумму по значениям активации каждого возбуждающего нейрона, мы сможем сравнить различные состояния в сети и увидеть, какие из них наиболее желательны. Обратите внимание, что это невозможно сделать для схем, основанных исключительно на логике, потому что нет постепенных весов для увеличения выбора правильного состояния. Это большая проблема, с которой сталкиваются большинство подходов, основанных на немонотонной логике.
Прежде чем мы продолжим, чтобы увидеть, как может выглядеть поиск интерпретации, мы должны сначала более внимательно изучить некоторые свойства сети. Первое, что нам нужно, это функция активации φ для наших нейронов, которая действительно неактивна для всех отрицательных значений активации; иначе мы не сможем по-настоящему подавить активацию нейронов. Мы можем использовать либо функцию ReLU, либо положительную половину функции tanh.

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

Поиск

Итак, как же выглядит фактический поиск интерпретации? Поскольку только возбуждающие нейроны могут иметь синапсы с отрицательной обратной связью, нам нужно учитывать их только во время поиска. Однако, прежде чем мы сможем выполнить фактический поиск, мы должны отсортировать возбуждающие нейроны таким образом, чтобы сохранить зависимости всех неповторяющихся синапсов. Во время поиска нам нужно будет сделать предположения о рекуррентно связанных будущих нейронах, состояние которых мы еще не знаем. Таким образом, для каждого возбуждающего нейрона мы будем вычислять и распространять значение активации в предположении, что все повторяющиеся входы имеют либо наиболее положительное влияние на текущий нейрон (ВЫБРАННО), либо наиболее отрицательное влияние (ИСКЛЮЧЕНО). Это также две возможные ветви для каждого узла в нашем дереве поиска. При возврате к родительскому узлу необходимо, конечно, восстановить предыдущее состояние сети.

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

В настоящее время мы используем этот алгоритм в сети с примерно 20 миллионами нейронов, из которых в среднем несколько тысяч активируются для данного документа. Время обработки одного документа составляет от 100 до 200 мс. Конечно, как обучить такой тип сети - вопрос открытый. В настоящее время мы используем созданную вручную модель, полученную из больших списков именованных сущностей и фраз, но, безусловно, был бы желателен настоящий алгоритм обучения для этой сети. Однако, на мой взгляд, этот алгоритм обучения не должен использовать градиентный спуск или обратное распространение. Сигнал ошибки просто становится слишком нечетким после того, как он проходит через несколько слоев нейронов. Лучшей отправной точкой для алгоритма обучения, вероятно, была бы дивергенция Кульбака-Лейблера, которая должна позволить нам тренировать возбуждающие нейроны, максимизируя получение информации по отношению к входным данным данный нейрон. Преимущество этого подхода в том, что он полностью не контролируется и, следовательно, не зависит от размеченных данных.

Данный алгоритм реализован в рамках проекта с открытым исходным кодом AIKA. Источник можно найти на GitHub. Тестовый пример JUnit, реализующий этот пример, можно найти здесь. Что было упущено в этой статье, так это трактовка реляционной структуры текстов или изображений. Если вы хотите узнать больше об обучении этого типа сети, прочтите эту статью.