|
松树原产于奥飞寺
量子比特 |公众号
现在您只需 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缓存。
此外,博主还推荐了一些训练模型、评估模型、改进架构的方法和教程。 |
|