Comments 22
Но статья Attention is all you need
получила свое название не просто так, и название оказалось даже более
глубокомысленным чем, полагаю, даже исходно полагали сами авторы.
Говорят, что и внимание не очень-то нужно. :)
Да и ResNet хоронить пока что рано — ResNet strikes back.
спасибо, про Poolformer не видел статью. Правда, навскидку сравнивая перформанс Poolformer и Swin на ImageNet, кажется, что Swin эффективне выходит (именно Swin а не Swin-Mixer). Про ResNet читал статью - действительно процедура обучения решает многое, и к моменту массового использования ViT у исследователей был большой опыт в подборе сильных процедур обучения. Но все же кажется, что если ViT-ы смогли составить сходу конкуренцию давно развиваемым сверточным сетям, то у них еще большой потенциал для дальнейшего развития.
Ну, там идея в том, что attention не так уж и важен сам по себе. PoolFormer — это просто пример.
Я вовсе не против трансформеров. Наоборот, мне кажется, всё это очень интересно и нам только предстоит понять, что делает те или иные модели эффективными.
Скажем, недавно была статья, в которой сделали NeRF без нейронок. То есть, значительная часть эффективности при ходится на дифференцируемый рендерер, вносящий inductive bias с информацией о внешнем мире. Статья Deep Image Prior показала, что сам факт использования свёрток — это уже важная штука, с помощью которых многое можно сделать. (И, кстати, идеи оттуда были использованы в известной статье про ретайминг видео.)
В общем, всё это очень и очень любопытно. :)
Очень познавательно! Действительно, интересные работы. Кажется, что практика сильно убежала вперед теории. Интересно, смогут ли когда нибудь теоретики приблизиться к сколько либо точному предсказанию поведения нейронной сети на реальном датасете при условиях, близких к реальным нейронным сетям (то есть не в пределе NTK или среднего поля, скажем)?
Да, deep learning — это сейчас экспериментальная наука. Но может, в ближайшее время появится хорошая теория, кто знает.
Я бы даже сказал, что пора распрощаться с мыслью, что нейросети - точная наука, и начать относиться к ней, как к естественной. Как биологи, разглядывающие под микроскопом своих подопечных дрозофил и изучающие даже всякие химические и генетические взаимосвязи, но признающие при этом, что их понимание бесконечно не полно.
Спасибо за статью! Что думаете про BEiT?
Идея сделать предобучение, как BERT, выглядит естественно, но вот главный вопрос был в том к поставить задачу, чтобы представить картинку как слово. Авторы BeiT придумали хорошее решение с подачей патчей в дискретный автоэнкодер, и, как я понял, их решение достаточно быстро файнтьюнится на ImageNet и сегментации. Работает даже немного лучше, чем DINO, судя по табличкам в их статье.
Еще есть свежий результат в этом направлении - Masked Autoencoders Are Scalable Vision Learners. Тут авторы маскируют большой процент (75% токенов) прогоняют через энкодер незамаскированные патчи и декодером восстанавливают картинку на предобучении. На файнтьюнинге используется только энкодер со всей (незамаксированной картинкой).
При сопоставимом количестве операций с плавающей точкой модели Swin
значительно превосходят ViT и DeiT и сравнимы с EfficientNet
(эффективнее по числу операций, чуть уступают в плане эффективности по
параметрам).
В табличке выше самый мелкий трансформер на 4.5 Гфлопс имеет точность 81.3, а EfficientNet на 1.8 Гфлопс выдает 81.6%. Где они эффективнее?
Ещё с трансформерами большая проблема в квантизации. Если свёрточные сети спокойно квантизируются в 8 бит или даже меньше с минимальной потерей точности, то трансформеры сильно ухудшаются, и совершенно неэффективны для практических применений, особенно вне дата-центра.
Ух, куда же я смотрел в этот момент) Действительно, EfficientNet выходит круче. Интересно, что в плане throughput таблица наиболее выигрышная для них, хотя, казалось бы, что он должен напрямую зависеть от FLOPs.
С квантизацией не доводилось особо работать. Могу предположить, что причина падения качества - более резкие оптимумы по сравнению с сверточными сетями (большая кривизна босс-поверхности). Вероятно, если брать модели, обученные с помощью SAM, они будут лучше квантоваться. Возможно ли дообучение квантованных моделей в низкой точности?
По личному опыту еще могу сказать, что visual transformer плохо прунится. Если ResNet можно запрунить без потери качества достаточно сильно, EfficientNet и NFNet не так хорошо, в силу их оптимизированности, до 70-80% обычно качество не проседает, а при небольшом прореживании качество слегка растет даже на валидации, то для ViT (DeiT, Swin) я наблюдал монотонное ухудшение качества и модель c 50% весов уже теряет пару процентов на ImageNet.
Я навскидку посмотрел - уже есть пара публикаций о квантизации трансформеров, авось через пару лет и дойдут до практических примеров.
Прунинг звучит круто ("мы выбросили 90% параметров!!!111"), на практике очень редко даёт ускорение ибо всё железо заточено под плотные, а не разряженные матрицы, и кроме слабеньких процессоров мало где можно получить ощутимый выигрыш.
В целом да, выигрыш от использования прунинга обычно не так велик, как можно было бы наивно думать.
Но все же можно добиться заметной пользы. Есть стартап neural magic и для некоторых моделей они добиваются серьезного ускорения за счет прунинга + квантования. На классификации и детекции ускорение серьезное (если верить цифрам).
Ага, только работают они только на CPU, и главная фишка у них эффективное распараллеливание на несколько процессорных ядер с максимальным использованием быстрого кэша. На мобильных процах (32-512 кБ) фокус не прокатит. Я не отрицаю что технология может быть полезной в некоторых случаях, но это явно не универсальная панацея. Прореживать Реснет-50 смысла нету - модель чисто академическая. Для Мобайлнета они обещают сокращение размера до 4.5 МБ, что соответсвует обычной 8-битной квантизации (4.2 миллиона весов). Так что непонятно где там "магия".
На обычной моей карточке разреженные тензоры обрабатываются, грубо говоря x3 по сравнению с dense с таким же количеством весов. Так что как только вы напрунили больше чем две трети вы уже вы выигрыше.
А кроме того никто, почему-то, не говорит, что удалять можно не только веса, но и целиком нейроны или свёртки. Это делается вообще без накладных расходов. Прунинг явно сильно недооценён.
А вы используете какие-то кастомные ядра, типа Sputnik, SparTA, или nmSparse? Произвольный паттерн прореживания ускоряется не очень хорошо. 2:4 sparsity можно ускорить на Nvidia GPU, начиная с Ampere, но там ускорение порядка 20-30% обычно.
Большие языковые модели дают новое дыхание прунингу, так как многие вычисления memory, а не compute bound, за счет меньшего количества операций с памятью.
Структурированный прунинг дает действительно ускорение почти автоматически, но сжимать целые каналы и размерности обычно куда тяжелее. 30-40% ускорения при сохранении качества не реальной задаче - это хороший результат, и требует обычно серьезного дообучения.
Я с полносвязаными слоями работаю, использую https://pypi.org/project/torch-sparse/ У него манипулирование индексами показалось менее проблематичным. Там кроме весов хранится ещё тензор с индексами x2 размером потому что две координаты, так что экономия по памяти начинается только после того, как прорядили хотя бы на 2/3 и по скорости исполнения та же ситуация, примерно раза в три медленнее при том же количестве весов. Для моих достаточно экспериментальных целей подходит. Если зарубаться за скорость инференса думаю можно и что-то более эффективное подыскать. Я почти уверен, что если подумать головой можно хранить один индекс, а не два и не требовать обязательно long int, учитывая реальные размеры матриц, а хранить оба индекса в одном лонге.
>> 30-40% ускорения при сохранении качества не реальной задаче - это хороший результат, и требует обычно серьезного дообучения.
30-40% процентов на инференсе это не просто бабло, а баблище, и я не знаю почему народ это не стало золотым стандартом постобработки сети перед инференсом.
Спасибо! Кажется, где-то мелькало мимо меня, но пристально не изучал. Стоит присмотреться)
Это работа вышла меньше года назад, но на неё уже 252 ссылки )
И вот опять свёрточные сети лучше всех: https://arxiv.org/abs/2201.03545 .
Да, похоже , пространство параметров в архитектурах еще мало исследовано. Здесь, правда замечу, что разница все же не так велика в производительности Swin и их ConvNext, более того, если сравнивать с XCiT, то они выйдут круче обоих моделей.
Справедливости ради надо заметить, они с обучались дистилляцией с учителем, и разницу может делать именно этот факт.
А вообще, кажется что оптимальная архитектура бы брала лушчее из двух миров - свертки с сильным inductive bias и attention со свойством улавливания глобального контекста.
ViT — на кухне фаворит