Небольшое исследование с использованием крошечных трансформеров
Делиться

Введение
При обучении больших языковых моделей (LLM) мы постоянно ограничены бюджетом. Это ограничение приводит к фундаментальному компромиссу: представьте, что если вы фиксируете вычислительный бюджет, увеличение размера модели означает необходимость уменьшения размера модели, на которой можно обучать, и наоборот. Итак, вы задаёте вопрос:
Стоит ли выделить больше ресурсов модели с большим количеством параметров или обучить ее на большем количестве данных?
В частности, производительность и эффективность LLM во многом зависят от этого компромисса. Поэтому крайне важно найти оптимальный баланс между количеством параметров модели и количеством используемых токенов.
Общее время обучения трансформатора приблизительно масштабируется как: C∝N×D, где
- N — количество параметров модели.
- D — количество токенов.
- C — фиксированный бюджет вычислений.
Легко видеть, что при фиксированном C, N и D обратно пропорциональны друг другу.
Предыдущие исследования (Каплан и др., 2020; Хоффман и др., 2022) показали, что потери при обучении моделей машинного обучения подчиняются степенному закону с вычислением: L(C)∝C^{−α}, а оптимальный размер модели и размер набора данных масштабируются с вычислением как: N_opt∝C^a, D_opt∝C^b для некоторых положительных значений a и b.
В этой статье мы будем использовать крошечные Трансформеры, чтобы изучить, как сбалансировать N и D при фиксированном вычислительном C.
Установка эксперимента
Мы проектируем минимальную модель трансформатора и называем ее «крошечным трансформатором» со следующими настраиваемыми свойствами, которые влияют на размер параметров модели:
- Размерность модели (d_model)
- Измерение MLP (d_mlp)
- Количество слоев (n_layers)
Мы хотели бы обучить преобразователь различных конфигураций на токенизированных последовательностях длиной 64 из набора данных WikiText-2.
Чтобы изучить эффект масштабирования, мы определили сетку моделей от очень маленьких (16 скрытых единиц, 1 слой) до относительно больших (128 скрытых единиц, 4 слоя) и объединили их с диапазоном токенов от 5 тыс. до 1 млн. См. код ниже:
model_configs = [ {«d_model»: 16, «d_mlp»: 64, «n_layers»: 1}, {«d_model»: 24, «d_mlp»: 96, «n_layers»: 1}, {«d_model»: 32, «d_mlp»: 128, «n_layers»: 2}, {«d_model»: 48, «d_mlp»: 192, «n_layers»: 2}, {«d_model»: 64, «d_mlp»: 256, «n_layers»: 3}, {«d_model»: 96, «d_mlp»: 384, «n_layers»: 3}, {«d_model»: 128, «d_mlp»: 512, «n_layers»: 4}, ] # количество токенов (D), на которых мы обучаемся — симулируется в несколько шагов × batch × seq_len token_budgets = [5e3, 1e4, 3e4, 5e4, 1e5, 3e5, 5e5, 1e6] # small for demo
Приблизительно оценивая стоимость вычислений как C≈N×D, наша идея состоит в том, чтобы вычислить функцию потерь для каждой пары (N,D) и найти пару (N,D), с которой модель достигает минимальной функции потерь для заданного C: это и есть баланс, который мы ищем.
Реализация и наблюдения
Мы используем код ниже для обучения модели фиксированному количеству шагов с различными парами (N,D) и записываем результат.
results = [] device = «cuda» if torch.cuda.is_available() else «cpu» for cfg in model_configs: model = TinyTransformer(vocab_size=len(tokenizer), **cfg) N_params = count_params(model) for D in token_budgets: steps = int(D // (SEQ_LEN * 16)) # предполагая, что batch_size=16 dataloader = DataLoader( tokenized_dataset[«train»].shuffle(seed=0), batch_size=16, collate_fn=collate_fn ) avg_loss = train_one(model, dataloader, steps=steps, device=device) compute = N_params * D results.append({ «N»: N_params, «D»: D, «C»: compute, «loss»: avg_loss })
Затем мы строим график окончательной потери в зависимости от вычисления (N×D):

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

«Лучшая» модель
Чтобы определить «лучшую» модель, мы бы выбрали пару размера модели и количества токенов, которая минимизирует потери при фиксированном бюджете.
Мы предполагаем, что оба показателя подчиняются степенному закону: N_opt∝C^α, D_opt∝C^β, и мы хотели бы оценить неизвестные показатели α и β, выполнив следующие шаги:
- Возьмем логарифм величин: log?(N_opt)=αlog?(C)+const, log?(D_opt)=βlog?(C)+const.
- Подберите линейную регрессию. Наклон регрессии — это не что иное, как показатель степени.
Следующий код дает такую регрессию:
# Подгонка логарифмической линейной регрессии a_slope, a_intercept, *_ = st.linregress(np.log(frontier.C), np.log(frontier.N)) b_slope, b_intercept, *_ = st.linregress(np.log(frontier.C), np.log(frontier.D))
В нашем пробном эксперименте мы обнаружили, что N_opt ~C^0,14, а D_opt ~C^0,86. Этот результат может не отражать всей картины, поскольку эксперимент проводился на упрощённой модели и конфигурациях. Но мы всё же видим, что рост вычислительной мощности приводит к увеличению оптимального размера модели, но с убывающей скоростью. Очевидно, что оставшийся бюджет следует отнести на увеличение количества обучающих токенов.
Более того, приведённые выше расчёты показывают, что наилучшее соотношение N_opt/D_opt = C^-0,72. Это означает, что при увеличении вычислительной мощности следует добавлять больше обучающих токенов, а не увеличивать размер модели.
Практические выводы
Из этого эксперимента, хотя он и игрушечный, мы можем извлечь несколько выводов:
- При фиксированном бюджете использование средней модели с большим объемом данных может превзойти очень большую модель с ограниченным объемом данных.
- Оптимальный размер модели и объём данных растут по мере роста вычислений. Не обучайте модель с большим количеством параметров, если у вас небольшой бюджет.
- При увеличении бюджета сначала рассмотрите оптимальное соотношение N_opt/D_opt, чтобы определить, следует ли увеличивать размер модели или добавлять больше обучающих данных.
Заключение
В этой публикации блога мы представляем исследование компромисса между размером модели и объёмом данных при фиксированном вычислительном бюджете для LLM в рамках модели. Эксперимент показывает, что мы можем найти оптимальное сочетание размера модели и количества токенов для достижения наилучшей производительности модели при заданном бюджете, что позволяет исследователям и практикам грамотно проектировать LLM и достигать наилучших результатов.
Ссылка
[1] Каплан, Дж., Маккэндлиш, С., Хениган, Т., Браун, Т.Б., Чесс, Б., Чайлд, Р., Грей, С., Рэдфорд, А., Ву, Дж. и Амодеи, Д. (2020). Законы масштабирования для нейронных языковых моделей.
[2] Хоффманн Дж., Боржо С., Менш А., Бучацкая Э., Кай Т., Резерфорд Э., де Лас Касас Д., Хендрикс Л.А., Уэлбл Дж., Кларк А., Хенниган Т., Ноланд Э., Милликан К., ван ден Дриссе Г., Дамок Б., Гай А., Осиндеро С., Симонян К., Элсен Э.,… Сифре Л. (2022). Обучение вычислительно-оптимальных моделей большого языка.
Источник: towardsdatascience.com



























