Как стать автором
Обновить

Комментарии 10

На текущий момент, не сколь либо строгой теории, гарантирующей успех или не успех той или иной стратегии прореживания.

как в свое время с самой теорией обучения сетей

Я бы сказал, что до сих пор мы можем получить точные результаты только в очень специальных случаях - когда данные из хорошего распределения, сети без функций активации, т.е только из линейных слоев, Mean Field  и Neural Tangent Kernel)

Встречал идею использовать механизм hard attention для того, чтобы делать backpropagation не на всю сетку, а на отдельные нейроны.

Прореживание градиентов тоже существует - и в обзоре https://arxiv.org/abs/2102.00554 - раздел 5.3 как раз посвящен методам прореживания градиента при обратном распространении. Полезно при распределенных вычислениях особенно, чтобы обмениваться меньшим количеством данных. По большей части прореживают тем же  magnitude-based  прунингом, либо на основе дисперсии.

Дистиляция NN это синоним прореживания?

Нет, дистилляция это несколько другой подход, хоть задача дистилляции и прунинга одна и та же - получить более компактную модель, потеряв как можно меньше в качестве.

В дистилляции есть модель-учитель и модель-ученик. Идея в следующем - пусть в задаче метка содержит не слишком много информации - например в классификации есть только правильный класс. Но если подавать вероятность или логиты для каждого класса модели-ученику, ученик, скорее всего, будет сходиться вернее. Логит содержит информацию не только об истинном классе, но и о том, что еще примерно может быть на картинке. Тем самым можно точнее попыться воспроизвести целевую функцию.

Модель-ученик тоже плотная (не прореженная), как и учитель, но меньшего размера чем учитель - например DistillBert https://medium.com/huggingface/distilbert-8cf3380435b5.

Спасибо большое за статью - очень кратко и доходчиво!

И тогда критерий отбора сводится к нахождению весов с наименьшеним значением \lambda_i^{1/2} w_i, при этом другие веса не изменяются.

Вот в этом месте не очень понятно, что такое лямбда, в том смысле, что в формулах выше этот параметр под таким обозначением не фигурировал.

Благодарю за замечание, автоматически написал \lambda_i

так как это собственное значение матрицы Гессе в том числе. Исправил этот недочет.

Монументальный трудище! Ничего не скажешь! Жаль сейчас нельзя проголосовать за старые статьи.

Радостно читать и одновременно грустно. Алгоритм RigL я изобрёл в бородатом 2015-ом году за 4 года до выхода статьи. Но потом нейросети забросил, а вернулся к ним только сейчас.

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

Просто надо не синглшот это делать, а в несколько подходов. Спрунили небольшую часть, пересчитали градиенты, ещё раз спрунили, ещё немножко, опять пересчитали, пока до нужного рейта не дожмёте. и dL/dw, как правило, логнормально распределены между 1e-3 и 1e-9 для каждого слоя. Даже если очень жестоко резать, останется часть весов, которые под резак не попадут, впрочем у меня были случаи, когда в каком-то слое оставалось всего несколько процентов весов.

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

torch spars при том же количестве активных весов работает в три раза медленнее, полагаю, потому что для каждого веса приходится грузить два инта с его индексами. То есть мы упираемся не в вычислительную скорость, а в скорость операций с памятью. Поскольку теоретически для передачи индексов можно использовать int16 и даже меньше, то кажется вполне достижимым замедление всего в 2 раза. Таким образом выигрыш будет наблюдаться только если уровень прореживания составляет 2-3 раза. Для сетей, которые от рождения были милипусечного размера, типа мобайлнета этого достичь трудно, но для огромных сетей, типа тех же трансформеров, выкорчевать две трети весом, мне кажется, не представляет никакого труда. Опять же self attention это простое произведение матриц. А простое spars умножение в наше время в торче идёт из коробки, там, правда, работа с индексами неудобная, в отличии от сторонних библиотек.

Ещё больше можно выиграть если изначально использовать не полную матрицу, а spars на этапе обучения. Все метрики для добавления весов в RigL можно посчитать за линейное время от количества входов-выходов. Там выигрыш вообще может быть конским. Правда, конечно, ценой такого эе конского усложнения кода.

Ой, нет, я чёта тупанул. В RigL используется dL/dw, а у меня в 2015-ом году была другая метрика. Но по части использования sparse тензоров всё относится и к dL/dw тоже.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории