Newer
Older
<img src="docs/AIM-Strong_Sign_Norm-01_Colors.svg" alt="AI Center Logo" width="200px"/>
# OrGAN
В отличие от киберфизических систем, объединяющих физические ресурсы с
ИТ-ресурсами, социо-киберфизические системы объединяют физические,
ИТ- и социальные «миры» на основе тесного взаимодействия между этими
ресурсами в реальном времени.
Конфигурация таких систем осложняется многообразием влияющих друг
на друга отношений, наличием многочисленных функциональных зависимостей,
а также присутствием человеческого фактора, который характеризуется
неопределенностью и возникновением новых социальных связей.
Решить эту задачу невозможно, ни используя только аналитические подходы (ориентированные
на обработку жестких и нечетких ограничений) из-за большого
разнообразия связей, ни используя только модели ИИ, обученных на основе
опыта экспертов, из-за низкой эффективности обучения функциональным зависимостям
на примерах.
Таким образом, для их эффективной конфигурации социо-киберфизических систем
необходимо обеспечить (а) их представление, учитывающее разнообразие связей
и сложность их топологии, и (б) учет факторов различной математической природы,
а именно опыта экспертов и жестких ограничений, накладываемых на различные
параметры, описываемые в виде уравнений или табличных функций.
Целью библиотеки OrGAN является генеративный дизайн конфигураций таких систем.
Она рассматривает социо-киберфизические системы, представленные в виде графов,
и реализует композитный дискриминатор, который используется для обучения
нейронной сети, направленной на генеративный дизайн таких конфигураций, и
учитывает указанные факторы.
Библиотека OrGAN не ориентирована непосредственно на поддержку проектировщиков
или инженеров, проектирующих социо-киберфизические системы, а в большей степени
ориентирована на программистов, которые могут использовать ее для разработки
программных инструментов для вышеупомянутых проектировщиков и инженеров.
<img src="docs/program_module_ru.png" alt="General scheme" width="500px"/>
С технической точки зрения библиотека OrGAN реализует процедуру обучения
генеративно-состязательной нейросетевой модели для генерации конфигураций
социо-организационных структур со сложной топологией связей.
Он учитывает неявные экспертные знания на основе обучающего набора данных
и параметрические зависимости как на основе обучающего набора данных, так и
на основе запрограммированных функциональных зависимостей.
В демонстрационных целях в репозиторий включены иллюстративные примеры.
## Общая схема бибилиотеки
<img src="docs/scheme_ru.png" alt="General scheme" width="500px"/>
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
Библиотека OrGAN включает три модуля оценки генерируемых артефактов, а именно
(а) "классический" дискриминатор, ориентированный на обучение неявных экспертных
знаний на основе обучающей выборки;
(б) нейросетевой апроксиматор недифференцируемых ограничений; и
(в) модуль аналитической оценки дифференцируемых ограничений.
## Зависимости
* **python >=3.9**
* **pytorch >=1.8**: https://pytorch.org
* **numpy >= 1.19**
Более детальный список требований представлен в `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()
```
## Пример использования
В одном из двух представленых примеров использования в качестве СКФС
рассматривается логистический отдел компании. При этом под конфигурацией
подразумевается определенный набор компонентов (подотделов), связей между
ними и значений числовых параметров для каждого компонента (в данном
примере – численность персонала).
<img src="docs/demo_1_0.png" alt="Logistics department example" width="10800px"/>
Каждый подотдел характеризуется двумя параметрами: условная загрузка (служебный
параметр, не определяемый конфигурацией, но используемый для оценки валидности
конфигурации) и количество персонала.
Кроме информационных связей между подотделами (представлены на рисунке линиями
без надписей), присутствуют иерархические связи (представлены линии с
надписью “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}
```
В данном случае, значения метрик не являются особенно информативными,
поскольку в качестве метрик определены выполнение требований к узлам,
связям, и параметрам соответственно, то есть, у любой валидной структуры
все три метрики должны принимать истинные значения.
## Документация
Документацию можно увидеть, проследовав по следующей ссылке:
https://organ.readthedocs.io/
Для генерации документации необходимо использовать пакет Sphinx и выполнить
команды:
```
cd docs
make html
```
Документация в формате HTML будет сгенерирована в папке `docs/_build`.
## Тестирование
В библиотеке OrGAN определено 28 модульных и 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`.
### Поддержка
Библиотека разработана при поддержке исследовательского центра
[**"Сильный ИИ в промышленности"**](<https://sai.itmo.ru/>)
[**Университета ИТМО**](https://itmo.ru) (г. Санкт-Петербург, Россия)
### Разработчики
* Андрей Пономарев
* Николай Шилов
* Николай Тесля
Контактный e-mail: nick@iias.spb.su
### Благодарности
Библиотека OrGAN основана на некоторых идеях проекта MolGAN: An implicit
generative model for small molecular graphs
(https://arxiv.org/abs/1805.11973).
Однако, в отличие от MolGAN, она преследует иную цель, учитывает
параметрическую составлющую и поддерживает генерацию параметризованных
организационных структур, учитывая входные параметры.
* [yongqyu/MolGAN-pytorch](https://github.com/yongqyu/MolGAN-pytorch)
* [nicola-decao/MolGAN](https://github.com/nicola-decao/MolGAN)