Skip to content

Latest commit

 

History

History
478 lines (386 loc) · 33.1 KB

README_ru.md

File metadata and controls

478 lines (386 loc) · 33.1 KB

SAI ITMO

Documentation License: BSD 3-Clause Eng

OrGAN

В отличие от киберфизических систем, объединяющих физические ресурсы с ИТ-ресурсами, социо-киберфизические системы объединяют физические, ИТ- и социальные «миры» на основе тесного взаимодействия между этими ресурсами в реальном времени. Конфигурация таких систем осложняется многообразием влияющих друг на друга отношений, наличием многочисленных функциональных зависимостей, а также присутствием человеческого фактора, который характеризуется неопределенностью и возникновением новых социальных связей. Решить эту задачу невозможно, ни используя только аналитические подходы (ориентированные на обработку жестких и нечетких ограничений) из-за большого разнообразия связей, ни используя только модели ИИ, обученных на основе опыта экспертов, из-за низкой эффективности обучения функциональным зависимостям на примерах. Таким образом, для их эффективной конфигурации социо-киберфизических систем необходимо обеспечить (а) их представление, учитывающее разнообразие связей и сложность их топологии, и (б) учет факторов различной математической природы, а именно опыта экспертов и жестких ограничений, накладываемых на различные параметры, описываемые в виде уравнений или табличных функций.

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

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

General scheme

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

В демонстрационных целях в репозиторий включены иллюстративные примеры.

Общая схема бибилиотеки

General scheme

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

Зависимости

Более детальный список требований представлен в requirements.txt.

Использование

Для обучения генеративно-состязательной нейросетевой модели предусмотрено два интерфейса: интерфейс на основе командной строки и програмный интерфейс (API).

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

Интерфейс на основе командной строки

Для обучения генеративно-состязательной модели с использованием командной строки используется файл main.py:

python main.py --rules=module.CustomOrgStructureModelClass

В качестве параметра rules следуем передать имя класса, соедержащего описание модели конфигурируемой организационно-технической системы (содержащее функцию определения валидности конфигурации, метрики ее оценки и др.) и реализующего интерфейс organ.structure.models.OrganizationModel. Дополнительно, в качестве аргументов можно параметризовать используемую нейросетевую модель (выбирая число и размеры слоев), изменять целевую функцию и др. Полный списко поддерживаемых параметров можно получить, запустив скрипт с параметром --help:

python main.py --help

Програмный интерфейс

Для обучения модели из кода прикладной программы необходимо подготовить структуру с параметрами конфигурации, сконструировать экземпляр класса organ.solver.Solver и запустить обучение (метод train()):

from organ.solver import Solver
from organ.demo import LogisticsDepartmentModel
from organ.config import make_config

config = make_config(rules=DemoOrganizationStructureModel(),
                     data_dir='data',
                     model_save_dir='output/models')

solver = organ.solver.Solver(config)
solver.train()

Примеры использования

В репозитории представлено 3 практических примера, которые можно использовать для иллюстрации работы бибилиотеки. Наборы данных для примеров находятся в подкаталогах каталога demo_data, а именно:

  • logistics - набор данных для генерации логистического отдела компании (правила описаны классом organ.demo.LogisticsDepartmentModel)
  • management - набор данных для генерации отдела продаж и административно-управляющего отдела (правила описаны классом organ.demo.ManagementModel)
  • sapsam и sapsam_aug - наборы данных (исходный и аугментированный соответственно) на основе фрагмента датасета SAP-SAM (https://github.com/signavio/sap-sam) для генерации организационных диаграм компании (правила описаны классом organ.demo.SapSamEMStructureModel)

Генеративный дизайн конфигураций логистического отдела компании

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

Logistics department example

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

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

Необходимо обучить генеративно-состязательную модель, позволяющую генерировать допустимые согласно заданным критериям конфигурации СКФС при заданном наборе входных параметров (загрузка определенных подотделов).

Исходные данные для решения задачи представляются двумя видами информации:

  • Обучающее множество из 20 образцов (полностью определенные конфигурации с соответствующими им входными параметрами - условная загрузка склада материалов и склада готовой продукции), которое помещается в каталог data.
  • Ограничения, позволяющие оценить допустимость конкретной совокупности параметров и наличия/отсутствия определенных отделов/подотделов. Данные ограничения представлены классом organ.demo.LogisticsDepartmentModel.

Поскольку обучающее множество содержит всего 20 образцов, первым этапом в решении задачи является аугментация обучающего множества, для которой следует следует использовать скрипт augment_dataset.py:

python augment_dataset.py demo_logistics 10000 demo_data/logistics data_augmented

В результате работы скрипта множество моделей СКФС, расширенное с помощью применения предложенного алгоритма аугментации до 10000 образцов, будет помещено в каталог data_augmented.

Далее необходимо произвести обучение генеративной нейросетевой модели для указанного класса компонентов СКФС. Для этого можно воспользоваться либо скриптом main.py, передав ему соответствующие параметры, либо непосредственно через программный интерфейс класса organ.solver.Solver. Рассмотрим первый способ. Для обучения модели с помощью скрипта необходимо выполнить следующую команду:

python main.py --rules demo_logistics --data_dir data_augmented

При этом будет использовано расширенное обучающее множество из каталога data_augmented и правила проверки, описанные в классе organ.demo.LogisticsDepartmentModel. В ходе работы скрипт периодически будет выводить в стандартный поток вывода информацию о значениях функции потерь и метрики качества генерируемых конфигураций компонентов СКФС. После завершения обучения (по умолчанию, 200000 итераций), обученные модели можно использовать для генерации конфигураций логистических отделов компонентов СКФС для заданных параметров с помощью следующего кода:

from organ.solver import Solver
from organ.config import make_config
from organ.demo import LogisticsDepartmentModel

config = make_config(
    # Класс с описанием правил оценки моделей
    # организационных структур (в данном случае -
    # отдела логистики)
    rules=LogisticsDepartmentModel(),
    # Точка сохранения, из которой следует
    # загрузить модель
    test_iters=60000,
    # Directories.
    data_dir='data_augmented',
    model_save_dir='output/models',
)

# Условия для генерации компонентов СКФС
ctx = np.array([10, 12])

solver = organ.solver.Solver(config)
orgs = solver.generate_valid(32, ctx=ctx)

Среди указанных параметров конфигурации и аргументов, передаваемых функции генерации, ключевыми являются следующие: test_iters – номер итерации, модели которой следует использовать для генерации конфигурации компонентов СКФС, model_save_dir – каталог, в котором находятся обученные модели, ctx – контекст (входные параметры) для генерации конфигураций (условная загрузка склада материалов и склада готовой продукции соответственно). Сформированный список структур будет помещен в переменную orgs. Каждый элемент этого списка содержит одну сгенерированную конфигурацию компонента СКФС (в данном случае – логистического отдела), составляющие которой (типы элементов, связей, параметризация элементов) могут быть выведены в консоль:

print('Подразделения:\n', orgs[0].nodes)
print('Связи:\n', orgs[0].edges)
print('Параметры подразделений:\n', orgs[0].node_features.ravel())

Подразделения:
 [ 0  0  2  3  0  5  6  7  8  9 10  0]
Связи:
 [[0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 2 0 2 2 2 2 0]
 [0 0 0 0 0 0 2 2 2 2 2 0]
 [0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 2 0 0 0 0 2 2 0 0 0]
 [0 0 0 2 0 0 0 2 2 0 0 0]
 [0 0 2 2 0 2 2 0 2 0 2 0]
 [0 0 2 2 0 2 2 2 0 0 2 0]
 [0 0 2 2 0 0 0 0 0 0 2 0]
 [0 0 2 2 0 0 0 2 2 2 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0]]
Параметры подразделений:
 [ 0.         0.        12.69819   15.418587   0.         5.6959157
  6.456403   6.382445   3.7638607  2.0864    25.380123   0.       ]

Оценка сгенерированных конфигураций СКФС производится по точности выполнения требований, определенных и реализованных в классе модели организационной структуры (в данном случае, organ.demo.LogisticsDepartmentModel). В частности, любой класс модели должен определять два метода validness() и metrics(). Первый возвращает логическое значение, соответствующее факту допустимости параметризованной структуры, переданной ему в качестве аргумента, второй – набор значений метрик, релевантных для данного класса моделей. Таким образом, точность выполнения требований может быть оценена как отношение числа валидных сгенерированных структур к общему числу сгенерированных структур:

>>> rules = LogisticsDepartmentModel()
>>> sum([rules.validness(x) for x in orgs]) / len(orgs)
1.0

Таким образом, все сгенерированные структуры оказались валидными. Значения метрик для первой сгенерированной структуры:

>>> rules.metrics(orgs[0]) 
{'node score': True, 'edge score': True, 'staff score': True}

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

Генеративный дизайн в части доопределения моделей предприятия на основе фрагмента набора данных SAP-SAM

В данном примере в качестве СКФС рассматриваются модели предприятий из набора данных SAP-SAM (https://github.com/signavio/sap-sam). В виду чрезмерного разнообразия набора данных (модели разных типов, например, модели предприятий и модели процессов; модели, описанные в разных форматах; модели имеющие различную терминологию), а также ориентированности библиотеки OrGAN на работу с малыми данными, из исходного набора данных было выбрано подмножество моделей organigram, имеющих схожую направленность. Затем, случайным образом было выбрано подмножество из 20 моделей, и используемая в них терминология была унифицирована вручную. После исключения повторяющихся моделей было получено обучающее множество из 17 моделей. При этом под конфигурацией также подразумевается определенный набор компонентов (подразделений) и связей между ними (в наборе данных SAP-SAM модели не имеют числовых параметров).

SAP-SAM model example

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

Исходные данные для решения задачи представляются двумя видами информации:

  • Обучающее множество из 17 образцов (полностью определенные конфигурации), которое помещается в каталог demo_data/sapsam.
  • Ограничения, позволяющие оценить допустимость отношений междуподразделениями в рамках конфигурации. Данные ограничения представлены классом organ.demo.SapSamEMStructureModel.

Поскольку обучающее множество содержит всего 17 образцов, для успешной работы с ним необходимы аугментированные конфигурации. Такие конфигурации сгенерированы, расширенное до 100 образцов обучающее множество, помещено в каталог demo_data/sapsam_aug.

Далее необходимо произвести обучение генеративной нейросетевой модели для указанного класса компонентов СКФС. Для этого можно воспользоваться либо скриптом main.py, передав ему соответствующие параметры, либо непосредственно через программный интерфейс класса organ.solver.Solver. Рассмотрим первый способ. Для обучения модели с помощью скрипта необходимо выполнить следующую команду:

python main.py --rules sapsam --data_dir demo_data/sapsam_aug \
--train_completion --non_conditional --non_parametric --num_iters 20000

При этом будет использовано расширенное обучающее множество из каталога demo_data/sapsam_aug и правила проверки, описанные в классе organ.demo.SapSamEMStructureModel. В ходе работы скрипт периодически будет выводить в стандартный поток вывода информацию о значениях функции потерь и метрики качества генерируемых конфигураций компонентов СКФС.

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

import numpy as np
from organ.solver import Solver
from organ.config import make_config
from organ.demo import SapSamEMStructureModel

config = make_config(
    # Класс с описанием правил оценки моделей
    # организационных структур 
    rules= SapSamEMStructureModel(),
    # Точка сохранения, из которой следует
    # загрузить модель
    test_iters=60000,
    # Directories.
    data_dir= 'demo_data/sapsam_aug',
    model_save_dir='output/models',
    train_completion=True
)

nodes = np.zeros(22)
nodes[2] = 2
nodes[4] = 4

nodes_mask = np.zeros(22)
nodes_mask[2] = 1
nodes_mask[4] = 1
nodes_mask[9] = 1

solver = organ.solver.Solver(config)
orgs = solver.complete_valid(32, nodes=nodes, nodes_mask=nodes_mask)

В результате будут сформированы 32 валидные конфигурации, являющиеся дополнениями частично заданной (вершины 2 (отдел продаж) и 4 (финансовый отдел) должны присутствовать, вершина 9 (отдел кадров) должна отсутствовать). Сформированный список конфигураций будет помещен в переменную orgs. Каждый элемент этого списка содержит одну сгенерированную конфигурацию компонента СКФС.

Документация

Документацию можно увидеть, проследовав по следующей ссылке: https://organ.readthedocs.io/ru/latest/

Для генерации документации необходимо использовать пакет Sphinx и выполнить команды:

cd docs
make html

Документация в формате HTML будет сгенерирована в папке docs/_build.

Тестирование

В библиотеке OrGAN определено 35 модульных и 1 интеграционный тест. Все тесты находятся в каталоге tests и реализованы с помощью фреймворка модульного тестирования PyTest. Для разделения категорий тестов используется механизм меток, поддерживаемый PyTest: в файле настроек PyTest определена метка integration, и эта метка используется в качестве аннотации для интеграционных тестов.

В каталоге tests/data находится тестовый набор данных, используемый для проверки функций работы с набором данных, а также для интеграционного теста.

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

pytest -m 'not integration'

Модульные тесты сгруппированы по тестируемым модулям OrGAN.

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

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

Об успешности прохождения модульных тестов можно судить по служебному выводу утилиты PyTest.

Интеграционный тест осуществляет проверку загрузки набора данных, обучения модели, расчета метрики и генерации конфигураций компонентов СКФС. Данный тест находится в тестовом модуле test_solver.py и помечен меткой pytest.mark.integration, чтобы обеспечить возможность раздельного запуска модульных и интеграционных тестов. Для запуска интеграционного теста необходимо, находясь в корневой директории репозитория, выполнить:

pytest -m 'integration'

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

Об успешности прохождения интеграционых тестов также можно судить по служебному выводу утилиты PyTest.

Поддержка

Исследование проводится при поддержке Исследовательского центра сильного искусственного интеллекта в промышленности Университета ИТМО в рамках мероприятия программы центра: Разработка и испытания экспериментального образца библиотеки алгоритмов сильного ИИ в части генеративного дизайна физических и/или цифровых объектов (компонентов киберфизических / социо-киберфизических систем), характеризующихся набором взаимосвязанных параметров и удовлетворяющих заданным требованиям.

Разработчики

  • Андрей Пономарев
  • Николай Шилов
  • Николай Тесля

Контактный e-mail: nick@iias.spb.su

Благодарности

Библиотека OrGAN основана на некоторых идеях проекта MolGAN: An implicit generative model for small molecular graphs (https://arxiv.org/abs/1805.11973). Однако, в отличие от MolGAN, она преследует иную цель, учитывает параметрическую составлющую и поддерживает генерацию параметризованных организационных структур, учитывая входные параметры.