|
|
机器之心报道: |( n$ ^' D5 J) @' a& b. s7 j2 Z
机器之心编辑部# w+ y1 n5 Z/ e9 l# d5 p
GPT 模型实现起来有时也很简单。' R! R6 ~+ R* t* f& ^
当前,大型语言模型(LLM)被认为是人工智能突破的方向。人们正在尝试用它们做各种复杂的事情,比如问答、创作、数学推理以及编写代码等。近段时间 ChatGPT 持续的爆火是最好的例证。
6 e# N+ ?. W# t9 ^% B然而,对于机器学习从业者来说,大模型的门槛很高:因为体量太大难以训练,很长时间里这个方向一直被大公司垄断。不过最近,简化 GPT 模型的方法越来越多了。1 月中旬,前特斯拉 AI 高级总监 Andrej Karpathy(现已回归 OpenAI)就发布了从零开始构建 GPT 模型的完整教程。不过训练出的 GPT 和 OpenAI 的 GPT-3 比较,两者规模差距达 1 万 - 100 万倍。1 c& |" t. }3 t$ U8 B" }
近日,加拿大麦克马斯特大学的一位软件工程本科生 Jay Mody 在导入 NumPy 库下,仅用 60 行代码就从头实现了一个 GPT 模型,并将其命名为 PicoGPT。不仅如此,他还将经过训练的 GPT-2 模型权重加载到自己的实现中,并生成了一些文本。下面为 60 行代码展示。
+ ^1 N; G* A1 `0 h1 I1 S) _9 q( [, B, w! W, b: w
" ~/ [8 V( P# z7 e [% G6 h, ~* P+ O8 |
不过要做到这些,你需要熟悉 Python 和 NumPy,还要有一些训练神经网络的基本经验。作者表示,这篇博客旨在对 GPT 进行简单易懂的完整介绍。因此,作者只使用已经训练的模型权重来实现前向传递代码。
2 b! v) `4 J7 _0 y' w% }% L) {! D* A4 G+ ?* l4 J/ U
3 h# X9 X! q; U6 T: H' W. |% p5 B
1 R5 M. v6 }" d) l: y4 B2 s8 w代码地址:, P0 }' W$ q9 b! y4 f1 q. w
https://github.com/jaymody/picoGPT/blob/29e78cc52b58ed2c1c483ffea2eb46ff6bdec785/gpt2_pico.py#L3-L58
3 L1 L; m' E3 d. w, C对于此项研究,Andrej Karpathy 给出了四个字:虽迟但到。想当初,Karpathy 构建的 minGPT 和 nanoGPT 还要 300 行代码。( r1 P \ D* Q' o3 e
, c/ c. d: P! v- |
E2 u. U2 j: _- ~! r1 O3 A1 U5 A) ~+ ?
1 f- b# N( b. h9 d, l2 r
值得一提的是,这篇教程不是完全零门槛的。为了让读者明白,作者首先介绍了什么是 GPT、它的输入、输出如何等其他内容,介绍得都非常详细。( f" q/ o+ q: i- j! c
; I+ [# L7 w- l6 Q7 ^& k
6 d, V f$ `; u, K4 F( C6 z3 o. b' w2 X3 k
& ?- R- K% R5 |$ i n% U! L至于 GPT 到底能干什么,作者给出了几个示例,它能写电子邮件、总结一本书、给你 instagram 标题的想法、向 5 岁的孩子解释黑洞、用 SQL 编写代码等。' i9 D( S( W( Y
通过仔细阅读这部分内容后,你能大致了解 GPT 的一些基础知识。有了这些背景介绍,接下来就是如何设置了。
/ \. U: w: y9 O/ o0 q9 G项目介绍. i" ^/ {" I/ }0 i1 Q" F$ x
设置
/ |+ j) q7 ]; M7 d2 @+ W# X [这一章节主要介绍了如何设置编码器、超参数以及参数。
; W0 ?8 J, ?. \- E3 ?7 d9 j
, C r$ ^1 i9 S, |& a; ? e D S' R( |& g q0 M* G0 z9 e( e
4 v+ P! ?; J- A: `- {, l7 k
你要做的,首先是克隆代码库:
' s) D! ] `5 q* ?% m/ l1 E. Q+ l
& f& Q# ]( U0 l* o$ o) T9 G5 M+ R I6 t' V6 p# d3 Q1 ^
然后安装依赖项:
! w! q: x6 Y Z0 \9 b
9 W0 }: `' C9 J
6 O5 _3 N' j( F* P7 j: I. |
* U* H f4 F9 V1 O; i注意,如果你使用的是 M1 Macbook,在运行 pip install 之前,你需要在 requirements.txt 中将 tensorflow 更改为 tensorflow-macos。在这个项目下,文件包括 encoder.py、utils.py、gpt2.py、gpt2_pico.py:
( |- i5 I1 K1 | V/ d; u* aencoder.py:包含 OpenAI BPE Tokenizer 的代码,直接取自 gpt-2 repo;
) u' }9 A8 c8 b J$ B, Ogpt2.py:包含 GPT 模型和生成代码,可以将其作为 python 脚本运行;" V# E( e. m; Q6 I J* C/ H% i/ M7 o4 m
gpt2_pico.py:与 gpt2.py 相同,但是代码行数更少。
5 _$ f7 g# W/ J其中 gpt2.py 需要从头开始实现,因此你要做的是先删除 gpt2.py 并重新创建一个空文件:" N1 N% o1 l5 m d7 l! F( A- `3 c
7 {5 Z5 Z8 w' Z% y' U: K8 B; k2 h
2 D1 M1 U& i: b; I# X然后将下列代码复制到 gpt2.py 中:
: a0 s2 I/ Q" ]1 k8 w& a5 A9 M3 j$ @( p, k
) P. `6 x7 p1 p3 m( V6 c1 D( S$ @: n' A6 t6 }! M2 x* r6 Y
上述代码包含 4 个主要部分:
) h% i1 w( x! {gpt2 函数是本次实现 GPT 的实际代码;
8 v o9 G/ w$ `% P0 x+ N& n* I4 ~generate 函数实现自回归解码算法;' N0 R5 X; `; K3 }" _7 X4 y
main 函数;8 ~! R- c. y0 J
fire.Fire ( main ) 将文件转换为 CLI 应用程序,以便最终可以运行代码:python gpt2.py "some prompt here"。! N0 V) a9 |! h1 X) l6 h
main 函数包含有 encode、hparams、params 参数,执行下列代码:$ t! q R' `. \ `
- W& E* ]! G9 |5 ]! |5 S r1 Q5 p$ P/ ^4 l/ G, f0 A8 m+ t) V1 |
$ _7 R8 a f l: C" P设置完成之后,作者开始介绍编码器、超参数、参数的一些细节内容。就拿编码器来说,本文的编码器和 GPT-2 使用的 BPE tokenizer 一样。下面是该编码器编码和解码的一些文本示例:
9 P$ k/ p: L; {: x) y5 {# r3 ]4 r( e$ i* ]) U1 |, c7 q
& ?2 o. m2 g& X5 U s5 S' N
2 E( }) u D" e) X
实际的 token 长这个样子:/ v# s. N) H5 [" x+ i
. m; T8 X# B! `! U/ ]$ B
$ A' A1 R$ ]4 D P1 N3 \
; S" }! i( S! q f/ F需要注意,有时 token 是单词(例如 Not),有时它们是单词但前面有一个空格(例如 all, 代表一个空格),有时是单词的一部分(例如 capes 被拆分为 cap 和 es ) ,有时它们是标点符号(例如 .)。# j" `4 [/ h" L2 K8 ? q
BPE 的一个好处是它可以对任意字符串进行编码,如果遇到词汇表中不存在的内容,它会将其分解为它能理解的子字符串:1 \2 h7 x9 [9 F, C! R
/ h5 d4 {' i- c! O8 O! ~, X
# t: [. x4 T2 `. `/ M/ c. I0 A H t5 @1 y3 k+ @" a% Q2 {. k! A5 V# S
更细节的内容不再赘述。接下来介绍基础神经网络,这一部分就更加基础了,主要包括 GELU、Softmax 函数以及 Layer Normalization 和 Linear。
8 ^) \0 g/ {* h6 R, d% A% M2 Q& [' R- r1 z% {( r
; L4 @( C6 h3 A0 I8 I3 }( U1 `/ I9 D
/ @' Z: x2 J: ?& ]$ ?每一小部分都有代码示例,例如在 Linear 部分,作者展示了标准矩阵乘法 + 偏置:' W+ K( I1 a3 E1 D$ P
* }; R) ^2 }) u) G. s
$ E$ R8 W9 S$ x' ?$ z
" d& ^9 o3 d- G1 ^7 [; c线性层从一个向量空间投影到另一个向量空间的代码如下:; M1 `. G; |1 A2 ]; V, _. K" x* B
* c) ~6 E9 ?& O, r T2 g
`" s$ Q# F/ t; b) d; Q( b% J
" G8 r1 e/ t% z R+ ]GPT 架构
8 t2 W* n7 s5 H' t1 Z& h R, Y9 r这部分介绍 GPT 自身架构。
+ z1 J1 K% h" ~7 K
6 V- J& o- z- W4 C) q4 o5 r$ U/ b3 J p' O N8 i2 M7 s
; n" n! y/ u& |2 j# _4 b6 Q& W! K% qTransformer 架构如下:) l; ]$ A+ X3 `4 p. r
: H5 h& {3 B' l5 t" X2 g1 Q8 B% {
+ h8 D" f1 P. l. E! {
* j5 b1 D: U# M% ^- V0 G. v% N& t7 FTransformer 仅使用解码器堆栈(图的右侧部分):
/ c# x7 b" C' o4 D1 n9 [# f# e+ A8 O' n, ~1 `' H* o
& H% b! l d( _2 s, K3 k. D9 z8 `0 f8 j) O& q3 D# `1 g
需要注意,由于摆脱了编码器,中间的交叉注意力层也被删除了。
2 p! Y/ |# F8 I+ @在高层次上,GPT 体系架构有以下三个部分:
% K3 ^5 Y: h' x* m! w文本 + 位置嵌入;
7 X* C5 ~: L# E- g1 jTransformer 解码器堆栈;4 e2 B- l x& B( l! R
投影到词汇表。, C A2 n6 m4 B" V, U# V" u
代码就像下面这样:
: I" c7 @& [% Y; q0 J, q, X
8 B1 }9 E" j# K
+ Q. T( B( B& _- _3 Y q0 O, m3 a2 t- y
代码部分截图
: M! P! U$ {8 T& E& s: M接下来更详细地分解以上三个部分中的每一个部分,这里也不再赘述。
/ P! c0 \, o6 T4 f& @& W以上就是作者对 GPT 的实现,接下来就是将它们组合在一起并运行代码,得到 gpt2.py。它的全部内容只有 120 行代码(如果删除注释和空格,则为 60 行)。 w0 s* c& l; }7 j
作者通过以下方式测试结果:9 S! N# `' ?1 B" K1 D
) q, O0 {+ V* A R
0 J$ {0 l$ {/ H) m+ a$ O" W( b
$ M" N1 B' _: t" q4 s% m输出结果如下:3 r4 x0 m, S* @& ^
3 o: o: _( h+ x
! h ]. L7 K- M; `. n P
7 s' P) p+ m& B8 D3 d: L! _
正如作者说的:这次实验成功了。& u+ j9 Y- V4 d/ S# x% O2 m
本文只是跟着作者的思路大概介绍了整体流程,想要了解更多内容的小伙伴,可以参考原文链接。5 s$ ?( }9 T! [* Q$ J) i
原文链接:https://jaykmody.com/blog/gpt-from-scratch/#basic-layers. `1 S4 R0 _6 S3 L. P
全面学习 ChatGPT,机器之心准备了 89 篇文章合集
. A- j2 D2 ^! v7 ^这是一份全面、系统且高质量的 ChatGPT 文章合集,我们筛选出来了 89 篇相关文章,设计了阅读框架与学习路径,大家可以根据自己的需求进行浏览与研读。合集内容包括:+ K+ _; I9 E1 r6 b4 Y
ChatGPT 及 OpenAI 大事件时间轴; x& j) j( L- e+ G; l8 n9 W. S
概念 · 真正搞懂 ChatGPT:共 3 篇文章
5 x( e: v1 z- V4 T6 K/ u5 I0 M研究 · GPT 家族更迭:共 16 篇文章
2 J% ]& R/ Y. m! h7 a R八年 · OpenAI 的历史与现在:共 13 篇文章4 `. F V4 y" W5 }$ c0 ^$ x) {
干货 · GPT 相关研究与技术:共 18 篇文章
4 H5 V1 G/ g a$ V9 I3 f) a4 S观点 · 专家谈 ChatGPT:共 8 篇文章) o0 G5 C5 M* n/ N
行业 · 应用与探索:共 23 篇文章4 V1 a' C F) d0 K# _6 U
行业 · 同类产品:共 8 篇文章+ P0 ]9 q( h, E% l- K
THE END % Z+ o% x9 a) {1 _* p8 f
投稿或寻求报道:content@jiqizhixin.com |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|