Skip to content

Latest commit

 

History

History
233 lines (164 loc) · 16.8 KB

README.rst

File metadata and controls

233 lines (164 loc) · 16.8 KB

Logo of GOLEM framework

Acknowledgement to SAI Acknowledgement to ITMO

Supported Python Versions PyPI Package Version Build Status Integration Build Status Coverage Status Documentation Status Supported Python Versions Telegram Chat eng GitLab mirror for this repository

Оптимизация и обучение графовых моделей эволюционными методами

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

  1. Метаэвристические методы имеют большой потенциал в решении сложных задач.

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

  1. Структурированные модели важны в различных областях.

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

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

Основные возможности

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

Применение

GOLEM потенциально применим к любой структуре задач оптимизации:

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

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

Примеры применения GOLEM:

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

Установка

GOLEM можно установить с помощью pip:

$ pip install thegolem

Быстрый старт

Следующий пример показывает поиск графа по графу-эталону с помощью метрики редакционного расстояния (Edit Distance). Оптимизатор настраивается с минимальным набором параметров и простыми одноточечными мутациями. Более подробные примеры можно найти в файлах simple_run.py, graph_search.py и tree_search.py в директории examples/synthetic_graph_evolution.

def run_graph_search(size=16, timeout=8):
    # Генерируем целевой граф и целевую функцию в виде edit distance
    node_types = ('a', 'b')  # Available node types that can appear in graphs
    target_graph = generate_labeled_graph('tree', size, node_types)
    objective = Objective(partial(tree_edit_dist, target_graph))
    initial_population = [generate_labeled_graph('tree', 5, node_types) for _ in range(10)]

    # Укажем параметры оптимизации
    requirements = GraphRequirements(timeout=timedelta(minutes=timeout))
    gen_params = GraphGenerationParams(adapter=BaseNetworkxAdapter(), available_node_types=node_types)
    algo_params = GPAlgorithmParameters(pop_size=30)

    # Инициализируем оптимизатор и запустим оптимизацию
    optimiser = EvoGraphOptimizer(objective, initial_population, requirements, gen_params, algo_params)
    found_graphs = optimiser.optimise(objective)

    # Визуализируем итоговый граф и график сходимости
    found_graph = gen_params.adapter.restore(found_graphs[0])  # Transform back to NetworkX graph
    draw_graphs_subplots(target_graph, found_graph, titles=['Target Graph', 'Found Graph'])
    optimiser.history.show.fitness_line()
    return found_graph

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

Процесс эволюции

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

Структура проекта

Репозиторий включает в себя следующие пакеты и папки:

  • Пакет core содержит основные классы и скрипты.
  • Пакет core.adapter отвечает за преобразование между графами из предметной области и внутренним представлением, используемым оптимизаторами.
  • Пакет core.dag содержит классы и алгоритмы для изображения и обработки графов.
  • Пакет core.optimisers содержит оптимизаторы для графов и все вспомогательные классы (например, те, которые представляют фитнес, отдельных лиц, популяции и т.д.), включая историю оптимизации.
  • Пакет core.optimisers.genetic содержит генетический (также называемый эволюционным) оптимизатор графов и операторы (мутация, отбор и так далее).
  • Пакет core.utilities содержит утилиты и структуры данных, используемые другими модулями.
  • Пакет serializers содержит класс Serializer и отвечает за сериализацию классов проекта (графики, история оптимизации и все, что с этим связано).
  • Пакет visualisation содержит классы, которые позволяют визуализировать историю оптимизации, графы и некоторые графики, полезные для анализа.
  • Пакет examples включает в себя несколько примеров использования фреймворка.
  • Все модульные и интеграционные тесты содержатся в каталоге test.
  • Источники документации находятся в каталоге docs.

Текущие исследования/разработки и планы на будущее

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

Как участвовать

  • Инструкция для добавления изменений находится в репозитории.

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

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

Поддержка

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

Контакты

Цитирование

Если вы используете наш проект в своей работе или исследовании, мы будем признательны за цитирование:

@inproceedings{pinchuk2024golem,
title={GOLEM: Flexible Evolutionary Design of Graph Representations of Physical and Digital Objects}, author={Pinchuk, Maiia and Kirgizov, Grigorii and Yamshchikova, Lyubov and Nikitin, Nikolay and Deeva, Irina and Shakhkyan, Karine and Borisov, Ivan and Zharkov, Kirill and Kalyuzhnaya, Anna}, booktitle={Proceedings of the Genetic and Evolutionary Computation Conference Companion}, pages={1668--1675}, year={2024}

}