A PyTorch重新实施GPT培训。MinGPT试图做到小巧、干净、易于解释和有教育意义,因为目前可用的大多数都有点杂乱无章。GPT不是一个复杂的模型,该实现大约有300行代码,包括样板和完全不必要的自定义因果自我关注模块。无论如何,所发生的一切都是将一系列索引放入一系列变压器块中,然后得出下一个索引的概率分布。剩下的复杂性只是巧妙地使用批处理(跨示例和超过序列长度),以便训练是有效的。
核心minGPT";库";(Hah)是两个文件:mingpt/model.py包含实际的Transformer模型定义,而mingpt/traine.py是训练模型的(独立于GPT的)PyTorch样板。然后,随附的Jupyter笔记本显示如何使用";库(Hah)来训练序列模型:
Play_math.ipynb训练专注于加法的GPT(灵感来自GPT-3白皮书中的加法部分)。
Play_char.ipynb将GPT训练为任意文本的字符级语言模型,类似于我以前的char-rnn,但使用的是转换器而不是RNN。
有了BPE编码器,分布式训练,也许还有FP16,这个实现也许能够重现GPT-1/GPT-2的结果,尽管我还没有尝试过$。GPT-3可能是遥不可及的,因为我的理解是它不适合GPU内存,需要更仔细的模型-并行处理。
这段代码非常简单,只需进行内联,而不是使用";,但是当前的API类似于:
#您可以自己定义一个类,将单个示例作为PyTorch LongTensors从Torch返回。公用事业。数据导入数据集TRAIN_DATASET=MyDataset(...)。Test_dataset=MyDataset(...)#从mingpt构造GPT模型。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)#从mingpt构建教练器。培训师导入培训师,TraineConfig tconf=TraineConfig(max_pechs=10,Batch_size=256)Trainer=Training(model,Train_Dataset,test_Dataset,tconf)Training er。列车()#(...。享受一段时间的表演吧..。)#模型中的样本([无,...]。和[0]从mingpt推送/弹出所需的虚拟批次维度)。工具导入样本x=Torch。张量([1,2,3],dtype=火炬。Long)[无,...]#上下文条件y=SAMPLE(MODEL,x,Steps=30,Temperature=1.0,Sample=True,top_k=5)[0]print(Y)#我们的模型用另外30个可能的整数填充整数序列。
OpenAI/image-gpt的代码中有一些更现代的类似gpt-3的修改,也有很好的参考价值。
HuggingFace/Transers有一个语言建模的例子。它功能齐全,但因此追踪起来也有一定的挑战性。例如,一些大型函数在各种分支语句后面有高达90%的未使用代码,这在简单语言建模的默认设置中是不被使用的。
我们训练了一个12层的只有解码器的变压器,带有掩蔽的自我注意头(768个维度状态和12个注意头)。对于位置前馈网络,我们使用了3072维的内态。
LR衰减:在最初的2000年更新中从零线性增加,并使用余弦时间表退火到0。
我们在小批量的64个随机抽样的512个令牌的连续序列上训练100个纪元。
由于在整个模型中广泛使用LayerNorm,简单的权重初始化N(0,0.02)就足够了。
(37)中提出的L2正则化的修改版本,在所有非偏置或增益权重上w=0.01。
我们使用学习位置嵌入代替了原工作中提出的正弦形式。
对于微调:我们以0.1的速率向分类器添加丢弃。学习速率为6.25e-5,批量为32。3个时代。我们使用线性学习率衰减时间表,热身超过0.2%的训练。λ设置为0.5.
LayerNorm被移动到每个子块的输入,类似于激活前的残差网络。
使用修正的初始化,其考虑了具有模型深度的残差路径上的累积。我们在初始化时将残留层的权重缩放1/√N,其中N是残留层的数量。(很奇怪,因为在他们发布的代码中,我只能找到旧的0.02的简单用法……。在他们发布的image-gpt中,我发现它用于c_proj,即使那样也只用于attn,而不用于mlp。哈。Https://github.com/openai/image-gpt/blob/master/src/model.py)。
GPT-2使用了48层和d_model 1600(与原来的12层和d_model 768相比)。~1.542B参数。
我们使用与GPT-2相同的模型和体系结构,包括其中描述的修改后的初始化、预归一化和可逆令牌化。
我们在变压器的各层中交替使用密集和局部带状稀疏注意模式,类似于稀疏变压器。
我们始终具有四倍于瓶颈层大小的前馈层,dff=4∗dmodel。
ADAM,β1=0.9,β2=0.95,Eps=10−8。
所有模型都使用0.1的权重衰减来提供少量的正则化。(注:GPT-1使用0.01我相信,见上文)
前3.75亿令牌上的线性LR预热。然后使用余弦衰减将学习率降到其值的10%,超过2600亿个令牌。
根据模型大小,在前40-120亿个训练令牌上,将批大小从小值(32K令牌)线性增加到全值。
始终使用完整的2048大小的时间上下文窗口,并在文档标记的末尾使用特殊的分隔符