Новый подход к моделированию нейронных сетей в таблично-сетевых базах данных.
[Это перевод статьи, которую я опубликовал на 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 в качестве СУБД. Программа содержит следующие основные компоненты:
Основная программа — mlp.py
create_db.py — модуль, который определяет основные классы для хранения MLP-моделей в табличной сетевой СУБД. Модуль использует API HTMS среднего уровня. Содержит описание двух гипертаблиц:
mlp — база данных (гипертаблица) для хранения моделей персептронов со следующими таблицами:
Start — каталог персептронов в базе данных;
Input — хранение в��одных узлов;
Hidden — хранение узлов скрытого слоя;
Output — хранение выходных узлов персептронов.
train — база данных (гипертаблица) для хранения образцов данных для обучения и валидации, т.е. наборов данных входных и выходных значений:
Training — таблица выборочных данных для обучения;
Validation — таблица образцов данных для валидации
load_train_valid.py — модуль с функцией загрузки образцов входных данных для обучения и валидации нейронной сети — из таблиц Excel в таблицы СУБД (как экземпляров классов для обучения и валидации), а также для создания пустых таблиц для хранения значений атрибутов экземпляров классов Start, Input, Hidden и Output. Модуль использует HTMS API среднего уровня.
mlp_train_valid.py — функция, которая считывает данные из таблиц Training и Validation, обучает нейронную сеть, проверяет ее и записывает полученный MLP в базу данных. В модуле для обучения и валидации используется HTMS API объектного уровня, а для сохранения перцептрона в базе данных используется API HTMS среднего уровня.
mlp_load_exec.py представляет собой модуль (MID-level HTMS API) с двумя функциями:
mlp_load_RAM — для чтения из базы данных конкретной модели SME;
mlp_execute — для получения выходного значения MLP для любого набора входных данных
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
