借用 Linus 大神的那句名言“talk is cheap, show me the code”,没有什么比手搓一个 GPT 出来更适合的了。有的同学可能会被吓到,人家花了几百亿美刀整出来的成果,说搓就能搓出来吗?其实我们的目标是写一个最简 GPT,从根本上去理解 GPT 技术。就像当初最早发布的 Linux 内核也就是两万行代码,但 Linux 核心架构是延续至今的。其实,只要实现 8 个核心组件,仅用400 行代码就可以得到一个“麻雀虽小,五脏俱全”的 GPT 了。在动手之前,我们先了解一些基本概念。GPT 是基于 Transformer 架构的自然语言处理模型,而 Transformer 的核心是自注意力机制,它能够为输入序列中的每个元素分配不同的权重,从而更好地捕捉序列内部的依赖关系。GPT 是从左向右训练的单向模型,它只使用 Transformer 的解码器架构,具有自回归的特点。在训练过程中,GPT 模型通过后续注意力掩码,确保每个位置只能看到当前位置之前的信息,这使得 GPT 特别适合生成式任务,例如文本分类、问答系统等。知道了 GPT 的原理,我们先来搞定 GPT 开发环境。本次实验环境,操作系统选择的是 Debian Linux,编程语言是 Python 3.x。同学们也可以根据自己的环境选择合适的工具,比如Windows、MacOS或者其他 Linux 发行版,开发工具可以用 PyCharm、VSCode 等。在这个最简 GPT 工程中,需要依赖 numpy 和 PyTorch 库,我们可以用 pip 工具进行安装,pip 会自动依次安装相关依赖库。pip install numpy
NumPy(Numerical Python)是 Python 中最基础和最重要的科学计算库,它为处理大规模数据和高效的数值计算提供了强大的支持。在本工程中会用到 NumPy的一些数学计算功能。PyTorch 是一个基于 Python 的科学计算库,它主要是为了解决深度学习任务而设计的。PyTorch 采用动态计算图的方式,可以灵活地构建复杂计算图,同时支持动态图和静态图两种方式。它还允许用户自由组合各种神经网络层,从而实现定制化的模型结构。在最简 GPT 工程中使用 torch.nn 模块构建神经网络模型,它提供了丰富的类和函数,方便用户定义、训练和评估神经网络模型。通过使用torch.nn,用户可以快速搭建各种复杂的神经网络结构,实现深度学习任务。另外,我们还使用torch.optim模块来优化算法,它为用户提供了各种常见的优化器,并封装了参数更新和学习率调整等功能,方便用户进行深度学习模型的训练和优化过程。最简 GPT 工程的结构可以分为三个部分,分别是 GPT 模型、构建语料库与训练模型、生成文本。
构成 GPT 模型的 8 个组件分别是多头自注意力、逐位置前馈网络、正弦位置编码表、填充掩码、后续掩码、解码器层、解码器、GPT。其中前五个组件构成 Transformer 解码器,我们重点对解码器层代码进行解读。GPT 解码器层包含一个多头自注意力层 MultiHeadAttention 和一个逐位置前馈网络层 PosFeedForwardNet,后面接了两个层归一化 nn.LayerNorm。
第一个层归一化 norm1:在多头自注意力 self_attn 处理后,将注意力输出 attn_output 与原始输入 dec_inputs 相加。这种加和操作实现了残差连接,可以加速梯度反向传播,有助于训练深层网络。
第二个层归一化 norm2:在逐位置前馈网络 feed_forward 处理后,将前馈神经网络输出 ff_outputs 与第一个层归一化输出 norm1_outputs 相加。这可以实现标准化输入数据,提高训练稳定性。为训练模型准备一段原始文本,如下图所示。虽然篇幅不长,但足以演示最简 GPT 的核心功能。这段文本的分析结果如下图所示。
训练数据由给定的输入句子构成,这些句子已经被编码为数字表示。在每个训练批次中,模型的输入是当前单词序列,而目标输出是该序列中每个单词的下一个单词。
为了计算损失,模型预测下一个单词的概率分布,然后使用交叉熵损失函数比较这些预测概率和实际目标单词。代码会依据主机配置而自主选择 GPU 或 CPU 进行计算,训练时间在数分钟左右:以下代码就是使用训练好的模型来生成文本,运行之后可以看到对每一个生成的词进行贪婪搜索的结果:首先,代码将输入字符串转换为一个单词索引列表 input_tokens,然后将这些输入的 token 作为初始生成的文本 output_tokens。接着,函数进入循环,将逐个生成新的 token,直到达到最大长度 max_len 或者遇到句子结束标志。
至此,手搓 GPT 大功告成,同学们还可以对上述代码进行调整。例如,将模型保存到磁盘上,以便反复加载使用;使用更丰富的语料来训练模型等。
最简 GPT 工程的 400 行完整代码全在《GPT 图解:大模型是怎样构建的》这本书中,书中对GPT 的8 个组件有非常细致的说明。
这是一本特别有趣的书,看着故事就把 GPT 学会了,让我们来具体了解一下。《GPT 图解:大模型是怎样构建的》从 NLP 技术的发展脉络梳理,讲述了 N-Gram、词袋模型(BoW)、Word2Vec(W2V)、神经概率语言模型(NPLM)、循环神经网络(RNN)、Seq2Seq(S2S)、注意力机制、Transformer,以及从初代 GPT 到 ChatGPT 再到 GPT-4 等一系列突破性技术的诞生与演进。本书最大的特点是通过两位虚拟人物“咖哥”和“小冰”的对话来展开技术讨论,将枯燥的技术细节化作轻松幽默的故事和缤纷多彩的图画,引领读者穿梭于不同时空,见证自然语言处理技术的传承、演进与蜕变。
本书作者黄佳,笔名就是“咖哥”,他目前是新加坡科技研究局人工智能研究员,主攻方向为 NLP 大模型的研发与应用。咖哥在 AI 领域深耕多年,在政府、银行、医疗等多个行业有丰富的 AI 实践经验。
咖哥同时还是《零基础学机器学习》《数据分析咖哥十话》等畅销书的作者。在他的笔下,技术褪去了神秘的面纱,读者在轻松的阅读体验中,自然就将技术学以致用。
配套资源丰富是本书另一大特色,咖哥精心编写每一章的示例代码,并编排为 Python notebook 文件。读者可以在 notebook 的交互式环境中轻松运行调试代码,观察输出结果。在 VSCode 中运行调试 Python notebook 工程
咖哥这部力作也得到了业界的广泛认可,多位大佬联袂推荐此书。看懂《GPT 图解:大模型是怎样构建的》,深入理解大模型原理,不要说手搓 GPT,在大模型的任何领域,同学们也都可以游刃有余,这才是 AI 时代应当具备的核心竞争力!