|
|
机器之心报道
9 g+ C4 Y. L; H机器之心编辑部5 A% j6 s% S) U9 _, p+ f
GPT 模型实现起来有时也很简单。& S' i: E( J) w7 j( {$ @. L1 E
当前,大型语言模型(LLM)被认为是人工智能突破的方向。人们正在尝试用它们做各种复杂的事情,比如问答、创作、数学推理以及编写代码等。近段时间 ChatGPT 持续的爆火是最好的例证。' D5 U( F+ i' \, Q, q1 m
然而,对于机器学习从业者来说,大模型的门槛很高:因为体量太大难以训练,很长时间里这个方向一直被大公司垄断。不过最近,简化 GPT 模型的方法越来越多了。1 月中旬,前特斯拉 AI 高级总监 Andrej Karpathy(现已回归 OpenAI)就发布了从零开始构建 GPT 模型的完整教程。不过训练出的 GPT 和 OpenAI 的 GPT-3 比较,两者规模差距达 1 万 - 100 万倍。
j9 ]' q5 Q9 @( i P# F近日,加拿大麦克马斯特大学的一位软件工程本科生 Jay Mody 在导入 NumPy 库下,仅用 60 行代码就从头实现了一个 GPT 模型,并将其命名为 PicoGPT。不仅如此,他还将经过训练的 GPT-2 模型权重加载到自己的实现中,并生成了一些文本。下面为 60 行代码展示。3 z! N7 r2 M% {6 E8 b$ l& g
; j6 A$ l, Q* |+ a8 e9 U% m
( O6 K2 x$ B! u: Q Y& `* x% o8 _" k1 c3 h7 G
不过要做到这些,你需要熟悉 Python 和 NumPy,还要有一些训练神经网络的基本经验。作者表示,这篇博客旨在对 GPT 进行简单易懂的完整介绍。因此,作者只使用已经训练的模型权重来实现前向传递代码。
7 {: @* k! W9 l8 d0 [& Q/ ]1 c4 l5 E6 v7 m& e
( J+ B* b; ]* V" |: z% B
. L1 t0 s2 ~8 c9 z+ ^0 P; X代码地址:
" D0 V9 _( ~& x$ qhttps://github.com/jaymody/picoGPT/blob/29e78cc52b58ed2c1c483ffea2eb46ff6bdec785/gpt2_pico.py#L3-L584 W. \: F* j+ |; ]8 k
对于此项研究,Andrej Karpathy 给出了四个字:虽迟但到。想当初,Karpathy 构建的 minGPT 和 nanoGPT 还要 300 行代码。1 v7 \% a" j. }; h6 Z
# |4 s1 k! K2 u, H2 s2 s$ g% o& a& I: B) ~) Y4 o: T; K; S2 W2 K
% F0 f9 A2 z; a1 w2 B; u7 \值得一提的是,这篇教程不是完全零门槛的。为了让读者明白,作者首先介绍了什么是 GPT、它的输入、输出如何等其他内容,介绍得都非常详细。1 s0 f# o5 K7 S/ G
9 D) r* y# @: x+ N6 l+ V8 R2 F+ }. J0 ^5 a4 d1 w
) J: Y/ \! h- T/ s) ~3 L( P q
至于 GPT 到底能干什么,作者给出了几个示例,它能写电子邮件、总结一本书、给你 instagram 标题的想法、向 5 岁的孩子解释黑洞、用 SQL 编写代码等。4 l& K* ?" H0 C7 w9 ?# c9 k% A
通过仔细阅读这部分内容后,你能大致了解 GPT 的一些基础知识。有了这些背景介绍,接下来就是如何设置了。
6 }) D/ n' p9 }( c+ z! S& ~% r项目介绍- w8 G3 P5 P8 i$ G! V
设置
/ `) N) T b' W# Z$ N3 ^这一章节主要介绍了如何设置编码器、超参数以及参数。
8 ~- L/ U8 n, b. J4 A5 Q+ h6 [. H, O% w4 T6 i Y J$ Q2 j- E
& Y X4 s+ ~9 x; p( ?; h2 h
9 k5 ?7 @/ u4 k( C8 Y2 ]' g: H' k你要做的,首先是克隆代码库:
{' u5 |& A* I, ?/ [: n0 k& j7 S
" a* o4 M/ c$ g4 x" @4 e, [0 u! v Y( U
0 {3 X( j- {( Z3 H: R然后安装依赖项:% v; k8 ?6 ~5 a6 @* A
$ ]" f# n; s' X5 q+ V% E
9 d5 x0 O- _' e; o- ~, |1 I/ J0 x9 e2 A( d& ~8 [# S
注意,如果你使用的是 M1 Macbook,在运行 pip install 之前,你需要在 requirements.txt 中将 tensorflow 更改为 tensorflow-macos。在这个项目下,文件包括 encoder.py、utils.py、gpt2.py、gpt2_pico.py:" {0 o& i% @0 h, c
encoder.py:包含 OpenAI BPE Tokenizer 的代码,直接取自 gpt-2 repo;; g, e1 g7 S; l- x
gpt2.py:包含 GPT 模型和生成代码,可以将其作为 python 脚本运行;$ v8 j# t; x4 Z- G3 ]) P! k
gpt2_pico.py:与 gpt2.py 相同,但是代码行数更少。
1 V; I$ U' w1 I& O/ C4 i其中 gpt2.py 需要从头开始实现,因此你要做的是先删除 gpt2.py 并重新创建一个空文件:
; c( O$ z& d$ t; m# b6 R
9 D- ?; u3 S! v$ ^( }
' {) n; a; |/ s: v8 e; t# s3 W- a/ H3 U1 |+ X# G( s B
然后将下列代码复制到 gpt2.py 中:/ h/ c% }+ w6 f/ a6 M# f
1 s$ o0 [+ I6 ~2 Q1 n
) r+ ?7 H0 b/ W7 g2 W, \1 X
$ |# }3 x: Z& ]# E+ O' x上述代码包含 4 个主要部分:
1 w6 |3 ^$ p: c+ ggpt2 函数是本次实现 GPT 的实际代码;; j7 U! {, J5 H$ {3 ?
generate 函数实现自回归解码算法;' K9 K" l4 A1 v# u0 u2 t
main 函数;$ h. F4 O6 }, W, E/ T4 G! I7 v' N$ V
fire.Fire ( main ) 将文件转换为 CLI 应用程序,以便最终可以运行代码:python gpt2.py "some prompt here"。" m6 {8 n% n) ^* V$ p8 y! C
main 函数包含有 encode、hparams、params 参数,执行下列代码:
6 M L5 u }4 b: j7 J, Y5 n- C5 b. y# p( B
0 H( R4 r4 Q" X) l9 c
+ o' ?/ c2 Z9 P7 A7 v设置完成之后,作者开始介绍编码器、超参数、参数的一些细节内容。就拿编码器来说,本文的编码器和 GPT-2 使用的 BPE tokenizer 一样。下面是该编码器编码和解码的一些文本示例:/ A T5 s1 t- f5 q8 H7 r9 ?
. y0 K" U: T: z
0 j' Z2 V* _5 F+ _/ D
+ G/ F* x% N5 N( J$ t+ u
实际的 token 长这个样子:! }5 m" q* Q) `/ e
$ Q$ Z" Z9 s' x% s& B8 ^" R3 ]' o
H1 M8 R. {0 h# I
7 J. b4 @. V- j/ L5 t0 ~& g2 Y需要注意,有时 token 是单词(例如 Not),有时它们是单词但前面有一个空格(例如 all, 代表一个空格),有时是单词的一部分(例如 capes 被拆分为 cap 和 es ) ,有时它们是标点符号(例如 .)。. n7 _& E) ^% X; C7 Y
BPE 的一个好处是它可以对任意字符串进行编码,如果遇到词汇表中不存在的内容,它会将其分解为它能理解的子字符串:
) t. I3 G* t. \7 ^& L% Z* I
8 C; n4 g* M3 M6 y" t' B. f
1 ^) i7 Y2 S# G/ T A8 I0 s
1 s3 [) ~0 m2 X4 ^5 s% h更细节的内容不再赘述。接下来介绍基础神经网络,这一部分就更加基础了,主要包括 GELU、Softmax 函数以及 Layer Normalization 和 Linear。
# a+ I- u9 W# G f. Z4 t
$ h* M* @9 p7 }" `
2 T3 A! R& s8 i3 r1 g
2 J2 B: o, l9 u* }每一小部分都有代码示例,例如在 Linear 部分,作者展示了标准矩阵乘法 + 偏置:3 j* |% f/ n6 b! d- f# v
3 l5 Z; w; @" e8 C+ K: L
- P( P7 r0 W' E7 ^6 _$ }8 h+ S; b( K
线性层从一个向量空间投影到另一个向量空间的代码如下:
/ B; _2 ~: f7 a, [
5 w% [3 s5 ~/ K9 v# M$ }& O
6 F' R3 A' m* p" S6 f# \
. s2 R+ U; M5 F n5 S0 \$ C$ pGPT 架构- E3 w& s7 h5 P( C
这部分介绍 GPT 自身架构。1 n0 _) X; B" p4 |4 d4 N" H, D
8 ]5 n" }8 i2 W# p
; a( w4 ~+ c; e; {- a2 O* c, [5 o' v! m* b* z' w
Transformer 架构如下:
2 z: N: T1 h+ ^# B( R) H5 ]- e$ k& h4 r% R4 w# U
0 _+ n& S* \6 s, m2 G) c5 C2 B: o3 h6 W
Transformer 仅使用解码器堆栈(图的右侧部分):
* c4 T/ l0 X1 R* \2 N1 X( R! }4 I* S j
9 m' s4 A4 q! Y3 E) Z, |& X' R. a3 y1 L/ y
需要注意,由于摆脱了编码器,中间的交叉注意力层也被删除了。
: u9 W/ Y. k: s& R+ F在高层次上,GPT 体系架构有以下三个部分:4 _( g3 k [6 O1 k K
文本 + 位置嵌入;
- b( X/ I" k" z7 |+ p' ITransformer 解码器堆栈;' S& l. A6 t9 g6 Q* A
投影到词汇表。
' d( r; ]8 S4 \: x' r- F x; v1 _5 B代码就像下面这样:, o) X$ S3 @) b! ^% l
6 I, m9 N0 J6 b& H0 G7 Z3 T) `
( N0 x$ Y. m) `5 Z6 P, {5 i3 Z0 [. X& w- ~1 L( w
代码部分截图7 k4 G6 d8 \) R- m. ~
接下来更详细地分解以上三个部分中的每一个部分,这里也不再赘述。( P. J2 }8 c6 ?+ r- v$ z
以上就是作者对 GPT 的实现,接下来就是将它们组合在一起并运行代码,得到 gpt2.py。它的全部内容只有 120 行代码(如果删除注释和空格,则为 60 行)。! b3 w4 B0 Q2 g9 h6 j' `3 l
作者通过以下方式测试结果:
2 s, F- k( X" S0 a9 U+ k: @( S/ l5 G9 z4 ]
2 D% P/ Q4 {( z2 W8 p; j
$ V0 S8 N3 G d输出结果如下:
& {* v6 }: b$ T6 C+ l; L3 V; D; m3 O
: D; S& ]; @+ a- E2 T( D
) f* x( b! u# r( ]7 \# A
正如作者说的:这次实验成功了。; w; e8 p& d8 L. T1 C. N
本文只是跟着作者的思路大概介绍了整体流程,想要了解更多内容的小伙伴,可以参考原文链接。
4 d) D% j4 E, B: ^# ^. Q: i原文链接:https://jaykmody.com/blog/gpt-from-scratch/#basic-layers
( o0 e" F7 f0 b0 m( }( Q) y, o全面学习 ChatGPT,机器之心准备了 89 篇文章合集
( G/ Z, E5 w+ d7 @+ y1 H这是一份全面、系统且高质量的 ChatGPT 文章合集,我们筛选出来了 89 篇相关文章,设计了阅读框架与学习路径,大家可以根据自己的需求进行浏览与研读。合集内容包括:
/ I; |0 C7 ]$ Y( N6 zChatGPT 及 OpenAI 大事件时间轴
( W+ H* z/ G0 E& u4 [9 |* W概念 · 真正搞懂 ChatGPT:共 3 篇文章+ }' u* v) d# B# Z6 G' j
研究 · GPT 家族更迭:共 16 篇文章: v9 u4 Z) k) p
八年 · OpenAI 的历史与现在:共 13 篇文章
* g' e7 b4 J# p- [+ D! y. R干货 · GPT 相关研究与技术:共 18 篇文章
; l% T+ y+ F% t1 i3 J' F0 ^' t观点 · 专家谈 ChatGPT:共 8 篇文章6 w: w- L& e! W, s" z8 g6 E
行业 · 应用与探索:共 23 篇文章
p: e. ^0 j1 [/ p4 A行业 · 同类产品:共 8 篇文章
5 P0 w1 k7 i$ ^5 W1 V' k8 T THE END `: E/ ^7 Z; Q7 c6 o
投稿或寻求报道:content@jiqizhixin.com |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|