minGPT-TF
Eine TensorFlow-Neuimplementierung von mingpt
Notizbücher
play_math.ipynb
und play_char.ipynb
wurden in Colab trainiert. Oben auf jedem Notizbuch befinden sich Links zum Trainieren des Modells in Colab. play_char.ipynb
Notebook- batch_size
wird reduziert, um in den Colab- GPU
Speicher zu passen. Ändern Sie die Parameter entsprechend dem GPU-Speicher.
minGPT – Readme
Eine PyTorch-Neuimplementierung des GPT-Trainings. minGPT versucht, klein, übersichtlich, interpretierbar und lehrreich zu sein, da die meisten der derzeit verfügbaren Programme etwas umfangreich sind. GPT ist kein kompliziertes Modell und diese Implementierung umfasst angemessenerweise etwa 300 Codezeilen, einschließlich Boilerplate und einem völlig unnötigen benutzerdefinierten Kausal-Selbstaufmerksamkeitsmodul. Wie auch immer, alles, was passiert, ist, dass eine Folge von Indizes in eine Folge von Transformatorblöcken eingefügt wird und eine Wahrscheinlichkeitsverteilung des nächsten Index herauskommt. Der Rest der Komplexität besteht lediglich darin, geschickt mit der Stapelverarbeitung umzugehen (sowohl über Beispiele als auch über die Sequenzlänge hinweg), damit das Training effizient ist.
Die Kern-minGPT-„Bibliothek“ (hah) besteht aus zwei Dateien: mingpt/model.py
enthält die eigentliche Transformer-Modelldefinition und mingpt/trainer.py
ist ein (GPT-unabhängiges) PyTorch-Boilerplate, das das Modell trainiert. Die beigefügten Jupyter-Notebooks zeigen dann, wie die „Bibliothek“ (hah) zum Trainieren von Sequenzmodellen verwendet werden kann:
-
play_math.ipynb
trainiert ein GPT, das sich auf Addition konzentriert (inspiriert durch den Additionsabschnitt im GPT-3-Artikel). -
play_char.ipynb
trainiert ein GPT als Sprachmodell auf Zeichenebene für beliebigen Text, ähnlich meinem älteren char-rnn, aber mit einem Transformator anstelle eines RNN -
play_words.ipynb
eine BPE-Version, die noch nicht existiert
Mit einem BPE-Encoder, verteiltem Training und vielleicht fp16 kann diese Implementierung möglicherweise GPT-1/GPT-2-Ergebnisse reproduzieren, obwohl ich $$$ noch nicht ausprobiert habe. GPT-3 ist wahrscheinlich außer Reichweite, da es meines Wissens nicht in den GPU-Speicher passt und eine sorgfältigere modellparallele Behandlung erfordert.
Beispielverwendung
Dieser Code ist einfach genug, um ihn einfach inline zu hacken, nicht „verwendet“, aber die aktuelle API sieht in etwa so aus:
# 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
Referenzen
Code:
- openai/gpt-2 hat das Modell, aber nicht den Trainingscode, und zwar in TensorFlow
- openai/image-gpt hat einige modernere gpt-3-ähnliche Modifikationen im Code, auch eine gute Referenz
- Huggingface/Transformers hat ein Beispiel für die Sprachmodellierung. Es ist voll funktionsfähig, aber daher auch etwas schwierig zu verfolgen. Beispielsweise verfügen einige große Funktionen über bis zu 90 % ungenutzten Code hinter verschiedenen Verzweigungsanweisungen, der in der Standardeinstellung der einfachen Sprachmodellierung ungenutzt bleibt.
Papiere + einige Implementierungshinweise:
Verbesserung des Sprachverständnisses durch generatives Pre-Training (GPT-1)
- Unser Modell folgt weitgehend der ursprünglichen Transformatorarbeit
- Wir haben einen 12-Schicht-Decoder-Transformator mit maskierten Selbstaufmerksamkeitsköpfen (768 dimensionale Zustände und 12 Aufmerksamkeitsköpfe) trainiert. Für die positionsbezogenen Feed-Forward-Netzwerke haben wir 3072 dimensionale innere Zustände verwendet.
- Adams maximale Lernrate beträgt 2,5e-4. (später verwendet GPT-3 für diese Modellgröße 6e-4)
- LR-Zerfall: linear von Null über die ersten 2000 Aktualisierungen ansteigend und unter Verwendung eines Kosinusplans auf 0 getempert
- Wir trainieren für 100 Epochen auf Minibatches von 64 zufällig ausgewählten, zusammenhängenden Sequenzen von 512 Token.
- Da Layernorm im gesamten Modell häufig verwendet wird, war eine einfache Gewichtsinitialisierung von N(0, 0,02) ausreichend
- Bytepair-Encoding (BPE)-Vokabular mit 40.000 Zusammenführungen
- Rest-, Einbettungs- und Aufmerksamkeits-Dropouts mit einer Rate von 0,1 für die Regularisierung.
- modifizierte Version der in (37) vorgeschlagenen L2-Regularisierung mit w = 0,01 für alle Nicht-Bias- oder Gain-Gewichte
- Für die Aktivierungsfunktion haben wir die Gaussian Error Linear Unit (GELU) verwendet.
- Wir haben gelernte Positionseinbettungen anstelle der in der Originalarbeit vorgeschlagenen Sinusversion verwendet
- Zur Feinabstimmung: Wir fügen dem Klassifikator einen Dropout mit einer Rate von 0,1 hinzu. Lernrate von 6,25e-5 und eine Batchgröße von 32,3 Epochen. Wir verwenden einen linearen Lernratenabfallplan mit einer Aufwärmphase von mehr als 0,2 % des Trainings. λ wurde auf 0,5 eingestellt.
- Das GPT-1-Modell besteht aus 12 Schichten und d_model 768, ~117 Millionen Parameter
Sprachmodelle sind unbeaufsichtigte Multitasking-Lernende (GPT-2)
- LayerNorm wurde an den Eingang jedes Unterblocks verschoben, ähnlich einem Restnetzwerk vor der Aktivierung
- Nach dem letzten Selbstaufmerksamkeitsblock wurde eine zusätzliche Ebenennormalisierung hinzugefügt.
- Es wird eine modifizierte Initialisierung verwendet, die die Akkumulation auf dem Restpfad mit der Modelltiefe berücksichtigt. Wir skalieren die Gewichte der Restschichten bei der Initialisierung um den Faktor 1/√N, wobei N die Anzahl der Restschichten ist. (Seltsam, weil ich in ihrem veröffentlichten Code nur eine einfache Verwendung des alten 0.02 finden kann ... in ihrer Veröffentlichung von image-gpt habe ich festgestellt, dass es für c_proj verwendet wird, und selbst dann nur für attn, nicht für mlp. huh. https: //github.com/openai/image-gpt/blob/master/src/model.py)
- Der Wortschatz wird auf 50.257 erweitert
- Erhöhen Sie die Kontextgröße von 512 auf 1024 Token
- Es wird eine größere Chargengröße von 512 verwendet
- GPT-2 verwendete 48 Schichten und d_model 1600 (im Vergleich zu ursprünglich 12 Schichten und d_model 768). ~1.542B Parameter
Sprachmodelle sind Few-Shot-Lernende (GPT-3)
- GPT-3: 96 Schichten, 96 Köpfe, mit d_model von 12.288 (175B Parameter).
- GPT-1-ähnlich: 12 Schichten, 12 Köpfe, d_model 768 (125M)
- Wir verwenden dasselbe Modell und dieselbe Architektur wie GPT-2, einschließlich der darin beschriebenen modifizierten Initialisierung, Vornormalisierung und reversiblen Tokenisierung
- Wir verwenden abwechselnd dichte und lokal gebänderte, spärliche Aufmerksamkeitsmuster in den Schichten des Transformators, ähnlich dem Sparse Transformer
- Wir haben immer die Feedforward-Schicht, die viermal so groß ist wie die Engpassschicht, dff = 4 ∗ dmodel
- Alle Modelle verwenden ein Kontextfenster mit nctx = 2048 Token.
- Adam mit β1 = 0,9, β2 = 0,95 und eps = 10−8
- Alle Modelle verwenden einen Gewichtsabfall von 0,1, um ein geringes Maß an Regularisierung bereitzustellen. (HINWEIS: GPT-1 verwendete 0,01, glaube ich, siehe oben)
- Beschneiden Sie die globale Norm des Farbverlaufs bei 1,0
- Lineares LR-Aufwärmen über die ersten 375 Millionen Token. Verwenden Sie dann den Kosinuszerfall, um die Lernrate auf 10 % seines Wertes zu senken, also auf über 260 Milliarden Token.
- Erhöhen Sie die Stapelgröße schrittweise linear von einem kleinen Wert (32.000 Token) bis zum vollen Wert über die ersten 4–12 Milliarden Token des Trainings, abhängig von der Modellgröße.
- Es wird immer das vollständige Zeitkontextfenster der Größe 2048 mit einem speziellen END OF DOCUMENT-Token-Trennzeichen verwendet
Lizenz
MIT