python

Работа с метасетевыми структурами на Python – библиотека MetaNet

  • четверг, 12 марта 2015 г. в 02:10:54
http://habrahabr.ru/post/252781/

Когда видите единственное решение – спросите других



В данной статье я хотел бы рассказать о некоторых предпосылках появления инструмента для моделирования метасетей.

Автоматизация обучения


Изначально возникла проблема автоматизации обучения искусственных нейронных сетей с определёнными временными ограничениями. На пути ее решения был предложен подход к использованию оппозитных нейронных сетей [1]. Суть в том, что бы обучать две сети, одну как обычно:



А вторую на обратных эталонных выходах:



где – эталонное множество выходов, y — выход сети, ε — значение отклонения (погрешность), N количество нейронов в заданном слое, L — номер выходного слоя и n — момент времени. Тогда для определения насыщения одной сети или попадании в локальный минимум – мы могли бы сравнивать ее с оппозитной. И в случае существенного различия не тратить время на очередное обучение. Но встает новый вопрос – как производить подобный анализ? Тогда мы решили определять достоверность ответов сети по значению дисперсии ответов. Целесообразность подобного решения была обусловлена эмпирическим наблюдением – при насыщении или попадании в локальный минимум – значения выхода отличаются небольшим разбросом. Построив модели, мы нашли, что в ряде случаев данный подход оправдывает себя. Но тут же появился другой вопрос – а как определить, около каких векторов входов ошибается сеть? Или – как должна изменяться степень доверия ответам сети, например, в задачах классификации, при приближении к конкретным классам распознаваемых объектов?

Степень доверия ответам сети


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

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



В итоге мы получили следующий график:



Представленные графики дают основание полагать, что с помощью метасети можно строить аналог доверительных интервалов. MetaOut на рисунке 2 представляет собой вывод метасети. Видно, что чем ближе пример выборки к тому, на котором базовая сеть ошибается – тем выше метасеть оценивает ошибку. Err на графике представляет собой модуль разницы между целевым выходом и тем что дает базовая сеть. Стоит отметить, что данные предоставлялись сети последовательно. Таким образом, график можно разбить на 3 области (по подклассам набора Iris) [2].

Метасети


Но по настоящему мое свободное время занял вопрос познания в НС [3]. Обращаясь к вопросу познания, нельзя не обратиться к И. Канту. Исследуя природу познания, Кант определил его как суждение. Судя о предмете синтетически, мы присоединяем к нему признак, или черту, прямо в нем не заключающуюся. Если же мы судим о предмете аналитически, мы ограничиваемся его понятием и не присоединяем к нему ничего, что не заключалось бы в нем. Таким образом, можно определить познание как синтетическое суждение, так как познанием мы называем только то, что расширяет наше знание о предмете. Далее синтетическое мышление можно разделить на познание заимствованное из опыта (a posteriori) и независимое (a priori). Безусловно, возможность априорного синтетического познания подробно рассмотрена Кантом с точки зрения философии, мы взяли на себя смелость рассмотреть возможность последнего с точки зрения нейронных сетей (НС). За более подробной информацией вы можете обратиться к работе [3]. Главная идея использования метасетей состоит в попытке объяснения работы НС. Таким образом вводя взаимное соответствие между множеством состояний НС и активностью элемента метасети – мы можем проектировать сети, а вводя однозначное – пытаться проследить логику вывода ответа сети.

Второй связанный с этой темой вопрос – это сознание. Ряд вопросов возник когда в кругозоре объявился Thomas Metzinger. Вопрос заключался в том, можно ли его модель сознания представить в виде активности элемента метасети.

Увидев, что существующие решения для моделирования НС адаптировать к поставленной задаче довольно сложно – было принято решение написать небольшую библиотеку. Так появился проект MetaNet. Сейчас он находится в стадии глубокой альфы. Разберем один пример. Сначала создадим многослойные персептроны:

out_net = FeedforwardNetwork(2, [4], 2)
inp_net_1 = FeedforwardNetwork(2, [4], 2)
inp_net_2 = FeedforwardNetwork(2, [4], 2)

Обучим их на XOR, после чего создадим метасеть –

metanet = MetaNet()
metanet.add_input_net(inp_net_1)
metanet.add_input_net(inp_net_2)
metanet.add_output_net(out_net)
metanet.connect_nets(inp_net_1, out_net)
metanet.connect_nets(inp_net_2, out_net)
metanet.connect_nets(out_net, inp_net_1)
metanet.connect_nets(out_net, inp_net_2)

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



Если к такой метасети применить сигнал [[1.0, 0.0], [0.0, 0.0]] то первая сеть даст 1, вторая 0 – и выходная сеть соответственно 1. Пока мы не реализовали соединение нейрон-нейрон между сетями, т.к. по умолчанию связи инъективные – мы добавляли один фиктивный выход, который всегда равен 0. При прохождении сигнала нейронам пост-сети присваивается наибольшее значение между текущим и предлагаемым состоянием.

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

t1 t2 t3 t4
inp_net_1 [1, 0] [0, 0] [1, 0] [0, 0]
inp_net_2 [0, 0] [0, 0] [1, 0] [0, 0]
out_net [0, 0] [1, 0] [0, 0] [0, 0]


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

Выводы


В статье показан контекст, в котором разрабатывается библиотека MetaNet. Я хотел бы обратиться к пользователям habrahabr с просьбой о критике, как идей, так и библиотеки. Хотелось бы на раннем этапе разработки учесть возможные пути развития, которые, вероятно, сейчас я упускаю из вида. Касаемо основного требования к коду – читаемость. Хотелось бы сделать инструмент для исследований, но упускать производительность из вида тоже не выход. Сейчас при использовании, например, mnist время обучения увеличивается до недопустимо больших значений.

Библиотека доступна по следующей ссылке.

Литература