Bottleneck Transformers for Visual RecognitionAravind Srinivas, Tsung-Yi Lin, Niki Parmar, Jonathon Shlens, Pieter Abbeel, Ashish VaswaniСтатья:
https://arxiv.org/abs/2101.11605 Код (неавторский):
https://github.com/lucidrains/bottleneck-transformer-pytorch Ещё одна работа про трансформеры в работе с картинками, технически простая, но по-своему интересна. Ну и авторы знаковые.
Собственно, за последние полгода уже вышло множество работ, примеряющих трансформеры на обработку изображений. Про часть мы уже писали, например, ViT (
https://t.me/gonzo_ML/434) или недавний Perceiver (
https://t.me/gonzo_ML/545). Работ таких сильно больше, авторы дают классификацию разных подходов и показывают своё место в ней (см. картинку к посту).
В двух словах, текущая работа добавляет трансформерные блоки в бэкбон сети (не поверх него как VideoBERT и т.п.) и является гибридной моделью (свёртки + внимание), а не чисто моделью на внимании (как ViT и другие).
Идея очень простая. Давайте посмотрим на обычный ResNet. У него есть bottleneck блоки, сначала ужимающие входной тензор по глубине (через 1x1 свёртки), потом производящие вычисления нормальными свёртками, и снова увеличивающие размерность выходного тензора. В этом блоке можно заменить средний этап со свёртки 3x3 на полноценный multi-head self-attention. В работе авторы заменяют боттлнеки резнета в финальной группе (c5) на такие вот новые боттлнек-трансформеры (BoT блоки). И смотрят, что получается. А получается достойно.
В работе заходят со стороны сегментации и детекции. Для таких задач часто нужна глобальная информация и свёртки, эффективно ловящие локальную информацию, могут быть не лучшим вариантом. Можно, конечно, всегда добавить слоёв и “поле зрения” высоких свёрток будет большим, но что если взять вместо них self-attention, у которого сразу глобальное поле? Есть очевидный момент, что в силу квадратичной вычислительной сложности внимания это дорого делать на входе и/или на картинках высокого разрешения, так что вставим мы его только в верхние уровни сети, где тензоры уже достаточно низкого разрешения и это не будет проблемой. Так мы получим гибридную архитектуру (свёртки + внимание).
Замена технически очень простая: берём ResNet и заменяем только три последних боттлнек блока на новые. Более никаких изменений и плясок с бубном (на этой теме авторы акцентируются особо :) ).
Полученную сеть зовут ботнетом (BoTNet).
На задачах сегментации и детекции результаты становятся лучше.
В работе куча экспериментов, перечислять все не буду, отмечу что-то интересное.
Во-первых, на одинаковых настройках, на задаче instance segmentation BoT50 в качестве бэкбона для feature pyramid network всегда лучше ResNet-50. Аналогично и с другими резнетами (101, 152). И более того, BoTNet-50 лучше ResNet-101 и в целом сравним с ResNet-152. Неплохая альтернатива добавлению лишних 50-100 слоёв.
От обучения на большем разрешении ботнет выигрывает (таким образом получили новый рекорд для single model single scale instance segmentation с BoT200, побив ResNeSt).
Нельзя не сравнить на классификации на обычном ImageNet. Тут BoTNet-50 не даёт особенных преимуществ по качеству перед ResNet-50 (вероятно, потому что работают здесь с меньшими разрешениями, чем в сегментации, 224x224 против 1024x1024). Но зато параметров меньше (а вычислений в терминах умножений-сложений примерно столько же).
Интересно сравнение с EfficientNets, SENets и ResNets.
EfficientNets оказались стабильно хуже — почти всегда находится ResNet, SENet или BoTNet лучше. Парето-кривая выглядит убедительно.
На сравнительно небольших моделях в что называется lower accuracy regime (до 83% top-1 accuracy) ResNet/SENet рулят и бьют остальных. ViT-384 вообще оказывается хуже ResNet-50 (но правда для ViT ценность была именно в обучении на больших датасетах, а не на теперь уже мелк`ом ImageNet, и там, как мы помним, цифры были существенно выше и вообще SoTA), а улучшенный DeiT-384 хуже SENet. В любом случае это сильные свёрточные бейзлайны, которые надо иметь в виду.
BoTNet начинает рулить на больших моделях за пределами этого режима.