# Movement Pruning: как адаптивное сжатие через fine-tuning делает BERT компактнее

Источник: https://www.youtube.com/watch?v=nxEr4VNgYOE
Канал: Yannic Kilcher
Опубликовано: 04.06.2020

---

В современном мире глубокого обучения модели становятся всё больше, но их использование на мобильных устройствах ограничено вычислительными мощностями. Янник Килхер (Yannic Kilcher) разбирает научную работу «Movement Pruning: Adaptive Sparsity by Fine-Tuning», подготовленную исследователями из Hugging Face и Корнеллского университета. В видео обсуждается революционный подход к сжатию нейросетей: вместо того чтобы удалять связи по их абсолютному значению, авторы предлагают смотреть на то, как веса «движутся» в процессе дообучения (fine-tuning).

## ✂️ Проблема избыточности: зачем нужно прунинг
[[JUMP:00:55]]

Прунинг (pruning) — это процесс удаления весов (связей) в нейронной сети для уменьшения её размера без значительной потери точности. Это критически важно для развёртывания моделей на смартфонах и других устройствах с ограниченной памятью [01:22].

Традиционный метод, называемый «прунингом по амплитуде» (magnitude pruning), работает следующим образом:

*   Сеть обучается до высокой точности.
*   Исследователь смотрит на распределение весов.
*   Веса с малым абсолютным значением (близкие к нулю) считаются шумом и удаляются.
*   Оставшаяся сеть дообучается, и процесс повторяется итеративно [02:54].

По словам Янника Килхера, логика здесь проста: веса с большой амплитудой вносят основной вклад в сигнал, а маленькие веса не важны [03:33]. Однако эта логика дает сбой, когда мы переходим к парадигме трансферного обучения (transfer learning), которая доминирует в современной обработке естественного языка (NLP) [04:24].

## 🔄 Ограничения трансферного обучения
[[JUMP:04:38]]

В трансферном обучении мы берем огромную предобученную модель (например, BERT) и адаптируем её под конкретную задачу. Янник Килхер приводит аналогию с классификатором кошек и собак:

1.  Сначала модель обучается на гигантском датасете отличать кошек от собак.
2.  Затем веса переносятся в новую модель, которую нужно научить определять, больно ли животное.
3.  Для второй задачи данных мало, поэтому мы полагаемся на признаки, которые модель уже выучила на первой задаче [06:14].

Проблема в том, что при обычном прунинге по амплитуде мы удаляем веса, основываясь на их важности для *первой* (общей) задачи. Но вес, который был важен для того, чтобы отличить кошку от собаки, может быть совершенно бесполезен для диагностики болезни. Более того, при fine-tuning веса смещаются очень незначительно относительно своих исходных значений [08:25]. Таким образом, прунинг по амплитуде в основном сохраняет структуру предобученной модели, игнорируя специфику новой задачи.

## 📈 Movement Pruning: прунинг по движению
[[JUMP:09:19]]

Авторы статьи — Виктор Сан (Victor Sanh), Томас Вольф (Thomas Wolf) и Александр М. Раш (Alexander M. Rush) — предлагают альтернативу: «Movement Pruning» (прунинг по движению) [00:00]. 

Суть метода заключается в анализе динамики весов во время fine-tuning:

*   Если в процессе дообучения вес стремится к нулю, он считается неважным для новой задачи и удаляется [09:47].
*   Если вес удаляется от нуля (становится больше по модулю), он признается важным.
*   Это позволяет модели быть адаптивной к целевой задаче, а не просто копировать важность из предобученного состояния [10:15].

Технически это реализуется через введение матрицы масок $M$, которая определяет, активен вес или нет. Важность веса ($s$) теперь определяется не его значением $W$, а градиентом функции потерь по отношению к этому весу [12:48].

## 🛠️ Математический аппарат и методы
[[JUMP:12:48]]

Янник Килхер объясняет, что Movement Pruning — это метод первого порядка (использует градиенты), в то время как прунинг по амплитуде — метод нулевого порядка (использует только значения весов) [17:40].

Ключевые технические аспекты метода:

*   **Straight-Through Estimator (STE):** Используется для того, чтобы градиенты могли «протекать» через бинарную маску во время обратного распространения ошибки, даже если в прямом проходе некоторые веса были обнулены [18:06].
*   **Soft Movement Pruning:** Улучшенная версия метода, где вместо жесткого отсечения топ-V процентов весов используется регуляризатор (лямбда), поощряющий разреженность матрицы важности [19:27].
*   **Sparsity Scheduling:** В процессе обучения разреженность модели увеличивается постепенно по определенному графику, что является стандартным инженерным приемом для таких задач [21:01].

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

## 📊 Результаты экспериментов и «V-образная» кривая
[[JUMP:21:41]]

Метод тестировался на классических NLP-задачах: SQuAD (ответы на вопросы), MNLI (логический вывод) и QQP (определение дубликатов вопросов) [22:47].

Результаты показывают четкую закономерность:

1.  **В режиме низкой разреженности** (когда остается много весов) прунинг по амплитуде всё еще конкурентоспособен и иногда выигрывает [23:40].
2.  **В режиме экстремальной разреженности** (остается всего 3–10% весов) Movement Pruning значительно превосходит старые методы [24:07].
3.  **Дистилляция знаний (Distillation):** Если использовать «учителя» (полную модель) для обучения «ученика» (сжатой модели), результаты Movement Pruning становятся еще более впечатляющими [25:57].

Анализ распределения оставшихся весов показал интересную «V-образную» форму [27:38]. Movement Pruning часто сохраняет веса, которые имеют малую амплитуду, но активно «двигались» во время обучения, и удаляет крупные веса, которые были важны для общей языковой модели, но не нужны для конкретной задачи [28:04].

## 🏗️ Слой за слоем: где происходит сжатие?
[[JUMP:28:16]]

Янник Килхер отмечает, что Movement Pruning распределяет разреженность в модели BERT неравномерно.

*   **Нижние слои:** Метод сохраняет больше весов в начальных слоях. Янник предполагает, что там кодируются базовые признаки языка, необходимые для любой задачи [29:20].
*   **Верхние слои:** Метод агрессивно удаляет веса в последних слоях. Это объясняется тем, что специфическая информация из задачи предобучения (предикция пропущенных слов) в финальных слоях часто оказывается избыточной для таких задач, как SQuAD [29:47].

В итоге авторам удалось получить модель, которая в разы меньше оригинала, но сохраняет до 95% точности на сложных лингвистических тестах [30:11].