Как делить вычислительный бюджет между параметрами и данными?
Закон масштабирования — не обещание, что «больше всегда лучше», а измеренная
кривая убывающей отдачи. Он связывает три ресурса — параметры, токены и
вычисления — и подсказывает, как разложить фиксированный бюджет между ними.
Мы не будем верить чужим графикам: обучим двадцать четыре собственные модели,
подберём закон по своим точкам и проверим его на скрытой крупной модели.
Двадцать четыре модели вместо одной веры
Про степенные законы обычно рассказывают, показывая чужую картинку с моделями
на миллиарды параметров. Проверить такую картинку школьник не может, и она
превращается в предмет веры. Поэтому весь этот урок построен на измерениях,
которые помещаются в двадцать секунд на обычном ноутбуке.
Возьмём реальный корпус SMS-сообщений — тот самый, на котором в
уроке 42 мы считали наивный Байес. После приведения к нижнему
регистру и склейки в один поток получается 454 669 символов и словарь из
44 символов; первые 363 735 символов — обучающий поток, последние 90 934 —
проверочный. Задача — предсказать следующий символ по шести предыдущим. Это
крошечная языковая модель того же устройства, что и большие: контекст,
эмбеддинги, скрытый слой, softmax, кросс-энтропия.
Мы обучили шесть размеров модели — от N=588 до N=53724 параметров, то
есть в 91 раз больше, — на четырёх объёмах данных: 20, 60, 150 и 320 тысяч
предъявленных токенов. Всего 24 запуска. Каждое число ниже посчитано этим
скриптом, а не переписано из статьи.
Крайние результаты сетки: худшая конфигурация (588 параметров, 20 тысяч
токенов) даёт валидационный loss 3,122 ната на символ, лучшая
(53 724 параметра, 320 тысяч токенов) — 2,134. Для сравнения, равномерное
угадывание из 44 символов стоило бы
ln44=3,784натанасимвол,
так что даже самая слабая модель что-то выучила, а лучшая сняла почти половину
избытка над этим потолком.
Линейка на логарифмической бумаге
Валидационный loss серии моделей приближают степенным законом
L(N)=L∞+aN−α,
где N — число параметров, L∞ — необратимая часть при данном
распределении данных, α>0 — показатель. Вычтем плато и прологарифмируем:
log(L−L∞)=loga−αlogN.
На логарифмической бумаге это прямая с наклоном −α. Отсюда простое
правило чтения: рост N в k раз делит избыточный loss на kα.
Наша подгонка по всем 24 точкам дала α=0,286. Значит, десятикратный
рост модели уменьшает избыточную часть в
100,286=1,93раза,
а стократный — в 1000,286=3,73 раза. Не «в десять раз лучше», а «на
треть меньше избытка за десятикратную цену» — вот что такое степенной закон,
переведённый на язык денег.
Рис. 79.1. Степенной закон виден только в правильных осях
Одни и те же 24 измерения. Слева, на линейных осях, кривые как будто упираются
в плато и подсказывают «дальше расти бесполезно». Справа, после вычитания
подобранного L∞=0,11 и перехода к логарифмам, те же точки выстраиваются
почти по прямым: отдача убывает, но не исчезает. Ощущение плато создано выбором
осей, а не физикой задачи.
Пол, ниже которого не опуститься
Слагаемое L∞ — не техническая добавка ради красоты подгонки. Это пол
задачи: даже идеальный предсказатель не угадывает следующий символ наверняка,
потому что источник сам по себе случаен. Величина этого пола называется
энтропией источника на символ.
Здесь начинается русская линия урока. Александр Яковлевич Хинчин в 1953 году в
«Успехах математических наук» дал первое строгое аксиоматическое построение
понятия энтропии: из нескольких естественных требований — непрерывности,
максимума на равномерном распределении, аддитивности при объединении
независимых опытов — функция
H(p1,…,pn)=−i∑pilnpi
определяется однозначно с точностью до множителя. Он же довёл до
математической строгости утверждение об энтропии стационарного эргодического
источника: предел
h=k→∞limH(Xk∣Xk−1,…,X1)
существует и равен средней информации на символ. Сегодня это знают как теорему
Шеннона — Макмиллана — Хинчина, а для нас у неё вполне практический смысл:
L∞ в законе масштабирования — оценка именно этого предела. Никакой рост
N и D не опустит loss ниже энтропии источника, и половина споров о
«пределах ИИ» — это спор о величине h для конкретного распределения текстов.
Наша подгонка дала L∞=0,107, но верить этой цифре как оценке энтропии
английского SMS-текста нельзя: она получена экстраполяцией с крошечных моделей
далеко за пределы измеренного диапазона. Прямая счётная оценка на том же
корпусе честнее: условная энтропия символа при контексте длины 3, измеренная на
проверочном потоке, равна 1,90 ната. И тот же расчёт показывает ловушку:
на обучающем потоке та же величина при контексте 4 равна 1,09, а на
проверочном вырастает до 2,02. Разница между 1,09 и 2,02 — не
свойство языка, а нехватка счётчиков, ровно то переобучение, о котором говорил
урок 32.
Три ресурса: N, D и C
Теперь второй ресурс. Обозначим через D число обучающих токенов, через C —
вычисления. Для плотного трансформера из урока 77 полезна грубая
оценка стоимости обучения
C≈6ND,
где шестёрка складывается из двух FLOP на умножение с накоплением в прямом
проходе и примерно вдвое большей работы в обратном. Например, модель на
N=109 параметров, обученная на D=2⋅1010 токенов, требует
C≈6⋅109⋅2⋅1010=1,2⋅1020FLOP.
Формула объясняет главное ограничение: при фиксированном C произведение ND
фиксировано, и увеличить модель можно только за счёт данных.
Совместную поверхность loss приближают суммой двух степенных членов и плато:
L(N,D)=L∞+NαA+DβB.
Наша подгонка по 24 точкам (нелинейный МНК, 60 случайных стартов) дала
L∞=0,107,A=4,55,α=0,286,B=5,44,β=0,087,
со среднеквадратичным остатком 0,037 ната — около полутора процентов от
типичного значения loss.
Стена ёмкости и стена данных
А теперь самая поучительная пара чисел урока. Самая маленькая модель,
накормленная максимумом данных (588 параметров, 320 тысяч токенов), даёт loss
2,626. Самая большая модель на минимуме данных (53 724 параметра, 20 тысяч
токенов) даёт 2,560 — то есть лучше, хотя увидела в шестнадцать раз
меньше текста:
L(588;320тыс.)=2,626>L(53724;20тыс.)=2,560.
Данные не заменяют ёмкость. Маленькая модель упирается в стену: шестнадцати
кратное увеличение корпуса дало ей выигрыш 0,496 ната, но стартовала она
так высоко, что осталась позади. Большая модель на 20 тысячах токенов, наоборот,
недоучена: доведя D до 320 тысяч, она выигрывает ещё 0,426 ната и приходит
к 2,134. При максимуме данных разрыв между крайними моделями составляет
2,626−2,134=0,492ната,
и это цена, которую платит недостаток параметров при девяностократной разнице в
размере.
Долина бюджета
Подставим ограничение D=C/(6N) в поверхность:
L(N)=L∞+AN−α+B(C6N)β.
Первое слагаемое падает с ростом N, второе растёт, потому что токенов при том
же бюджете становится меньше. Сумма имеет минимум — та самая U-образная кривая,
вдоль которой живёт всё планирование.
Рис. 79.2. Долина бюджета: где на диагонали лежит минимум
Цвет — подобранный loss, пунктирные диагонали — линии постоянного бюджета
6ND=C, чёрные точки — наши 24 запуска. Красная линия соединяет минимумы на
диагоналях: это compute-optimal ridge. Двигаться вдоль диагонали значит менять
параметры на токены при неизменной стоимости обучения; сойти с гребня — заплатить
те же деньги и получить худший результат.
Найдём минимум аналитически. Дифференцируем по N:
dNdL=−αAN−α−1+βB6βC−βNβ−1=0.
Отсюда условие равновесия
αAN−α=βB(C6N)β,
и после перегруппировки
Nα+β=βBαA⋅6βCβ.
Значит, оптимальные ресурсы растут как степени бюджета:
N∗∝Cβ/(α+β),D∗∝Cα/(α+β).
Это в точности задача на условный экстремум из урока 23: линия
уровня loss касается линии бюджета, а множитель Лагранжа играет роль теневой
цены вычислений.
Подставим наши показатели, α=0,286 и β=0,087:
α+ββ=0,234,α+βα=0,766.
Проверим формулу численным поиском по подобранной поверхности. При росте
бюджета с 108 до 3⋅109, то есть в 30 раз, найденный численно
оптимум сдвигается так: N∗ растёт в 2,214 раза, D∗ — в 13,55
раза. Формула предсказывает 300,234=2,213 и 300,766=13,55.
Совпадение до третьей цифры — хороший знак, что мы решили одну и ту же задачу
двумя способами.
Цена схода с гребня
Насколько дорого ошибиться? Возьмём бюджет C=109 FLOP. Численный оптимум —
N∗=1244 параметра при D∗=134 тысячи токенов, loss 2,647. Сдвинем
модель в десять раз в любую сторону вдоль той же диагонали:
L(10N∗)=2,793,L(N∗/10)=2,845.
Переплата — 0,146 и 0,199 ната соответственно при абсолютно том же счёте
за электричество. Заметьте асимметрию: в нашем режиме ошибиться в сторону
слишком большой модели чуть дешевле, чем в сторону слишком маленькой, потому что
β<α.
Много это или мало? Движение по самому гребню при десятикратном росте бюджета
даёт 3,069−2,647=0,422 ната. Значит, десятикратный промах в размере
модели съедает примерно треть выигрыша от десятикратного бюджета — неприятно,
но не катастрофа.
Что изменил результат Chinchilla
Ранние крупные языковые модели были велики относительно своих корпусов: их
растили по N и почти не растили по D. Работа группы Chinchilla (2022)
показала на собственной серии из сотен запусков, что при фиксированном бюджете
обучения выгоднее уменьшить модель и удлинить обучение, наращивая N и D
примерно в одинаковой пропорции. Их подгонка дала близкие показатели
α≈β, откуда и знаменитое «около 20 токенов на параметр».
Наш эксперимент честно показывает границы такой рекомендации. У нас
β=0,087 втрое меньше α, и оптимальное отношение токенов к
параметрам не постоянно: оно растёт с 31,5 при бюджете 108 до 1250
при 1011. Причина прозрачна: наш корпус мал и однороден, повторы в нём
неизбежны, а модели настолько малы, что упираются в ёмкость раньше, чем в
данные. Число «20» — результат конкретной серии на конкретных данных, а не
универсальная константа. Смесь данных из урока 78 меняет ценность
одного токена, а с ней и все показатели.
Лаборатория бюджета
Параметры, токены и compute-optimal долина
График шире экрана — листайте по горизонтали →
Загружается живая иллюстрация…
Виджет считает по нашим подобранным константам. Зафиксируйте бюджет и двигайте
N: слева U-образная кривая вдоль линии 6ND=C, справа — та же точка на
плоскости ресурсов рядом с гребнем оптимумов. Обратите внимание, какое пологое у
долины дно и как быстро растёт переплата, когда вы уходите на порядок.
Затем ухудшите качество токена. Переключатель уменьшает долю новой информации
вдвое или вчетверо; при бюджете 109 оптимум сдвигается с N∗=1244 до
N∗=1058, то есть модель становится меньше, а токенов приходится брать
больше. Смысл прост: если каждый токен несёт меньше нового, дефицитным ресурсом
становятся данные, и бюджет надо перекладывать в их сторону.
Наконец, включите цену инференса. Появляется вторая, совсем другая точка
оптимума: та, что минимизирует полную стоимость системы при заданном целевом
loss. Она всегда левее training-optimal, и чем больше запросов, тем сильнее.
Fit без самообмана
Красивая прямая на log-log ничего не доказывает. Проверять закон надо так же,
как любую модель в уроке 63, — предсказанием того, чего он не
видел.
Мы спрятали самую крупную модель (53 724 параметра) и подобрали закон по
оставшимся двадцати точкам. Затем предсказали её loss при D=320 тысяч:
L^=2,084,Lфакт=2,134,ошибка=+0,050(2,4%).
Закон недооценил трудность: реальная крупная модель оказалась чуть хуже
прогноза. Для сравнения, квадратичный полином по logN, подогнанный по тем же
малым точкам, предсказал 2,007 — ошибка 0,127, в два с половиной раза
больше. Полином прекрасно интерполирует и плохо экстраполирует, ровно как в
уроке 50.
Слева: обе кривые одинаково хорошо описывают обучающие точки, но за пределами
диапазона расходятся — звезда показывает реальный результат скрытой модели.
Справа: остатки полной подгонки. Они малы (RMSE 0,037), но не случайны — видна
систематическая дуга, признак того, что форма закона не идеальна.
Разумный протокол выглядит так. Спланируйте сетку (N,D)до обучения.
Держите токенизатор, оптимизатор и расписание шага фиксированными. Подгоняйте по
валидационному loss, а не по обучающему. Оставьте одну-две крупнейшие
конфигурации в holdout. Показывайте остатки, а не только красивую прямую. И
помните, что обычный МНК в исходных координатах и в логарифмах взвешивает ошибки
по-разному — об этом урок 49.
Loss гладок, а способность «вспыхивает»
Отдельная путаница связана со словом «эмерджентность». Возьмём наши шесть
моделей, обученных на максимуме данных, и измерим три величины на одних и тех же
30 тысячах позиций.
Средняя вероятность верного символа растёт плавно: с 0,137 у самой малой
модели до 0,241 у самой большой, то есть в 1,76 раза, причём ни один шаг
между соседними размерами не даёт больше чем +16%. Точность top-1 тоже растёт
мягко: с 0,268 до 0,391.
А теперь строгая метрика: доля блоков из пяти подряд идущих символов, где
угаданы все пять. Она вырастает с 0,0017 до 0,0157 — в 9,4 раза,
и один из шагов даёт скачок в 2,9 раза. Ничего нового модель не обрела:
поменялась только метрика.
Механика проста. Если вероятность верного шага равна p, а метрика требует k
подряд верных шагов, то
Pуспех≈pk,
и при k=5 рост точности top-1 с 0,268 до 0,391 даёт рост p5 с
0,0014 до 0,0091 — в 6,6 раза. Логарифмическая производная
dlnpdlnP=k
прямо говорит: строгая метрика усиливает относительные изменения ровно в k
раз. Возведение в степень превращает пологий подъём в «скачок».
Шесть моделей, одни и те же предсказания, три способа их измерить. Гладкие
кривые вероятности и точности — и резко взлетающая строгая метрика. Прежде чем
объявлять внезапную способность, посмотрите на непрерывную версию той же
метрики: часто скачок живёт в шкале, а не в модели.
Токен токену рознь
Закон масштабирования описывает не байты на диске, а новую информацию. Проверим
это прямым опытом: возьмём модель среднего размера и обучим её дважды на одном и
том же числе предъявленных токенов — один раз на свежем потоке, другой раз
циклически повторяя всего 40 тысяч уникальных позиций.
При 40 тысячах предъявленных токенов разницы почти нет (2,613 против
2,616) — первый проход повторов ещё не содержит. Но при 320 тысячах, то есть
после восьми проходов по одному и тому же куску, разрыв становится отчётливым:
Lсвежие=2,294,Lповторы=2,322,Δ=0,028.
За тот же счёт вычислений свежие токены дали выигрыш 0,319 ната, повторы —
только 0,294. Разрыв в нашем крошечном режиме невелик, но растёт с числом
проходов, и знак его однозначен.
Рис. 79.5. Свежие токены и повторы расходятся с числом проходов
Одинаковая модель, одинаковое число шагов оптимизатора, одинаковый бюджет
вычислений. Единственное различие — новизна токенов. Пока проходов мало, кривые
неразличимы; после нескольких эпох повторный корпус отстаёт, и отставание
растёт. Полезно ввести «эффективные данные» Deff, помня, что
напрямую они не наблюдаемы.
Обучение спорит с инференсом
Compute-optimal — про обучение. Продукт живёт иначе: модель обучают один раз, а
запросы к ней идут годами. Полная стоимость системы
Ctotal=Ctrain+QCinfer≈6ND+2NQ,
где Q — число обслуженных токенов запросов, а 2N — примерная стоимость
одного такого токена. Задача становится другой: зафиксировать целевой loss и
минимизировать полную стоимость.
Мы решили её по подобранной поверхности для целевого loss 2,369.
Оптимальный размер модели уменьшается по мере роста числа запросов:
Рис. 79.6. Один и тот же loss, разные оптимальные размеры
Каждая кривая — полная стоимость достижения одного и того же целевого loss
2,369 при своём числе запросов. Точки — минимумы. Чем больше запросов, тем
левее минимум: инференс переголосовывает обучение. Дистилляция, квантование и
спекулятивное декодирование двигают эту картину дальше, но требуют отдельной
проверки качества.
Как спланировать собственную серию
Соберём протокол, который вы можете повторить сами.
Выберите сетку: не меньше четырёх размеров модели с шагом в 2–3 раза и не
меньше четырёх объёмов данных. Наши 6×4 — разумный минимум.
Зафиксируйте всё, кроме N и D: токенизатор из урока 75,
оптимизатор, расписание шага, длину контекста.
Для малых и шумных конфигураций повторите запуск с несколькими seed и
усредните — иначе шум запуска попадёт в показатель.
Подгоняйте на валидационном loss, а holdout из крупнейших конфигураций
держите закрытым до конца.
Оцените неопределённость: bootstrap по запускам даёт разброс
(α,β,A,B), а вместе с ним — разброс самой оптимальной точки.
Постройте остатки против N и против D. Дуга важнее высокого R2.
Итоговое решение всё равно принимается вне закона. Он отвечает на условный
вопрос «какой ожидается loss при таком режиме», но не говорит, нужен ли вам этот
loss. Сопоставление выигрыша, сроков, цены обслуживания и риска — задача о
нескольких критериях из урока 53, и scaling law даёт для неё
всего одну, пусть и важную, колонку таблицы.
Закон работает внутри режима
Что мы измерили. Валидационный loss двадцати четырёх собственных моделей ложится
на поверхность L∞+AN−α+BD−β с остатком 0,037 ната.
Показатели α=0,286 и β=0,087 задают, как делить бюджет:
N∗∝C0,234, D∗∝C0,766. Сход с гребня на порядок
стоит 0,15–0,20 ната, тогда как десятикратный бюджет по гребню приносит
0,42. Скрытая крупная модель предсказана с ошибкой 2,4% — лучше, чем
полиномом, но не идеально. Повторы данных отстают от свежих токенов. Строгая
метрика создаёт видимость скачка там, где вероятность растёт плавно.
Чего мы не измерили и потому не утверждаем: что эти константы применимы к
трансформерам на миллиарды параметров; что L∞=0,107 — энтропия
английского языка; что отношение токенов к параметрам обязано расти всегда.
Закон масштабирования — инструмент планирования внутри проверенного режима. За
его пределами это ставка, и называть её надо ставкой.