Pull to refresh

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 — это сейчас экспериментальная наука. Но может, в ближайшее время появится хорошая теория, кто знает.

Я бы даже сказал, что пора распрощаться с мыслью, что нейросети - точная наука, и начать относиться к ней, как к естественной. Как биологи, разглядывающие под микроскопом своих подопечных дрозофил и изучающие даже всякие химические и генетические взаимосвязи, но признающие при этом, что их понимание бесконечно не полно.

Идея сделать предобучение, как 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% процентов на инференсе это не просто бабло, а баблище, и я не знаю почему народ это не стало золотым стандартом постобработки сети перед инференсом.

Хороший обзор у вас получился. В этой области есть еще одна важная и фундаментальная работа. Это механизм favor+. Он позволят выпонять операции внимания в линейном пространстве и полностью совместим с оригинальной архитектурой трансформера.

Спасибо! Кажется, где-то мелькало мимо меня, но пристально не изучал. Стоит присмотреться)

Да, похоже , пространство параметров в архитектурах еще мало исследовано. Здесь, правда замечу, что разница все же не так велика в производительности Swin и их ConvNext, более того, если сравнивать с XCiT, то они выйдут круче обоих моделей.

Стрелочка вверх означает разрешение 384x384, а \Ipsilon - дистилляцию
Стрелочка вверх означает разрешение 384x384, а \Ipsilon - дистилляцию

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

А вообще, кажется что оптимальная архитектура бы брала лушчее из двух миров - свертки с сильным inductive bias и attention со свойством улавливания глобального контекста.

Sign up to leave a comment.

Articles