🔴 Сложный ⏱️ 25 минут

Многокритериальная оптимизация: когда нужно балансировать

Многокритериальная оптимизация: когда нужно балансировать

🎯 Зачем это нужно?

Представь, что ты выбираешь новый смартфон 📱. Хочешь максимальную производительность, но минимальную цену. Долгую работу батареи, но лёгкий вес. Крутую камеру, но компактный размер. Звучит знакомо? Это и есть многокритериальная оптимизация!

В реальном мире редко есть один простой критерий успеха:

  • 🚗 Автомобили: максимальная скорость + минимальный расход топлива + максимальная безопасность
  • 🏥 Лекарства: максимальная эффективность + минимальные побочные эффекты + минимальная стоимость
  • 🤖 Нейросети: максимальная точность + минимальное время работы + минимальный размер модели

📚 История вопроса

В 1906 году итальянский экономист Вильфредо Парето изучал распределение богатства и заметил интересную закономерность: нельзя улучшить положение одного человека, не ухудшив положение другого. Эта идея превратилась в принцип Парето - основу современной многокритериальной оптимизации.

Забавный факт: принцип “80/20” (80% результата от 20% усилий) тоже от Парето, но к оптимизации он не относится! 😄

💡 Интуиция

Представь, что ты тренер команды и выбираешь игрока. У тебя есть два кандидата:

  • Игрок А: быстрый (9/10), но слабо бьёт (3/10)
  • Игрок Б: медленный (4/10), но сильно бьёт (8/10)

Кого выбрать? Нет однозначного ответа! Оба варианта парето-оптимальны - нельзя улучшить один критерий, не ухудшив другой.

[МЕДИА: image_01] Описание: График с двумя осями (скорость и сила удара), показывающий игроков А и Б как парето-оптимальные точки Промпт: “2D scatter plot showing multi-objective optimization concept, two axes labeled speed and power, points A and B marked as pareto-optimal solutions, pareto frontier line, modern clean design, educational style”

В многокритериальной оптимизации мы ищем не одно решение, а множество компромиссных решений - Парето-фронт.

📐 Формальное определение

Задача многокритериальной оптимизации: min F(x) = [f₁(x), f₂(x), …, fₘ(x)]ᵀ

где x ∈ S (допустимое множество)

Доминирование по Парето: Решение x¹ доминирует x² (x¹ ≺ x²), если:

  • ∀i: fᵢ(x¹) ≤ fᵢ(x²)
  • ∃j: fⱼ(x¹) < fⱼ(x²)

Парето-оптимальность: Решение x* парето-оптимально, если не существует x ∈ S такого, что x ≺ x*.

🔍 Примеры с разбором

Пример 1: Обучение нейросети

Хотим обучить модель для распознавания изображений с двумя целями:

  • f₁(x) = accuracy (максимизировать → минимизировать 1-accuracy)
  • f₂(x) = inference_time (минимизировать)
# Три модели-кандидата:
models = [
    {"accuracy": 0.95, "time": 100},  # A: точная, но медленная
    {"accuracy": 0.85, "time": 20},   # B: быстрая, но менее точная  
    {"accuracy": 0.80, "time": 80}    # C: хуже по обоим критериям
]

Анализ доминирования:

  • A vs B: A точнее, B быстрее → никто не доминирует
  • A vs C: A точнее И быстрее → A доминирует C
  • B vs C: B точнее И быстрее → B доминирует C

Парето-фронт: {A, B}

[МЕДИА: image_02] Описание: График accuracy vs inference_time с тремя точками, показывающий парето-фронт Промпт: “scatter plot with accuracy on y-axis and inference time on x-axis, three points A B C marked, pareto frontier connecting A and B, point C dominated and crossed out, tech-style visualization”

Пример 2: Портфельная оптимизация

Инвестор выбирает портфель акций:

  • f₁(x) = -ожидаемая_доходность (минимизируем отрицание)
  • f₂(x) = риск (дисперсия)

Классическая задача: “риск vs доходность”. Парето-фронт здесь называется эффективной границей - все оптимальные портфели лежат на этой кривой.

🎮 Практика

Базовый уровень 🟢

Задание 1: У тебя есть три способа добраться в университет:

  • Автобус: время=40мин, стоимость=50₽
  • Такси: время=15мин, стоимость=300₽
  • Метро: время=30мин, стоимость=60₽

Какие варианты парето-оптимальны? (минимизируем и время, и стоимость)

Задание 2: Три алгоритма машинного обучения:

  • SVM: precision=0.9, recall=0.7
  • RandomForest: precision=0.8, recall=0.85
  • NaiveBayes: precision=0.75, recall=0.6

Построй парето-фронт (максимизируем оба показателя).

Задание 3: Оптимизируем дизайн веб-сайта:

  • Вариант А: скорость загрузки=2с, красота=8/10
  • Вариант Б: скорость загрузки=5с, красота=9/10
  • Вариант В: скорость загрузки=1с, красота=6/10

Определи доминирующие решения.

Продвинутый уровень 🟡

Задание 4: Реализуй функцию проверки доминирования:

def dominates(solution1, solution2):
    # solution = [f1, f2, ..., fn] (все минимизируем)
    # Верни True, если solution1 доминирует solution2
    pass

Задание 5: Задача размещения вышек сотовой связи. Нужно выбрать K=3 точки из N=6 кандидатов для минимизации:

  • f₁ = максимальное расстояние до ближайшей вышки
  • f₂ = общая стоимость установки

Кандидаты: [(x₁,y₁,cost₁), (x₂,y₂,cost₂), …, (x₆,y₆,cost₆)]

Как бы ты решал эту задачу? Опиши алгоритм.

Задание 6: В задаче оптимизации гиперпараметров нейросети получены результаты:

  • Конфигурация 1: loss=0.1, training_time=2ч
  • Конфигурация 2: loss=0.12, training_time=1ч
  • Конфигурация 3: loss=0.08, training_time=4ч

Нарисуй парето-фронт и объясни выбор для production-системы.

Челлендж 🔴

Задание 7: Метрика Hypervolume Парето-фронт = {(2,5), (3,3), (5,2)}. Референсная точка = (6,6). Вычисли hypervolume - объём пространства, доминируемого фронтом.

Задание 8: Алгоритм NSGA-II Опиши основные этапы генетического алгоритма NSGA-II для многокритериальной оптимизации. Что такое crowding distance и зачем он нужен?

Задание 9: AutoML Challenge У тебя 10 разных архитектур нейросетей. Каждую можно обучать с 5 разными learning_rate. Три критерии: accuracy, model_size, training_time.

Как эффективно найти парето-фронт из 50 возможных конфигураций, не обучая все модели?

⚠️ Частые ошибки

Ошибка: “Найду лучшее решение по каждому критерию отдельно”
Правильно: Ищем компромиссные решения - парето-фронт
💡 Почему: Оптимум по одному критерию часто ужасен по другим

Ошибка: “Взвешу критерии произвольно: 0.7×f₁ + 0.3×f₂” ✅ Правильно: Веса должны отражать реальные предпочтения пользователя
💡 Почему: Неправильные веса дают бессмысленные решения

Ошибка: “Все точки парето-фронта одинаково хороши” ✅ Правильно: Нужно учитывать контекст и предпочтения
💡 Почему: В реальных задачах важность критериев может меняться

🎓 Главное запомнить

Парето-фронт - множество компромиссных решений, где нельзя улучшить один критерий без ухудшения другого ✅ Доминирование: x¹ ≺ x² если x¹ не хуже по всем критериям и лучше хотя бы по одному
Применение: выбор гиперпараметров ML, portfolio optimization, engineering design

🔗 Связь с другими темами

Назад: Градиентный спуск с ограничениями помогает находить отдельные точки парето-фронта

Вперёд: Эволюционные алгоритмы (NSGA-II, MOEA/D) эффективно строят весь парето-фронт за один запуск

Практика: Hyperparameter tuning в AutoML, A/B тестирование с несколькими метриками, оптимизация рекомендательных систем

Понял тему? Закрепи в боте! 🚀

Попрактикуйся на задачах и получи персональные рекомендации от AI

💪 Начать тренировку
💬 Есть вопрос? Спроси бота!