AI Thefittest: зачем я пишу свою open-source библиотеку эволюционных алгоритмов

AI

Редактор
Регистрация
23 Август 2023
Сообщения
3 016
Лучшие ответы
0
Реакции
0
Баллы
51
Offline
#1
Автор: Шерстнев Павел


Эволюционный цикл. Источник: яндекс картинки

This preservation of favourable individual differences and variations, and the destruction of those which are injurious, I have called Natural Selection, or the Survival of the Fittest.” — Charles Darwin, On the Origin of Species, 1872, Chapter 4: Natural Selection

Эволюционные алгоритмы — это часть области искусственного интеллекта, которую называют вычислительный интеллект (Computational Intelligence). В отличие от «классического» машинного обучения, где всё завязано на строгих формулах и градиентах, вычислительный интеллект работает ближе к природе — через адаптацию, самоорганизацию и отбор. Если сказать проще, это способ искать оптимальные решения — максимумы и минимумы функций — по тем же законам, по которым эволюция ищет приспособленные формы жизни. Здесь решения «размножаются», «мутируют» и «соревнуются» между собой, а выживают те, кто ближе к цели.

Красиво? Да. А главное — это работает. С помощью эволюционных алгоритмов можно оптимизировать всё что угодно: от структуры нейросетей до формы деталей в инженерных системах или гиперпараметров моделей. Эволюционные алгоритмы применяются не только для оптимизации функций и нейросетей. Они подходят для AutoML, поиска архитектур (NAS) и настройки сложных AI‑пайплайнов — в том числе RAG‑систем и мультиагентных решений. И это не только теория — крупные исследовательские группы, включая Google DeepMind, уже применяют эволюционные методы даже в связке с LLM.

Когда начинаются трудности


Во времена моей учёбы в магистратуре системного анализа мы активно изучали эволюционные алгоритмы и их применение в машинном обучении. Самым сложным оказывалась практическая часть: существующие фреймворки либо устарели, либо требовали слишком много дополнительного кода. В итоге большую часть алгоритмов приходилось писать вручную. Особенно удивляло, что почти все библиотеки ограничиваются классическими реализациями, тогда как более современные подходы — вроде самоконфигурирования или адаптации на основе истории успеха — просто нельзя применить «из коробки». И это проблема не про «студентов и исследования». В индустрии ситуация такая же: современные эволюционные методы есть на Arxiv, в презентациях и демо, но не в репозиториях, которые можно встроить в пайплайн.

Так появился Thefittest


Логотип проекта

Thefittest (от англ. «the fittest», «наиболее приспособленный») — open‑source библиотека или фреймворк на Python из области вычислительного интеллекта, стоящей на пересечении оптимизации и искусственного интеллекта. Она объединяет эволюционные алгоритмы и инструменты для их применения в задачах машинного обучения.

Изначально я собирал в ней свои собственный рабочие реализации, чтобы не терять код и не переписывать одинаковые части заново. Но проект быстро вырос. Как человек, много раз сталкивавшийся с отсутствием современных готовых решений, я собрал всё в одном месте: сначала локально, потом на GitHub. В какой‑то момент стало очевидно: если этот код помогает мне, он может помочь и другим. Так Thefittest стал открытым проектом. Позже я выложил его на PyPI, чтобы устанавливать можно было одной командой:

pip install thefittest

С этого момента библиотека перестала быть «для себя» и стала «для других». И тут всё резко усложнилось: понадобились документация, тесты, CI/CD, скорость, совместимость с экосистемой ML. В какой‑то момент я понял простую вещь: написать алгоритмы — это половина дела. Чтобы библиотекой реально могли пользоваться, нужно построить вокруг неё инфраструктуру. Минимальный набор оказался таким:


  • автоматическое форматирование (например, black),


  • статическая проверка типов (mypy),


  • линтер (ruff или flake8),


  • автоматические тесты (pytest),


  • CI/CD в GitHub Actions,


  • анализ качества кода (Codacy или SonarCloud),


  • публикация на PyPI (poetry / twine),


  • документация (Sphinx или mkdocs).

Для пользователя это просто «установил и работает», а для разработчика — целая экосистема вокруг библиотеки. Примерно так выглядел технологический стек Thefittest на момент релиза:


Технологический стек Thefittest

Со временем Thefittest перестал быть просто «папкой с кодом». Сейчас это примерно 13 000 строк Python, из которых большая часть — основной функционал, а четверть — тесты. Проект тестируется на трёх версиях Python (3.9–3.11), проходят автоматические проверки качества кода, а покрытие уходит в Codecov.

Производительность без C


Эволюционные алгоритмы могут считать десятки тысяч итераций, огромные популяции и модели с сотнями параметров. На чистом Python это превращается в мучение. Чтобы библиотека оставалась быстрой и масштабируемой, я переписал критичные участки (скрещивание, мутации, обновление популяций, вычисления) с помощью Numba.

Это дало производительность, близкую к C/C++, но без ручной компиляции, зависимостей и боли с окружением. Важно, что такой подход позволяет применять Thefittest не только в исследовательских экспериментах, но и в реальных ML‑пайплайнах — от оптимизации гиперпараметров до NAS и промышленных задач.

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

@njit(int8[:](int8[:, :], float64[:], float64[:]))
def two_point_crossover(
individs: NDArray[np.byte],
fitness: NDArray[np.float64], rank: NDArray[np.float64]
) -> NDArray[np.byte]:

size = len(individs[0])
c_points = random_sample(range_size=size, quantity=2, replace=False)
c_points = sorted(c_points)

if flip_coin(0.5):
offspring = individs[0].copy()
other_individ = individs[1]
else:
offspring = individs[1].copy()
other_individ = individs[0]

for i in range(size):
if c_points[0] <= i <= c_points[1]:
offspring = other_individ

return offspring

Всего один декоратор превращает эту функцию из обычного Python‑кода в JIT‑компилированную, работающую в разы быстрее.

Thefittest в действии


Большинство известных библиотек по эволюционным алгоритмам ограничиваются классическими методами и узким кругом задач. Thefittest задумывался иначе — как полноценный инструмент для прикладного искусственного интеллекта: его можно использовать не только в оптимизации функций, но и в реальных ML‑пайплайнах, AutoML, построении моделей и настройке сложных систем.

Сейчас в библиотеке реализовано около 12 эволюционных алгоритмов, работающих с непрерывными, целочисленными и категориальными параметрами. Семь из них раньше не были доступны в open‑source в рабочем, продакшен‑готовом виде: в лучшем случае они существовали только в статьях и псевдокоде.

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


Дерево реализованных методов
Интерфейс


Когда я только начинал работать с эволюционными алгоритмами, меня всегда удивляло, как многие используют DEAP. Это отличный фреймворк, но по сути — конструктор: чтобы собрать рабочий алгоритм, нужно вручную соединять блоки, писать свой пайплайн, настраивать операторы. На практике это часто превращается в копирование чужих примеров, чтобы «хоть как‑то запустить» оптимизацию.

В Thefittest я решил пойти другим путём — сделать всё максимально просто и готовым к применению. Любой алгоритм можно запустить как полноценный оптимизатор: достаточно передать целевую функцию как обычную Python‑функцию и указать количество итераций.

При этом возможности остаются гибкими: можно менять параметры, выбирать стратегии селекции, задавать оператор скрещивания, передавать callback‑функции. Всё это в привычном для Python‑разработчика формате, без лишнего кода и обёрток.


Сравнение "размера" вызова генетического алгоритма
Совместимость со scikit-learn


Одно из ключевых требований к библиотекам машинного обучения на Python — совместимость со scikit‑learn. Это негласный стандарт всей экосистемы: знакомые методы fit(), predict(), score(), единые подходы к API и десятки инструментов.

Если модель поддерживает API sklearn, она сразу попадает в готовую инфраструктуру — кросс‑валидация, пайплайны, стекинг, автоматический подбор гиперпараметров.

В Thefittest это реализовано так: например, GeneticProgrammingRegressor можно использовать как обычную модель из sklearn — включать в стекинг, вызывать fit(), predict(), считать метрики и комбинировать с любыми другими алгоритмами.

from sklearn.ensemble import StackingRegressor
from thefittest.regressors import GeneticProgrammingRegressor
from thefittest.optimizers import SelfCGP
from sklearn.metrics import mean_squared_error, r2_score


# Конечная модель (GeneticProgrammingRegressor) импортируется из библиотеки thefittest
final_model = GeneticProgrammingRegressor(
n_iter=200,
pop_size=500,
optimizer=SelfCGP,
optimizer_args={"show_progress_each": 10, "keep_history": True, "max_level": 5},
)

# Создаем стэкинг-регрессор
stacking_regressor = StackingRegressor(
estimators=base_models, # Базовые модели в ансамбле стекинга
final_estimator=final_model # В качестве мета-модели используется GeneticProgrammingRegressor из thefittest
)

# Обучаем и оцениваем стэкинг-регрессор
stacking_regressor.fit(X_train, y_train)
y_pred_stack = stacking_regressor.predict(X_test)

# Вычисляем метрики
stacking_mse = mean_squared_error(y_test, y_pred_stack)
stacking_r2 = r2_score(y_test, y_pred_stack)

# Выводим результаты
print("\nStacking model:")
print(f"MSE: {stacking_mse:.4f}, R2: {stacking_r2:.4f}")


По сути, Thefittest добавляет в экосистему sklearn новую категорию моделей — эволюционные, которые не только оптимизируют параметры, но и выводят на уровень автоматизации процессов машинного обучения.

Совместимость с PyTorch и обучение на GPU


Если для классических ML-моделей ключевым стандартом является совместимость со scikit-learn, то для нейросетей — возможность обучения на GPU. Поэтому в Thefittest добавлена интеграция с PyTorch: эволюционные алгоритмы оптимизируют структуру модели, а веса обучаются с помощью стандартных оптимизаторов torch.optim на GPU.

Это позволяет использовать гибридный подход: эволюция отвечает за архитектуру и гиперпараметры, а градиентные методы — за точность. При этом всё остаётся в привычном для Python формате — без дополнительных обёрток и «ручных» интерфейсов.

from thefittest.optimizers import SelfCGP
from thefittest.classifiers import GeneticProgrammingNeuralNetClassifier
from thefittest.benchmarks import IrisDataset

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import minmax_scale

import torch
import torch.optim as optim

# Данные
data = IrisDataset()
X, y = minmax_scale(data.get_X()), data.get_y()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1)

# Автоматический выбор устройства
device = "cuda" if torch.cuda.is_available() else "cpu"

model = GeneticProgrammingNeuralNetClassifier(
n_iter=10,
pop_size=10,
optimizer=SelfCGP,
weights_optimizer=optim.Adam,
weights_optimizer_args={"iters": 1000, "lr": 0.01},
device=device
)

model.fit(X_train, y_train)
preds = model.predict(X_test)
Не просто библиотека, а технология


В основе проекта моя диссертационная работа. В ходе исследований я разработал модификации эволюционных алгоритмов, которые автоматически подстраивают собственные параметры в процессе работы. Это решает главную проблему классических ГА и ГП — необходимость ручной настройки и хрупкость при изменении свойств задачи. Самоадаптация делает алгоритмы устойчивыми, повышает точность и позволяет применять их в реальных инженерных сценариях. Часть этих методов уже реализована в Thefittest, часть — в процессе интеграции. Среди них:


  • самоконфигурируемые генетические алгоритмы с адаптацией по истории успеха (SelfCSHAGA, PDPSHAGA);


  • самоконфигурируемые варианты генетического программирования (SelfCSHAGP, PDPSHAGP);


  • метод автоматизированного проектирования ансамблей нейросетей (GPENN).

Эти алгоритмы впервые будут доступны в открытом виде. На основе Thefittest уже создано шесть программных систем, зарегистрированных в Роспатенте. Некоторые примеры решаемых задач:

Краткосрочный прогноз силы ветра на морском побережье


Построена гибридная модель: автоматически спроектированный ансамбль нейросетей + интерпретируемая нечёткая логика, обе части формируются самоконфигурируемыми эволюционными алгоритмами. Подход ориентирован на оперативный прогноз на горизонте 1–3 часа с балансом между качеством и объяснимостью для практического применения.

Моделирование акустических характеристик древесных панелей


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

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

Признание и популяризация


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


Отдельно я особенно горжусь победой в премии «Гравитация 2025» — одном из крупных российских конкурсов в области ИИ. Thefittest победил в номинации «Алгоритмы и программные решения в области ИИ и больших данных». Для меня это подтверждение того, что библиотека ценна не только как учебно‑исследовательский инструмент, но и как технологическая разработка, признанная экспертами.


Победа в гравитации
Куда дальше


Конечно, это не законченный продукт и не «идеальная» библиотека, а всё, что описано выше, по сути лишь уверенный старт. За время презентаций и выступлений я много раз слышал критику — и в большинстве случаев она была обоснованной. Например, в некоторых алгоритмах я действительно «изобретал велосипед». Вместо переписывания чужих реализаций с нуля нужно учиться интегрировать их в экосистему библиотеки. Это позволит запускать, например, L-SRTDE прямо из Thefittest, без переписывания исходников. Это и правильнее, и эффективнее, и полезнее для пользователей.

Так зачем же я пишу свою open-source библиотеку эволюционных алгоритмов?


Когда‑то Thefittest был просто рабочим набором инструментов, собранным «для себя». Сейчас это технология, которую можно интегрировать в реальные AI‑проекты: оптимизацию моделей, AutoML, построение нейросетевых архитектур, символьную регрессию и прогнозирование сложных систем. Поэтому главный ориентир — не просто публиковать код, а доводить решения до практической применимости.

Чтобы упростить старт, уже подготовлены рабочие примеры: запуск оптимизаторов, автоматическое построение моделей, подключение собственных операторов, использование через API scikit‑learn, а также Jupyter‑ноутбук на Kaggle, который можно запустить без настройки окружения. Это делает технологию доступной разработчикам, инженерам и исследовательским группам, даже без глубокой подготовки в ML. Полноценная документация сейчас в разработке — я постепенно переношу туда инструкции, типовые сценарии и примеры.

Код открыт не только на GitHub, но и на GitVerse — это шаг к тому, чтобы библиотека была доступна внутри российских AI‑проектов и могла развиваться как часть отечественной научно‑технологической инфраструктуры.

Если кратко: цель Thefittest — вывести эволюционные алгоритмы из статей и лабораторных прототипов в прикладной уровень, где ими можно действительно пользоваться. Не как идеей, а как инструментом.
 
Сверху Снизу