Weight banding: странные полосы в весах нейросетей

Weight banding: странные полосы в весах нейросетей

Когда исследователи из Circuits thread впервые визуализировали веса последнего свёрточного слоя InceptionV1, они решили, что у них баг в коде. Вместо привычного хаоса фильтров на них смотрели идеально ровные горизонтальные полосы, повторяющиеся от нейрона к нейрону. Ни один отдельный вес не выглядел подозрительно, но равномерность общей картины была настолько разительной, что другого объяснения, кроме ошибки, на ум не приходило. Ошибки не было. Паттерн оказался настоящим, воспроизводимым и общим для почти всех современных зрительных сетей. Его назвали weight banding.

Что такое weight banding

Weight banding это структурный феномен в обученных свёрточных нейросетях: веса финального свёрточного слоя выстраиваются в однородный пространственный узор, обычно горизонтальные полосы. Проще говоря, фильтры последнего слоя систематически кодируют вертикальную позицию в изображении и игнорируют горизонтальную. Феномен описан в статье Circuits thread на Distill.pub в 2020 году.

Чтобы увидеть полосы, веса нужно правильно визуализировать. Для каждого нейрона берут веса, связывающие его с предыдущим слоем, и сжимают размерность по каналам с помощью неотрицательного матричного разложения (NMF, non-negative matrix factorization) до трёх факторов. Эти три фактора маппятся на каналы RGB, и пространственная структура весов становится видна глазом. В обычных слоях такая визуализация даёт пёструю мозаику. В последнем слое с weight banding она даёт ровную гребёнку.

Техника применима не только к ImageNet-классике. NMF-визуализация весов это дешёвый диагностический инструмент: она не требует ни прогона данных через сеть, ни градиентов, только доступ к чекпоинту. Если в вашей собственной модели последний слой показывает регулярные полосы, это сигнал, что данные содержат позиционный перекос, а архитектура компенсирует его через веса. Для медицинских снимков или спутниковых изображений, где позиционная структура совсем другая, картина может отличаться, и это само по себе информативно.

Структурные феномены: взгляд на сеть целиком

Большая часть исследований в духе Circuits концентрируется на мелком масштабе: отдельные нейроны, небольшие цепочки из двух-трёх слоёв, знаменитые curve detectors. Weight banding интересен тем, что это феномен другого уровня. Он проявляется на масштабе целого слоя, как повторяющиеся симметрии в equivariance или специализированные ветви сети в branch specialization.

Авторы сравнивают это с гистологией. Разные типы биологических тканей различимы под микроскопом не по отдельным клеткам, а по общей текстуре: мышечная ткань даёт гладкую регулярную исчерченность, эпителий выглядит совсем иначе. Так и слой с weight banding при NMF-визуализации отличается от любого другого слоя так же резко, как мышца от эпителия.

По характеру паттерна феномен напоминает checkerboard artifacts, знакомые всем, кто работал с генеративными зрительными моделями: при deconvolution (transposed convolution) с неподходящим шагом и размером ядра в сгенерированных изображениях возникает регулярная шахматная сетка. Там артефакт виден на выходе модели и считается дефектом. Weight banding живёт глубже, в самих весах, и дефектом может не быть вовсе.

Откуда вообще взялся global average pooling

Чтобы понять, почему полосы так распространены, стоит вспомнить историю. Классические сети вроде AlexNet и VGG завершались громоздкими полносвязными слоями, на которые приходилась большая часть всех параметров модели. В 2013 году статья Network in Network предложила альтернативу: усреднить каждую карту признаков до одного числа и подать эти значения напрямую на классификатор. Идея прижилась: Inception и ResNet приняли global average pooling как стандарт, и полносвязные гиганты ушли в прошлое.

У решения была цена, о которой мало говорили. Усреднение по всему изображению безжалостно стирает информацию о том, где именно находился каждый признак. Для локализации и детекции это очевидная потеря, но оказалось, что и для классификации позиция важна. Weight banding показывает, как сеть расплачивается за эту экономию параметров: она встраивает позиционный код в веса последнего свёрточного слоя, забирая часть их ёмкости под задачу, которую раньше бесплатно решала архитектура.

Где возникают полосы, а где нет

Проверка на зоопарке архитектур дала чёткую закономерность. Weight banding стабильно формируется в последнем свёрточном слое моделей с глобальным средним пулингом (global average pooling): InceptionV1 (слой mixed_5b), ResNet50, VGG19. А вот AlexNet феномена не показывает вообще.

Различие объясняется архитектурой. AlexNet не использует global average pooling: его последний свёрточный слой напрямую соединён с полносвязным, который видит все пространственные позиции раздельно и может обращаться с каждой по-разному. Если посмотреть на веса этого полносвязного слоя, они сильно меняются вдоль вертикальной оси изображения. Сеть получает позиционную информацию напрямую, без посредников.

Отсюда главная гипотеза статьи. Пулинг после последних свёрток уничтожает пространственную информацию, усредняя активации по всему изображению. Но для классификации ImageNet вертикальная позиция важна: небо сверху, земля снизу, объекты расположены не случайно. Сеть учится компенсировать потерю, встраивая позиционный код прямо в веса последнего свёрточного слоя. Горизонтальные полосы это выученный механизм сохранения информации, которую архитектура стирает.

Эксперименты на упрощённой модели

Чтобы проверить гипотезу причинности, авторы построили упрощённую зрительную сеть: шесть групп свёрток, разделённых L2-пулингом, в конце global average pooling до 512 значений и полносвязный слой на 1001 класс ImageNet. Базовая модель надёжно воспроизводила weight banding в последнем слое и обычно в двух предшествующих. Дальше начались вмешательства.

Первый тест был sanity check: обучение на датасете, повёрнутом на 90 градусов. Если полосы это баг или численный артефакт, поворот данных ничего не изменит. Результат оказался кристально чистым: горизонтальные полосы стали вертикальными. Феномен порождён свойствами данных, а не кодом обучения.

Второй тест убрал global average pooling, позволив полносвязному слою видеть все позиции сразу. Weight banding исчез. Плата за это: в 49 раз больше параметров в полносвязном слое и переобучение на тренировочной выборке. Это сильное свидетельство, что именно агрессивный пулинг вызывает феномен, и оно согласуется с отсутствием полос в AlexNet.

Третий эксперимент оказался самым неожиданным. Авторы применили пулинг только вдоль горизонтальной оси: каждая строка финального слоя усреднялась, вертикальная позиция сохранялась, горизонтальная терялась. Число параметров выросло лишь в 7 раз. Полосы в последнем слое исчезли, но при ближайшем рассмотрении обнаружились в предыдущем, слое 5a. Словно сеть настойчиво искала, куда бы спрятать позиционную информацию, и отступила на один слой назад.

Что не смогло убрать полосы

Ещё интереснее список вмешательств, которые не подействовали. Обучаемые пространственные маски перед пулингом (пробовали 3, 5 и 16 масок) выучивали крупномасштабную структуру изображения, но полосы оставались. Замена пулинга на attention-слой не помогла. Не помогли ни обучаемая маска 7×7×512 после слоя 5b, ни CoordConv-каналы с явными координатами на входе, ни разбиение выхода на 16 групп каналов с отдельным полносвязным слоем для каждой, ни схема в духе VGG с global max pooling и промежуточным слоем на 4096 нейронов.

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

Проверка на реальных архитектурах

Два ключевых вмешательства, поворот на 90 градусов и удаление финального пулинга, авторы проверили на InceptionV1, ResNet50 и VGG19, обучая каждую модель с нуля. Эффект подтвердился во всех трёх, с одной оговоркой. У VGG19 удаление пулинга перед полносвязными слоями не убрало banding, хотя на поворот датасета модель реагировала правильно. Авторы честно отмечают, что у них были проблемы с памятью при обучении этого варианта, так что аномалия может оказаться багом эксперимента. Такая открытость в мелочах характерна для всего Circuits thread.

Фича или баг

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

Практической рекомендации из статьи не следует, и в этом её честность. Ценность результата в другом: это редкий пример устойчивой причинной связи между решением в архитектуре и итоговыми обученными весами. Выбор global average pooling вместо полносвязной головы предсказуемо порождает конкретный паттерн в конкретном слое. Такие связи это именно то, что нужно, чтобы интерпретируемость однажды начала информировать дизайн архитектур, а не только постфактум объяснять их поведение.

Для Circuits как программы weight banding важен ещё и масштабом. Главная критика направления всегда упиралась в микроскопичность: хорошо изучить нейрон кривых это прекрасно, но как от нейрона перейти к пониманию модели целиком? Крупномасштабные структуры вроде полос в весах это кандидат на промежуточный уровень описания, мостик между отдельными цепочками и поведением всей сети.

Стоит признать и ограничение, о котором авторы говорят прямо. Ранние работы по визуализации сетей, например Zeiler et al, обещали, что понимание внутренностей моделей приведёт к лучшим архитектурам. Спустя годы трудно назвать хотя бы один случай, когда инсайт из интерпретируемости напрямую породил новый архитектурный приём, ставший стандартом. Weight banding имеет правильный характер для такого инсайта: он устойчив, причинен и предсказуем. Но пока это скорее демонстрация возможности, чем готовый инструмент проектирования.

Часто задаваемые вопросы

Влияет ли weight banding на точность модели?

Прямых измерений вреда или пользы в статье нет. Полосы кодируют полезную позиционную информацию, но занимают под неё ёмкость фильтров. Авторы не дают рекомендаций менять архитектуру, рассматривая феномен как наблюдение, а не дефект.

Возникает ли weight banding в трансформерах?

Статья 2020 года рассматривает только свёрточные сети на ImageNet. У ViT позиционная информация подаётся явно через позиционные эмбеддинги, поэтому механизм компенсации через веса там вряд ли нужен. Прямых исследований аналога феномена в трансформерах не публиковалось.

Как проверить свою модель на weight banding?

Взять веса последнего свёрточного слоя, сжать каналы через NMF до трёх факторов и отобразить их как RGB. Простейший дополнительный тест из статьи: переобучить модель на датасете, повёрнутом на 90 градусов. Если полосы повернулись вместе с данными, это настоящий weight banding, а не артефакт обучения.

Итог

Weight banding это напоминание, что нейросети не пассивно принимают архитектурные решения, а активно их компенсируют. Уберите у сети доступ к пространственной информации через пулинг, и она выучит полосы в весах. Поверните данные, и полосы повернутся. Предложите attention или явные координаты, и сеть всё равно предпочтёт свой способ. Если вам интересно, как устроены модели изнутри, возьмите любую свёрточную сеть с global average pooling, примените NMF к последнему слою и посмотрите на полосы своими глазами: это один из немногих случаев, когда внутренности нейросети можно буквально увидеть.

← Все записи