400 行代码手搓最简 GPT,大模型就是这样玩的!

科技   2024-10-20 10:24   江苏  

01

怎样手搓一个最简GPT

学习 GPT 的方式是什么?
借用 Linus 大神的那句名言“talk is cheap, show me the code”,没有什么比手搓一个 GPT 出来更适合的了。
有的同学可能会被吓到,人家花了几百亿美刀整出来的成果,说搓就能搓出来吗?其实我们的目标是写一个最简 GPT,从根本上去理解 GPT 技术。就像当初最早发布的 Linux 内核也就是两万行代码,但 Linux 核心架构是延续至今的。
其实,只要实现 8 个核心组件,仅用400 行代码就可以得到一个“麻雀虽小,五脏俱全”的 GPT 了。

GPT关键组件
在动手之前,我们先了解一些基本概念。GPT 是基于 Transformer 架构的自然语言处理模型,而 Transformer 的核心是自注意力机制,它能够为输入序列中的每个元素分配不同的权重,从而更好地捕捉序列内部的依赖关系。

Transformer 架构
GPT 是从左向右训练的单向模型,它只使用 Transformer 的解码器架构,具有自回归的特点。在训练过程中,GPT 模型通过后续注意力掩码,确保每个位置只能看到当前位置之前的信息,这使得 GPT 特别适合生成式任务,例如文本分类、问答系统等。
知道了 GPT 的原理,我们先来搞定 GPT 开发环境。
02

搭建 GPT 开发环境

本次实验环境,操作系统选择的是 Debian Linux,编程语言是 Python 3.x。同学们也可以根据自己的环境选择合适的工具,比如Windows、MacOS或者其他 Linux 发行版,开发工具可以用 PyCharm、VSCode 等。
在这个最简 GPT 工程中,需要依赖 numpy 和 PyTorch 库,我们可以用 pip 工具进行安装,pip 会自动依次安装相关依赖库。

pip install numpy

pip install torch
NumPy(Numerical Python)是 Python 中最基础和最重要的科学计算库,它为处理大规模数据和高效的数值计算提供了强大的支持。在本工程中会用到 NumPy的一些数学计算功能。
PyTorch 是一个基于 Python 的科学计算库,它主要是为了解决深度学习任务而设计的。PyTorch 采用动态计算图的方式,可以灵活地构建复杂计算图,同时支持动态图和静态图两种方式。它还允许用户自由组合各种神经网络层,从而实现定制化的模型结构。
在最简 GPT 工程中使用 torch.nn 模块构建神经网络模型,它提供了丰富的类和函数,方便用户定义、训练和评估神经网络模型。通过使用torch.nn,用户可以快速搭建各种复杂的神经网络结构,实现深度学习任务。
另外,我们还使用torch.optim模块来优化算法,它为用户提供了各种常见的优化器,并封装了参数更新和学习率调整等功能,方便用户进行深度学习模型的训练和优化过程。
开发环境准备好了,让我们开始手搓最简 GPT。
03

最简 GPT 开发过

最简 GPT 工程的结构可以分为三个部分,分别是 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 学会了,让我们来具体了解一下。
04

弄懂大模型的那些事儿

《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 时代应当具备的核心竞争力!
点击下方即可购书,限时特惠
5折


菜鸟学Python
回复 小助手 领取全套Python学习资料,已原创500+篇,从入门,进阶技巧,爬虫数据分析,数据可视化等,以及经验和技巧的总结,趣味原创文章,破解九宫格,破解Google面试题,情人节选对象,微软面试题,弹球游戏,聊天机器人等欢迎关注!
 最新文章