Как стать автором
Обновить

Использование HTMS для хранения и применения нейронных сетей

Время на прочтение5 мин
Количество просмотров2.8K

Новый подход к моделированию нейронных сетей в таблично-сетевых базах данных.

[Это перевод статьи, которую я опубликовал на www.medium.com в серии постов о таблично-сетевой модели данных. Смотрите ссылки на все посты здесь.]

Система управления HyperTable Management System — HTMS разработана для универсального использования. Одной из предметных областей, где признаки базовой для HTMS — таблично-сетевой модели данных соответствуют ей максимально адекватно, являются нейронные сети¹. Нейронная сеть представляет собой направленный, взвешенный граф.

В качестве базовой модели нейросети я буду использовать многослойный персептрон MultyLayer Percehtron— MLP² с одним скрытым слоем.

Теория и практика MLP превосходно представлена в серии статей Роберта Кейма об основной теории и структуре известной топологии нейронных сетей (см. перевод на рус.). Он также содержит текст программы Python Python Code for MLP Neural Networks.py, которая реализует два основных этапа обучения нейронной сети — собственно обучение, которое заключается в подборе весов для активации скрытого слоя и активации выходного узла (векторная задача нелинейной оптимизации) и валидации (проверки) — определение вероятности того, что нейронная сеть выдаст правильное выходное значение для произвольной комбинации входных значений.

Программа Python Code for MLP Neural Networks.py была мной использована в качестве прототипа для создания программного обеспечения (также на Python), использующего систему HTMS в качестве СУБД. Программа содержит следующие основные компоненты:

  1. Основная программа — mlp.py

  2. create_db.py — модуль, который определяет основные классы для хранения MLP-моделей в табличной сетевой СУБД. Модуль использует API HTMS среднего уровня. Содержит описание двух гипертаблиц:

    mlp — база данных (гипертаблица) для хранения моделей персептронов со следующими таблицами:

  • Start — каталог персептронов в базе данных;

  • Input — хранение входных узлов;

  • Hidden — хранение узлов скрытого слоя;

  • Output — хранение выходных узлов персептронов.

    train — база данных (гипертаблица) для хранения образцов данных для обучения и валидации, т.е. наборов данных входных и выходных значений:

  • Training — таблица выборочных данных для обучения;

  • Validation — таблица образцов данных для валидации

  1. load_train_valid.py — модуль с функцией загрузки образцов входных данных для обучения и валидации нейронной сети — из таблиц Excel в таблицы СУБД (как экземпляров классов для обучения и валидации), а также для создания пустых таблиц для хранения значений атрибутов экземпляров классов Start, Input, Hidden и Output. Модуль использует HTMS API среднего уровня.

  2. mlp_train_valid.py — функция, которая считывает данные из таблиц Training и Validation, обучает нейронную сеть, проверяет ее и записывает полученный MLP в базу данных. В модуле для обучения и валидации используется HTMS API объектного уровня, а для сохранения перцептрона в базе данных используется API HTMS среднего уровня.

  3. mlp_load_exec.py представляет собой модуль (MID-level HTMS API) с двумя функциями:

  • mlp_load_RAM — для чтения из базы данных конкретной модели SME;

  • mlp_execute — для получения выходного значения MLP для любого набора входных данных

  1. mlp_par.py представляет собой модуль с параметрами и логистической функцией и производной от логистической функции. Ниже приведены скриншоты из гипертабличного редактора HTMS, который является частью программной системы.

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

Общая структура базы данных для хранения персептронов (нейронных сетей). База данных имеет 4 таблицы (Start, Input, Hidden и Output) и 13 атрибутов:

Таблица Start представляет собой каталог персептронов, хранящихся в базе данных. В примере — 5 нейронных сетей с 3 входными и 3 скрытыми узлами. Поле StoI — хранит набор простых ссылок на строки в таблице Input, где каждая строка соответствует одному входному узлу. Помимо входных узлов, каждый персептрон имеет специальный узел-смещение — BiasI, поэтому каждому персептрону присваивается по 4 строки. Поле Correctness содержит результаты валидации перцептрона:

В этой форме редактор показывает подробное содержимое всего поля для одной из строк таблицы. В частности, здесь можно увидеть, что поле ссылок StoI в 1-й строке таблицы Start содержит 4 ссылки — на 1-ую, 2-ую, 3-ю и 4-ую строку таблицы Input:

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

Подробное содержимое всего поля для одной из строк в таблице Input. В частности, здесь можно увидеть, что поле ссылок ItoH в 1-й строке таблицы содержит 3 взвешенные ссылки — на 1-ую, 2-ую и 3-ю строки таблицы Hidden — с весами -0,03, +0,8 и -0,07 соответственно:

Содержимое таблицы для хранения скрытых узлов всех персептронов. Поле HtoO содержит взвешенную (нумерованную) ссылку на строку в таблице Output, где каждая строка соответствует одному выходному узлу:

Подробное содержимое всего поля для одной из строк в таблице Hidden. В частности, здесь можно увидеть, что поле ссылок HtoO в 1-й строке таблицы содержит взвешенную ссылку — на 2-ю строку таблицы Output — с весом -0,60:

В качестве дополнительного примера другой базы данных персептронов (с 3 входными узлами и 5 узлами в скрытом слое) показано содержимое ее таблицы Start:

Пример многослойного персептрона с 3 входными узлами и 3 узлами в скрытом слое в табличной сетевой базе данных HTMS. Изображение сгенерировано HTMS редактором (с пакетом визуализации Graphviz):

Поскольку алгоритмы и структуры данных фрагментов программного кода для валидации в модуле mlp_train_valid.py и для использования персептрона в модуле mlp_load_exec.py практически полностью совпадают, этот пример показывает, как инструменты HTMS могут использоваться на среднем уровне и объектном уровне для решения одной и той же задачи.

Хранение нейронных сетей в таблично-сетевой СУБД HTMS имеет очевидные преимущества.
Во-первых, возможность хранения большого количества подобных нейронных сетей, отличающихся параметрами, используемыми в обучении — количеством эпох, скоростью обучения и значением смещения и, соответственно, весовыми коэффициентами, что позволяет выбрать лучший после набора действий по их проверке.
Во-вторых, в одной базе данных HTMS могут храниться разные нейронные сети, выбор которой осуществляется в зависимости от быстро меняющейся среды при решении подобных задач. HTMS благодаря своей высокой производительности, которая, в свою очередь, является следствием табличной сетевой модели данных, обеспечит быструю загрузку в оперативную память необходимой в данный момент нейронной сети.
В-третьих, использование адекватной СУБД может помочь в научных и образовательных целях.
В четвертых, Особенности табличной сетевой модели данных и ее реализация в HTMS дают возможность эффективно хранить в базе данных и читать из нее нейронные сети с десятками тысяч входных и скрытых узлов. например, приблизительный объем базы данных на 1 МСП с 1 тыс. входных узлов и 1 тыс. узлов скрытого слоя будет:

len_Start=105 # length of one Start table row (hereinafter in bytes)
len_Input=57 # length of one Input table row
len_Hidden=57 # length of one Hidden table row
len_Link_Discriptor=20# length of descriptor for a block of simple links (data type "*link")
len_Link=4 # memory for one simple link
len_Weight_Descriptor=20 # length of descriptor for numbered links block (data type "*weight")
len_Weight=8 # memory for one numbered (weighted) link
input_Dimension=1000 # number of input layer nodes
hidden_Dimension=1000 # number of hidden layer nodes
# Formula for calculating the total amount of memory in the database
memory = len_Start + len_Link_Discriptor + input_Dimension*(len_Link + len_Input + len_Weight + hidden_Dimensionlen_Weight) + hidden_Dimension(len_Hidden + len_Weight_Descriptor + len_Weight)
print("\n "+ str( int(memory/1000)/1000.)+"Mb" )


Получается примерно 8.154 Mb.

Объем базы данных на сеть с 100 тыс. входных узлов и 100 тыс. узлов скрытого слоя будет примерно 80.0154 Gb.

Нетрудно понять, что сеть с 1 млн. входных и 1 млн. скрытых узлов будет занимать примерно 8 Тбайт.

Ссылки
[1]: Philipp Petersen. 2022. Neural Network Theory. University of Vienna
[2]: Frank Rosenblatt. 1962. Principles of Neurodynamics: Perceptrons and the Theory of Brain Mechanisms. Spartan Books

Теги:
Хабы:
-5
Комментарии5

Публикации

Истории

Работа

Data Scientist
63 вакансии
Python разработчик
142 вакансии

Ближайшие события