сеньорчикОткрыть в Telegram
← вся теориятеория к собесу · Computer Vision

Архитектуры CV и transfer learning

Зачем это спрашивают

Вопрос «какой бэкбон возьмёшь» - инженерный: точность, латентность и память на целевом железе, а не топ лидерборда. Плюс проверка пары констант: зачем skip-связи и когда ViT уместен.

// Дефолтный ответ индустрии много лет один: предобученный ResNet-класс бэкбон, дальше по потребностям.

ResNet: skip-связи как условие глубины

До ResNet глубокие сети упирались в деградацию: добавляешь слои - качество падает ещё на трейне, это не переобучение. Skip-связь x + F(x) даёт градиенту прямой путь и превращает задачу слоя в «выучи поправку к identity».

Итог: десятки и сотни слоёв стали обучаемыми, ResNet - дефолтный бэкбон-бейзлайн до сих пор.

// Bottleneck-блок (1×1 → 3×3 → 1×1) даёт ту же выразительность за меньший компьют - на нём стоят ResNet-50 и старше.

деградация глубины
хуже на трейне от добавления слоёв; лечится skip-связями

Эффективность: EfficientNet и MobileNet

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

MobileNet - depthwise separable свёртки: пространственная и канальная части разделены, кратное удешевление для мобильных и эджа ценой умеренной точности.

// Сравнивать архитектуры честно - по кривой accuracy-FLOPs (или accuracy-латентность на своём железе), а не по одной цифре с ImageNet.

depthwise separable
свёртка по пространству и каналам раздельно - дёшево

ViT и предобучение

ViT: картинка режется на патчи-токены, дальше обычный трансформер. Глобальный контекст с первого слоя, но меньше индуктивных смещений, чем у CNN (convolutional neural network), нужен масштаб данных или сильный претрейн, на маленьком датасете с нуля он проиграет CNN.

Предобучение (ImageNet или self-supervised) - стандартная точка старта любой CV-задачи (cross-validation): фичи переносимы, обучение с нуля оправдано редко.

// Практическое равновесие: мало данных - CNN с претрейном; много данных или сильный foundation-претрейн - ViT-семейство.

индуктивное смещение
встроенные предположения (локальность CNN); меньше - нужно больше данных

Как отвечать: «Как выберешь архитектуру под задачу классификации изображений?»

От ограничений, не от лидерборда. Сначала бюджет: где инференс - сервер с GPU, CPU или мобилка, какая латентность допустима. Дальше дефолт: предобученный ResNet или EfficientNet как бейзлайн - быстро и предсказуемо; на эдж - MobileNet-класс; ViT рассматриваю при большом датасете или доступном сильном претрейне, с нуля на малых данных он проигрывает CNN. Сравниваю кандидатов по кривой точность-латентность на целевом железе и одинаковом разрешении - точность растёт с разрешением сама по себе, легко обмануться.

Выбор от ограничений, дефолт с обоснованием и две гигиены сравнения - инженерный ответ.

На чём валят

  • ViT с нуля на маленьком датасете - проиграет CNN; ему нужен масштаб или претрейн.
  • Выбор по точности на ImageNet без латентности своего железа.
  • «Глубже = лучше» без skip-связей - деградация, а не переобучение.
  • Сравнение архитектур при разном разрешении входа - точность растёт с разрешением сама.

Проверьте себя

Пять вопросов из банка по этой подтеме. Всего их 12, остальные разбираются в тренажёре.

  1. #cv_architectures1 / 5
    Дообучаете предобученную сеть на маленьком датасете. Заморозить бэкбон и учить только голову или размораживать всё?
    A)Размораживать все слои и учить их с большим learning rate — так модель выйдет точнее
    B)На малых данных обычно морозят бэкбон (или большую его часть) и учат голову; полное размораживание грозит переобучением и забыванием
    C)Заморозка слоёв технически недоступна в современных фреймворках глубокого обучения, поэтому учат всё
    D)Выбор между заморозкой и размораживанием вообще никак не зависит от размера имеющегося обучающего датасета
    показать ответ и разбор
    +B)На малых данных обычно морозят бэкбон (или большую его часть) и учат голову; полное размораживание грозит переобучением и забыванием

    // разбор: Чем меньше данных, тем выше риск переобучить и «размыть» полезные предобученные веса. Поэтому на малых датасетах бэкбон замораживают (или почти весь) и учат только голову; при чуть большем объёме аккуратно размораживают верхние блоки с маленьким learning rate. Полное размораживание всего с большим LR на малых данных ведёт к переобучению и катастрофическому забыванию выученных фич.

  2. #cv_architectures2 / 5
    BatchNorm ведёт себя по-разному в режимах train и eval. Какая типичная грабля на инференсе?
    A)BatchNorm в режиме eval отключается и перестаёт влиять на проходящие через него активации
    B)В режиме eval BatchNorm заново пересчитывает и обновляет свои обучаемые веса на каждом отдельном тестовом изображении
    C)BatchNorm обязательно требует ровно квадратных входных изображений, иначе на инференсе он падает с ошибкой размерности
    D)Забыть model.eval() или мелкий батч: BN берёт шумную статистику батча вместо бегущих средних
    показать ответ и разбор
    +D)Забыть model.eval() или мелкий батч: BN берёт шумную статистику батча вместо бегущих средних

    // разбор: На обучении BatchNorm нормирует по статистике текущего батча и копит бегущие среднее/дисперсию; на инференсе (eval) он должен использовать именно эти накопленные статистики. Забыли переключить в eval() — BN считает статистику по тестовому батчу, и результат зависит от состава и размера батча (особенно ломается на батче размера 1). Отсюда «в train работает, на одиночном инференсе плывёт». В eval бегущие статистики фиксированы, веса не обновляются.

  3. #cv_architectures3 / 5
    Почему очень глубокие «обычные» сети плохо обучались до BatchNorm и остаточных связей?
    A)Градиент при обратном проходе затухает или взрывается через много слоёв — нижние слои почти не учатся
    B)У глубоких сетей физически не хватает параметров, чтобы запомнить даже обучающую выборку
    C)Глубокие сети мгновенно переобучаются уже на первой эпохе и потому бесполезны без агрессивной ранней остановки
    D)Функция ошибки у глубоких сетей по построению вообще не имеет ни одного локального минимума
    показать ответ и разбор
    +A)Градиент при обратном проходе затухает или взрывается через много слоёв — нижние слои почти не учатся

    // разбор: При обратном распространении градиент — произведение множителей по слоям; на большой глубине он экспоненциально затухает (или взрывается), и ранние слои почти не получают сигнала. Это проблема оптимизации, а не нехватки ёмкости — параметров как раз в избытке. Смягчают нормализацией активаций (BatchNorm), остаточными связями и удачной инициализацией/активацией.

  4. #cv_architectures4 / 5
    Что BatchNorm даёт при обучении, помимо истории с режимами train/eval?
    A)Заменяет собой функцию активации, поэтому ReLU после него уже не нужен
    B)Устраняет переобучение, снимая нужду в другой регуляризации
    C)Нормирует активации по батчу — стабилизирует обучение, допускает больший learning rate, слегка регуляризует
    D)Уменьшает число параметров сети вдвое, отбрасывая половину каналов на каждом слое сети
    показать ответ и разбор
    +C)Нормирует активации по батчу — стабилизирует обучение, допускает больший learning rate, слегка регуляризует

    // разбор: BatchNorm нормирует активации по статистике батча (нулевое среднее, единичная дисперсия) и учит сдвиг-масштаб. Это сглаживает ландшафт оптимизации: обучение устойчивее, допустим больший learning rate, меньше чувствительность к инициализации, а шум батч-статистики даёт лёгкую регуляризацию. Активацию он не заменяет, параметры не режет и оверфит полностью не убирает.

  5. #cv_architectures5 / 5
    Inception-блок считает свёртки 1×1, 3×3, 5×5 и пулинг параллельно. Зачем?
    A)Чтобы обучать четыре независимые сети сразу и в конце выбрать из них одну самую лучшую
    B)Чтобы блок ловил признаки разного масштаба, а обучение взвешивало полезные ветви
    C)Чтобы исключить переобучение за счёт большего числа параметров в блоке
    D)Чтобы отказаться от глубины сети, заменив все её слои одним широким блоком
    показать ответ и разбор
    +B)Чтобы блок ловил признаки разного масштаба, а обучение взвешивало полезные ветви

    // разбор: Заранее «правильный» размер ядра неизвестен, а объекты бывают разного масштаба. Inception считает несколько ветвей (1×1, 3×3, 5×5, пулинг) параллельно и конкатенирует выходы, позволяя блоку ловить и мелкие, и крупные паттерны, а обучению — взвесить полезные ветви. Свёртки 1×1 внутри снижают каналы и держат стоимость в узде. Это не ансамбль отдельных сетей и не отказ от глубины.

дальше

Теорию прочитали. Навык ставится повторением

В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.