|
|
机器之心报道
1 M$ h' I9 u d0 l机器之心编辑部1 O! u( @ G# d$ i# n- v5 s, G" a
GPT 模型实现起来有时也很简单。
6 x+ B I& [7 _当前,大型语言模型(LLM)被认为是人工智能突破的方向。人们正在尝试用它们做各种复杂的事情,比如问答、创作、数学推理以及编写代码等。近段时间 ChatGPT 持续的爆火是最好的例证。" [& P& v+ k. p4 w! J- G( A* S
然而,对于机器学习从业者来说,大模型的门槛很高:因为体量太大难以训练,很长时间里这个方向一直被大公司垄断。不过最近,简化 GPT 模型的方法越来越多了。1 月中旬,前特斯拉 AI 高级总监 Andrej Karpathy(现已回归 OpenAI)就发布了从零开始构建 GPT 模型的完整教程。不过训练出的 GPT 和 OpenAI 的 GPT-3 比较,两者规模差距达 1 万 - 100 万倍。
4 R/ B; d9 G, l0 P; l! E近日,加拿大麦克马斯特大学的一位软件工程本科生 Jay Mody 在导入 NumPy 库下,仅用 60 行代码就从头实现了一个 GPT 模型,并将其命名为 PicoGPT。不仅如此,他还将经过训练的 GPT-2 模型权重加载到自己的实现中,并生成了一些文本。下面为 60 行代码展示。
: P: w' G2 N. u! d, g _
3 X4 [7 k( r7 s' A) s6 l& X9 g1 ?$ g8 u: n8 e( T
- j( N( o5 ?: V% G. S
不过要做到这些,你需要熟悉 Python 和 NumPy,还要有一些训练神经网络的基本经验。作者表示,这篇博客旨在对 GPT 进行简单易懂的完整介绍。因此,作者只使用已经训练的模型权重来实现前向传递代码。
9 _; |) V0 N% c( t1 a* i& P8 s3 z- ~1 ~9 ~: \
: \' W7 t4 r8 p% h$ q) l4 D# G" }) d! h5 J
代码地址:
7 h; Y0 ~# n r3 O$ |: h W( m* g% qhttps://github.com/jaymody/picoGPT/blob/29e78cc52b58ed2c1c483ffea2eb46ff6bdec785/gpt2_pico.py#L3-L58. ]( r2 Y; S9 T0 n
对于此项研究,Andrej Karpathy 给出了四个字:虽迟但到。想当初,Karpathy 构建的 minGPT 和 nanoGPT 还要 300 行代码。! h6 O! V2 N' \2 E8 O
' M. L4 ?( H7 ?& m- |
$ `$ F. ?0 c: \9 k% V
& ^0 k0 Y" c/ p7 b& I值得一提的是,这篇教程不是完全零门槛的。为了让读者明白,作者首先介绍了什么是 GPT、它的输入、输出如何等其他内容,介绍得都非常详细。: L) ~# d& [% X5 L
, {, G7 t$ Q# g9 C; k& ^; j: |7 F9 M1 s" j3 H
% ?4 N4 A8 [8 X; G4 n2 @( q至于 GPT 到底能干什么,作者给出了几个示例,它能写电子邮件、总结一本书、给你 instagram 标题的想法、向 5 岁的孩子解释黑洞、用 SQL 编写代码等。
+ ^: w6 g- E) _0 o/ w4 q4 V1 ]% _6 j通过仔细阅读这部分内容后,你能大致了解 GPT 的一些基础知识。有了这些背景介绍,接下来就是如何设置了。: i6 x! f) N( f. L
项目介绍( i" g" h* |2 d
设置
3 j: \* ?% a; V! d这一章节主要介绍了如何设置编码器、超参数以及参数。7 E# I2 P* o/ l- P& j& [/ D
* b1 p5 a! s9 j' F) p$ _
0 ]3 y; e% K( a" Z5 e
! u; j' }) F& [( ]1 ~, W( ^4 o; `
你要做的,首先是克隆代码库:9 R6 a9 \1 w6 | e$ \
% E3 A& r3 t6 j6 T/ ^+ Q/ s, ]/ c+ J7 K$ V
, {. G% D: T& ` A# @7 N' `5 d
然后安装依赖项: T6 K: ]7 @/ A6 `/ o$ v/ Z" ~
. |1 s9 K0 b; i. I/ m' U
6 H' N% h/ _0 l9 r# k' I2 _. l* J: X) e' W1 u1 E+ p
注意,如果你使用的是 M1 Macbook,在运行 pip install 之前,你需要在 requirements.txt 中将 tensorflow 更改为 tensorflow-macos。在这个项目下,文件包括 encoder.py、utils.py、gpt2.py、gpt2_pico.py:6 o, @# p1 f1 r5 y2 J2 c
encoder.py:包含 OpenAI BPE Tokenizer 的代码,直接取自 gpt-2 repo;- ~- {1 M: c2 x: h, Q* Z
gpt2.py:包含 GPT 模型和生成代码,可以将其作为 python 脚本运行;
3 _/ j- N% T6 Fgpt2_pico.py:与 gpt2.py 相同,但是代码行数更少。+ t8 B% j& j& p
其中 gpt2.py 需要从头开始实现,因此你要做的是先删除 gpt2.py 并重新创建一个空文件:1 P R0 y$ ^1 h- y# q- g
9 a% P- ?: n, {$ {9 V; [; q7 D2 M
) a0 E1 n% _% m9 t! n
" i3 |. u' g4 x: s5 J然后将下列代码复制到 gpt2.py 中:$ B! d( J* `+ }% P9 \! ^
& \: u+ ~9 Z4 q9 p& z8 ?3 j) @% ?) \
2 l8 [6 _0 E# R6 O
上述代码包含 4 个主要部分:
+ }/ o' N! `1 J0 e" r+ lgpt2 函数是本次实现 GPT 的实际代码;
* K+ N N8 O0 S X& M; n7 dgenerate 函数实现自回归解码算法;/ [# Y# t" V: K- ]
main 函数;7 ~' r( h: ]% r- u8 }: c
fire.Fire ( main ) 将文件转换为 CLI 应用程序,以便最终可以运行代码:python gpt2.py "some prompt here"。+ N6 \( l3 h/ H5 h6 a R& `9 G
main 函数包含有 encode、hparams、params 参数,执行下列代码:
: R/ I# h. Y( V4 d& l, J* a( s% F- e, a5 ?* U
8 B7 y! s( x/ a1 D
$ {5 o9 i, b: o0 p8 `9 J设置完成之后,作者开始介绍编码器、超参数、参数的一些细节内容。就拿编码器来说,本文的编码器和 GPT-2 使用的 BPE tokenizer 一样。下面是该编码器编码和解码的一些文本示例:
1 L" [' @0 f+ ?$ M0 T$ ]2 w+ j# J
+ m2 R6 ~& h5 d+ O0 l* \9 [. \) i* [
8 H' X5 m" D" ?; I* x c6 l实际的 token 长这个样子:
0 m' a1 p! D1 a2 r+ ^ q' Q6 U6 Y# Z+ B
( }; d. H0 u& b" b. @& \+ [% B# }4 j
+ m) T7 ~. j% N* h% N$ M( m& o
需要注意,有时 token 是单词(例如 Not),有时它们是单词但前面有一个空格(例如 all, 代表一个空格),有时是单词的一部分(例如 capes 被拆分为 cap 和 es ) ,有时它们是标点符号(例如 .)。
. V+ S# w# x8 t9 FBPE 的一个好处是它可以对任意字符串进行编码,如果遇到词汇表中不存在的内容,它会将其分解为它能理解的子字符串:
8 e, ^! ^6 F) }# e3 z, x: x
2 d5 o, ^( q1 a% i! s5 \; g( K9 M* Q* t' O6 e/ F# k
1 l' Z) _; ?9 }, ^+ H( ]- _1 j
更细节的内容不再赘述。接下来介绍基础神经网络,这一部分就更加基础了,主要包括 GELU、Softmax 函数以及 Layer Normalization 和 Linear。
/ l# a) V' ^+ O; s2 d4 g3 h) M- l; Q% G( q. [5 o, `* b
& T( k! s3 l2 s! e1 p% } F! a( N7 v
5 T7 m; _ e$ A* j! z0 [! _9 Z每一小部分都有代码示例,例如在 Linear 部分,作者展示了标准矩阵乘法 + 偏置:
$ i5 a5 g9 T6 R* u# @ s$ [* Q$ o8 E' @- w7 J' _! P" j
2 I& Z8 n$ m/ c2 w$ t" a3 L! G/ \9 H+ h& N# A* V! A0 H4 x
线性层从一个向量空间投影到另一个向量空间的代码如下:
4 C( s/ z' N) o. ~
0 p) X- H4 d, v" v6 }% d& |5 d! `, V
7 f) X: }4 C: FGPT 架构
]- G4 |: E# e. _8 d这部分介绍 GPT 自身架构。
# q+ O# P- }8 G$ s5 D: E, a3 p. ?6 Z$ X- r4 C0 K
- S) y4 l! n. E' a- q5 U. t) D
# P: u( j( n! x* ]Transformer 架构如下:! k+ w7 k) {! u. V, H4 } o: r
: w4 K: i$ {- J' B; N5 M5 I, W: e
) N: A6 o! N m! J0 U* f: S+ N# [- u; K& H
Transformer 仅使用解码器堆栈(图的右侧部分):
+ W" `: ]/ T, q8 t9 }2 O+ s9 N# ^- u e3 b3 \( I3 z$ s
& x( Y' _0 o8 P' U8 Q X$ {; `
: j$ j3 I& S2 m* h& w$ v8 p
需要注意,由于摆脱了编码器,中间的交叉注意力层也被删除了。0 _0 t3 f! E' p! \- Z
在高层次上,GPT 体系架构有以下三个部分:7 G9 _# n6 D& n3 C; ?, H
文本 + 位置嵌入;
; s C/ ` O" _: KTransformer 解码器堆栈;
7 B+ ~$ v K/ ~2 |" E6 s6 m% J投影到词汇表。
l( M! K9 i. G3 ?代码就像下面这样:
2 o; p; X# v) h' E3 i- @: D# E* `
! N9 k! {* U ?- P o! ^5 Y2 b0 ^/ l" ]5 s5 {
9 W0 t2 w }7 f7 k
代码部分截图& G L W9 f5 x2 J2 \) a
接下来更详细地分解以上三个部分中的每一个部分,这里也不再赘述。# B6 n" V, [' p1 r% ? P, n
以上就是作者对 GPT 的实现,接下来就是将它们组合在一起并运行代码,得到 gpt2.py。它的全部内容只有 120 行代码(如果删除注释和空格,则为 60 行)。
8 t( V/ j; _% e% @作者通过以下方式测试结果:( {: @ v N& H4 a
2 U5 _ g9 r0 k8 q9 i- ]5 P
2 U, W* \9 T* ~# M4 Q% W8 a
3 J8 a9 C9 }/ _9 z: L. k输出结果如下:
0 F9 I0 O! C0 f u/ C2 o5 |# N2 j) @0 ~
6 e) z u2 p% q e' k W& Y$ }2 n6 K
正如作者说的:这次实验成功了。, l- l0 W7 {# l0 R' w
本文只是跟着作者的思路大概介绍了整体流程,想要了解更多内容的小伙伴,可以参考原文链接。( w' q& z7 w) n, P6 {8 k# T2 H
原文链接:https://jaykmody.com/blog/gpt-from-scratch/#basic-layers
* M. H9 t" Z% f( i全面学习 ChatGPT,机器之心准备了 89 篇文章合集 q- ~. l. N8 q, ?" \7 n
这是一份全面、系统且高质量的 ChatGPT 文章合集,我们筛选出来了 89 篇相关文章,设计了阅读框架与学习路径,大家可以根据自己的需求进行浏览与研读。合集内容包括:
( h% w Y0 J3 b% SChatGPT 及 OpenAI 大事件时间轴
* _) M' U- y9 o: |& |# k! R: }概念 · 真正搞懂 ChatGPT:共 3 篇文章
& n7 o+ S Q+ D* R" T- l ?8 j研究 · GPT 家族更迭:共 16 篇文章/ W" E% \+ P- X, @# k
八年 · OpenAI 的历史与现在:共 13 篇文章
) B- X- I# ]5 E. k4 v* y干货 · GPT 相关研究与技术:共 18 篇文章( V/ L, m8 S: g& l7 ]: @$ b6 ?. @
观点 · 专家谈 ChatGPT:共 8 篇文章
2 r8 C" }0 q' u; b/ `8 _$ y" m行业 · 应用与探索:共 23 篇文章
6 y, n5 i0 @1 o) Y4 t! x& r. d/ |, e行业 · 同类产品:共 8 篇文章* p3 [0 D9 y# r$ k5 K' |( i( |
THE END , |) I8 J% P: r7 r+ i, ]
投稿或寻求报道:content@jiqizhixin.com |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|