60行代码就能构建GPT!网友:比之前的教程都要清晰|附代码

Pine 发自 凹非寺
量子位 | 公众号 QbitAI

现在只用60行代码,就能从0构建GPT了!

24be1a696798a3642e2e58a98628c3ca.png

想当初,前特斯拉前AI总监的minGPT和nanoGPT也都还要300行代码。

这个60行代码的GPT也有名字,博主将它命名为PicoGPT

不过和此前minGPT和nanoGPT的教程不同,今天要讲的这个博主的教程,更侧重于代码实现部分,模型的权重则用已经训练好的。

对此,博主解释称这篇教程的重点在于提供一个简单且易于破解的完整技术介绍

这对还不理解GPT背后概念的盆友,算是非常友好了。

ddd7dd8d4ea9aca23199f67084955fd4.png

还有网友称赞,这篇博客介绍得非常清晰,第一部分尤为如此。

这篇介绍GPT模型的文章太好了,它比我之前看到的介绍都要清晰,至少在第一部分讨论文本生成和取样是这样的。

f4b251a48b4ed0713d58cddec0b0cb77.png

目前,此项目在GitHub上标星已破百,HackerNews上的点击量也即将破千。

28273c79767ad4fa14e279502f1b940d.png

从GPT是什么讲起

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

教程的重点聚焦在技术介绍上,统共有六大部分:

什么是GPT?

按照惯例,在正式构建GPT之前得先对它做一些基本介绍,教程从输入/输出、生成文本以及训练三个部分分别来讲GPT是如何工作的。

da226f81385b40ee4720079a97e63c75.png

在这趴,博主附上代码,甚至还用了一些比喻来让读者们更好地理解GPT。

举个栗子4b3f6dec542a48e26ffc410f9f702add.png,在输入这一部分,作者将句子比作一条绳子,tokenizer则会将其分割成一小段一小段(单词),被称作token。

又比如说,在生成文本这part介绍自动回归时,博主直接贴上代码:

def generate(inputs, n_tokens_to_generate):for _ in range(n_tokens_to_generate): # auto-regressive decode loopoutput = gpt(inputs) # model forward passnext_id = np.argmax(output[-1]) # greedy samplinginputs = np.append(out, [next_id]) # append prediction to inputreturn list(inputs[len(inputs) - n_tokens_to_generate :])  # only return generated idsinput_ids = [1, 0] # "not" "all"
output_ids = generate(input_ids, 3) # output_ids = [2, 4, 6]
output_tokens = [vocab[i] for i in output_ids] # "heroes" "wear" "capes"

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

60行代码怎么运行?

了解完GPT的基本概念之后,就直接快进到了如何在电脑上运行这个PicoGPT。

博主先是甩出了他那只有60行的代码:

import numpy as npdef gpt2(inputs, wte, wpe, blocks, ln_f, n_head):pass # TODO: implement thisdef generate(inputs, params, n_head, n_tokens_to_generate):from tqdm import tqdmfor _ in tqdm(range(n_tokens_to_generate), "generating"):  # auto-regressive decode looplogits = gpt2(inputs, **params, n_head=n_head)  # model forward passnext_id = np.argmax(logits[-1])  # greedy samplinginputs = np.append(inputs, [next_id])  # append prediction to inputreturn list(inputs[len(inputs) - n_tokens_to_generate :])  # only return generated idsdef main(prompt: str, n_tokens_to_generate: int = 40, model_size: str = "124M", models_dir: str = "models"):from utils import load_encoder_hparams_and_params# load encoder, hparams, and params from the released open-ai gpt-2 filesencoder, hparams, params = load_encoder_hparams_and_params(model_size, models_dir)# encode the input string using the BPE tokenizerinput_ids = encoder.encode(prompt)# make sure we are not surpassing the max sequence length of our modelassert len(input_ids) + n_tokens_to_generate < hparams["n_ctx"]# generate output idsoutput_ids = generate(input_ids, params, hparams["n_head"], n_tokens_to_generate)# decode the ids back into a stringoutput_text = encoder.decode(output_ids)return output_textif name == "__main__":import firefire.Fire(main)

然后从克隆存储库,安装依赖项等步骤一步步教你如何在电脑上运行GPT。

其中,还不乏一些贴心的小tips,比如说如果使用的是M1 Macbook,那在运行pip install之前,需要将requments.txt中的tensorflow更改为tensorflow-macos。

此外,对于代码的四个部分:gpt2,generate,main以及fire.Fire(main),博主也有做详细解释。

等到代码能够运行之后,下一步博主就准备详细介绍编码器、超参数(hparams)以及参数(params)这三部分了。

f317ff99324948159c2188b97fb8d892.png

直接在笔记本或者Python会话中运行下面这个代码:

from utils import load_encoder_hparams_and_params
encoder, hparams, params = load_encoder_hparams_and_params("124M", "models")

Bingo!一些必要的模型和tokenizer文件就直接下载到model/124M,编码器、hparams和params也能直接加载。

更具体的内容这里就不多说了,教程的链接已经附在文末。

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

这一趴涉及到的知识就更加基础了,因为下一趴是实际GPT自身的架构,所以在此之前,需要了解一些非特定于GPT的更基本的神经网络层

博主介绍了GeLU、Softmax函数以及Layer Normalization和Linear。

13995d08d4902ba608a9988b63ce766b.png

GPT架构

终于!这部分要来讲GPT自身的架构了,博主从transformer的架构引入。

be0e17115e7122a70dc287df5b8377bb.png

transformer架构

GPT的架构只使用了transformer中的解码器堆栈(即图表的右边部分),并且其中的的“交叉注意”层也没有用到。

15ab931e138b99c25af9353f26b8b0bf.png

GPT架构

随后,博主将GPT的架构总结成了三大部分:

  • 文本 + 位置嵌入

  • 变压器解码器堆栈

  • 下一个token预测头

并且还将这三部分用代码展示了出来,是酱紫的:

def gpt2(inputs, wte, wpe, blocks, ln_f, n_head):  # [n_seq] -> [n_seq, n_vocab]# token + positional embeddingsx = wte[inputs] + wpe[range(len(inputs))]  # [n_seq] -> [n_seq, n_embd]# forward pass through n_layer transformer blocksfor block in blocks:x = transformer_block(x, block, n_head=n_head)  # [n_seq, n_embd] -> [n_seq, n_embd]# projection to vocabx = layer_norm(x, ln_f)  # [n_seq, n_embd] -> [n_seq, n_embd]return x @ wte.T  # [n_seq, n_embd] -> [n_seq, n_vocab]

再后面,就是关于这三部分的更多细节……

测试构建的GPT

这部分将全部的代码组合在一起,就得到了gpt2.py,统共有120行代码,删除注释和空格的话,就是60行。

然后测试一下!

python gpt2.py \"Alan Turing theorized that computers would one day become" \--n_tokens_to_generate 8

结果是这样的:

the most powerful machines on the planet.

成功了!

一些后续补充

最后一部分,博主也总结了这短短60行代码的不足:非常低效!

不过他还是给出了两个可以让GPT变高效的方法:

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

  • 实现 KV 缓存。

此外,博主还推荐了一些训练模型、评估模型以及改进架构的方法和教程。

感兴趣的话,直接戳文末链接~

作者介绍

Jay Mody,目前在加拿大一家NLP初创公司Cohere从事机器学习的工作,此前,他还分别在特斯拉和亚马逊作为软件工程师实习过一段时间。

31f5978958266596d6082f467e7d33de.png

除了这篇教程之外,小哥的博客网站上还有更新其他文章,并且都有附代码~

1d05adf9d40067a791afa4d879272e40.png

代码传送门:
https://github.com/jaymody/picoGPT/blob/29e78cc52b58ed2c1c483ffea2eb46ff6bdec785/gpt2_pico.py#L3-L58
教程链接:
https://jaykmody.com/blog/gpt-from-scratch/#putting-it-all-together

《中国AIGC产业全景报告暨AIGC 50》调研启动

谁会是中国的“ChatGPT”?最有竞争力和潜力的AIGC力量位于何方?

量子位《中国AIGC产业全景报暨AIGC 50》正式启动对外征集,期待有更多优秀的机构、产品、案例与技术能够被大众看到。

b8a4c50ae50efa889e0d00f220b7061f.png

点这里👇关注我,记得标星哦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/44658.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java实现腾讯云短信服务功能(保姆级,超详细,附源码)

百度可以搜索到很多短信服务提供商&#xff0c;这里以腾讯云的短信服务为例&#xff08;阿里云的也尝试了一下&#xff0c;可能是我运气不好&#xff0c;试了好几次都没有通过审核&#xff0c;阿里云的现在好像也需要资质了&#xff0c;企业或者商户&#xff09;&#xff0c;腾…

java实现腾讯云直播

云直播官方文档&#xff1a;https://cloud.tencent.com/document/product/267 云直播在线生成api&#xff1a;https://console.cloud.tencent.com/api/explorer?Productlive&Version2018-08-01&ActionUpdateLiveWatermark&SignVersion 对云直播api调用的主要目的…

java对接腾讯云短信平台详细代码

在项目中集成一下短信功能。对比了几个服务商&#xff0c;最终选择了腾讯云&#xff0c;因为他每个月免费送100条。 一、申请API 1. 注册腾讯云实名认证后&#xff0c;开通短信服务。 2. 获取AppID和AppK待用。 3. 创建短信签名模板和短信正文模板。系统说半日内审核&#xff…

【腾讯云 Finops Crane 集训营】深入了解 Crane 开源项目,集训营实验操作指南,体验过程总结

前言 最近有幸参与了腾讯云举办的Finops Crane的集训营。在这个过程中&#xff0c;老师认真指导&#xff0c;让我受益非浅&#xff0c;也让我真正理解了这一产品所带来的意义。 在听了老师们的介绍和讲解后&#xff0c;我马不停蹄地开始了自己摸索。首先是跟着视频和官方教程…

腾讯云对象存储COS及CDN加速配置

文章目录 相关文章1. 登陆腾讯云官网&#xff0c;进入腾讯云对象存储COS控制台2. 创建存储空间3. 添加自定义CDN加速域名4. 购买腾讯云免费SSL证书5. 腾讯云 CDN 域名部署 SSL证书6. 测试自定义域名HTTPS访问COS中的文件7. 创建腾讯云子账户&#xff0c;授予对象存储权限&#…

SpringBoot整合腾讯云COS对象存储实现文件上传

企业级项目开发中都会有文件、图片、视频等文件上传并能够访问的场景&#xff0c;对于初学者Demo可能会直接存储在应用服务器上&#xff1b;对于传统项目可能会单独搭建FastDFS、MinIO等文件服务来实现存储&#xff0c;这种方案可能对于企业成本较小&#xff0c;但缺点也是很多…

腾讯云区块链使用心得

浅谈一下最近体验TBaaS的感想。 TBaaS 区块链服务平台集成开发、管理和运维等功能&#xff0c;支持客户在云上快速部署联盟区块链网络环境。基于 TBaaS 区块链服务平台&#xff0c;客户可以降低对区块链底层技术的获取成本&#xff0c;专注在区块链业务模式创新及业务应用的开发…

阿里云和腾讯云全方位对比

一、竞品分析目的 本文旨在人工智能行业通过对云服务平台代表性产品阿里云、腾讯云的产品定位、核心功能、发展战略等方面的研究&#xff0c;探讨人工智能云服务平台产品的在国内的发展趋势。为之后根据实际情况利用具有较多优势的云服务平台研发应用层人工智能产品提供决策辅…

与腾讯云物联网对接

与腾讯云物联网对接 第一步&#xff1a;移植Tencenttinyos的相关文件 net platform&#xff1a;串口驱动框架&#xff0c;只要HAL层 drivers&#xff1a; 第二步&#xff1a;添加头文件路径 第三步&#xff1a;添加esp8266例程 文件夹路径&#xff1a;TencentOS-tiny-master…

python调用腾讯云API语音识别

一、登录腾讯云、开通语音识别接口、获取密钥 登录 - 腾讯云 (tencent.com) 二、打开 API Explorer 语音识别 录音文件识别请求 - API 文档 - 文档中心 - 腾讯云 选择 录音文件请求 三、打开参数说明&#xff0c;按需求填入参数。 其中Data输入的的是音频文件经过base64编码后…

腾讯云TRTC服务实现Web视频会议

腾讯云TRTC服务实现Web视频会议 背景 近期公司承接了某高校智慧校园的项目建设工作&#xff0c;其中在家校协作的板块中需要进行视频教学&#xff0c;以及线上屏幕共享&#xff0c;为了完成这一需求&#xff0c;我在自研与第三方服务的选择之间选择了第三方&#xff0c;主要因…

腾讯云HiFlow场景连接器

文章目录 &#xff08;一&#xff09;腾讯云HiFlow场景连接器是什么&#xff1f;&#xff08;二&#xff09;腾讯云HiFlow场景连接器对于我的工作/生活能有什么好处呢&#xff1f;添加企业微信机器人 &#xff08;一&#xff09;腾讯云HiFlow场景连接器是什么&#xff1f; 腾讯…

监控、无人机摄像头RTSP协议对接腾讯云直播

监控、无人机摄像头RTSP协议对接腾讯云直播 1. 需求与目标 传统监控高清摄像机ip camera&#xff08;如: 海康,大华等&#xff09;遵循监控行业标准&#xff0c;一般只支持rtsp传输协议&#xff0c;互联网直播通用标准为rtmp协议&#xff0c;将这些摄像机视频流引入互联网直播…

【虚拟人快讯】超写实虚拟人青鸟发布,脑白金推出数字人形象

1、3月17日&#xff0c;作为广西文化符号的“刘三姐”穿越时空&#xff0c;以国内首个省级超写实文旅数字推广大使的身份在全网公开亮相&#xff0c;广西壮族自治区文化和旅游厅厅长欧余军在“元宇宙世界”&#xff0c;宣布授予“刘三姐数字人”“广西文化旅游数字推广大使”称…

Gmail邮箱怎么获取授权码?熟悉一下

打开谷歌邮箱https://mail.google.com/mail/u/0/#settings/fwdandpophttps://mail.google.com/mail/u/0/#settings/fwdandpop 进入“转发和 POP/IMAP”&#xff0c;启用 IMAP。 点击“右上角Logo” > “管理您的google账号” 在回到“管理您的google账号” 设置应用专用密码…

【reCAPTCHA 】添加Google验证码

在网站登陆注册时常常需要用到验证码&#xff0c;来防止站点被攻击。 大概这个样子&#xff1a; 现在框架是前后端分离的&#xff0c;angularwebapi弄个验证码感觉有点麻烦 然后就找到google的reCAPTCHA 还挺好使的&#xff0c;记录一下&#xff1a; 地址&#xff1a;https:…

Google验证码ReCaptcha V3

因为工作的原因需要使用Google验证码ReCaptcha v3&#xff0c;所以我就上网了解了一下&#xff0c;下面是我的一些学习分享。 大家应该都是用过google的验证码&#xff0c;如 这种情况的需要我们手动去选择&#xff0c;ReCaptcha V3则不需要了&#xff0c;不需要用户去手动的验…

使用Google reCAPTCHA进行人机验证

reCAPTCHA是Google公司推出的一项验证服务&#xff0c;使用十分方便快捷&#xff0c;在国外许多网站上均有使用。它与许多其他的人机验证方式不同&#xff0c;它极少需要用户进行各种识图验证。 它的使用方式如下如所示&#xff0c;只需勾选复选框即可通过人机验证。 虽然简单…

解决Google人机验证reCaptcha失效问题

安装Redirector插件 Firefox浏览器1. 下载Firefox浏览器&#xff0c;并安装插件2. 打开Redirector插件的界面3. 弹出如下界面4. 按照如下形式填写 Chrome浏览器 Firefox浏览器 1. 下载Firefox浏览器&#xff0c;并安装插件 2. 打开Redirector插件的界面 3. 弹出如下界面 4. 按…

.NET 使用 Google 验证码(Google reCAPTCHA)

一. 前言 前段时间&#xff0c;发现注册受到了恶意攻击&#xff0c;一天注册量10w&#xff0c;接口已从IP做了限制&#xff0c;但不管用&#xff0c;对方每一次发起的IP都不一样&#xff1b;紧急做了滑动验证码&#xff0c;虽然上线立马就阻止了恶意请求&#xff1b; 但好景不…