минGPT-TF
Повторная реализация mingpt в TensorFlow
Ноутбуки
play_math.ipynb
и play_char.ipynb
обучены в colab. В верхней части каждой записной книжки есть ссылки для обучения модели в colab. play_char.ipynb
batch_size
блокнота уменьшен, чтобы соответствовать памяти GPU
Colab. Измените параметры в соответствии с памятью графического процессора.
minGPT — Readme
Повторная реализация PyTorch обучения GPT. minGPT старается быть небольшим, понятным, интерпретируемым и обучающим, поскольку большинство доступных в настоящее время несколько разросшихся. GPT — несложная модель, и эта реализация состоит примерно из 300 строк кода, включая шаблон и совершенно ненужный пользовательский модуль причинного самоконтроля. В любом случае, все, что происходит, это то, что последовательность индексов переходит в последовательность блоков-трансформеров, и получается распределение вероятностей следующего индекса. Остальная часть сложности заключается в умном подходе к пакетной обработке (как по примерам, так и по длине последовательности), чтобы обучение было эффективным.
Основная «библиотека» minGPT (ха) состоит из двух файлов: mingpt/model.py
содержит фактическое определение модели Transformer, а mingpt/trainer.py
— это (независимый от GPT) шаблон PyTorch, который обучает модель. Прикрепленные блокноты Jupyter показывают, как можно использовать «библиотеку» (ха) для обучения моделей последовательностей:
-
play_math.ipynb
обучает GPT, ориентированный на сложение (вдохновленный разделом сложения в статье GPT-3) -
play_char.ipynb
обучает GPT, чтобы он был моделью языка на уровне символов для произвольного текста, аналогично моему старому char-rnn, но с преобразователем вместо RNN. -
play_words.ipynb
версия BPE, которой еще не существует.
С помощью кодировщика bpe, распределенного обучения и, возможно, fp16 эта реализация сможет воспроизвести результаты GPT-1/GPT-2, хотя я не пробовал $$$. GPT-3, вероятно, недоступен, поскольку, насколько я понимаю, он не помещается в память графического процессора и требует более тщательной обработки параллельных моделей.
Пример использования
Этот код достаточно прост, чтобы его можно было просто взломать, а не «использовать», но текущий API выглядит примерно так:
# you're on your own to define a class that returns individual examples as PyTorch LongTensors
from torch . utils . data import Dataset
train_dataset = MyDataset (...)
test_dataset = MyDataset (...)
# construct a GPT model
from mingpt . model import GPT , GPTConfig
mconf = GPTConfig ( vocab_size , block_size , n_layer = 12 , n_head = 12 , n_embd = 768 ) # a GPT-1
model = GPT ( mconf )
# construct a trainer
from mingpt . trainer import Trainer , TrainerConfig
tconf = TrainerConfig ( max_epochs = 10 , batch_size = 256 )
trainer = Trainer ( model , train_dataset , test_dataset , tconf )
trainer . train ()
# (... enjoy the show for a while... )
# sample from the model (the [None, ...] and [0] are to push/pop a needed dummy batch dimension)
from mingpt . utils import sample
x = torch . tensor ([ 1 , 2 , 3 ], dtype = torch . long )[ None , ...] # context conditioning
y = sample ( model , x , steps = 30 , temperature = 1.0 , sample = True , top_k = 5 )[ 0 ]
print ( y ) # our model filled in the integer sequence with 30 additional likely integers
Ссылки
Код:
- 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 со специальным разделителем токена КОНЕЦ ДОКУМЕНТА.
Лицензия
Массачусетский технологический институт