минGPT
Повторная реализация GPT в PyTorch, как для обучения, так и для вывода. minGPT старается быть небольшим, понятным, интерпретируемым и обучающим, поскольку большинство доступных в настоящее время реализаций модели GPT могут быть немного разросшимися. GPT — несложная модель, и эта реализация занимает около 300 строк кода (см. mingpt/model.py). Все, что происходит, это то, что последовательность индексов передается в преобразователь, и получается распределение вероятностей по следующему индексу в последовательности. Основная сложность заключается в умном использовании пакетной обработки (как по примерам, так и по длине последовательности) для повышения эффективности.
примечание (январь 2023 г.) : хотя я могу продолжать принимать и изменять некоторые детали, minGPT находится в полуархивном состоянии. Более свежие разработки см. в моей переписанной версии nanoGPT. По сути, на minGPT стали ссылаться в самых разных местах (блокноты, блоги, курсы, книги и т. д.), что лишило меня желания вносить более крупные изменения, которые я хотел внести для продвижения кода вперед. Я также хотел немного изменить направление: от сосредоточения исключительно на образовании к чему-то, что по-прежнему просто и доступно для взлома, но имеет зуб (воспроизводит средние отраслевые тесты, допускает некоторые компромиссы для повышения эффективности выполнения и т. д.).
Библиотека minGPT состоит из трех файлов: mingpt/model.py содержит фактическое определение модели Transformer, mingpt/bpe.py содержит слегка переработанный кодировщик пар байтов, который преобразует текст и последовательности целых чисел точно так же, как это делал OpenAI в GPT, mingpt/trainer. py — это (независимый от GPT) шаблонный код PyTorch, который обучает модель. Кроме того, в папке projects
есть ряд демонстраций и проектов, использующих библиотеку:
-
projects/adder
обучает GPT с нуля сложению чисел (на основе раздела сложения в документе GPT-3) -
projects/chargpt
обучает GPT быть языковой моделью уровня символов в некотором входном текстовом файле -
demo.ipynb
демонстрирует минимальное использование GPT
и Trainer
в формате блокнота на простом примере сортировки. -
generate.ipynb
показывает, как можно загрузить предварительно обученный GPT2 и сгенерировать текст по некоторой подсказке.
Установка библиотеки
Если вы хотите import mingpt
в свой проект:
git clone https://github.com/karpathy/minGPT.git
cd minGPT
pip install -e .
Использование
Вот как можно создать экземпляр GPT-2 (версия параметров 124M):
from mingpt . model import GPT
model_config = GPT . get_default_config ()
model_config . model_type = 'gpt2'
model_config . vocab_size = 50257 # openai's model vocabulary
model_config . block_size = 1024 # openai's model block_size (i.e. input context length)
model = GPT ( model_config )
И вот как его можно тренировать:
# your subclass of torch.utils.data.Dataset that emits example
# torch LongTensor of lengths up to 1024, with integers from [0,50257)
train_dataset = YourDataset ()
from mingpt . trainer import Trainer
train_config = Trainer . get_default_config ()
train_config . learning_rate = 5e-4 # many possible options, see the file
train_config . max_iters = 1000
train_config . batch_size = 32
trainer = Trainer ( train_config , model , train_dataset )
trainer . run ()
См. demo.ipynb
для более конкретного примера.
Модульные тесты
Охват пока не очень впечатляющий, но:
python -m unittest discover tests
дела
- добавить демонстрацию тонкой настройки gpt-2 в произвольный текстовый файл
- добавить демо-версию диалогового агента
- улучшенная документация результатов существующих проектов (adder, chargpt)
- добавьте смешанную точность и связанные с ней вкусности для масштабирования обучения
- распределенная поддержка обучения
- воспроизвести некоторые тесты в проектах/, например text8 или другом языковом моделировании
- правильное ведение журнала вместо вывода на печать любительский час хаха
- у меня, вероятно, должен быть файл требований.txt...
- должна быть возможность загружать многие другие веса модели, кроме gpt2-*
Ссылки
Код:
- openai/gpt-2 содержит определение модели в TensorFlow, но не код обучения.
- openai/image-gpt имеет некоторые более современные модификации, подобные gpt-3, в своем коде, что также является хорошей ссылкой
- В Huggingface/Transformers есть пример моделирования языка. Он полнофункциональный, но в результате его сложно отследить. Например, некоторые большие функции содержат до 90% неиспользуемого кода различных операторов ветвления, который не используется в настройках по умолчанию простого языкового моделирования.
Документы + некоторые замечания по реализации:
Улучшение понимания языка посредством генеративной предварительной подготовки (GPT-1)
- Наша модель во многом повторяет оригинальную работу трансформатора.
- Мы обучили 12-слойный преобразователь, предназначенный только для декодера, с замаскированными головами самовнимания (768 пространственных состояний и 12 голов внимания). Для позиционных сетей прямого распространения мы использовали 3072 размерных внутренних состояния.
- Максимальная скорость обучения Адама 2,5e-4. (позже GPT-3 для этого размера модели использует 6e-4)
- Затухание LR: линейно увеличивается от нуля в течение первых 2000 обновлений и отжигается до 0 с использованием косинусного графика.
- Мы обучаемся в течение 100 эпох на мини-пакетах из 64 случайно выбранных смежных последовательностей из 512 токенов.
- Поскольку норма слоя широко используется во всей модели, было достаточно простой инициализации веса N(0, 0,02).
- словарь байт-парного кодирования (BPE) с 40 000 слияний
- остаточные, встраивания и выпадения внимания с коэффициентом 0,1 для регуляризации.
- модифицированная версия регуляризации L2, предложенная в (37), с w = 0,01 для всех весов без смещения или усиления.
- В качестве функции активации мы использовали линейную единицу гауссовой ошибки (GELU).
- Мы использовали вложения изученных позиций вместо синусоидальной версии, предложенной в оригинальной работе.
- Для тонкой настройки: Добавляем отсев в классификатор с коэффициентом 0,1. Скорость обучения 6,25e-5 и размер пакета 32,3 эпохи. Мы используем линейный график снижения скорости обучения с разминкой более 0,2% от времени обучения. λ был установлен равным 0,5.
- Модель GPT-1 имеет 12 слоев и d_model 768, ~ 117M параметров.
Языковые модели предназначены для многозадачного обучения без присмотра (GPT-2)
- LayerNorm был перенесен на вход каждого субблока, аналогично остаточной сети до активации.
- дополнительная нормализация слоя была добавлена после последнего блока внимания к себе.
- используется модифицированная инициализация, которая учитывает накопление остатков на пути с глубиной модели. Мы масштабируем веса остаточных слоев при инициализации с коэффициентом 1/√N, где N — количество остаточных слоев. (странно, потому что в их выпущенном коде я могу найти только простое использование старой версии 0.02... в их выпуске image-gpt я обнаружил, что он используется для c_proj, и даже тогда только для attn, а не для mlp. да. https: //github.com/openai/image-gpt/blob/master/src/model.py)
- словарный запас расширен до 50 257
- увеличить размер контекста с 512 до 1024 токенов
- используется больший пакетный размер 512
- В GPT-2 использовалось 48 слоев и d_model 1600 (по сравнению с исходными 12 слоями и d_model 768). ~1,542 млрд параметров
Языковые модели изучаются с небольшим количеством попыток (GPT-3)
- GPT-3: 96 слоев, 96 головок, d_model 12 288 (175B параметров).
- Тип GPT-1: 12 слоев, 12 головок, d_model 768 (125M)
- Мы используем ту же модель и архитектуру, что и GPT-2, включая описанную там модифицированную инициализацию, предварительную нормализацию и обратимую токенизацию.
- мы используем чередующиеся плотные и локально полосатые разреженные паттерны внимания в слоях преобразователя, аналогично разреженному преобразователю.
- у нас всегда есть слой прямой связи, в четыре раза превышающий размер узкого слоя, dff = 4 ∗ dmodel
- все модели используют контекстное окно из nctx = 2048 токенов.
- Адам с β1 = 0,9, β2 = 0,95 и eps = 10−8.
- Все модели используют снижение веса 0,1, чтобы обеспечить небольшую регуляризацию. (ПРИМЕЧАНИЕ: кажется, GPT-1 использовал 0,01, см. выше)
- обрезать глобальную норму градиента на уровне 1,0
- Линейная разминка LR для первых 375 миллионов токенов. Затем используйте косинусный распад для снижения скорости обучения до 10% от его значения, более 260 миллиардов токенов.
- постепенно увеличивайте размер пакета линейно от небольшого значения (32 тыс. токенов) до полного значения в течение первых 4–12 миллиардов токенов обучения, в зависимости от размера модели.
- всегда используется полное окно временного контекста размером 2048 со специальным разделителем токена КОНЕЦ ДОКУМЕНТА.
Генеративное предварительное обучение на основе пикселей (изображение GPT)
- При работе с изображениями мы выбираем тождественную перестановку πi = i для 1 ≤ i ≤ n, также известную как порядок растра.
- мы создаем нашу собственную 9-битную цветовую палитру путем кластеризации значений пикселей (R, G, B) с использованием k-средних с k = 512.
- Наша самая крупная модель iGPT-XL содержит L = 60 слоев и использует размер встраивания d = 3072 для общего количества 6,8B параметров.
- Наша следующая по величине модель, iGPT-L, по сути идентична GPT-2 с L = 48 слоями, но содержит немного меньший размер встраивания — d = 1536 (по сравнению с 1600) для общего количества параметров 1,4B.
- Мы используем тот же код модели, что и GPT-2, за исключением того, что мы инициализируем веса в зависимости от слоя, как в Sparse Transformer (Child et al., 2019), и инициализируем нулями все проекции, производящие логиты.
- Мы также обучаем iGPT-M, модель параметров 455M с L = 36 и d = 1024.
- iGPT-S, модель с параметрами 76M с L = 24 и d = 512 (окей, а сколько голов? похоже, код Github утверждает 8)
- При предварительном обучении iGPT-XL мы используем размер пакета 64 и обучаем 2M итераций, а для всех остальных моделей мы используем размер пакета 128 и обучаем 1M итераций.
- Адам с β1 = 0,9 и β2 = 0,95
- Скорость обучения нагревается на одну эпоху, а затем падает до 0.
- Мы не использовали затухание веса, поскольку применение небольшого затухания веса, равного 0,01, не изменило качество представления.
- иГПТ-С лр 0,003
- Отсев не используется.
Лицензия
Массачусетский технологический институт