|
|
机器之心报道- T6 s# I, b4 X& W
机器之心编辑部
+ j# s. l. w* l/ |2 B! xGPT 模型实现起来有时也很简单。
7 g4 A6 U: p! |% s) P; e' m7 C当前,大型语言模型(LLM)被认为是人工智能突破的方向。人们正在尝试用它们做各种复杂的事情,比如问答、创作、数学推理以及编写代码等。近段时间 ChatGPT 持续的爆火是最好的例证。
7 \# e( P6 J6 x( J$ M( P然而,对于机器学习从业者来说,大模型的门槛很高:因为体量太大难以训练,很长时间里这个方向一直被大公司垄断。不过最近,简化 GPT 模型的方法越来越多了。1 月中旬,前特斯拉 AI 高级总监 Andrej Karpathy(现已回归 OpenAI)就发布了从零开始构建 GPT 模型的完整教程。不过训练出的 GPT 和 OpenAI 的 GPT-3 比较,两者规模差距达 1 万 - 100 万倍。
; S. p' H3 O' b# o2 D近日,加拿大麦克马斯特大学的一位软件工程本科生 Jay Mody 在导入 NumPy 库下,仅用 60 行代码就从头实现了一个 GPT 模型,并将其命名为 PicoGPT。不仅如此,他还将经过训练的 GPT-2 模型权重加载到自己的实现中,并生成了一些文本。下面为 60 行代码展示。% j4 Y; T: A, l
$ N# J+ L% S. Y( o$ A2 D) b9 m3 J7 F0 u$ O5 l7 D2 u
8 j$ `. U8 u- B4 H5 _不过要做到这些,你需要熟悉 Python 和 NumPy,还要有一些训练神经网络的基本经验。作者表示,这篇博客旨在对 GPT 进行简单易懂的完整介绍。因此,作者只使用已经训练的模型权重来实现前向传递代码。
6 M9 K" S) Y7 T5 T
) i' h' P) ]2 H% C m+ s7 R! e" w. D3 p c" G( @
k+ N: a4 L' w# s! L) ^
代码地址:
; j" O8 h9 o# J' P, \https://github.com/jaymody/picoGPT/blob/29e78cc52b58ed2c1c483ffea2eb46ff6bdec785/gpt2_pico.py#L3-L58" i. ?8 i! T7 X
对于此项研究,Andrej Karpathy 给出了四个字:虽迟但到。想当初,Karpathy 构建的 minGPT 和 nanoGPT 还要 300 行代码。2 [( a- b' n1 y& ~6 {* t0 R
2 X4 z2 r. a* K7 s" J8 x! c- G3 h% `7 X7 d6 S7 s
, t6 M+ b- [0 [8 ?' n值得一提的是,这篇教程不是完全零门槛的。为了让读者明白,作者首先介绍了什么是 GPT、它的输入、输出如何等其他内容,介绍得都非常详细。
Z |. L% x5 ?$ E. R& E( O9 n/ L* |* Y( w+ r
+ Y1 g3 m# g; K+ x+ F7 j5 a- M W1 V/ N" R$ F, i3 |: M# Q5 c8 V
至于 GPT 到底能干什么,作者给出了几个示例,它能写电子邮件、总结一本书、给你 instagram 标题的想法、向 5 岁的孩子解释黑洞、用 SQL 编写代码等。
# n* P6 S- K" h: v N. `/ }8 a通过仔细阅读这部分内容后,你能大致了解 GPT 的一些基础知识。有了这些背景介绍,接下来就是如何设置了。+ \# Z4 T2 Q% S. ^
项目介绍9 g6 c: L- Q- G, Q! S1 J
设置
0 O" d" e9 J) Q* Y9 L$ m) x这一章节主要介绍了如何设置编码器、超参数以及参数。/ V) V. b3 m3 G8 g5 N
7 h }" f; X+ n$ Y- G E" w/ }2 L2 }# @: ^- M
b9 p9 I1 d: R. J; P
你要做的,首先是克隆代码库:* R) v h$ v0 r/ v5 n, e8 I3 J
# o* \+ A7 J% Y0 j! a; s9 r8 {% I& i$ X. [# R5 L2 _
- S8 K! {! i: n% t+ i& o然后安装依赖项:$ a- i: t* g, m6 p K
$ o% }1 E2 `3 u& |" q) H
; |% u _. ^2 _0 f9 i: i
2 U, a0 S& }2 S6 T7 m
注意,如果你使用的是 M1 Macbook,在运行 pip install 之前,你需要在 requirements.txt 中将 tensorflow 更改为 tensorflow-macos。在这个项目下,文件包括 encoder.py、utils.py、gpt2.py、gpt2_pico.py:
, j" j) V' r: A( t( ^encoder.py:包含 OpenAI BPE Tokenizer 的代码,直接取自 gpt-2 repo;
, ]9 l* L; C3 h% @) Mgpt2.py:包含 GPT 模型和生成代码,可以将其作为 python 脚本运行;2 [3 E, k- L3 m, R0 N5 Z
gpt2_pico.py:与 gpt2.py 相同,但是代码行数更少。+ h7 r/ D D& K t2 E
其中 gpt2.py 需要从头开始实现,因此你要做的是先删除 gpt2.py 并重新创建一个空文件:# I7 y G( G) [5 }5 x
. O p, i4 w; r: P5 V! m6 p \' e4 h
$ |2 Z- e1 X% V. u7 {9 F- L
7 Y0 i1 n5 s5 B8 P然后将下列代码复制到 gpt2.py 中:+ T9 _& Z2 F- x8 z! c) S1 c1 p4 t' L2 c
2 |3 q+ m7 H+ C/ v1 \+ e+ a
$ N) u: _% ?/ [7 a* ~
1 S( S0 [( x' R( ^0 K) Q上述代码包含 4 个主要部分:
5 U! U8 u+ ?" y; H% p5 D. agpt2 函数是本次实现 GPT 的实际代码;
9 R% F# D1 ?! I$ q, {. lgenerate 函数实现自回归解码算法;. D) x& @: w6 M2 o
main 函数;# S- N; w k2 n( S" j: l
fire.Fire ( main ) 将文件转换为 CLI 应用程序,以便最终可以运行代码:python gpt2.py "some prompt here"。" K# R( y! d2 q. U$ N7 n+ i3 t
main 函数包含有 encode、hparams、params 参数,执行下列代码:
- g6 F9 Q$ C0 v( C7 p7 n
) c7 Q, X: y8 ]* o! i
7 Y$ w! i4 L4 ^) `8 `% c% y( k% N8 L2 v' F# V4 K' ~4 @
设置完成之后,作者开始介绍编码器、超参数、参数的一些细节内容。就拿编码器来说,本文的编码器和 GPT-2 使用的 BPE tokenizer 一样。下面是该编码器编码和解码的一些文本示例:
4 _1 C0 l$ s7 m. `7 `2 M
( w/ J' g5 u! {# X a, L& z
0 e. W1 }' T8 T( O) X. x# G
4 ?0 m" s6 r: ^9 R; S实际的 token 长这个样子:
- T$ \- L) }2 m! Y4 A' E( O- i3 J/ B: W
- p7 a* n! V! p
: ]/ m' E% j1 L D* h! Q
( n' T! X: _7 D$ V+ a需要注意,有时 token 是单词(例如 Not),有时它们是单词但前面有一个空格(例如 all, 代表一个空格),有时是单词的一部分(例如 capes 被拆分为 cap 和 es ) ,有时它们是标点符号(例如 .)。
% D6 F4 n0 e) G: ]% CBPE 的一个好处是它可以对任意字符串进行编码,如果遇到词汇表中不存在的内容,它会将其分解为它能理解的子字符串:
7 K3 B: P3 h% M: B$ F/ @9 u6 C5 ~( z) N( `
- \6 h/ M- s' Y7 e( q/ v [3 z( U/ W" d! y+ G; c7 h
更细节的内容不再赘述。接下来介绍基础神经网络,这一部分就更加基础了,主要包括 GELU、Softmax 函数以及 Layer Normalization 和 Linear。
6 L& s. w @7 C5 C! ]. H- Q3 A: E5 n( O M
% r" ^5 n) d6 p5 X6 P& c+ g8 x2 U5 n6 \9 C u% k
每一小部分都有代码示例,例如在 Linear 部分,作者展示了标准矩阵乘法 + 偏置:2 Q, M: z6 W( z6 ]
& d8 ]( W/ k( @5 `$ \
4 N4 w; F* S3 K' x' t, N$ A
1 ]7 q+ U* h+ n4 T0 `
线性层从一个向量空间投影到另一个向量空间的代码如下:( R7 }4 @( \( a7 i4 j- M* y# W
& E* N4 A4 L6 l
. v `' B7 s3 g& y( m$ w" Q+ K1 Y) M3 ^7 Q4 C& l- o9 L: l
GPT 架构# M9 q- C/ `& m R$ `$ z
这部分介绍 GPT 自身架构。( N& ~/ X9 W& e
5 [. e9 ]- |4 `( z! ?$ {2 [1 N# i5 p7 t2 u4 z0 f
1 Z2 X" t* g# J& ?" @6 X1 u
Transformer 架构如下:( h- g8 P: t5 b5 _
& @. C9 T! P f. j4 H" t
# r* I4 ?$ W1 B% m
/ T" B8 z7 v1 _Transformer 仅使用解码器堆栈(图的右侧部分):8 V) Y O F" X: B; J# i
- b; p! B9 r5 b
; F$ K' `* T; A9 s V2 X) G) i
3 g. j5 `* p6 Y0 A3 x! b- T需要注意,由于摆脱了编码器,中间的交叉注意力层也被删除了。
) _0 p" u; K9 _# w! L0 W在高层次上,GPT 体系架构有以下三个部分:/ p ?; E* E9 u8 E7 W6 B$ K
文本 + 位置嵌入;% L% E" t4 a0 Y1 W# n& O
Transformer 解码器堆栈;
* W( r6 |- K0 R0 |0 z* y4 l/ W投影到词汇表。
" \" ?8 N! k/ w$ `代码就像下面这样:
" m3 O5 D, k1 }$ l4 e- f# x
0 z+ _; B' H! \: g/ S( t6 H$ n( n/ `3 y4 J
7 `% J$ [8 Q9 S! R+ o' i$ P
代码部分截图3 ? o2 w! \2 y8 ]
接下来更详细地分解以上三个部分中的每一个部分,这里也不再赘述。) c( p/ V: D- o1 |+ i$ z" X, b0 ?
以上就是作者对 GPT 的实现,接下来就是将它们组合在一起并运行代码,得到 gpt2.py。它的全部内容只有 120 行代码(如果删除注释和空格,则为 60 行)。
+ K* l: ^4 R7 Y9 g- ?* E6 g5 i+ G作者通过以下方式测试结果:# H4 M0 d. L& A2 [$ I7 {
# a- F1 {% M! d; v; o
% d8 q0 r9 |0 t( _* u: P
5 N$ }3 j& ^6 i! f输出结果如下:
( f9 v6 R1 i! t
$ t% X6 h2 ]9 ^9 W$ l2 B. C q7 ~1 l2 w. _
1 o% [1 ]3 b; O. g* l正如作者说的:这次实验成功了。% X2 |# r( r, f, Y" ]7 D) {
本文只是跟着作者的思路大概介绍了整体流程,想要了解更多内容的小伙伴,可以参考原文链接。
1 d4 J9 T4 u2 n9 ]+ X5 p1 {原文链接:https://jaykmody.com/blog/gpt-from-scratch/#basic-layers$ W% z* t2 d; r" h% d& y
全面学习 ChatGPT,机器之心准备了 89 篇文章合集
# N+ Y! X' c: g4 v这是一份全面、系统且高质量的 ChatGPT 文章合集,我们筛选出来了 89 篇相关文章,设计了阅读框架与学习路径,大家可以根据自己的需求进行浏览与研读。合集内容包括:' T' S# g4 y' m% N
ChatGPT 及 OpenAI 大事件时间轴
( c3 o* k) V, g( H概念 · 真正搞懂 ChatGPT:共 3 篇文章
: k, D/ ^/ u2 Z4 ^研究 · GPT 家族更迭:共 16 篇文章, w0 k% F9 d4 M
八年 · OpenAI 的历史与现在:共 13 篇文章
2 ?; Q% Y* m# e% X7 e& ~干货 · GPT 相关研究与技术:共 18 篇文章
, i( k, f* L; q( P' P' j观点 · 专家谈 ChatGPT:共 8 篇文章
/ e6 x6 |* y; j8 _- Z行业 · 应用与探索:共 23 篇文章
/ C3 e3 B0 c6 y' S2 B3 A行业 · 同类产品:共 8 篇文章/ k# w. F9 H8 R, B* t
THE END - s: z/ t" G/ O4 c& J
投稿或寻求报道:content@jiqizhixin.com |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|