找回密码
 立即注册
搜索
查看: 98|回复: 0

只需 60 行代码,轻松构建 GPT!PicoGPT 带你探索模型奥秘

[复制链接]

2万

主题

0

回帖

6万

积分

管理员

积分
64662
发表于 2024-11-5 00:45:27 | 显示全部楼层 |阅读模式
松树原产于奥飞寺

量子比特 |公众号

现在您只需 60 行代码即可从头开始构建 GPT!

当时,特斯拉前 AI 总监  还需要 300 行代码。

这个60行的GPT还有一个名字,博主给它起的名字。

不过,与之前的教程不同的是,今天要讲的博主教程更侧重于代码实现部分,并且模型的权重已经训练好了。

对此,博主解释说,本教程的重点是提供完整且简单易破解的技术介绍。

这对于还不了解GPT背后概念的朋友来说非常友好。

有网友称赞该博客的介绍非常清晰,尤其是第一部分。

这是对 GPT 模型的精彩介绍,它比我之前见过的任何介绍都更清晰,至少在讨论文本生成和采样的第一部分时是如此。

目前,这个项目在网络上的星数已经突破100,网络点击量也即将突破1000。

我们先来了解一下什么是GPT

在介绍之前,我还是需要说明一下,本教程并不是完全零门槛的,需要读者提前熟悉NumPy和一些基本的训练神经网络。

本教程以技术介绍为主,分为六部分:

什么是 GPT?

与往常一样,在正式构建 GPT 之前,必须对其进行一些基本介绍。本教程从输入/输出、文本生成和训练三个部分解释了 GPT 的工作原理。

这里,博主附上了代码,甚至还用了一些比喻来帮助读者更好地理解GPT。

举个栗子

,在输入部分,作者将句子比作一根绳子,并将其分成小段(单词),称为标记。

再比如,在文本生成部分引入自动回归时,博主直接贴出了代码:

定义 (, ):

for _ in range(): # 自动循环

= gpt() # 模型传递

= np.([-1]) #

= np.(out, []) # 输入

list([len() - :]) # 仅 id

= [1, 0] # “不是” “全部”

= (, 3) # = [2, 4, 6]

= [vocab for i in ] # "" "wear" "capes"

在每次迭代中,它将预测的标记附加回输入。这种预测未来值并将其添加回输入的过程就是 GPT 被描述为自回归的原因。

如何运行60行代码?

了解 GPT 的基本概念后,是时候快进到如何在计算机上运行它了。

博主首先抛出了他仅有的60行代码:

numpy 作为 np



def gpt2(, wte, wpe, , ln_f, ):

通过# TODO:这个

def (, , , ):

来自 tqdm tqdm

for _ in tqdm(range(), ""): # 自动循环

= gpt2(, **, =) # 模型传递

= np.([-1]) #

= np.(, []) # 输入

list([len() - :]) # 仅 id

def main(: str, : int = 40, : str = "124M", : str = ""):

来自实用程序

# 从 open-ai gpt-2 文件中加载 、 、 和

, , = (, )

# 使用 BPE 的输入

=.()

# 确保我们不是模型的最大值

len() + < ["n_ctx"]

#ids

= (, , [""], )

# 将 ids 返回到

=.()

如果名称==“”:



火.火(主要)

然后它将逐步教您如何在计算机上运行 GPT,包括克隆存储库、安装依赖项等。

其中,有一些深思熟虑的提示。例如,如果您使用的是 M1,则需要在运行 pip 之前将 .txt 更改为 -macos。

另外,博主还详细解释了代码的四个部分:gpt2、main和fire.Fire(main)。

代码可以运行之后,接下来博主就详细介绍一下编码器、超参数()和参数()这三个部分。

直接在笔记本或会话中运行以下代码:

来自实用程序

, , = ("124M", "")

宾果!一些必要的模型和文件直接下载到model/124M,编码器,也可以直接加载。

更具体的内容我这里就不多说了。教程的链接附在文章末尾。

一些基本神经网络层的介绍

这节课涉及的知识就更基础了,因为下节课是GPT本身的实际架构,所以在此之前,你需要了解一些非GPT特有的更基础的神经网络层。

博主介绍了GeLU、函数、Layer sum。



GPT架构

最后!这一部分会讲GPT本身的结构,博主从结构上介绍了这一点。

△建筑

GPT的架构只使用了解码器堆栈(图的右侧部分),并没有使用“交叉注意力”层。

△GPT架构

后来博主将GPT的结构总结为三部分:

文本+位置嵌入

解码器堆栈

下一个令牌预测标头

而这三部分也用代码展示出来,就是紫色的:

def gpt2(, wte, wpe, , ln_f, ): # [n_seq] -> [n_seq, ]

# 代币+

x = wte[] + wpe[range(len())] # [n_seq] -> [n_seq, ]

# 经过

对于块:

x = (x, block, =) # [n_seq, ] -> [n_seq, ]

#

x = (x, ln_f) # [n_seq, ] -> [n_seq, ]

x @ wte.T # [n_seq, ] -> [n_seq, ]

稍后会有关于这三个部分的更多详细信息...

GPT 测试构建

这部分将所有代码组合在一起得到gpt2.py,总共120行代码。如果删掉注释和空格,就变成60行了。

那就测试一下吧!

gpt2.py \

“艾伦有一天会”\

-- 8

结果是这样的:

最上的。

成功!

一些后续补充

上一篇博主还总结了这短短60行代码的缺点:效率很低!

不过他还是给出了两种让GPT更加高效的方法:

同时而不是按顺序执行注意力计算。

实现KV缓存。

此外,博主还推荐了一些训练模型、评估模型、改进架构的方法和教程。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|【远见汇智】 ( 京ICP备20013102号-17 )

GMT+8, 2025-5-6 23:39 , Processed in 0.060879 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表