Неплохой обзор! Хотел сделать несколько комментариев.
Вообще, сложно сказать, насколько предложенный механизм можно считать гибридом свертки и attention. Само понятие "внимания" довольно размыто, и можно под ним понимать всякое, но обычно кажется естественным воспринимать как некоторый взвешенный учетом информации от соседей.
Инволюция, предложенная в статье, - это частный случай *динамической свертки*, т.е зависящей от входных данных. В обычной свертке - ядро это некоторый не зависящий от входных данных тензор, который обновляется лишь в процессе градиентного спуска, а инволюция же - считается для каждого входа отдельно. В их статье в качестве функции, генерирующей свертки используется последовательность двух сверток 1x1 с сжатием посередине (для экономии числа операций и весов). Похожая идея, только с одной свёрткой и softmax на выходе была предложена ранее в https://arxiv.org/pdf/1901.10430.pdf.
Нет, дистилляция это несколько другой подход, хоть задача дистилляции и прунинга одна и та же - получить более компактную модель, потеряв как можно меньше в качестве.
В дистилляции есть модель-учитель и модель-ученик. Идея в следующем - пусть в задаче метка содержит не слишком много информации - например в классификации есть только правильный класс. Но если подавать вероятность или логиты для каждого класса модели-ученику, ученик, скорее всего, будет сходиться вернее. Логит содержит информацию не только об истинном классе, но и о том, что еще примерно может быть на картинке. Тем самым можно точнее попыться воспроизвести целевую функцию.
Прореживание градиентов тоже существует - и в обзоре https://arxiv.org/abs/2102.00554 - раздел 5.3 как раз посвящен методам прореживания градиента при обратном распространении. Полезно при распределенных вычислениях особенно, чтобы обмениваться меньшим количеством данных. По большей части прореживают тем же magnitude-based прунингом, либо на основе дисперсии.
Я бы сказал, что до сих пор мы можем получить точные результаты только в очень специальных случаях - когда данные из хорошего распределения, сети без функций активации, т.е только из линейных слоев, Mean Field и Neural Tangent Kernel)
Нашел пример по ускорению Берта благодаря прунингу (https://blog.rasa.com/pruning-bert-to-accelerate-inference/). Но начинает уже просаживаться качество при этом. В CV — в основном работы смотрят на (количество параметров и флопс)[https://blog.rasa.com/pruning-bert-to-accelerate-inference/], но в экспериментах просто кладется маска на веса, что не ускоряет модель на практике. В обработке сигналов обычно смотрят на скорость работы — она фиксированная, а чтобы число умножений было не более определенного порога
Еще интересная работа, на мой взгляд, обучение разреженной модели с перешиванием весов — RigL. Веса убираются по magnitude-based прунингу, а новые выращиваются на основе градиента лосс-функции. В примерах есть сжатие до 4-5 раз почти без просадки качества и есть открытая реализация на Tensorflow
В Signal processing это работает на реальных архитектурах для продакшена. Детали обычно являются корпоративной тайной — поэтому в открытом доступе не появляются. В компьютерном зрении считать матрицу Гессе честно слишком накладно (ее размер для типичной архитектуры типа Resnet, EfficientNet будет порядка 10^7 x 10^7 — 10^14), что никуда не влезет. Но методы основанные на приближениях как-то работают https://arxiv.org/pdf/2101.08940.pdf. В приведенной работе где-то в 3-4 раза ужали размер модели (но правда все на CIFAR-10), а интересно было в real-life applications увидеть пример.
На текущий момент, самый точный метод, известный мне по прунингу — Optimal Brain Surgeon. В этом подходе необходимо считать матрицу Гессе модели (берется приближение функцией второго порядка в окрестности минимума), и оптимальный сдвиг берется такой, что он убирает часть весов и рост ошибки наименьший. Оригинальная работа очень старая, поэтому там совсем игрушечные модели, в своей практике я работаю с моделями порядка несколько тысяч весов (ТЗ требует сверхкомпактный моделей для обработки сигналов) — и на текущий момент OBS — дает самое лучшее качество при том же количество весов. Про наличие открытых имплементаций увы не знаю. Самый простой, но грубоватый подход — magnitude based. Он добавлен в стандартные Фреймворк, есть в Tensorflow (Tutorial). Но без серьезной просадки в качестве, полагаю, более чем раза в 2 модель ужать не получится в большинстве задач.
Очень мало информации, чтобы дать какую-то оценку полученным результатам.
1) По поводу замеров времени — это время обучения, затраченное на количество эпох, изображенное на графиках? Важна конфигурация на которой проводились расчеты — CPU, GPU (модель видеокарты), размер выборки, батча. Без этого время ни о чем не говорит.
2) Неплохо было бы показать примеры данных из датасета и результаты классификации на определенных примерах. Если на первой картинке еще можно догадаться, что скорее всего подразумевается MNIST, то для остальных примеров даже сложно оценить сложность задачи.
3) С акциями более чем сомнительный результат — что подается на вход, что на выходе? Как измеряется точность тоже непонятно. Я бы ожидал решение здесь скорее задачу регресии.
4) В задаче сегментации что подразумевается под точностью — IoU (Intersection over Union) или (mAP)?
Неплохой обзор! Хотел сделать несколько комментариев.
Вообще, сложно сказать, насколько предложенный механизм можно считать гибридом свертки и attention. Само понятие "внимания" довольно размыто, и можно под ним понимать всякое, но обычно кажется естественным воспринимать как некоторый взвешенный учетом информации от соседей.
Инволюция, предложенная в статье, - это частный случай *динамической свертки*, т.е зависящей от входных данных. В обычной свертке - ядро это некоторый не зависящий от входных данных тензор, который обновляется лишь в процессе градиентного спуска, а инволюция же - считается для каждого входа отдельно. В их статье в качестве функции, генерирующей свертки используется последовательность двух сверток 1x1 с сжатием посередине (для экономии числа операций и весов). Похожая идея, только с одной свёрткой и
softmax
на выходе была предложена ранее в https://arxiv.org/pdf/1901.10430.pdf.Вообще концепция разделения на быстрые веса, считающиеся для каждого примера на лету, и медленные, обновляемые градиентным спуском, была предложена когда-то Schidhuber - https://people.idsia.ch/~juergen/fast-weight-programmer-1991-transformer.html.
Возможно, достоинство этой архитектуры в том, что она дает новую мультипликативную нелинейность вида
которую сложно выразить через традиционные композиции сверток и активаций.
Благодарю за замечание, автоматически написал
так как это собственное значение матрицы Гессе в том числе. Исправил этот недочет.
Нет, дистилляция это несколько другой подход, хоть задача дистилляции и прунинга одна и та же - получить более компактную модель, потеряв как можно меньше в качестве.
В дистилляции есть
модель-учитель
имодель-ученик
. Идея в следующем - пусть в задаче метка содержит не слишком много информации - например в классификации есть только правильный класс. Но если подавать вероятность или логиты для каждого класса модели-ученику, ученик, скорее всего, будет сходиться вернее. Логит содержит информацию не только об истинном классе, но и о том, что еще примерно может быть на картинке. Тем самым можно точнее попыться воспроизвести целевую функцию.Модель-ученик тоже плотная (не прореженная), как и учитель, но меньшего размера чем учитель - например DistillBert https://medium.com/huggingface/distilbert-8cf3380435b5.
Прореживание градиентов тоже существует - и в обзоре https://arxiv.org/abs/2102.00554 - раздел 5.3 как раз посвящен методам прореживания градиента при обратном распространении. Полезно при распределенных вычислениях особенно, чтобы обмениваться меньшим количеством данных. По большей части прореживают тем же magnitude-based прунингом, либо на основе дисперсии.
Я бы сказал, что до сих пор мы можем получить точные результаты только в очень специальных случаях - когда данные из хорошего распределения, сети без функций активации, т.е только из линейных слоев, Mean Field и Neural Tangent Kernel)
Нашел пример по ускорению Берта благодаря прунингу (https://blog.rasa.com/pruning-bert-to-accelerate-inference/). Но начинает уже просаживаться качество при этом. В CV — в основном работы смотрят на (количество параметров и флопс)[https://blog.rasa.com/pruning-bert-to-accelerate-inference/], но в экспериментах просто кладется маска на веса, что не ускоряет модель на практике. В обработке сигналов обычно смотрят на скорость работы — она фиксированная, а чтобы число умножений было не более определенного порога
Еще интересная работа, на мой взгляд, обучение разреженной модели с перешиванием весов — RigL. Веса убираются по magnitude-based прунингу, а новые выращиваются на основе градиента лосс-функции. В примерах есть сжатие до 4-5 раз почти без просадки качества и есть открытая реализация на Tensorflow
В Signal processing это работает на реальных архитектурах для продакшена. Детали обычно являются корпоративной тайной — поэтому в открытом доступе не появляются. В компьютерном зрении считать матрицу Гессе честно слишком накладно (ее размер для типичной архитектуры типа Resnet, EfficientNet будет порядка 10^7 x 10^7 — 10^14), что никуда не влезет. Но методы основанные на приближениях как-то работают https://arxiv.org/pdf/2101.08940.pdf. В приведенной работе где-то в 3-4 раза ужали размер модели (но правда все на CIFAR-10), а интересно было в real-life applications увидеть пример.
На текущий момент, самый точный метод, известный мне по прунингу — Optimal Brain Surgeon. В этом подходе необходимо считать матрицу Гессе модели (берется приближение функцией второго порядка в окрестности минимума), и оптимальный сдвиг берется такой, что он убирает часть весов и рост ошибки наименьший. Оригинальная работа очень старая, поэтому там совсем игрушечные модели, в своей практике я работаю с моделями порядка несколько тысяч весов (ТЗ требует сверхкомпактный моделей для обработки сигналов) — и на текущий момент OBS — дает самое лучшее качество при том же количество весов. Про наличие открытых имплементаций увы не знаю. Самый простой, но грубоватый подход — magnitude based. Он добавлен в стандартные Фреймворк, есть в Tensorflow (Tutorial). Но без серьезной просадки в качестве, полагаю, более чем раза в 2 модель ужать не получится в большинстве задач.
1) По поводу замеров времени — это время обучения, затраченное на количество эпох, изображенное на графиках? Важна конфигурация на которой проводились расчеты — CPU, GPU (модель видеокарты), размер выборки, батча. Без этого время ни о чем не говорит.
2) Неплохо было бы показать примеры данных из датасета и результаты классификации на определенных примерах. Если на первой картинке еще можно догадаться, что скорее всего подразумевается MNIST, то для остальных примеров даже сложно оценить сложность задачи.
3) С акциями более чем сомнительный результат — что подается на вход, что на выходе? Как измеряется точность тоже непонятно. Я бы ожидал решение здесь скорее задачу регресии.
4) В задаче сегментации что подразумевается под точностью — IoU (Intersection over Union) или (mAP)?