Я уже давно хотела написать про законы масштабирования, которые возникают при обучении LLM. Меня всегда завораживает факт, что какие-то большие масштабные процессы могут быть описаны простыми изящными формулами.
А тот факт, что в сознании большинства людей возможности современных LLM / AI больше связаны с магией, «так получилось» (см. мем про рисование лошади) или «невозможно предсказать», пушит меня к написанию этого поста (или серии) еще больше.
Кстати, с того момента, как я впервые собралась писать свой пост, некоторые «законы» приказали долго жить (про emerging abilities). Но сегодня мы будем говорить не о них. Начнем с базовых — и, пока что, вечных (в нашем локальном отрезке реальности, лол). Они были первыми, и дальше — только уточнялись.
Погнали.
01С чего всё началось
Долгое время прогресс в машинном обучении выглядел как ремесло. Кто-то придумал удачную архитектуру, кто-то — хитрый трюк с обучением, и модель стала чуть лучше. Насколько именно лучше, предсказать заранее было нельзя.
Фоном к смене этого взгляда стоит эссе Ричарда Саттона The Bitter Lesson (2019). Его мысль: за 70 лет истории ИИ раз за разом побеждали не хитроумные, вручную закодированные методы, а простые общие подходы, умеющие пожирать всё больше вычислений и данных.
Если это правда, напрашивается вопрос: а можно ли выигрыш от масштаба измерить и предсказать заранее?
Первые эмпирические намёки появились ещё раньше. В 2017-м команда Baidu (Hestness et al.) показала на переводе, речи и языковых моделях, что ошибка падает с ростом данных не как попало, а по степенному закону — прямой линией в логарифмических координатах.
Но каноническая точка отсчёта для LLM — это январь 2020 года и работа OpenAI (Kaplan et al., Scaling Laws for Neural Language Models). Именно она превратила разрозненные наблюдения в стройную теорию и, что важнее, — в инструмент планирования.
Зачем вообще этим задались? Тут все понятно. Если вы собираетесь потратить десятки миллионов долларов на обучение огромной модели, вы хотите знать заранее: окупится ли это и как правильно поделить бюджет — вложиться в модель побольше или в данные побольше?
Полученные законы масштабирования превратили ставку на масштаб из «обучим что-нибудь гигантское и понадеемся» в «мы можем спрогнозировать результат до запуска».
02Первые законы: что говорил Kaplan
Работа OpenAI сформулировала простую и красивую вещь: loss падает по степенному закону от трёх ресурсов — числа параметров \(N\), объёма данных в токенах \(D\) и вычислений \(C\).
\[ L(N)=\left(\frac{N_c}{N}\right)^{\alpha_N},\qquad L(D)=\left(\frac{D_c}{D}\right)^{\alpha_D},\qquad L(C)=\left(\frac{C_c}{C}\right)^{\alpha_C} \]Здесь \(L\) — это loss, кросс-энтропия на токен: насколько хорошо модель угадывает следующее слово (ниже — лучше). Показатели маленькие: \(\alpha_N \approx 0.076\), \(\alpha_D \approx 0.095\), \(\alpha_C \approx 0.050\).
Как читать эту формулу. Главное здесь — не буквы, а сам факт степенного закона. Он говорит: чтобы улучшить loss на фиксированную величину, ресурс надо не добавить, а умножить. График получается прямой в логарифмическом масштабе — не потому что прогресс линейный, а потому что он множится, а не складывается. Маленький показатель — это плохая новость про отдачу: каждый следующий шаг вниз стоит во столько же раз дороже предыдущего.
Пример
Возьмём \(\alpha_N \approx 0.076\). Увеличим модель в 10 раз — с 1B до 10B параметров. Loss (его «параметровая» часть) уменьшится в \(10^{0.076} \approx 1.19\) раза, то есть всего на ~16%. Чтобы урезать эту часть loss вдвое, модель пришлось бы раздуть примерно в \(10^{\,0.3/0.076} \approx 9000\) раз. Вот что такое «убывающая отдача» в цифрах: первые улучшения дёшевы, каждое следующее — на порядок дороже.
Дальше имеем формулу, которая переживет с того года все последующие пересмотры. Оценка стоимости обучения:
\[ C \approx 6ND \]Как читать. Это не закон природы, а чистая эмпирика: во сколько операций обойдётся прогон. Стоимость компьюта (во флопсах) пропорциональна количеству параметров модели на объем обучающих данных, умноженная на 6. 6 — странное число, правда? Его надо читать как (2+2×2). Прямой проход стоит ~2 операции на каждый вес и каждый токен, обратный проход (градиенты) — вдвое дороже. Закон можно вертеть в любые стороны: зафиксируем любые две величины из трёх — можно посчитать третью.
Пример. Хотим модель на 7B обучить на датасете в 2T токенов. Как посчитать бюджет?
\(C \approx 6 \times 7{\cdot}10^{9} \times 2{\cdot}10^{12} \approx 8.4{\cdot}10^{22}\) FLOPs. Если прогонять на 256 картах H100 при реалистичной утилизации ~40%, это примерно 58 000 GPU-часов, то есть около 9–10 суток непрерывного счёта.
Одна формула — и мы уже можем посчитать срок обучения (если все пойдет хорошо) и размер кластера (а дальше можно посчитать деньги, если найдете поставщика). Польза — очевидна.
03Как это все изменило
Можно было экстраполировать: измерить несколько маленьких моделей, провести через них прямую и предсказать loss модели, которую ещё не обучал.
Можно было обосновать гигантский запуск как предсказуемое вложение, а не авантюру. И прикинуть, сколько вычислений нужно для целевого качества.
Кажется, что одно это могло быть той ключевой точкой, когда индустрия двинулась вперед. Ребята обосновывали и защищали бюджеты, получали GPU, закупали данные, раздували модели.
Без этой формулы мы бы не стояли в той точке прогресса, в которой находимся сейчас. Настоящая гонка началась с нее. Именно когда ты можешь обосновать, почему тебе нужно выделить денег на проект. Не чутьем, не ощущением, не «все так делают». Конкретными формулами, выражающими конкретные математические модели.
Но мат. модели имеют свойство уточняться. И в этой мат. модели, описывающей то, как LLM имеют свойство насыщаться знаниями, была «ошибка», которую заметят только через два года.
Из своей мат. модели Kaplan вывел рецепт: при росте бюджета наращивай в первую очередь параметры, а во вторую — данные. И из этого мы жили какое-то время в эпохе «огромных, недообученных» моделей вроде GPT-3.
Помните такое? Количества параметров все новых и новых моделей росли как на дрожжах. В то время как количества данных? О них в статьях упоминалось гораздо меньше и размытее, потому что в рост их объема команды вкладывались значительно меньше.
Оно и понятно: хороших данных — ограниченное количество. Сначала их надо купить, а потом готовить и обрабатывать. Правильно миксовать датасеты. Правильно подавать. Очень много дополнительных проблем, кроме просто финансового вопроса.
А если мат. модель уважаемых авторов из OpenAI говорит о том, что вложение в количество параметров так же эффективно, как вложение в количество данных, то зачем страдать?
04Через два года вектор поменялся
Я не знаю, при каких обстоятельствах уважаемые господа из DeepMind-а решили поставить этот принцип под сомнение.
Но в какой-то момент это случилось. И на поверхность вышла правда: большинство существующих к тому моменту моделей можно было еще обучать и обучать.
В статье Chinchilla (DeepMind, Hoffmann et al., 2022) ребята переписали форму loss, добавив несократимый член \(E\) и отдельные слагаемые-штрафы за недонасыщенность данными и за недоразвитость параметров.
\[ L(N,D)=E+\frac{A}{N^{\alpha}}+\frac{B}{D^{\beta}} \]Зачем вообще нужна эта E?
В формуле Каплана, если посмотрите, можно прийти к ситуации, когда loss обращается в ноль. Но такого, как мы знаем, не бывает. С точки зрения моделирования реальности уже прокол построения мат. модели такой себе. Здесь \(E\) — это нижняя граница лосса, которую мы не преодолеем даже с самыми бесконечными и обширными ресурсами.
Так сказать, неустранимая случайность языка, если концептуально. И eps > 0, если вспомним всякие оценки в математике. Классика, короче.
Второе слагаемое — штраф за то, что модель слишком мала. Третье — штраф за то, что данных слишком мало.
Ключевая интуиция: вы не «улучшаете loss в пустоту», а гасите два штрафа, приближаясь к стене \(E\). И гасить их надо сбалансированно — получается, что нет никакого смысла уменьшать один штраф в ноль, пока второй остается огромным.
Отсюда главный вывод Chinchilla: параметры и данные надо растить в ногу, в соотношении примерно \(D \approx 20N\). Получается порядка 20 токенов на 1 параметр модели.
Chinchilla на 70B параметров обошла Gopher на 280B параметров при том же бюджете. Индустрия развернулась.
Теперь команды стали бороться за данные, а не за то, чтобы раздувать компьют ради размера модели.
05Откуда 20?
Это интересный вопрос. Давайте сначала пройдемся по тому, что писали Шиншилла-ребята в своей статье.
Это число не является чистым выводом самой формулы определенного ими закона. 20 — это эмпирически полученное число, соответствующее месту, где loss минимальна.
Что мы действительно можем сделать по формуле
Мы можем показать, что наше число «отношение количества токенов к количеству параметров» — вообще существует как какое-то одно число.
Показываем. Минимизируем \(L=E+A/N^\alpha+B/D^\beta\) при \(C=6ND\). Подставляем вместо \(D=C/(6N)\), производную по \(N\) сводим к нулю, получаем кросивое условие баланса:
\[ \alpha\cdot\frac{A}{N^\alpha}=\beta\cdot\frac{B}{D^\beta} \]В оптимуме «штраф за маленькую модель» и «штраф за маленькие данные» стоят в фиксированной пропорции. Отсюда — оптимальное распределение:
\[ N_{\text{opt}}=G\left(\frac{C}{6}\right)^{a},\quad D_{\text{opt}}=\frac{1}{G}\left(\frac{C}{6}\right)^{b},\quad G=\left(\frac{\alpha A}{\beta B}\right)^{1/(\alpha+\beta)},\quad a=\frac{\beta}{\alpha+\beta}\approx0.46,\; b=\frac{\alpha}{\alpha+\beta}\approx0.54 \]Раз \(a\approx b\approx0.5\), то оба \(N\) и \(D\) растут примерно как \(\sqrt{C}\). Поэтому отношение \(D/N\) почти не зависит от бюджета — и существует как отношение.
Но какое именно — формула сама не говорит: нужно значение \(G\), а оно завязано на реальные \(A, B\), а не на одни показатели. Поэтому надо считать эмпирически на конкретных примерах. Поехали считать.
Эмпирика
Шиншилла-ребята описывают методику IsoFLOP, по которой они ищут, где сидит минимум loss.
Зафиксируем бюджет, скажем \(C=10^{21}\) FLOPs. Из \(C=6ND\) каждый выбор \(N\) жёстко задаёт \(D=C/(6N)\). Обучаем несколько моделей на этом бюджете:
| модель \(N\) | данные \(D\) | токенов на параметр | что это |
|---|---|---|---|
| \(N=1\)B | \(D\approx167\)B токенов | 167 | пример крошечной модели, у которой не хватает емкости, чтобы прожевать кучу данных |
| \(N=3\)B | \(D\approx56\)B | ≈19 | нормас |
| \(N=10\)B | \(D\approx17\)B | 1.7 | пример большой модели, которой не хватает данных |
Рисуем итоговый loss как функцию \(N\). Получаем U-образную кривую: слева плохо (модель мала), справа плохо (данных мало), минимум — около \(N\approx3\)B. Для нашего бюджета это \(D\approx56\)B, то есть \(D/N\approx19\approx20\).
Повторяем при других бюджетах — дно U-кривой каждый раз садится примерно на 20 токенов на параметр.
Получаем, что 20 — это эмпирическое свойство loss-поверхности, вычисленное с обученных моделей, а не следствие формулы. Флагман подтвердил напрямую: 1.4T токенов / 70B параметров = 20.
06Нюанс
Если взять напечатанные в статье константы параметрической подгонки (Approach 3) и подставить в формулу выше, получится не 20, а примерно семьдесят токенов на параметр. Репликация ребятами из Epoch AI (Besiroglu et al., 2024) показала, что та таблица несовместима с двумя другими методами самой же статьи и содержит ошибку; при корректной переподгонке двадцатка возвращается.
Поэтому 20 надёжнее понимать как результат IsoFLOP-минимумов (подтверждённый самой моделью Chinchilla), а не как выхлоп параметрической формулы.
Короче, намудрили, по пути запутались, но в итоге оказались правы. Соотношением для оценки пользоваться можно (и до сих пор все пользуются). Погнали дальше.
07Inference-aware оценки
Chinchilla-ребята уточнили, что все-таки не столько важен сам по себе размер модели, сколько размер знаний, которые в нее положили. При этом и у Каплана, и у Шиншиллы все рассуждения вертятся именно вокруг оценки этапа обучения.
В статье Beyond Chinchilla (Sardana & Frankle, 2023) ребята поднимают вопрос, а что в реальности мы хотим оптимизировать. Обучение? Да, это точно важный и дорогостоящий процесс, но что происходит дальше? Дальше мы модель используем.
Инференс потом гоняется кучу раз, и каждый такой прогон чего-то стоит. Это уже не константа, а функция от количества прогонов.
Поэтому бюджет надо считать не только для обучения, но и для инференса. И в этом случае оптимум будет сдвигаться к меньшим, но сильно перетренированным моделям (таким как Llama и Mistral).
Целевую функцию меняют на «обучить + обслуживать»:
\[ \min_{N,\,D_{\text{tr}}}\; \underbrace{6\,N D_{\text{tr}}}_{\text{обучение}} + \underbrace{2\,N D_{\text{inf}}}_{\text{инференс}}\quad\text{при}\quad L(N,D_{\text{tr}})=\ell \]Тут уже знакомые нам коэффициенты. 6 на этапе обучения — т.к. мы гоняем в две стороны, 2 — на этапе инференса (т.к. в обратную сторону, самую дорогую, мы не гоняем данные).
\(D_{\text{inf}}\) — это количество токенов, которые будут прогнаны через модель за всю жизнь модели. Чем больше \(D_{\text{inf}}\), тем сильнее оптимум сдвигается к меньшим и дольше обученным моделям.
08Вопросы про эффективность данных и параметров
Дальше стоит задаться вопросом о том: если у нас есть данные, то насколько много мы их можем переиспользовать и показывать модели? Если у нас есть параметры, как много мы их можем урезать? Или, наоборот, растить их точность после запятой?
На эту тему есть два исследования.
Эффективные данные
Эффективные данные (Data-constrained scaling, Muennighoff et al., 2023). Повторённые токены дают меньше свежих, и Chinchilla-формула переписывается через эффективный объём:
\[ D'=U_D+U_D\,R_D^{*}\left(1-e^{-R_D/R_D^{*}}\right),\qquad R_D^{*}\approx 15 \]где \(U_D\) — это уникальные токены, \(R_D\) — число повторов (эпохи минус 1).
Рецепт: повтор до ~4 эпох почти бесплатен, к ~16 отдача тает, дальше нужно уже либо докупать данные, либо вкладывать бюджет в параметры, а не в лишние проходы.
Ещё один лайфхак из статьи: если подмешать код к тексту, то это дает до ~2× эффективных токенов даже для оценки на естественном языке.
Эффективные параметры
Эффективные параметры (Precision scaling, Kumar et al., 2024). Ключевая идея исследования заключается в том, что параметры и биты взаимозаменяемы:
\[ N_{\text{eff}}(P)=N\left(1-e^{-P/\gamma}\right) \]где \(P\) — это разрядность в битах, а \(\gamma\) — это подгоняемая константа порядка единицы. При большом \(P\) выходит \(N_{\text{eff}}\to N\), а при низком получается заметно меньше.
Полный закон добавляет к Chinchilla штраф за пост-квантизацию:
\[ L=a\,N_{\text{eff}}^{-\alpha}+b\,D^{-\beta}+E+\delta_{\text{PTQ}}(N_{\text{eff}},D,P_{\text{train}},P_{\text{post}}) \]Главный контринтуитивный вывод спрятан в слагаемом \(\delta_{\text{PTQ}}\): деградация от пост-квантизации растёт с числом токенов обучения. То есть сильно перетренированную модель тяжелее ужать без потерь — в какой-то момент лишние данные даже вредят, если вы затем собираетесь ее квантизовать.
Конкретные рецепты для использования разрядностей
По умолчанию сейчас BF16 (16 бит) — стандарт фронтира. Поэтому, если потом надо резать, то условно обучить модель побольше в ~7–8 битах бывает выгоднее, чем обучить модель поменьше — в 16. Для инференса Парето-фронт лежит ниже — около 4–6 бит (Dettmers & Zettlemoyer, 2023).
Связь с inference-aware оценкой
Перетренировка ради дешевого инференса и агрессивная пост-квантизация тянут в разные стороны. Много токенов удешевляют инференс по FLOPs, но делают модель чувствительнее к квантизации. Если план — инферить модель в 4 битах, не нужно стараться насытить токенами на параметр.
09Итак, выводы первой части
- Если вы хотите оценить компьют для обучения, актуальна эта формула: \[ C \approx 6ND \]
- Если вы хотите учесть компьют, который вам понадобится всего (для обучения и инференса), актуальна эта формула: \[ \min_{N,\,D_{\text{tr}}}\; \underbrace{6\,N D_{\text{tr}}}_{\text{обучение}} + \underbrace{2\,N D_{\text{inf}}}_{\text{инференс}}\quad\text{при}\quad L(N,D_{\text{tr}})=\ell \]
- Чтобы понять, насколько вам нужно растить модель в зависимости от имеющихся у вас данных, пользуйтесь Шиншиллой: \[ D/N\approx20 \]
- Если данных у вас ограниченное число, и вы максимально хорошо хотите их модели показать, то смело показывайте от 4 до 15 раз: \[ D'=U_D+U_D\,R_D^{*}\left(1-e^{-R_D/R_D^{*}}\right),\qquad R_D^{*}\approx 15 \]
- Если модель резать не будете, используйте 16 бит.
Если модель планируется резать, то обучать лучше на 7–8 битах большую модель, а инферить затем на 4–6 битах.
На этом на сегодня все.
В следующие разы мы поговорим про интересные законы подбора гиперпараметров для обучения больших моделей, а также про Densing Law, который является аналогом закона Мура для LLM, и некоторые законы, которые к настоящему моменту прекратили свое существование и были опровергнуты более детальными исследованиями.
Stay tuned!