|
|
机器之心报道
5 R: p0 e3 s& N) j机器之心编辑部 p9 J7 `- y. H5 O* ]4 F4 o+ V
GPT 模型实现起来有时也很简单。
( k5 A# Z) U- p L# i- x当前,大型语言模型(LLM)被认为是人工智能突破的方向。人们正在尝试用它们做各种复杂的事情,比如问答、创作、数学推理以及编写代码等。近段时间 ChatGPT 持续的爆火是最好的例证。
' D# ~$ u4 A Q然而,对于机器学习从业者来说,大模型的门槛很高:因为体量太大难以训练,很长时间里这个方向一直被大公司垄断。不过最近,简化 GPT 模型的方法越来越多了。1 月中旬,前特斯拉 AI 高级总监 Andrej Karpathy(现已回归 OpenAI)就发布了从零开始构建 GPT 模型的完整教程。不过训练出的 GPT 和 OpenAI 的 GPT-3 比较,两者规模差距达 1 万 - 100 万倍。
4 P i4 C) s& |9 p: \近日,加拿大麦克马斯特大学的一位软件工程本科生 Jay Mody 在导入 NumPy 库下,仅用 60 行代码就从头实现了一个 GPT 模型,并将其命名为 PicoGPT。不仅如此,他还将经过训练的 GPT-2 模型权重加载到自己的实现中,并生成了一些文本。下面为 60 行代码展示。
; D; |( W0 _$ z% D, }. a% T2 @" V( l: e
/ [, q& ?# q; ?5 h1 m; q( q. O4 d, V7 t' [/ x. g3 |
不过要做到这些,你需要熟悉 Python 和 NumPy,还要有一些训练神经网络的基本经验。作者表示,这篇博客旨在对 GPT 进行简单易懂的完整介绍。因此,作者只使用已经训练的模型权重来实现前向传递代码。 H3 N, q: w" ?/ ]+ l7 R9 L
! c0 G+ i+ i- \/ g4 h( N6 ^9 N" ^
" c! Z% }8 g# j5 Z1 t9 k
7 g9 u- y1 D" d! `; f. J' r m* F
代码地址:! z% R, ?* j5 o, m. P/ H8 O% n
https://github.com/jaymody/picoGPT/blob/29e78cc52b58ed2c1c483ffea2eb46ff6bdec785/gpt2_pico.py#L3-L58* }' c* n$ f% @$ C0 c2 z
对于此项研究,Andrej Karpathy 给出了四个字:虽迟但到。想当初,Karpathy 构建的 minGPT 和 nanoGPT 还要 300 行代码。
1 p- L: o# i# ?. P5 R% ~
7 _' {" z* X% \7 ?& T( w0 B: O- |* l( N1 \# V* S! }
- T/ g7 U% c: B, a" Z$ ^# k$ J值得一提的是,这篇教程不是完全零门槛的。为了让读者明白,作者首先介绍了什么是 GPT、它的输入、输出如何等其他内容,介绍得都非常详细。& T& D4 w, H* P6 T0 z, ]% r1 b" N2 V
# e8 k, G+ S* h ]
# l/ e |. | h- ]0 | y9 x$ T4 l1 j4 z5 o
至于 GPT 到底能干什么,作者给出了几个示例,它能写电子邮件、总结一本书、给你 instagram 标题的想法、向 5 岁的孩子解释黑洞、用 SQL 编写代码等。6 z3 D _, s" _( V0 d9 U5 L7 d
通过仔细阅读这部分内容后,你能大致了解 GPT 的一些基础知识。有了这些背景介绍,接下来就是如何设置了。) B+ s, H3 Y. y+ A
项目介绍
. i5 A' Y- \, M+ n6 z @设置
% @, F! Z: o0 W) z- G这一章节主要介绍了如何设置编码器、超参数以及参数。9 U, B/ \* W& m% u1 ^1 Z
* h2 o1 X0 x$ U3 c
5 C' Y4 W1 R, a) P9 n; e0 j6 ]3 e( K& H$ ^9 c/ n! R, k4 i; s
你要做的,首先是克隆代码库:3 E5 _# m6 t: i$ n5 t4 Z7 O$ ?
T/ t4 \7 t5 k3 N y( \' U0 J$ g4 M6 _1 A, Z
4 A9 h9 {% V |1 e然后安装依赖项:# d9 F3 h; d/ v# @
3 S; F; n) F! U! ~# [0 `
( _0 B. T8 }" N* h; C. C( Q8 m6 E' t! z) k: e+ ~3 F6 ^
注意,如果你使用的是 M1 Macbook,在运行 pip install 之前,你需要在 requirements.txt 中将 tensorflow 更改为 tensorflow-macos。在这个项目下,文件包括 encoder.py、utils.py、gpt2.py、gpt2_pico.py:
; d5 Z+ U5 b( n' {. y. aencoder.py:包含 OpenAI BPE Tokenizer 的代码,直接取自 gpt-2 repo;1 S y- U7 Q* ^
gpt2.py:包含 GPT 模型和生成代码,可以将其作为 python 脚本运行;9 q8 c, u, X0 W. P6 R b
gpt2_pico.py:与 gpt2.py 相同,但是代码行数更少。; y4 E: Y+ \ k+ L% v
其中 gpt2.py 需要从头开始实现,因此你要做的是先删除 gpt2.py 并重新创建一个空文件:
2 S3 F1 g! k# H! H6 ^
8 `* d# e8 v9 x. {' R
+ ]9 _+ k' `/ o D( K7 G/ G/ F" S( ~- E' J1 c/ r$ D
然后将下列代码复制到 gpt2.py 中:6 B6 c2 b7 Y3 J+ l7 [7 @9 e
6 U+ E* S% j" D7 X5 Y. Q, j
, U1 c/ A3 P! A7 A% y
. K: y& n" c2 v6 t$ ~! n- y上述代码包含 4 个主要部分:/ }1 T/ v& t( Z% s
gpt2 函数是本次实现 GPT 的实际代码;
6 z# [/ |2 T1 r) f) Hgenerate 函数实现自回归解码算法; B; T3 M) u9 x
main 函数;
) m1 W4 J6 D' k. N8 L# efire.Fire ( main ) 将文件转换为 CLI 应用程序,以便最终可以运行代码:python gpt2.py "some prompt here"。
' k0 ]/ _: P |# M, m- H1 ^8 l9 C4 Nmain 函数包含有 encode、hparams、params 参数,执行下列代码:
& X+ t0 p) o6 ^: F% Y
0 Q+ B9 l/ |4 b" U, _+ F- _# o" b$ G- m2 ^/ j2 W+ v
$ U$ S9 u% R- @! E8 {+ M
设置完成之后,作者开始介绍编码器、超参数、参数的一些细节内容。就拿编码器来说,本文的编码器和 GPT-2 使用的 BPE tokenizer 一样。下面是该编码器编码和解码的一些文本示例:
3 w W& s* ~* I" x2 D8 ^+ _% q& }5 g- c' d/ Z: ~ @( h
c6 V1 p! A4 i. G; j7 l
/ g7 m% n, J/ L1 Q
实际的 token 长这个样子:/ @+ F( H0 y& c* C
" _6 }. L( h8 m! g4 d% z8 V2 m# m! z/ Z/ E1 O1 a
0 K3 d1 [) t# H' H
需要注意,有时 token 是单词(例如 Not),有时它们是单词但前面有一个空格(例如 all, 代表一个空格),有时是单词的一部分(例如 capes 被拆分为 cap 和 es ) ,有时它们是标点符号(例如 .)。- v. {! G4 x' O$ b/ L
BPE 的一个好处是它可以对任意字符串进行编码,如果遇到词汇表中不存在的内容,它会将其分解为它能理解的子字符串:
) f* ^" X: X. ]1 T" [
& b* ^0 b" E- s( e/ p g3 @$ z8 k" W6 E0 J% J
; ?% z$ o8 D! u) R5 |8 r. a; O$ F" a
更细节的内容不再赘述。接下来介绍基础神经网络,这一部分就更加基础了,主要包括 GELU、Softmax 函数以及 Layer Normalization 和 Linear。
* W) U8 Z% A2 h/ C5 K3 |7 \* V- e- h x. C# g
0 S) b1 d# [( t. Z# i5 l8 [& q
, X* r+ d+ G9 y2 U1 Q; z+ z4 n每一小部分都有代码示例,例如在 Linear 部分,作者展示了标准矩阵乘法 + 偏置:& C- z9 [% V, u- {' C5 E
7 W) ]2 m7 Z& S- P' [9 B
$ l- @+ b" P9 c: s7 r8 l' Y% {& j `; [. J- q
线性层从一个向量空间投影到另一个向量空间的代码如下:6 K; w" W# x+ {- M, J8 }( W
% r W9 l( K* @0 }3 K7 J3 o! T& o2 {' ^0 ^( x' U8 F" E5 o
0 z5 l1 L0 b |( d/ kGPT 架构; Z( ]' e" T# l' l
这部分介绍 GPT 自身架构。; s4 O9 o) z* E$ S0 l: f# [
5 @8 c2 I- N' f$ v7 _- h+ i
( _) w4 [8 m5 b; v9 `+ I
# P& N# m. R+ h$ uTransformer 架构如下:
" a! D/ I5 ^, ~" G$ C
4 ]9 U+ x2 c2 l* }, d9 g3 A5 ^6 o: I& {
" j( E/ C; U0 e$ [Transformer 仅使用解码器堆栈(图的右侧部分):1 o0 P2 f! c# b$ R* }# N$ M
$ F; J F7 w) x+ a0 y& w P8 l$ `2 O9 @/ l
* }# L r" n& J G需要注意,由于摆脱了编码器,中间的交叉注意力层也被删除了。
& T1 l, Y/ f! f9 ]# P9 Z& X在高层次上,GPT 体系架构有以下三个部分: L! x/ T! P9 V( `4 w' K Y
文本 + 位置嵌入; g0 r6 S* ]8 E% C2 h) @9 S ]
Transformer 解码器堆栈;
- C9 } X1 T/ A! a; ?1 ^- d: E投影到词汇表。
9 B, p5 X1 O5 L0 @5 k6 s& c# _9 U代码就像下面这样:
9 {. d5 s. N+ Z: m0 [+ P6 O$ E; }: d( J1 [
) `$ U3 F2 E) D3 E4 `$ T
& @. }9 ^" P% y: z0 L代码部分截图9 z8 `) b) X, B! e( r K \4 o
接下来更详细地分解以上三个部分中的每一个部分,这里也不再赘述。
3 N* A9 L0 p7 v以上就是作者对 GPT 的实现,接下来就是将它们组合在一起并运行代码,得到 gpt2.py。它的全部内容只有 120 行代码(如果删除注释和空格,则为 60 行)。% p O) ^) {1 K
作者通过以下方式测试结果:
1 C$ O' [: k6 }6 c5 M
7 I8 ]& y( K5 F6 e1 `( f D+ a# D0 x/ G) Y
% l2 X T8 d4 ~1 D' D/ b
输出结果如下:/ j" P, a" w' u+ R' P$ X0 {
: u: s* |0 Q# l, J: C2 K
( U$ \% s, ^; j, Q
/ q5 j. D b1 ~
正如作者说的:这次实验成功了。
2 h6 n% E7 {* f, T* |本文只是跟着作者的思路大概介绍了整体流程,想要了解更多内容的小伙伴,可以参考原文链接。
: K* q1 s# P8 [0 Y% E! S原文链接:https://jaykmody.com/blog/gpt-from-scratch/#basic-layers: _& C. a- s. N2 ^. K, b
全面学习 ChatGPT,机器之心准备了 89 篇文章合集: P5 A* `; v5 u; `+ _- ?/ C1 f
这是一份全面、系统且高质量的 ChatGPT 文章合集,我们筛选出来了 89 篇相关文章,设计了阅读框架与学习路径,大家可以根据自己的需求进行浏览与研读。合集内容包括:4 s+ I4 A8 j' J& X1 `: q& n- k" Z
ChatGPT 及 OpenAI 大事件时间轴
: b$ [8 i$ G: J! S4 ^概念 · 真正搞懂 ChatGPT:共 3 篇文章
6 O6 ]+ A/ v( R3 a2 U; d2 B研究 · GPT 家族更迭:共 16 篇文章
4 ], R/ A. ^; v八年 · OpenAI 的历史与现在:共 13 篇文章# h! z, Q; Q2 P: ~; u/ d+ Z0 p
干货 · GPT 相关研究与技术:共 18 篇文章4 }3 D0 G5 {7 i# J. p
观点 · 专家谈 ChatGPT:共 8 篇文章
2 B5 I$ n3 u$ l) p+ _行业 · 应用与探索:共 23 篇文章3 }. X- q( V1 `6 X$ t6 [+ O; l2 O5 G
行业 · 同类产品:共 8 篇文章
# o+ b+ y: d1 y5 {! s# i0 d" K( {# G7 V THE END 3 f# W: ?; P8 }8 r
投稿或寻求报道:content@jiqizhixin.com |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|