|
|
机器之心报道
- t, w: e& s7 W3 q0 H9 H3 X机器之心编辑部% w. ], j2 t% f+ m2 o! k& B+ p
GPT 模型实现起来有时也很简单。2 ]3 n- M! `1 v. a* C* Z' J0 G' P1 \
当前,大型语言模型(LLM)被认为是人工智能突破的方向。人们正在尝试用它们做各种复杂的事情,比如问答、创作、数学推理以及编写代码等。近段时间 ChatGPT 持续的爆火是最好的例证。% G+ x; m9 }, a% T' P
然而,对于机器学习从业者来说,大模型的门槛很高:因为体量太大难以训练,很长时间里这个方向一直被大公司垄断。不过最近,简化 GPT 模型的方法越来越多了。1 月中旬,前特斯拉 AI 高级总监 Andrej Karpathy(现已回归 OpenAI)就发布了从零开始构建 GPT 模型的完整教程。不过训练出的 GPT 和 OpenAI 的 GPT-3 比较,两者规模差距达 1 万 - 100 万倍。: f' T. Q( G3 l& r- A, q# P
近日,加拿大麦克马斯特大学的一位软件工程本科生 Jay Mody 在导入 NumPy 库下,仅用 60 行代码就从头实现了一个 GPT 模型,并将其命名为 PicoGPT。不仅如此,他还将经过训练的 GPT-2 模型权重加载到自己的实现中,并生成了一些文本。下面为 60 行代码展示。
* H* X" V$ n7 r1 J1 F& v( b" s' G5 H" x8 L. i) S$ w: n
" @) a" ^; h1 l7 P1 T) Y
. U( C3 d) N$ X+ i* n2 X/ k不过要做到这些,你需要熟悉 Python 和 NumPy,还要有一些训练神经网络的基本经验。作者表示,这篇博客旨在对 GPT 进行简单易懂的完整介绍。因此,作者只使用已经训练的模型权重来实现前向传递代码。
6 ~; K0 I, Y( {6 D$ ~ w5 l/ x' k1 G: f
l& A+ f0 B; U# ?
. y J" z' ~, }" v* ]9 C/ }代码地址:
s Q: {, Q- H- ~# o% A8 x8 Bhttps://github.com/jaymody/picoGPT/blob/29e78cc52b58ed2c1c483ffea2eb46ff6bdec785/gpt2_pico.py#L3-L58 S+ ^3 t( V' v4 U4 H5 L/ y
对于此项研究,Andrej Karpathy 给出了四个字:虽迟但到。想当初,Karpathy 构建的 minGPT 和 nanoGPT 还要 300 行代码。7 U$ A2 W# ^& U
. x0 \+ Q! X; s+ ?, p6 ?* N; Y
: l8 r2 T4 F9 {8 p
9 S( o. ?' H2 T7 f4 O值得一提的是,这篇教程不是完全零门槛的。为了让读者明白,作者首先介绍了什么是 GPT、它的输入、输出如何等其他内容,介绍得都非常详细。
8 y& w5 c! A9 K& G4 T1 p; L6 P" p7 _( s. T! v- E# k ~
4 d6 a1 W, Y' i, ^' A
e! ~* q, H2 i0 Y4 y; D L至于 GPT 到底能干什么,作者给出了几个示例,它能写电子邮件、总结一本书、给你 instagram 标题的想法、向 5 岁的孩子解释黑洞、用 SQL 编写代码等。! I$ m, y& V. B- H
通过仔细阅读这部分内容后,你能大致了解 GPT 的一些基础知识。有了这些背景介绍,接下来就是如何设置了。$ X* }+ g& u6 W
项目介绍
) n$ m( _' n- {0 |; G设置
1 Z7 m) @" Q1 E X+ ]6 l这一章节主要介绍了如何设置编码器、超参数以及参数。
/ g# m, K3 F1 o' H; L8 R) f, M+ t% X+ g
, C. O7 d4 B( D: M- n" ]3 m1 _4 P& z6 G8 |0 \' P+ B& _; `6 X0 p
你要做的,首先是克隆代码库: t$ |+ H8 w F/ X$ s
2 ?$ x' {7 i: P0 K
1 ?4 A* ^; o# a* I- \
5 O9 C# R4 T1 F8 m) T) v
然后安装依赖项:
/ H% K) q5 O! u+ V1 |0 e+ G
% k( h' D0 ^7 j
, L4 M0 O8 p- h6 m$ m' v" q9 r
/ H ~* q$ F5 k注意,如果你使用的是 M1 Macbook,在运行 pip install 之前,你需要在 requirements.txt 中将 tensorflow 更改为 tensorflow-macos。在这个项目下,文件包括 encoder.py、utils.py、gpt2.py、gpt2_pico.py:
! @" R9 d" O5 M7 Yencoder.py:包含 OpenAI BPE Tokenizer 的代码,直接取自 gpt-2 repo;' ]) ?) k2 B- @& a
gpt2.py:包含 GPT 模型和生成代码,可以将其作为 python 脚本运行;- \- i" F- f, R# w$ r+ `5 J+ s
gpt2_pico.py:与 gpt2.py 相同,但是代码行数更少。+ X. |* T1 I$ d$ C
其中 gpt2.py 需要从头开始实现,因此你要做的是先删除 gpt2.py 并重新创建一个空文件:
8 X* Y- W$ m6 z/ v% F) L5 @9 ]: x5 j- j
& |1 V% r. g$ B
. v5 M M8 T- M& k% f然后将下列代码复制到 gpt2.py 中:/ I0 j" q% {5 h' g% R. z
- |+ l4 Q- t1 h u. U$ N O
9 g% \4 X, Y8 X! T2 `% f
; }, F# B. ~1 X/ [* x! l上述代码包含 4 个主要部分:
% e8 H# s7 N1 g% Z7 agpt2 函数是本次实现 GPT 的实际代码;: S4 A- W4 D W( S; D' x V0 J
generate 函数实现自回归解码算法;
, g% @& V' T: qmain 函数;
4 {5 ]7 K+ e5 N' hfire.Fire ( main ) 将文件转换为 CLI 应用程序,以便最终可以运行代码:python gpt2.py "some prompt here"。! _0 D! K% j" ~$ n' h! H" u; u* x
main 函数包含有 encode、hparams、params 参数,执行下列代码:
9 f+ C7 R7 E( D! G% L/ N2 K t/ h. [
5 R! ^7 M7 c3 s3 D
. l2 {$ d% _- b$ m' I; O+ \8 i/ x8 A
设置完成之后,作者开始介绍编码器、超参数、参数的一些细节内容。就拿编码器来说,本文的编码器和 GPT-2 使用的 BPE tokenizer 一样。下面是该编码器编码和解码的一些文本示例:
8 o" M' P2 H) U; n. i
; O# r: ^4 C" O6 @ q6 B) Z0 c! ?" [ E: s5 T
- ] Q8 G: g, K4 b
实际的 token 长这个样子:2 c0 U z2 y- M) J! L# u
0 M+ }7 n+ ]$ v( \
" h! ]. l j* k: j1 P+ o
& F4 u# k$ |! f) _+ w& r+ ~/ Z需要注意,有时 token 是单词(例如 Not),有时它们是单词但前面有一个空格(例如 all, 代表一个空格),有时是单词的一部分(例如 capes 被拆分为 cap 和 es ) ,有时它们是标点符号(例如 .)。
& @8 G4 q) N3 w! E$ G+ ZBPE 的一个好处是它可以对任意字符串进行编码,如果遇到词汇表中不存在的内容,它会将其分解为它能理解的子字符串:
7 L. p$ n* N4 a; m7 @, \& p: {: k- \/ ~3 B; e
9 E B9 f6 p3 G. F% t
- r" Z5 n5 G# [. m更细节的内容不再赘述。接下来介绍基础神经网络,这一部分就更加基础了,主要包括 GELU、Softmax 函数以及 Layer Normalization 和 Linear。; s) Z+ d6 Z4 a: P3 G! m% \ t
2 a: c6 B$ f+ e- P) W
* b$ a2 X) C% C+ d2 L- m) V
+ g+ S; w9 G7 a1 Y# q每一小部分都有代码示例,例如在 Linear 部分,作者展示了标准矩阵乘法 + 偏置:
. H5 f" u; t9 ?- j) U! k
# j2 K) d7 i: H: E# `( |) S# C# i- I, q+ S# Q$ G* r
" M8 T; _/ C- P* I7 }线性层从一个向量空间投影到另一个向量空间的代码如下:9 P7 n# X D+ j$ p
, ~$ z% M% y H) k$ y- {& ?6 H7 S& C1 A; r
- T2 \; k( F2 ^% [GPT 架构
2 r8 g; U4 \' O' L这部分介绍 GPT 自身架构。
# H# }4 h3 q* |2 G+ R' q2 d/ N' `3 e* _( }
, l7 D) a, K% w
2 }; S9 E9 a0 `$ ^, y- \Transformer 架构如下:
2 Q/ o) T9 P( n2 O2 y+ \3 { x1 c1 L7 L: X. P
# F1 e6 t7 E) F4 a" H! S" ^3 f" z7 A
Transformer 仅使用解码器堆栈(图的右侧部分):
# Y4 I+ |: _; C2 T" Z
; G/ r) e% T) E5 T/ p6 J, n0 @" c7 m X% I
7 O8 h5 G. T' D$ i! M8 i
需要注意,由于摆脱了编码器,中间的交叉注意力层也被删除了。# m6 n! @, s) g: k
在高层次上,GPT 体系架构有以下三个部分:% X" u8 X$ ~) j M
文本 + 位置嵌入;1 o4 A/ X# f4 U3 W! u- w: w# ^
Transformer 解码器堆栈;/ P L9 ^: ]5 o/ p, |1 e
投影到词汇表。, `' X/ m$ q# U: [1 n
代码就像下面这样:
" V; z* g' C& E0 Y5 P& ~% G) z
# z R, a9 }& M0 @: {9 { Q0 `; _8 q
1 J$ i. }& Y# Z I) b/ a2 [, ?代码部分截图3 O2 m6 N" |. O5 x- t, y* w, F: t
接下来更详细地分解以上三个部分中的每一个部分,这里也不再赘述。0 a) @1 w1 V* a. W; ~+ r
以上就是作者对 GPT 的实现,接下来就是将它们组合在一起并运行代码,得到 gpt2.py。它的全部内容只有 120 行代码(如果删除注释和空格,则为 60 行)。
3 }5 [9 s2 H) S" F作者通过以下方式测试结果:
" \6 o' B6 j2 {$ q% h" n2 f* j$ [2 T
$ G( F6 [2 g6 F5 b; A* V0 O) Q. i
: p6 G8 q# H) U9 y( ]" r# ]" V输出结果如下:
! ?0 G: o: F* ^/ ]; b+ k+ m
. n- L* j0 y6 J+ H, W
2 ^+ A* |+ s# p* @! z H3 x" z! v' K/ O C8 f. b0 j2 z
正如作者说的:这次实验成功了。( }; |7 a$ E# R" e
本文只是跟着作者的思路大概介绍了整体流程,想要了解更多内容的小伙伴,可以参考原文链接。8 X+ U9 p! @2 h; Q
原文链接:https://jaykmody.com/blog/gpt-from-scratch/#basic-layers( j. u! n, R! R& Y& t/ `# |
全面学习 ChatGPT,机器之心准备了 89 篇文章合集
4 `8 R6 t' r) M/ P这是一份全面、系统且高质量的 ChatGPT 文章合集,我们筛选出来了 89 篇相关文章,设计了阅读框架与学习路径,大家可以根据自己的需求进行浏览与研读。合集内容包括:
$ V6 J% z9 B4 C5 X1 o7 x" F$ _ChatGPT 及 OpenAI 大事件时间轴2 n. Q8 s. L0 R& @! U) D; F
概念 · 真正搞懂 ChatGPT:共 3 篇文章
+ B' ` E: [3 X; z K' Q- z研究 · GPT 家族更迭:共 16 篇文章
& M6 n# R% Y# Q# M2 s0 I1 F7 |4 Z八年 · OpenAI 的历史与现在:共 13 篇文章8 D6 m/ K2 Q3 f1 V
干货 · GPT 相关研究与技术:共 18 篇文章
9 v2 i! {/ Q" H8 O9 S观点 · 专家谈 ChatGPT:共 8 篇文章' W# ^, x; |/ H/ c
行业 · 应用与探索:共 23 篇文章 W1 Y4 d% q4 f& v: \
行业 · 同类产品:共 8 篇文章
' g5 L2 l: a |+ m5 \& `, U1 P THE END % C, L" _) j/ r! C+ Y
投稿或寻求报道:content@jiqizhixin.com |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|