최소GPT-TF
Mingpt의 TensorFlow 재구현
노트북
colab에서 훈련된 play_math.ipynb
및 play_char.ipynb
Colab에서 모델을 훈련시키기 위한 링크는 각 노트북 상단에 있습니다. play_char.ipynb
노트북 batch_size
Colab GPU
메모리에 맞게 줄어듭니다. GPU 메모리에 따라 매개변수를 변경합니다.
minGPT - 읽어보기
GPT 훈련을 PyTorch로 다시 구현한 것입니다. minGPT는 현재 사용 가능한 대부분의 기능이 약간 넓기 때문에 작고, 깨끗하고, 해석 가능하고, 교육적입니다. GPT는 복잡한 모델이 아니며 이 구현은 상용구와 완전히 불필요한 사용자 지정 원인 Self-Attention 모듈을 포함하여 적절하게 약 300줄의 코드입니다. 어쨌든, 일어나는 일은 일련의 인덱스가 일련의 변환기 블록에 들어가고 다음 인덱스의 확률 분포가 나오는 것뿐입니다. 나머지 복잡성은 훈련이 효율적이도록 일괄 처리(예제 전체 및 시퀀스 길이 모두)를 통해 영리하게 수행하는 것입니다.
핵심 minGPT "라이브러리"(hah)는 두 개의 파일입니다. mingpt/model.py
에는 실제 Transformer 모델 정의가 포함되어 있고 mingpt/trainer.py
는 모델을 훈련하는 (GPT 독립적) PyTorch 상용구입니다. 첨부된 Jupyter 노트북은 "라이브러리"(ㅋㅋㅋ)를 사용하여 시퀀스 모델을 학습하는 방법을 보여줍니다.
-
play_math.ipynb
덧셈에 초점을 맞춘 GPT를 훈련합니다(GPT-3 논문의 덧셈 섹션에서 영감을 받음) -
play_char.ipynb
이전 char-rnn과 유사하지만 RNN 대신 변환기를 사용하여 임의 텍스트에 대한 문자 수준 언어 모델이 되도록 GPT를 교육합니다. -
play_words.ipynb
아직 존재하지 않는 BPE 버전
bpe 인코더, 분산 교육 및 fp16을 사용하면 이 구현이 GPT-1/GPT-2 결과를 재현할 수 있지만 $$$를 시도하지는 않았습니다. GPT-3는 GPU 메모리에 맞지 않고 보다 신중한 모델 병렬 처리가 필요하다는 점을 이해하기 때문에 도달하기 어려울 것 같습니다.
사용 예
이 코드는 "사용된" 것이 아니라 인라인으로 해킹할 만큼 간단하지만 현재 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)을 통한 언어 이해 향상
- 우리 모델은 원래의 변압기 작업을 크게 따릅니다.
- 우리는 마스크된 self-attention 헤드(768차원 상태 및 12개 attention 헤드)가 있는 12층 디코더 전용 변환기를 훈련했습니다. 위치별 피드포워드 네트워크의 경우 3072차원 내부 상태를 사용했습니다.
- Adam의 최대 학습 속도는 2.5e-4입니다. (나중에 이 모델 크기의 GPT-3은 6e-4를 사용합니다)
- LR 붕괴: 처음 2000번의 업데이트 동안 0에서 선형적으로 증가하고 코사인 일정을 사용하여 0으로 어닐링됨
- 무작위로 샘플링된 64개의 미니배치, 512개 토큰의 연속 시퀀스에 대해 100세대 동안 훈련합니다.
- layernorm은 모델 전반에 걸쳐 광범위하게 사용되므로 N(0, 0.02)의 간단한 가중치 초기화로 충분합니다.
- 40,000개의 병합이 포함된 바이트쌍 인코딩(BPE) 어휘
- 정규화에 대한 비율이 0.1인 잔여, 임베딩 및 주의 드롭아웃.
- 모든 비편향 또는 이득 가중치에 대해 w = 0.01인 (37)에서 제안된 L2 정규화의 수정된 버전
- 활성화 함수에는 GELU(Gaussian Error Linear Unit)를 사용했습니다.
- 우리는 원래 작업에서 제안된 정현파 버전 대신 학습된 위치 임베딩을 사용했습니다.
- 미세 조정을 위해: 분류기에 0.1 비율로 드롭아웃을 추가합니다. 학습률은 6.25e-5이고 배치 크기는 32.3 에포크입니다. 훈련의 0.2%가 넘는 워밍업이 포함된 선형 학습률 감소 일정을 사용합니다. λ는 0.5로 설정되었습니다.
- GPT-1 모델은 12개의 레이어와 d_model 768, ~117M 매개변수입니다.
언어 모델은 비지도 멀티태스킹 학습자(GPT-2)입니다.
- LayerNorm은 활성화 전 잔여 네트워크와 유사하게 각 하위 블록의 입력으로 이동되었습니다.
- 최종 self-attention 블록 이후에 추가 레이어 정규화가 추가되었습니다.
- 모델 깊이가 있는 잔여 경로의 누적을 설명하는 수정된 초기화가 사용됩니다. 초기화 시 잔여 레이어의 가중치를 1/√N만큼 조정합니다. 여기서 N은 잔여 레이어 수입니다. (발표된 코드에서 이전 0.02의 간단한 사용만 찾을 수 있기 때문에 이상합니다... image-gpt 릴리스에서 c_proj에 사용되는 것을 발견했고 심지어 mlp가 아닌 attn에만 사용되는 것을 발견했습니다. 허. 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.542B 매개변수
언어 모델은 Few-Shot Learners(GPT-3)입니다.
- GPT-3: 96개 레이어, 96개 헤드, d_model 12,288(175B 매개변수).
- GPT-1 유사: 12개 레이어, 12개 헤드, d_model 768(125M)
- 우리는 여기에 설명된 수정된 초기화, 사전 정규화 및 가역적 토큰화를 포함하여 GPT-2와 동일한 모델 및 아키텍처를 사용합니다.
- 우리는 Sparse Transformer와 유사하게 Transformer의 레이어에서 교대로 조밀하고 지역적으로 묶인 Sparse Attention 패턴을 사용합니다.
- 우리는 항상 병목 레이어 크기의 4배인 피드포워드 레이어를 가집니다. dff = 4 * dmodel
- 모든 모델은 nctx = 2048 토큰의 컨텍스트 창을 사용합니다.
- β1 = 0.9, β2 = 0.95, eps = 10−8인 Adam
- 모든 모델은 약간의 정규화를 제공하기 위해 0.1의 가중치 감소를 사용합니다. (참고: GPT-1은 0.01을 사용했습니다. 위 내용을 참조하세요.)
- 그라디언트의 전역 표준을 1.0에서 자릅니다.
- 처음 3억 7,500만 개의 토큰에 대한 선형 LR 준비. 그런 다음 학습률을 해당 값의 10%(2,600억 개 이상의 토큰)까지 낮추기 위해 코사인 붕괴를 사용합니다.
- 모델 크기에 따라 배치 크기를 작은 값(32,000개 토큰)에서 처음 40억~120억 개의 훈련 토큰에 걸쳐 전체 값까지 선형적으로 점진적으로 늘립니다.
- 특수한 END OF DOCUMENT 토큰 구분 기호와 함께 전체 2048 크기의 시간 컨텍스트 창이 항상 사용됩니다.
특허
MIT