|
|
机器之心报道
1 s* M* J- R, L |机器之心编辑部, Z' h# @- U' _+ N. R' a. M1 A
GPT 模型实现起来有时也很简单。
S2 S: T" ?/ T8 M. L& V; ~当前,大型语言模型(LLM)被认为是人工智能突破的方向。人们正在尝试用它们做各种复杂的事情,比如问答、创作、数学推理以及编写代码等。近段时间 ChatGPT 持续的爆火是最好的例证。0 [ u! h2 k& K c# E, F* U) r4 S, V
然而,对于机器学习从业者来说,大模型的门槛很高:因为体量太大难以训练,很长时间里这个方向一直被大公司垄断。不过最近,简化 GPT 模型的方法越来越多了。1 月中旬,前特斯拉 AI 高级总监 Andrej Karpathy(现已回归 OpenAI)就发布了从零开始构建 GPT 模型的完整教程。不过训练出的 GPT 和 OpenAI 的 GPT-3 比较,两者规模差距达 1 万 - 100 万倍。
, {7 N" [ A2 P4 p8 f, N近日,加拿大麦克马斯特大学的一位软件工程本科生 Jay Mody 在导入 NumPy 库下,仅用 60 行代码就从头实现了一个 GPT 模型,并将其命名为 PicoGPT。不仅如此,他还将经过训练的 GPT-2 模型权重加载到自己的实现中,并生成了一些文本。下面为 60 行代码展示。5 S; Y, G- s4 C5 p7 r% C+ L
5 T- X9 S" _4 \0 Q( B
& T/ y) E' B; A
, t& T- q% `8 G5 h& x7 G6 |6 S/ }不过要做到这些,你需要熟悉 Python 和 NumPy,还要有一些训练神经网络的基本经验。作者表示,这篇博客旨在对 GPT 进行简单易懂的完整介绍。因此,作者只使用已经训练的模型权重来实现前向传递代码。4 K( H/ o% A" Z5 Y$ Z) r9 R+ A6 W1 k
- C" h# m! t ~: v6 a; M7 v# r: M! v: }6 h1 }
- d, f% F# A" ]# R- P$ u代码地址:8 Z2 V) k W+ U+ @7 d+ f G
https://github.com/jaymody/picoGPT/blob/29e78cc52b58ed2c1c483ffea2eb46ff6bdec785/gpt2_pico.py#L3-L58
1 e% c# H) L4 C. ^9 G" g" P; U对于此项研究,Andrej Karpathy 给出了四个字:虽迟但到。想当初,Karpathy 构建的 minGPT 和 nanoGPT 还要 300 行代码。
O7 P% k4 Z! @5 }2 {8 T, A; Q& ?
% ]5 _8 C! ? O5 f. N5 p
; ?- h8 Q R) ^% E* I! [* S6 q: T) W值得一提的是,这篇教程不是完全零门槛的。为了让读者明白,作者首先介绍了什么是 GPT、它的输入、输出如何等其他内容,介绍得都非常详细。
; W* C7 `, _1 x. X+ U8 L) X( A7 r
, M' E! p. p/ Z* I( Q. K6 a' X0 L6 n% V) u! f
) @5 S8 l6 T! I至于 GPT 到底能干什么,作者给出了几个示例,它能写电子邮件、总结一本书、给你 instagram 标题的想法、向 5 岁的孩子解释黑洞、用 SQL 编写代码等。
& U1 j6 Y7 }; ]; E通过仔细阅读这部分内容后,你能大致了解 GPT 的一些基础知识。有了这些背景介绍,接下来就是如何设置了。
0 |" _6 H* E! v# N5 q3 l' j项目介绍( D0 `! B2 p* e( V& ]+ Z
设置" M; f7 v& i) D" w( E
这一章节主要介绍了如何设置编码器、超参数以及参数。 U/ Q h4 w8 [) y
1 |8 q4 {) [) ~
; H$ b9 ~3 g7 j) f& m/ w$ c: u* p$ a* S: n
你要做的,首先是克隆代码库:9 _% K( ~" |. [6 [7 J7 M
5 v1 e$ ?! d1 z7 A3 a" v0 _
$ L9 x j7 ^( e3 A) U# m; q& \% R( s" R4 X2 }
然后安装依赖项:
4 l. S) s4 z7 W
$ `$ w: @* [% a1 |+ K \
/ T7 q4 M" y$ J' S* {, f
$ Y0 u1 |9 y8 R+ I2 u" C注意,如果你使用的是 M1 Macbook,在运行 pip install 之前,你需要在 requirements.txt 中将 tensorflow 更改为 tensorflow-macos。在这个项目下,文件包括 encoder.py、utils.py、gpt2.py、gpt2_pico.py:
1 D! V- j: O+ ~' f5 {) O; U$ eencoder.py:包含 OpenAI BPE Tokenizer 的代码,直接取自 gpt-2 repo;& B9 w# C& Y- ?
gpt2.py:包含 GPT 模型和生成代码,可以将其作为 python 脚本运行;! Y$ O1 @1 O( p" V8 S
gpt2_pico.py:与 gpt2.py 相同,但是代码行数更少。
% H: v" f( F* p/ i, e" T其中 gpt2.py 需要从头开始实现,因此你要做的是先删除 gpt2.py 并重新创建一个空文件:
+ n+ \' P h* I5 j' ?8 E' H: o- }
: }2 s+ ~' {! Y8 f8 k) X* J. X0 _, o! d( [/ j) W( j$ u4 g
3 ?! s5 d1 ~: {* p9 _7 q然后将下列代码复制到 gpt2.py 中:) B- r5 l( [+ Q6 ~) j
9 ?( @( g2 N2 }& W. C. \% L9 k# c$ ~/ ] u
# {9 y! X+ O$ l7 p8 I9 S
上述代码包含 4 个主要部分:2 y! e, y* T8 J% ~4 M; U
gpt2 函数是本次实现 GPT 的实际代码;
t; ?; `2 z9 O Q" M K& \generate 函数实现自回归解码算法;; v, b$ b8 b0 t1 ], U
main 函数;
% A/ q3 Z- o3 v5 r/ l$ X6 d7 q1 Wfire.Fire ( main ) 将文件转换为 CLI 应用程序,以便最终可以运行代码:python gpt2.py "some prompt here"。
b6 d' X, _* Mmain 函数包含有 encode、hparams、params 参数,执行下列代码:
" \) l8 u; E& {4 E$ F- |/ `. d' i* m3 b ^
+ ? Z3 ]2 o- ~ @3 ]; u; O% ~9 _$ R+ b- H1 }. E
设置完成之后,作者开始介绍编码器、超参数、参数的一些细节内容。就拿编码器来说,本文的编码器和 GPT-2 使用的 BPE tokenizer 一样。下面是该编码器编码和解码的一些文本示例:
6 s6 j% ]$ P% ^+ m& q* Z: z! E6 f5 G% Y5 k% t( G2 v+ A
# n; ~6 z! F5 Y
- P& {3 {5 J* U$ v$ M$ y0 Z5 z实际的 token 长这个样子:8 X) a) ]9 V- C7 O8 E8 W
" z. c n- l: ?5 S& F. e8 j' h8 M1 S/ v* C7 }: q
6 H# E/ X- t" E3 M/ P' Y' x需要注意,有时 token 是单词(例如 Not),有时它们是单词但前面有一个空格(例如 all, 代表一个空格),有时是单词的一部分(例如 capes 被拆分为 cap 和 es ) ,有时它们是标点符号(例如 .)。7 J2 |) {3 i- K! W5 N
BPE 的一个好处是它可以对任意字符串进行编码,如果遇到词汇表中不存在的内容,它会将其分解为它能理解的子字符串:# G: p% J) W5 {
9 d) X2 [# L3 _6 o
. \# H* ^$ ~: r% a5 g
- F2 F$ v2 _' v更细节的内容不再赘述。接下来介绍基础神经网络,这一部分就更加基础了,主要包括 GELU、Softmax 函数以及 Layer Normalization 和 Linear。3 f- D4 S r. o" x; N4 D
1 ]% O6 t9 Z- t; }6 N2 \6 h
) n; W; Z& d/ a$ X/ h. x# @' f+ {
( p# Z( `1 R0 Z$ c' @# j2 e+ r6 b每一小部分都有代码示例,例如在 Linear 部分,作者展示了标准矩阵乘法 + 偏置:
0 ]1 p4 t) _5 E0 C" W( W, F: N9 ^0 @ @! w- [" f
$ Z9 u% \- x7 ~; v* M$ [* Y" f. @
" O4 I% n: N& G6 f3 w' K% d" ?" z
线性层从一个向量空间投影到另一个向量空间的代码如下:
* N. ~6 E: w: L. @2 y; W' C
1 N) w7 D1 I0 l8 b$ T$ c8 z( G0 l/ q. U f. t! a! q/ P
' K) X: u+ @0 L! S# O. z6 yGPT 架构
( Z# U7 Q8 y% ^! M( Z/ B2 o+ e这部分介绍 GPT 自身架构。" v1 y. E- d. U9 V
" H$ h D5 x. {) ^ B0 x# |' h% x0 d1 G0 S: g
9 D3 b) I- w- O* h+ C
Transformer 架构如下:
$ q, a4 L1 a0 n& E/ l$ } o, Y b' L+ k" k8 } h
4 S x% Y' [- {* L) X- D- Q, x( k5 ?& c+ ~7 r
Transformer 仅使用解码器堆栈(图的右侧部分):
7 ~* o! ]3 e& U# ]" b' y' a7 M, Y r) p! A
* P. W) G5 d( O9 |4 W4 X7 l i- G. v0 ?4 f( j( ]0 E! w
需要注意,由于摆脱了编码器,中间的交叉注意力层也被删除了。, G9 r! O7 B( Q3 c
在高层次上,GPT 体系架构有以下三个部分:; R( Q1 l: R' o; W0 l& o
文本 + 位置嵌入;
% k, L, e3 k5 a% N, GTransformer 解码器堆栈;- ]. D$ W3 O* Z4 v% u' ~8 f) l0 G
投影到词汇表。
" k9 k2 [, G" L* K( I! v代码就像下面这样:- S& J7 D8 {6 u8 @) X3 Y" b7 M1 X! q e
2 \2 s* n( X7 \( z4 k- g4 L
3 F9 M6 D( E. q a# Z" j
! H6 r$ F( `; m1 c0 M T代码部分截图
) P; |2 e& p! O& ?接下来更详细地分解以上三个部分中的每一个部分,这里也不再赘述。6 O L, t( N* p7 t
以上就是作者对 GPT 的实现,接下来就是将它们组合在一起并运行代码,得到 gpt2.py。它的全部内容只有 120 行代码(如果删除注释和空格,则为 60 行)。6 _1 j- [; q# T3 u+ g
作者通过以下方式测试结果:
q, B" V; D, t4 `4 p2 x
; L7 h3 q7 O6 H) U' X1 K* }& u1 r
8 y1 J) r; K! U8 C2 J2 A) W9 P% F+ E; |4 n5 w1 Z8 [
输出结果如下: W# ]& k" S V& D! o6 ~
/ T8 ]0 D3 d3 f, Y$ A% `4 H. ]: ^1 K b5 Q$ [ @" i! i9 t( R
9 a6 a# U4 J. q& M& L$ Z正如作者说的:这次实验成功了。
- d4 ^ A# p0 N本文只是跟着作者的思路大概介绍了整体流程,想要了解更多内容的小伙伴,可以参考原文链接。, X. S6 V% Y% m
原文链接:https://jaykmody.com/blog/gpt-from-scratch/#basic-layers0 C. J5 L' l" k
全面学习 ChatGPT,机器之心准备了 89 篇文章合集
6 V) c8 T8 u1 [! s& z这是一份全面、系统且高质量的 ChatGPT 文章合集,我们筛选出来了 89 篇相关文章,设计了阅读框架与学习路径,大家可以根据自己的需求进行浏览与研读。合集内容包括:
& z4 L4 v* Q: E* z0 [ChatGPT 及 OpenAI 大事件时间轴
; l) j' a" e; V) _6 ?概念 · 真正搞懂 ChatGPT:共 3 篇文章* Z/ Q# p; ?% v6 J# k/ K0 w6 E( L
研究 · GPT 家族更迭:共 16 篇文章0 g( e3 U8 r, Y) h
八年 · OpenAI 的历史与现在:共 13 篇文章! p! a2 q3 Y! |/ o% w3 M
干货 · GPT 相关研究与技术:共 18 篇文章
8 B- |' \+ X1 B- M观点 · 专家谈 ChatGPT:共 8 篇文章! m0 W0 U# N; r, L" z4 e
行业 · 应用与探索:共 23 篇文章
' [7 s) b7 Q, n, W4 b行业 · 同类产品:共 8 篇文章. N& t9 N4 G$ L3 [" Z* C- u5 ^
THE END 7 x# e1 _" Q3 F& _
投稿或寻求报道:content@jiqizhixin.com |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|