|
|
机器之心报道
! s. y7 I Q1 U# B$ b机器之心编辑部6 p- f n3 w# a
GPT 模型实现起来有时也很简单。 R5 p8 p) n) ~! u& k
当前,大型语言模型(LLM)被认为是人工智能突破的方向。人们正在尝试用它们做各种复杂的事情,比如问答、创作、数学推理以及编写代码等。近段时间 ChatGPT 持续的爆火是最好的例证。
$ Y. r, b- g# ~0 A8 ^8 _然而,对于机器学习从业者来说,大模型的门槛很高:因为体量太大难以训练,很长时间里这个方向一直被大公司垄断。不过最近,简化 GPT 模型的方法越来越多了。1 月中旬,前特斯拉 AI 高级总监 Andrej Karpathy(现已回归 OpenAI)就发布了从零开始构建 GPT 模型的完整教程。不过训练出的 GPT 和 OpenAI 的 GPT-3 比较,两者规模差距达 1 万 - 100 万倍。
2 t4 r" }; U9 `' i近日,加拿大麦克马斯特大学的一位软件工程本科生 Jay Mody 在导入 NumPy 库下,仅用 60 行代码就从头实现了一个 GPT 模型,并将其命名为 PicoGPT。不仅如此,他还将经过训练的 GPT-2 模型权重加载到自己的实现中,并生成了一些文本。下面为 60 行代码展示。
7 g- s: j E! }, w% S X
9 G- N' ^; T6 j: m' B( ~
. h# k4 v5 i# M8 a4 O+ e- _- H6 }1 }* y3 m r2 i4 {
不过要做到这些,你需要熟悉 Python 和 NumPy,还要有一些训练神经网络的基本经验。作者表示,这篇博客旨在对 GPT 进行简单易懂的完整介绍。因此,作者只使用已经训练的模型权重来实现前向传递代码。
' V% o# S) G/ d. ^( \2 }/ U" s; k' W H! O0 y( c
6 j+ `+ P/ W& |8 F# r9 Z
- @* p k5 F" o2 F" c
代码地址:/ Z5 C0 g: v7 V
https://github.com/jaymody/picoGPT/blob/29e78cc52b58ed2c1c483ffea2eb46ff6bdec785/gpt2_pico.py#L3-L580 q A% U+ ^* V& H! y
对于此项研究,Andrej Karpathy 给出了四个字:虽迟但到。想当初,Karpathy 构建的 minGPT 和 nanoGPT 还要 300 行代码。% c( S+ Z' T! R, ] K
; J9 a; L. c: D A
5 n1 Q, W {: z) w* v7 W! }. }3 c H, o# t
值得一提的是,这篇教程不是完全零门槛的。为了让读者明白,作者首先介绍了什么是 GPT、它的输入、输出如何等其他内容,介绍得都非常详细。
: p/ Y/ h" |: W' c# x1 i: V* g+ K) ~7 H$ [3 h8 W
, n1 d8 q! I* w) F; R7 D
! z+ r) Q }' b5 Q
至于 GPT 到底能干什么,作者给出了几个示例,它能写电子邮件、总结一本书、给你 instagram 标题的想法、向 5 岁的孩子解释黑洞、用 SQL 编写代码等。
3 [" h" l- R% u) _- d6 Q# n通过仔细阅读这部分内容后,你能大致了解 GPT 的一些基础知识。有了这些背景介绍,接下来就是如何设置了。
) }. N8 {" ]$ r+ d8 ^项目介绍9 O8 I0 `3 i- V- y
设置" Z2 N; i% q8 P) O9 u( @5 ]
这一章节主要介绍了如何设置编码器、超参数以及参数。 D+ k k2 a3 ~) _% A
0 P$ |: L" [# F( J* ^! _
; G+ H) M. `+ V2 ]
- e/ f' Z d) e+ `你要做的,首先是克隆代码库:
7 d+ p- i- D% X0 v+ ]
/ F! w0 z5 I) y% W
( M7 S9 e. |( W/ S6 n; }
3 S2 x M: y7 {$ U0 @) ~然后安装依赖项:5 R6 j. {, S, z8 E
# m# R- k6 R. A* _
, |9 O2 @; X m# J( d! H" T, J6 o( Z
注意,如果你使用的是 M1 Macbook,在运行 pip install 之前,你需要在 requirements.txt 中将 tensorflow 更改为 tensorflow-macos。在这个项目下,文件包括 encoder.py、utils.py、gpt2.py、gpt2_pico.py:
. H: P8 u* g( Y5 ^0 N& wencoder.py:包含 OpenAI BPE Tokenizer 的代码,直接取自 gpt-2 repo;
s1 ]( x5 H! }. _gpt2.py:包含 GPT 模型和生成代码,可以将其作为 python 脚本运行;; ^9 y2 m/ m* t# f
gpt2_pico.py:与 gpt2.py 相同,但是代码行数更少。 t+ j) b" O( B+ f- {: w
其中 gpt2.py 需要从头开始实现,因此你要做的是先删除 gpt2.py 并重新创建一个空文件:
& V: {, ^$ P6 {: a; `' v3 A7 k4 f3 ~$ @# f5 u- E/ g
4 \5 L+ {, a7 B( m1 |
& `5 S+ j! a: z1 ~% T: x
然后将下列代码复制到 gpt2.py 中:
) c" _3 } M8 ~. X# h0 }2 I; ?
: [6 b/ g: f0 M
. m) }1 w/ u$ q+ P: S( y% y* v/ }' `: K) l
上述代码包含 4 个主要部分:
# u6 o; w5 t3 _! O1 `7 Vgpt2 函数是本次实现 GPT 的实际代码;
( ?" n6 d4 w# O$ tgenerate 函数实现自回归解码算法;. M. v8 f" Q$ W7 T$ {' L( O4 {# l
main 函数;. J* a5 ?1 I! O% b5 R- e
fire.Fire ( main ) 将文件转换为 CLI 应用程序,以便最终可以运行代码:python gpt2.py "some prompt here"。6 T0 b/ B+ o1 U
main 函数包含有 encode、hparams、params 参数,执行下列代码:
$ e' o9 \; L: C5 [8 R
! E0 [9 I a5 m/ a- n! ^0 E4 B- ^
7 ?% ]5 O4 d. h; p/ q2 X2 u* o设置完成之后,作者开始介绍编码器、超参数、参数的一些细节内容。就拿编码器来说,本文的编码器和 GPT-2 使用的 BPE tokenizer 一样。下面是该编码器编码和解码的一些文本示例:
) m6 N! I a) j) a$ \6 ^
/ ?$ Q x5 h) B4 a" v# A) s7 N% c# U2 G3 ~) ] q$ n+ L
! @* a$ J" g7 { A7 Z: f7 f4 }
实际的 token 长这个样子:
& h/ Z, a) p- _. p: |8 k, \$ d3 l9 P# B2 d( l S. e/ S3 ?1 ?
4 j7 z. q1 k% S; g1 X8 G
; l8 _- ~6 D: x& H需要注意,有时 token 是单词(例如 Not),有时它们是单词但前面有一个空格(例如 all, 代表一个空格),有时是单词的一部分(例如 capes 被拆分为 cap 和 es ) ,有时它们是标点符号(例如 .)。3 g6 g9 A4 d1 y! a9 _! _8 @. z; \
BPE 的一个好处是它可以对任意字符串进行编码,如果遇到词汇表中不存在的内容,它会将其分解为它能理解的子字符串:
% ?2 F8 f) `7 d% o
1 E) v$ N5 x& k W8 [ u9 \( M& O9 Q( A% w
$ C+ d. B; c( ~
更细节的内容不再赘述。接下来介绍基础神经网络,这一部分就更加基础了,主要包括 GELU、Softmax 函数以及 Layer Normalization 和 Linear。
1 f2 f" V8 O: O: P
0 w" N3 `) v; N( b- l0 }% v2 b7 H* M% \8 v2 ?4 z2 _# f+ }
9 ^1 \5 g ?$ K每一小部分都有代码示例,例如在 Linear 部分,作者展示了标准矩阵乘法 + 偏置:
; S4 A; b& U+ L: ~4 F4 v6 @# j9 a I8 W' F
3 A/ ]7 G2 v, ?. C
9 {. e# b1 E& C7 M- h# Y
线性层从一个向量空间投影到另一个向量空间的代码如下:' u5 s" Q, ^$ `! Y( |) ]! F- @. V" D
4 Z7 O3 N! {! {7 C. n2 l8 T2 u5 W8 l2 s2 }7 W$ Q
& x0 P; P! v u' W1 T
GPT 架构3 ^) I2 E$ n! a( Y) [. N z( _
这部分介绍 GPT 自身架构。
0 g% U$ g9 y) |9 B6 n7 O- \: q1 `$ [2 \' M
6 F9 O+ ~" R$ N3 r
`; t( T: V# O6 `/ G: NTransformer 架构如下:
0 J$ {# }0 J2 b& ~; G z3 K! `' W0 ?& ^# G4 k( f" |
' ^$ n% n9 r. r9 T% \& t2 j: z/ g8 J
Transformer 仅使用解码器堆栈(图的右侧部分):
5 N; B! G7 ` P/ C3 I2 s" [, r/ T
a% ]9 v# I X9 ]# o
/ M/ Y0 _- j1 c" [! R( ]8 ~需要注意,由于摆脱了编码器,中间的交叉注意力层也被删除了。+ f, ~) Q. z0 C2 y
在高层次上,GPT 体系架构有以下三个部分:
- ~1 z- X. [8 z9 |# d9 Z文本 + 位置嵌入;6 ~: I2 l2 ~ B% k* C2 `: F5 `- h6 K
Transformer 解码器堆栈;/ q3 Z: ]% b7 e+ A
投影到词汇表。% S: p( m* a/ i$ a
代码就像下面这样:
% x* q- @4 z; h1 L$ i8 P
- I/ e$ Q. A/ E% i$ E3 o2 U; h: V# ^* W r+ A9 U8 k
1 k! u7 z9 f! U, Q# w# W2 q W
代码部分截图
8 {2 y. x1 @% _7 |接下来更详细地分解以上三个部分中的每一个部分,这里也不再赘述。( z& S! E Z4 y9 P2 d/ h% g
以上就是作者对 GPT 的实现,接下来就是将它们组合在一起并运行代码,得到 gpt2.py。它的全部内容只有 120 行代码(如果删除注释和空格,则为 60 行)。' b! P: ~* \1 w4 D- r/ m0 Q' z0 X
作者通过以下方式测试结果:
) s7 J9 _$ ^# S: t) F; K, L0 L+ u' f2 R( F4 c
9 n0 \$ l3 i. ^8 \0 ~! w- ^3 o
0 Q, M( o7 r: H* W: ?8 C3 K' s输出结果如下:
" G" [$ O" }8 j% z* K; t8 e6 J
, n7 x8 Y4 E+ w9 Y6 K! V
/ C1 R7 w2 E* _3 r2 v
$ i6 Q, c" f% { }, D, Y正如作者说的:这次实验成功了。9 `! ?3 m- o+ N
本文只是跟着作者的思路大概介绍了整体流程,想要了解更多内容的小伙伴,可以参考原文链接。
/ s) x% ~4 D+ h0 K) @* x原文链接:https://jaykmody.com/blog/gpt-from-scratch/#basic-layers
- S3 R5 G% z" y. f: `) Z全面学习 ChatGPT,机器之心准备了 89 篇文章合集
, o, T1 h. E+ ?这是一份全面、系统且高质量的 ChatGPT 文章合集,我们筛选出来了 89 篇相关文章,设计了阅读框架与学习路径,大家可以根据自己的需求进行浏览与研读。合集内容包括:$ W2 s# O4 m. y& ~3 P; o
ChatGPT 及 OpenAI 大事件时间轴4 r- T" \6 [3 {( U4 b
概念 · 真正搞懂 ChatGPT:共 3 篇文章
5 E5 K: V9 Z8 G5 Z/ |, P研究 · GPT 家族更迭:共 16 篇文章! ], Y, n& t/ j4 X
八年 · OpenAI 的历史与现在:共 13 篇文章5 K, n- b, v/ `1 p: x9 B1 `8 a# Z
干货 · GPT 相关研究与技术:共 18 篇文章
+ n( A* |- ~- z6 `: P4 P+ n+ w观点 · 专家谈 ChatGPT:共 8 篇文章/ h' B" u: ~; t2 d% b& \' J4 O2 Y
行业 · 应用与探索:共 23 篇文章
0 o. j n) @1 f" t. h* s! [行业 · 同类产品:共 8 篇文章
, J( \% m9 N' `; _3 \. B THE END 5 n4 h; h2 P- e1 k) H; ^
投稿或寻求报道:content@jiqizhixin.com |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|