Как-то мимо меня прошло, но вот - клёвая идея ускорения ViT'ов от Facebook



Ссылка на блогпост, статья и код.



Преамбула:

Чтобы обработать изображение, современные трансформеры нарезают их на патчи (кусочки, обычно квадратные, см. гифку), а затем оперируют представлениями этих частичек, каждый из которых представлен "токеном". Как мы знаем, трансформеры работают тем медленнее, чем больше таких кусочков-токенов (это применимо и для текстов, и для изображений) - у самого обычного трансформера связь квадратичная. То есть добавление новых и новых токенов всё больше замедляет обработку.



TLDR метода:

Давайте в промежутках между обработкой разными блоками будем определять наиболее схожие патчи и объединять их, тем самым уменьшая вычислительную сложность. Доля смердженных токенов - гиперпараметр, чем она выше, тем больше просадка по качеству, но тем больше ускорение. Эксперименты показывают, что можно объединять порядка 40% токенов с потерей качества 0.1— 0.4%, при этом получать ускорение ВДВОЕ (ещё и памяти меньше жрёт).

Если визуализировать, какие патчи мы мерждим, то они 1) близко расположены друг к другу 2) описывают один и тот же объект (см. области одного цвета на гифке). То есть существенной потери информации не происходит - объект остаётся "в поле зрения" модели.

И главное - модель тренировать не надо, метод применяется к уже обученной модельке 🤯



Обожаю такие инженерные подходы, основанные на смекалке и понимании принципа работы чего-либо.



UPD: Обещают ещё завезти в StableDiffusion, чтобы и там ускрять, ухх! Очень круто, что за счёт того, что трансформеры везде, такие трюки можно сразу внедрять в широкий набор моделей.