Автор: Леонид Костюшко Редактура: Дмитрий Раков, Александр Гончаренко, Александр Наздрюхин

Идея

Представим классический сверточный слой, задаваемый количеством выходных каналов. Каждому выходному каналу будет соответствовать свой набор весов — ядер сверток. Цель прунинга — избавиться от избыточных наборов весов в каждом слое сети и тем самым уменьшить число выходных каналов и параметров всей модели. Прунинг наборов весов называется structured pruning. Он отличается от unstructured pruning’а тем, что удаляет целые наборы параметров ядер сверток, а не отдельные единицы весов в каждом ядре, плюс он чаще имеет практический результат.

Определение избыточных наборов весов

Можно случайно. А можно оценить важность наборов весов, используя их значения (magnitude based pruning) или градиенты (gradient based pruning).

К magnitude based pruning относят оценку весов через L1, L2 нормы. Получается, важность набора весов определяется как сумма норм весов в этом наборе. Важность также можно оценивать как 1 — доля нулевых параметров нейрона; ранг матрицы выходного слоя. Однако отметим, что baseline в виде L1, L2 и random до сих пор актуален и дает лучшие результаты на отдельных примерах.

Классическая идея gradient based pruning’а — статья Pruning Convolutional Neural Networks for Resource Efficient Inference. Здесь важность параметра подсчитывается как разность между лоссом нашей сети без фиксированного параметра и лоссом со всеми параметрами. Лосс аппроксимируется рядом Тейлора 1-го порядка:

$$ I=\left|\frac{\partial L}{\partial x} \cdot x\right| $$

Как и при magnitude based pruning, важность набора весов будет определяться суммой отдельных параметров.

В случае наличия batch normalization слоя можно оценить набор весов напрямую при помощи scale и bias BN слоев, уникальных для каждого выходного канала сети:

$$ I=\left|\frac{\partial L}{\partial \beta} \cdot \beta+\frac{\partial L}{\partial \gamma} \cdot \gamma\right| $$

Многие из последних статей по gradient based pruning основываются на этой идее, плюс добавляют, например, разложение в ряд Тейлора до более высоких порядков.

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

На рисунке (а) красным цветом обозначена наименьшая по значимости группа весов, на рисунке (b) — ее удаление.

На рисунке (а) красным цветом обозначена наименьшая по значимости группа весов, на рисунке (b) — ее удаление.

Применение теории на практике

Хорошая реализация теории, представленной выше, есть в библиотеках nni и Torch-Pruning. Можно реализовать свои или взять готовые метрики подсчета важности нейронов и применить их к любым слоям на выбор.

Улучшение результатов

Результаты улучшаются за счет оптимизации нарушенных связей между параметрами.

  1. Самый простой способ — finetuning модели после прунинга. Он дает значительно меньшую просадку итоговой модели в сравнении с исходной. Таким образом, весь пайплайн оптимизации можно представить как последовательность повторений pruning + finetuning до того момента, пока модель не подойдет под наши ограничения.

Схема пайплайна прунинга

Схема пайплайна прунинга