从零开始训练自己的GPT
之前研究LLM的时候,都只是看架构原理,以及MultiAttention的实现代码,但是对于大模型完整的训练过程没有太多仔细的了解。正好放假,就抽了点时间在研究了一下。这次,用网络小说“诛仙”为例,训练一个能写网文的语言模型。
前期准备
首先需要导入一些必要的库,以及设置一些必要的参数。
1 |
|
准备词表
训练模型的第一步是需要从语料中提取出词表字典。
1 |
|
词典提取完之后,就需要弄一个解码器和编码器。这两者的作用是将字符映射为数字Index,以及将Index反映射为字符。
1 |
|
获取批数据
接下来,需要定义一个获取批数据的方法。我们定义了80%的数据作为训练集,20%作为验证集。get_batch
方法会随机选择一个index,然后逐层叠加数据。
1 |
|
打印看一下,这里batch_size
是4,这说明一个批次里有四个样本对。输入是一个长度为8的句子,而输出则是从第二个字之后,预测下一个字。
1 |
|
评估函数
接下来定义一个评估的函数。当评估时,不需要计算梯度。模型也需要切换到eval
模式。随后迭代地取batch样本,计算概率和损失。最后输出损失的均值。
1 |
|
构建模型
随后就是最重要的模型部分。这里采用了最通用的多头注意力构成的模型。首先定义一个注意力头。
1 |
|
随后,我们组一个多头注意力模板。
1 |
|
然后是前向传播层。
1 |
|
训练模型
我们创建一个Optimizer,随后开始训练模型。
1 |
|
测试模型
训练完成后就可以测试模型了。
1 |
|
2024/2/17 于连江