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

Inception и EfficientNet: архитектуры следующего поколения

Inception и EfficientNet: архитектуры следующего поколения

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

Представь, что ты разрабатываешь приложение для распознавания еды в Instagram Stories 📱. Нужна сеть, которая:

  • Работает на телефоне (не тормозит)
  • Точно различает пиццу от пасты
  • Не съедает всю батарею за час

В 2014 году AlexNet требовала суперкомпьютер для обучения. В 2019 EfficientNet-B7 обгоняет её по точности, работая на смартфоне! 🚀

Реальные применения:

  • 📸 Google Photos - поиск по фото (Inception)
  • 🤳 Snapchat фильтры - real-time на телефоне (EfficientNet)
  • 🏥 Медицинская диагностика - точность + скорость критичны

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

2014: ImageNet покорили глубокие сети. Логика: “больше слоев = больше точности”

Проблема: ResNet-152 (152 слоя) vs ResNet-50 (50 слоев) - разница в точности всего 1%, но вычислений в 3 раза больше! 😱

2015: Команда Google придумала Inception - “а что если делать свёртки РАЗНЫХ размеров параллельно?”

2019: Команда Google Brain: “все масштабируют сети наугад. А что если есть оптимальная формула?” → EfficientNet

Результат: EfficientNet-B0 = ResNet-50 по точности, но в 5 раз быстрее!

💡 Интуиция

Inception: “Параллельный взгляд”

Представь, что ты фотограф 📷. Снимаешь лицо человека:

  • Широкий объектив (1×1 свёртка) - общие черты лица
  • Нормальный объектив (3×3 свёртка) - детали глаз, носа
  • Телеобъектив (5×5 свёртка) - текстура кожи, морщины

Inception говорит: “А давайте использовать ВСЕ объективы ОДНОВРЕМЕННО и склеим результат!”

[МЕДИА: image_01] Описание: Схема Inception блока с параллельными свёртками разных размеров Промпт: “inception module architecture diagram, parallel convolution branches (1x1, 3x3, 5x5), max pooling, concatenation, colorful modern style, neural network visualization, educational illustration”

EfficientNet: “Умное масштабирование”

Аналогия с настройкой игры 🎮:

  • Глубина (depth) = количество уровней игры
  • Ширина (width) = количество персонажей на экране
  • Разрешение = качество графики

Обычный подход: “увеличим всё по максимуму!” → игра тормозит

EfficientNet: “есть оптимальный баланс: если увеличиваем разрешение на 20%, то глубину - на 15%, а ширину - на 10%”

[МЕДИА: image_02] Описание: Compound scaling диаграмма EfficientNet Промпт: “efficientnet compound scaling visualization, 3D graph showing depth/width/resolution scaling, mathematical formula φ^α, φ^β, φ^γ, clean technical style, blue and orange gradient”

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

Inception Module

Bottleneck design:

Input → [1×1] → [3×3] → Output₁
     → [1×1] → [5×5] → Output₂  
     → [1×1] → MaxPool → [1×1] → Output₃
     → [1×1] → Output₄

Final = Concat(Output₁, Output₂, Output₃, Output₄)

Зачем 1×1 перед большими свёртками? Уменьшают количество каналов → меньше параметров!

Было: 512 каналов → 5×5×512 = 1.3M параметров Стало: 512 → 1×1×64 → 5×5×64 = 25K + 102K = 127K параметров

Экономия: 10× меньше вычислений! 💪

EfficientNet Compound Scaling

Формула масштабирования:

  • depth: d = α^φ
  • width: w = β^φ
  • resolution: r = γ^φ

Ограничения:

  • α·β²·γ² ≈ 2 (удваиваем FLOPS при φ += 1)
  • α ≥ 1, β ≥ 1, γ ≥ 1

Найденные оптимальные значения:

  • α = 1.2 (глубина растёт медленно)
  • β = 1.1 (ширина растёт ещё медленнее)
  • γ = 1.15 (разрешение - средне)

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

Пример 1: Подсчёт параметров Inception

Задача: Входной тензор 224×224×128. Inception блок:

  • Ветка 1: 1×1, 64 фильтра
  • Ветка 2: 1×1, 96 фильтров → 3×3, 128 фильтров
  • Ветка 3: 1×1, 16 фильтров → 5×5, 32 фильтра

Решение:

# Ветка 1: 1×1 свёртка
params_1 = 1 * 1 * 128 * 64 = 8,192

# Ветка 2: bottleneck + 3×3
params_2a = 1 * 1 * 128 * 96 = 12,288  
params_2b = 3 * 3 * 96 * 128 = 110,592
params_2 = params_2a + params_2b = 122,880

# Ветка 3: bottleneck + 5×5  
params_3a = 1 * 1 * 128 * 16 = 2,048
params_3b = 5 * 5 * 16 * 32 = 12,800
params_3 = params_3a + params_3b = 14,848

# Итого
total = 8,192 + 122,880 + 14,848 = 145,920 параметров

Без bottleneck было бы: 5×5×128×32 = 204,800 параметров → экономия 29%!

Пример 2: EfficientNet масштабирование

Задача: EfficientNet-B0 → B3 (φ = 3)

Базовая модель B0:

  • Глубина: 18 слоев
  • Ширина: 1.0× (базовые каналы)
  • Разрешение: 224×224

Масштабирование для B3:

  • d = 1.2³ = 1.73 → 18 × 1.73 = 31 слой
  • w = 1.1³ = 1.33 → каналы ×1.33
  • r = 1.15³ = 1.52 → 224 × 1.52 = 341×341

Проверим ограничение: α·β²·γ² = 1.2 × 1.1² × 1.15² ≈ 1.2 × 1.21 × 1.32 ≈ 1.92 ≈ 2 ✅

🎮 Практика

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

Задание 1: Почему в Inception используют 1×1 свёртки перед большими фильтрами?

💡 Подсказка Посчитай количество операций с ними и без них
✅ Ответ Уменьшают количество каналов → меньше параметров в больших свёртках. Bottleneck архитектура экономит до 10× вычислений.

Задание 2: EfficientNet-B1 имеет φ = 1. Если B0 использует разрешение 224×224, какое разрешение у B1?

💡 Подсказка r = γ^φ, где γ = 1.15
✅ Ответ r = 1.15¹ = 1.15, значит 224 × 1.15 = 257×257

Задание 3: Объясни, почему параллельные свёртки в Inception эффективнее последовательных?

✅ Ответ Каждая ветка специализируется на своём масштабе признаков. Сеть может одновременно выделять локальные (3×3) и глобальные (5×5) особенности.

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

Задание 4: Входной тензор 112×112×256. Inception блок с ветками 1×1×64, (1×1×48 → 5×5×64), MaxPool3×3. Сколько параметров?

💡 Подсказка Не забудь про 1×1 после MaxPool для выравнивания каналов
✅ Ответ Ветка 1: 1×1×256×64 = 16,384 Ветка 2: 1×1×256×48 + 5×5×48×64 = 12,288 + 76,800 = 89,088 Ветка 3: MaxPool + 1×1×256×32 = 8,192 Итого: 113,664 параметра

Задание 5: EfficientNet: если увеличить φ с 2 до 3, во сколько раз вырастет количество FLOPS?

💡 Подсказка FLOPS ∼ d × w² × r², используй формулу ограничения
✅ Ответ α·β²·γ² ≈ 2, значит FLOPS растут в 2^(φ₂-φ₁) = 2¹ = 2 раза

Задание 6: Реализуй простой Inception блок на PyTorch:

class SimpleInception(nn.Module):
    def __init__(self, in_channels):
        # Твой код здесь
        pass
    
    def forward(self, x):
        # Твой код здесь  
        pass

Челлендж 🔴

Задание 7: Google AutoML нашёл оптимальную архитектуру EfficientNet-B0. Предположи, почему α = 1.2, β = 1.1, γ = 1.15?

✅ Ответ Глубина (α) растёт быстрее всего - добавить слой "дёшево". Ширина (β) растёт медленно - квадратично влияет на память. Разрешение (γ) средне - линейно влияет на точность, но квадратично на вычисления.

Задание 8: Докажи, что депthwise separable свёртки в EfficientNet экономят параметры по сравнению с обычными.

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

Ошибка: “1×1 свёртки бесполезны - они не изменяют размер” ✅ Правильно: 1×1 свёртки - это полносвязный слой по каналам 💡 Почему: Они комбинируют информацию между каналами и уменьшают размерность

Ошибка: “EfficientNet просто делает сеть больше”
Правильно: EfficientNet масштабирует сбалансированно по всем измерениям 💡 Почему: Случайное увеличение только глубины или ширины неэффективно

Ошибка: “Inception слишком сложный для мобильных устройств” ✅ Правильно: MobileNet использует идеи Inception с депthwise свёртками
💡 Почему: Современные мобильные чипы оптимизированы под параллельные вычисления

Ошибка: “Большее разрешение всегда лучше” ✅ Правильно: Есть баланс между разрешением и скоростью обучения 💡 Почему: Квадратичный рост вычислений может не окупиться точностью

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

Inception: Параллельные свёртки разного размера + bottleneck для экономии ✅ EfficientNet: Сбалансированное масштабирование d×w²×r² ≈ 2^φ
Применение: Мобильные приложения, real-time системы, ограниченные ресурсы

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

Назад: ResNet и skip connections → зачем нужны были новые архитектуры Вперёд: Transformer архитектуры → внимание vs свёртки
Практика: Transfer learning - как использовать предобученные EfficientNet модели

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

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

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