MAATRIX / Блог / Дистилляция модели: маленькая копия большой

Дистилляция модели: маленькая копия большой

MAATRIX

Если вы разворачивали малую модель и удивлялись, почему одна 7B-модель отвечает заметно осмысленнее другой такого же размера — скорее всего, разница именно в этом. «Дистиллированные» модели (в названии часто мелькает слово distilled или суффикс -distill) обучены не с нуля на сырых данных, а скопированы с поведения модели крупнее. Разберём, что происходит технически, почему это работает лучше прямого обучения и где у этого подхода честный потолок.

Что вообще значит «дистилляция знаний»

Термин пришёл из статьи Джеффри Хинтона и соавторов 2015 года (Distilling the Knowledge in a Neural Network), и суть в переносе смысла: есть «модель-учитель» — крупная, уже обученная, качественная — и «модель-ученик» — компактная, которую нужно обучить так, чтобы она вела себя похоже на учителя.

Ключевое отличие от обычного обучения — в том, ЧТО именно служит обучающим сигналом:

  • Обычное обучение с нуля. Модель видит вход и единственную «правильную» метку — например, для классификации это one-hot вектор: 1 для правильного класса, 0 для всех остальных. Для языковой модели это токен, который должен идти следующим. Сигнал жёсткий и бедный: правильно/неправильно, ничего между.
  • Дистилляция. Ученик видит тот же вход, но целью для него служит не жёсткая метка, а полное распределение вероятностей, которое выдал учитель по всем возможным вариантам ответа. Учитель не просто говорит «правильный ответ — B», он говорит «B — 62%, C — 30%, A — 6%, D — 2%». Это распределение и есть тот самый более богатый сигнал, ради которого всё затевается.

Разница на первый взгляд кажется технической деталью, но по факту это разные виды информации. Метка «правильно/неправильно» говорит ученику только куда целиться. Распределение учителя говорит ещё и насколько похожи между собой разные неправильные варианты, насколько учитель вообще уверен, где задача для него однозначна, а где — на грани. Хинтон называл это «тёмным знанием» (dark knowledge) — оно спрятано в относительных весах неправильных ответов и обычным обучением никогда не передаётся.

Как это устроено технически: softmax, логиты и температура

Чтобы малая модель могла учиться на распределении, а не на метке, нужно немного изменить то, как считается функция потерь (loss).

Обычная языковая модель на выходе даёт логиты — сырые ненормированные числа для каждого токена словаря, — которые затем проходят через softmax и превращаются в вероятности. Стандартный softmax:

p_i = exp(z_i) / Σ exp(z_j)

Проблема в том, что при обычной температуре (T=1) softmax учителя обычно почти вырожден: один токен получает вероятность 0.97, остальные — крохи вроде 0.0001. Из такого распределения ученику почти нечему учиться сверх обычной метки — вся полезная информация про относительные шансы токенов «размазана» до нуля.

Поэтому вводят температуру T > 1 в формулу softmax и учителя, и ученика на этапе обучения:

p_i = exp(z_i / T) / Σ exp(z_j / T)

При T=3-4 распределение «размягчается» (soft targets/soft labels) — второй и третий по вероятности варианты становятся заметны, и именно в них находится содержательный сигнал: какие ответы модель считает «почти правильными», а какие — категорически нет. Итоговая функция потерь ученика обычно комбинирует два слагаемых:

L = α · L_hard(y_true, p_student) + (1-α) · T² · L_soft(p_teacher_T, p_student_T)

Первое слагаемое — обычная кросс-энтропия с истинной меткой (её не выкидывают полностью, она держит ученика на земле), второе — расхождение (обычно KL-дивергенция) между смягчёнными распределениями учителя и ученика. Множитель T² компенсирует то, что градиенты soft-таргетов при высокой температуре масштабируются иначе. Коэффициент α (обычно 0.1-0.5) балансирует, сколько веса отдать «истине» и сколько — «мнению учителя».

Для больших языковых моделей на практике чаще применяют упрощённый вариант: ученик обучается предсказывать следующий токен на текстах, СГЕНЕРИРОВАННЫХ учителем (это называют sequence-level distillation или просто "обучение на синтетике учителя") — учитель прогоняется по промптам, его ответы становятся датасетом, и ученик дообучается на них обычным supervised fine-tuning. Это менее строгая форма дистилляции (без явного soft-label loss), но она даёт похожий эффект и гораздо проще в реализации, поэтому именно так устроено большинство публично доступных "distill"-моделей.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Развернуть ИИ на сервере

Почему дистиллированная модель обычно лучше той же архитектуры, обученной с нуля

Вот центральный практический факт: возьмите две модели одинакового размера (скажем, обе 8B параметров, одна архитектура). Одну обучите обычным способом с нуля на исходном датасете с жёсткими метками. Другую — дистиллируйте с модели покрупнее на том же вычислительном бюджете. Вторая почти всегда выигрывает по качеству при равном размере.

Причина в объёме и структуре сигнала, а не в объёме данных. Малая модель имеет ограниченную ёмкость — она физически не может выучить всё, что «знает» большая. Но у неё есть выбор, НА ЧТО потратить эту ограниченную ёмкость. Жёсткие метки говорят только «здесь верно, здесь неверно» — и малая модель тратит ёмкость, пытаясь угадать эту границу вслепую, часто переобучаясь на шум и артефакты датасета. Мягкие метки учителя уже частично прочертили эту границу за неё — учитель как бы говорит: «вот здесь задача простая, будь уверен; здесь — граничный случай, распредели уверенность; вот эти два класса вообще похожи по смыслу, не старайся их резко разделять». Ученик тратит свою ограниченную ёмкость эффективнее, потому что использует уже отфильтрованное, отструктурированное знание, а не пытается заново открыть его в сырых данных.

Есть и практический побочный эффект: датасет, сгенерированный качественным учителем, зачастую чище и последовательнее, чем исходный сырой датасет (в котором могут быть ошибки разметки, противоречия, шум). Ученик, обучающийся на выходах учителя, косвенно наследует эту очистку.

Если раньше вы разбирали, зачем вообще нужны компактные модели — ограничения по железу, требования к задержке ответа, стоимость инференса на масштабе — то дистилляция это именно способ получить максимум качества в рамках этих ограничений, а не альтернатива им. Компактный размер остаётся тем же, но при том же размере вы получаете модель, которая справляется лучше.

Фундаментальный компромисс: ученик не может превзойти учителя

Здесь важна честность, потому что маркетинг вокруг "дистиллированных" моделей иногда создаёт ложное впечатление, будто это способ получить качество большой модели бесплатно, в маленьком корпусе. Это не так, и вот почему.

Дистилляция — это процесс АППРОКСИМАЦИИ поведения учителя в рамках ограниченной ёмкости ученика. Ученик стремится К поведению учителя, но не может воспроизвести его точно, если у него банально меньше параметров, слоёв, механизмов внимания для хранения тех же зависимостей. Часть возможностей крупной модели неизбежно теряется при сжатии — вопрос не в том, потеряется что-то или нет, а в том, ЧТО именно потеряется:

  • Редкие и длиннохвостые знания. Учитель может знать факт, который встречается в его обучающих данных один раз на миллион примеров. У ученика емкости не хватит удержать такие редкости — они первыми "вымываются" при сжатии.
  • Многошаговое рассуждение на пределе сложности. Учитель может держать в голове длинную цепочку логических шагов. Ученик с меньшим числом слоёв физически не может выполнить столько же последовательных трансформаций информации — на сложных многошаговых задачах разрыв с учителем обычно заметнее, чем на простых.
  • Устойчивость к нетипичным формулировкам вопроса. Большая модель обычно лучше держит качество на перефразированных, нестандартно сформулированных промптах — у неё больше "запаса" для генерализации. Ученик натренирован на конкретном распределении ответов учителя и может быть более хрупким за пределами этого распределения.

Хорошая дистилляция МИНИМИЗИРУЕТ этот разрыв, но не может обнулить его — это математически следует из разницы в ёмкости моделей, а не из качества методики. Если вам попадается дистиллированная модель, которая заявленно "не уступает" учителю по всем параметрам сразу — это повод перепроверить бенчмарки, а не повод верить на слово: либо тестировали на узком наборе задач, где разрыв в ёмкости не проявился, либо сравнение методологически нечестное.

Практический сценарий: когда дистилляция реально нужна

Дистилляция особенно оправдана в одной конкретной ситуации: у вас уже ЕСТЬ доступ к качественной крупной модели (например, к топовому облачному API), но реальные ограничения продакшена не позволяют использовать именно её напрямую. Типичные ограничения:

ОграничениеКак проявляетсяЧто даёт дистилляция
Стоимость на масштабеКрупная модель через API стоит центы за тысячу запросов, но у вас миллионы запросов в деньМалая модель на своём железе — фиксированная стоимость сервера вместо растущей стоимости за токен
Задержка ответаКрупная модель отвечает за 2-5 секунд, а нужен ответ за 200-300 мс (голосовой ассистент, автодополнение)Малая модель на GPU отвечает на порядок быстрее за счёт меньшего числа параметров на forward pass
Требования к железуКрупная модель требует несколько GPU с десятками ГБ VRAM, у вас один сервер среднего классаДистиллированная малая модель влезает в разумный объём VRAM или даже работает на CPU
Приватность и офлайн-режимДанные нельзя отправлять во внешний API (медицина, юридические документы, внутренние документы компании)Дистиллированная модель разворачивается локально, данные не покидают ваш периметр

Если у вас нет доступа к сильному учителю вообще — сравнение здесь другое, и оно подробно разобрано в статье про локальную модель против облачного API: вопрос там не про дистилляцию, а про то, где вообще держать инференс.

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

Дистилляция и другие способы сжатия: где граница

Дистилляцию часто путают с другими техниками уменьшения модели, хотя механика у них принципиально разная:

  • Квантование — не меняет архитектуру и число параметров, а снижает точность представления уже обученных весов (например, с FP16 до Q4). Это сжатие "после факта", применимое к любой готовой модели за минуты. Подробный разбор, что при этом теряется, — в статье про квантование модели и потери в Q4.
  • Прунинг (pruning) — обнуление или удаление отдельных весов/нейронов внутри уже обученной модели без изменения общей архитектуры.
  • Дистилляция — принципиально другой процесс: не сжатие готовой модели, а ОБУЧЕНИЕ новой, изначально меньшей модели с использованием сигнала от большей. Дистиллированная модель имеет собственную, заранее выбранную архитектуру — она не "урезанная копия" учителя, а отдельная модель, которую можно было бы обучить и без учителя, просто хуже.

На практике эти техники комбинируют: сначала дистиллируют знание в компактную архитектуру, затем ещё и квантуют результат для инференса — так получают модели, которые одновременно и структурно компактны, и легковесны по памяти. Комбинация даёт мультипликативный, а не взаимоисключающий эффект.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Развернуть ИИ на сервере

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Дистиллированная модель — это то же самое, что fine-tuning?

Нет. Fine-tuning дообучает уже существующую предобученную модель на новых данных под конкретную задачу — модель остаётся той же архитектуры и того же размера, меняются только веса. Дистилляция создаёт ОТДЕЛЬНУЮ, обычно меньшую модель, которая учится имитировать поведение другой модели. Их можно комбинировать: сначала дистиллировать базовую малую модель, затем дообучить её fine-tuning'ом под вашу узкую задачу.

Можно ли дистиллировать модель без доступа к её весам, только через API?

Да, именно так чаще всего и происходит с закрытыми коммерческими моделями — вы не получаете доступ к внутренним логитам учителя, но можете собрать датасет из пар "промпт-ответ" через публичный API и дообучить свою малую модель на этих ответах (это упрощённая, sequence-level форма дистилляции, без явного soft-label loss). Перед этим стоит проверить условия использования API конкретного провайдера — многие явно запрещают использовать выходы модели для обучения конкурирующих моделей.

Насколько сильно ученик отстаёт от учителя на практике?

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

Стоит ли дистиллировать модель самому или лучше взять готовую distill-версию?

Если ваша задача близка к общей (диалог, суммаризация, общие вопросы-ответы) — почти всегда выгоднее взять уже готовую публичную дистиллированную модель, чем повторять этот процесс самостоятельно: подготовка качественного датасета и цикл обучения требуют времени и вычислений. Собственная дистилляция оправдана, когда задача узкая и специфичная и готового варианта под неё просто нет.

Нужен ли для дистилляции мощный сервер?

Само обучение ученика — это полноценный процесс fine-tuning или pretraining, требующий GPU с достаточным объёмом VRAM, соизмеримо с обучением любой модели такого же размера. А вот генерация датасета через API учителя — это просто множество запросов к внешнему сервису, для которой мощный GPU не нужен вообще.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →