Математика глубокого обучения
Mixture of Experts
Разделить параметры и вычисления — и почему главная проблема здесь статистическая
Идея: разорвать связь между памятью и вычислениями
В обычной сети число параметров и объём вычислений на токен — это одно и то же число: каждый токен проходит через все веса. MoE эту связь разрывает.
Сумма идёт только по выбранным экспертам из , поэтому на токен приходится доля параметров слоя. При , это : восемь наборов веса, работы — как от двух.
| активная доля | ||
|---|---|---|
Mixtral 8×7B — прямая иллюстрация: млрд параметров всего, млрд активны на токен. Память нужна под все, арифметика — под четверть.
Почему это трудно
Проблема не в формуле, а в том, что
Это положительная обратная связь, и её отказ тихий: лосс продолжает падать, ошибок нет, просто большая часть параметров не используется, и модель по сути имеет размер активной части.
Покрутите разброс логитов роутера. Уверенный роутер — несбалансированный роутер.
эксперт токенов
вместимость: 20
- активная доля
- 25%
- перегрузка
- ×1.63
- balance loss
- 1.239
- отброшено
- 16
Часть токенов отброшена: эксперт исчерпал вместимость, и для этих токенов слой сработал как тождественное отображение — они прошли по residual-связи без обработки. Ошибки при этом не возникает.
Два числа под графиком стоит понимать точно.
Перегрузка — отношение максимальной загрузки к средней. При идеальном балансе единица; при на восьми экспертах треть слоя простаивает, пока один считает за трёх.
Balance loss — вспомогательное слагаемое, добавляемое к основной цели:
где — доля токенов, попавших эксперту , а — его средний гейт. Устроено так, что при равномерном распределении величина равна единице (каждое слагаемое , сумма , умноженная на ), и растёт при перекосе.
Почему в формуле произведение двух величин, а не одна: считается через argmax и по нему
нельзя дифференцировать, а — гладкая функция параметров роутера. Произведение даёт
градиент, который толкает роутер понижать гейт у перегруженных экспертов. Приём общий и стоит
запомнить: недифференцируемую величину используют как вес при дифференцируемой.
Capacity factor и отброшенные токены
Каждому эксперту заранее выделяется буфер:
Причина этого ограничения — не математика, а форма тензоров: чтобы считать батчем, буферы должны быть равными и известными заранее. Токены сверх вместимости отбрасываются — проходят слой по residual-связи без обработки.
Заметьте, что происходит: это не ошибка и не исключение. Для отброшенного токена MoE-слой работает как тождественное отображение, и обнаружить это можно только по счётчику. Ещё один тихий режим отказа, и второй в этом уроке.
Capacity factor означает запас в четверть. Больше — меньше потерь и больше памяти под буферы, меньше — наоборот.
Что ещё ломается
| проблема | проявление | обычное решение |
|---|---|---|
| коллапс роутера | все токены к нескольким экспертам | balance loss |
| отброшенные токены | тихий пропуск слоя | capacity factor выше единицы |
| нестабильность обучения | расходимость на больших моделях | z-loss на логиты роутера |
| дисбаланс между устройствами | одно ждёт остальные | балансировка + capacity |
| переобучение экспертов | каждый видит мало данных | больше данных, меньше |
Строка про устройства стоит отдельного внимания, потому что она превращает статистику в инженерную проблему. Эксперты обычно распределены по устройствам, и раз шаг синхронный, все ждут самое загруженное. Значит перегрузка — это не «треть простаивает в среднем», а шаг втрое дольше. Баланс тут нужен не для качества, а для скорости.
Что MoE даёт и чего не даёт
| обычная сеть | MoE | |
|---|---|---|
| параметров | ||
| вычислений на токен | ||
| памяти под веса | под все эксперты | |
| обмен между устройствами | нет | all-to-all на каждом слое |
| качество при равных вычислениях | базовое | обычно выше |
| качество при равной памяти | базовое | обычно ниже |
Две последние строки — самое полезное для практики. MoE выгодна, когда узкое место — вычисления, и невыгодна, когда память: держать восемь экспертов, чтобы использовать два, приходится целиком. Отсюда и типичная область применения: обучение и сервинг больших моделей на многих устройствах, где памяти суммарно достаточно, а времени всегда мало.
Итог
- MoE разрывает связь «параметры = вычисления»: активная доля равна .
- Главная проблема — статистическая: роутер сходится к вырожденному решению, и отказ тихий.
- Balance loss равен единице при равномерном распределении и работает через произведение недифференцируемой доли на дифференцируемый гейт.
- Отброшенные токены — не ошибка, а пропуск слоя; capacity factor задаёт запас.
- Выгода в вычислениях, плата — памятью и обменом между устройствами.
Источники
- Shazeer и др. — Outrageously Large Neural Networks, The Sparsely-Gated MoE Layer — Top-k роутинг и вспомогательная функция потерь
- Fedus и др. — Switch Transformers — k = 1, capacity factor, что происходит при переполнении
- Zoph и др. — ST-MoE, Designing Stable and Transferable Sparse Expert Models — Устойчивость обучения и разбор режимов отказа
Проверки
0 из 2Разреженность и её цена
Отметьте все верные утверждения о MoE-слоях.
Баланс, вместимость и потери
Реализуйте
moe_facts(experts, top_k, tokens, capacity_factor, loads), гдеloads[e]— сколько назначений получил эксперт (сумма равнаtokens * top_k, потому что каждый токен идёт кtop_kэкспертам). Верните[active_fraction, imbalance, capacity, dropped, balance]:active_fraction= — доля параметров слоя, работающая на один токен;imbalance— загрузка самого занятого эксперта, поделённая на среднюю ;capacity= — размер буфера эксперта, вверх до целого;dropped= — назначения, не поместившиеся в буфер;balance= , где — вспомогательная функция потерь в упрощённом виде (гейт совпадает с распределением).
Проверить себя можно двумя крайностями: при равномерной загрузке
imbalanceиbalanceобе равны единице, а при полном коллапсе на одного эксперта обе равны .Загрузка редактора…
Ctrl/⌘ + Enter