|
|
机器之心报道
) L8 D9 J H& F- Z- Z机器之心编辑部$ v9 U. g4 H W. K3 x7 g* c8 b
GPT 模型实现起来有时也很简单。
# D3 a. ]' F6 X* o% N H: Q当前,大型语言模型(LLM)被认为是人工智能突破的方向。人们正在尝试用它们做各种复杂的事情,比如问答、创作、数学推理以及编写代码等。近段时间 ChatGPT 持续的爆火是最好的例证。4 |# B+ W- ?: A4 m
然而,对于机器学习从业者来说,大模型的门槛很高:因为体量太大难以训练,很长时间里这个方向一直被大公司垄断。不过最近,简化 GPT 模型的方法越来越多了。1 月中旬,前特斯拉 AI 高级总监 Andrej Karpathy(现已回归 OpenAI)就发布了从零开始构建 GPT 模型的完整教程。不过训练出的 GPT 和 OpenAI 的 GPT-3 比较,两者规模差距达 1 万 - 100 万倍。8 v- l E+ j% z0 ?1 H
近日,加拿大麦克马斯特大学的一位软件工程本科生 Jay Mody 在导入 NumPy 库下,仅用 60 行代码就从头实现了一个 GPT 模型,并将其命名为 PicoGPT。不仅如此,他还将经过训练的 GPT-2 模型权重加载到自己的实现中,并生成了一些文本。下面为 60 行代码展示。
% C; v6 t' ~' E
# v- v' C4 z! w4 ~
; }9 _/ J: t5 F$ ^
% G& W$ T& B9 l( G: v1 q不过要做到这些,你需要熟悉 Python 和 NumPy,还要有一些训练神经网络的基本经验。作者表示,这篇博客旨在对 GPT 进行简单易懂的完整介绍。因此,作者只使用已经训练的模型权重来实现前向传递代码。0 S/ B* s# b8 z$ b
8 Q* U7 q( o* L: e+ F/ l
+ q* c) |; p1 v. z- _# {; T g
5 s3 A3 f$ H& q0 h: ]8 E/ p5 v代码地址:2 A# \0 o: d Z3 \
https://github.com/jaymody/picoGPT/blob/29e78cc52b58ed2c1c483ffea2eb46ff6bdec785/gpt2_pico.py#L3-L584 F3 ^# a* _, Q& P
对于此项研究,Andrej Karpathy 给出了四个字:虽迟但到。想当初,Karpathy 构建的 minGPT 和 nanoGPT 还要 300 行代码。
" w* f! _2 ^' D9 n/ E! v D3 ^6 `- r; M/ Z
5 ]" J# }6 M( y/ U {. I% J
) ~9 ]1 z+ f* L2 Y0 T值得一提的是,这篇教程不是完全零门槛的。为了让读者明白,作者首先介绍了什么是 GPT、它的输入、输出如何等其他内容,介绍得都非常详细。' h9 \. S4 l) `0 J( r
+ z# u- X" q- |
" [ F; M- u* B6 p8 _# G3 |) ~' n$ Y, m$ F, X% b
至于 GPT 到底能干什么,作者给出了几个示例,它能写电子邮件、总结一本书、给你 instagram 标题的想法、向 5 岁的孩子解释黑洞、用 SQL 编写代码等。! ^; O/ [5 h, z: M6 S9 m, d1 T
通过仔细阅读这部分内容后,你能大致了解 GPT 的一些基础知识。有了这些背景介绍,接下来就是如何设置了。/ [7 l) Y5 v6 A9 ^) k4 U
项目介绍2 r+ t, L( J) t: w7 l! R- ]& p
设置& [ i; z4 ?8 F" e6 A7 u, O
这一章节主要介绍了如何设置编码器、超参数以及参数。% L ?9 i" E9 V, H: W" T
0 d* l% g3 c" d3 U0 \/ Y% e! U& Q
% e: V- V6 b1 e
9 N7 ^& n# n0 r/ x你要做的,首先是克隆代码库:9 K: z. e, o! D
% i; e: q$ j' \/ Y$ t- j: s' Y
8 r$ T" `, O( V1 z/ T( [/ l
4 ?3 F# K9 d& w然后安装依赖项:0 V6 R# z& p- s
9 }3 _5 o' |' @2 P1 j! n# f) y
( k6 ]+ v& I$ [) }- d; z+ {
+ I& ^* | t0 u- F$ G6 P- j注意,如果你使用的是 M1 Macbook,在运行 pip install 之前,你需要在 requirements.txt 中将 tensorflow 更改为 tensorflow-macos。在这个项目下,文件包括 encoder.py、utils.py、gpt2.py、gpt2_pico.py:
6 f/ O6 S2 o2 h6 rencoder.py:包含 OpenAI BPE Tokenizer 的代码,直接取自 gpt-2 repo;! H h( q$ d. t
gpt2.py:包含 GPT 模型和生成代码,可以将其作为 python 脚本运行;
" {/ f5 w2 h' T6 I$ L- u$ K; R7 }gpt2_pico.py:与 gpt2.py 相同,但是代码行数更少。
* V; p# I3 _% j, i其中 gpt2.py 需要从头开始实现,因此你要做的是先删除 gpt2.py 并重新创建一个空文件:! |9 f# V% F* v
3 _% F% [5 N; J/ \* ? i' n* g
" R* A0 a6 Y; Z/ ~: B: a* t9 P
9 M/ v- y) z8 c9 i
然后将下列代码复制到 gpt2.py 中:1 J4 C0 _. {' r1 Z Y
$ a* f# C9 l1 `& D" W& W
% ? `5 S9 ^ B8 B
- n; K* h7 Q4 ^7 _上述代码包含 4 个主要部分:
$ N: c4 |+ P/ S/ [9 _2 Ggpt2 函数是本次实现 GPT 的实际代码;& V% j1 m2 f, @$ m& n
generate 函数实现自回归解码算法;2 v" l$ w6 [; z) Q
main 函数;9 v1 `6 e0 z; X: M- {, ^" d4 a
fire.Fire ( main ) 将文件转换为 CLI 应用程序,以便最终可以运行代码:python gpt2.py "some prompt here"。6 i* ?' X8 R) O7 n# j7 U4 V, @" s
main 函数包含有 encode、hparams、params 参数,执行下列代码:
4 w* Z; ? l- F# h, M' c( _; C8 G! Q' q; T/ p& Z& Y3 v
. h8 ^0 m& F% U- B% k+ s
& \- b# ]/ [$ [- [8 |- R设置完成之后,作者开始介绍编码器、超参数、参数的一些细节内容。就拿编码器来说,本文的编码器和 GPT-2 使用的 BPE tokenizer 一样。下面是该编码器编码和解码的一些文本示例:
- u7 J3 p1 z: K2 u J0 [7 G: ^+ Y
( a0 K7 ]+ \* x1 d4 M% t' ?. J! N3 M7 A* L9 s* G2 `0 t) F1 a$ F
/ k" I# F* L& M+ l7 P" L6 o9 f实际的 token 长这个样子:
! l: G3 _0 O9 u8 O
# X) v( X/ z2 Q9 _& p% ]2 D
6 K6 f7 `# b o6 ^$ v% y, l. T8 M! ?$ r5 t
需要注意,有时 token 是单词(例如 Not),有时它们是单词但前面有一个空格(例如 all, 代表一个空格),有时是单词的一部分(例如 capes 被拆分为 cap 和 es ) ,有时它们是标点符号(例如 .)。
' ^2 C, n$ ~8 D# HBPE 的一个好处是它可以对任意字符串进行编码,如果遇到词汇表中不存在的内容,它会将其分解为它能理解的子字符串:
; {% V& J0 f/ N) l4 x- _5 `$ {& g3 @' d- K
; q* B) u+ k; d2 ^: \: B3 r4 {+ E
更细节的内容不再赘述。接下来介绍基础神经网络,这一部分就更加基础了,主要包括 GELU、Softmax 函数以及 Layer Normalization 和 Linear。4 } i* U" |: i
4 H, L' F3 ? _5 N6 N7 J' u) n+ u) v: j
! v' u; i- G3 c, A9 o; L; q* F) R
每一小部分都有代码示例,例如在 Linear 部分,作者展示了标准矩阵乘法 + 偏置:
& C: Y* p) T# u; m6 ]1 {* @+ b" @. W- ~$ ~
1 u1 ?$ c, {' _- _, F: R1 A# @' U/ A& p3 a& g
线性层从一个向量空间投影到另一个向量空间的代码如下:
8 u; N5 S* q& S. ^, s- j2 q4 o5 t" @& [1 [ H
# c5 O8 ~9 E/ P B
" g/ h. s0 o3 H: x+ L( {1 QGPT 架构
: |8 d6 o U, |* ~) j这部分介绍 GPT 自身架构。
@3 A+ f% o% P, B H/ @% [ m* d, r+ \4 a c: e) t
) O4 j' |. j# a ~$ B( b: s
6 U4 d: \! G: F" XTransformer 架构如下:$ |) K/ W0 }" o2 P: A
" B4 c4 }: E. |: }, n" h
, p( |1 l" X9 M4 `) C/ _# x% [ E
8 j2 U% m' r) A; n" L6 w$ n- c* ETransformer 仅使用解码器堆栈(图的右侧部分):
$ f( v- M# M! \, l/ N% u. W
4 ]9 a9 @, d+ n8 f
, f( r! q; F9 q0 u4 ]* C% t. E
需要注意,由于摆脱了编码器,中间的交叉注意力层也被删除了。/ p$ |: u+ `) |0 F P
在高层次上,GPT 体系架构有以下三个部分:! B9 n! {/ m) g; ]
文本 + 位置嵌入;9 T' p0 S- A% x/ J" K7 ?
Transformer 解码器堆栈;
* a; p3 k/ H6 d1 \% M, w; Z投影到词汇表。8 s; @% H) E/ q
代码就像下面这样:. c8 o1 H) V" L; M3 W% I
( J4 G/ B5 F" m2 ~) P8 i: @
+ K+ }6 _6 W+ ~1 F; W' m- [5 T7 O* `# }: P4 O: o
代码部分截图
) P, J& \" P& k% E; r1 |) N接下来更详细地分解以上三个部分中的每一个部分,这里也不再赘述。
4 |0 }2 R1 [7 G& Z; q. Q, z6 _以上就是作者对 GPT 的实现,接下来就是将它们组合在一起并运行代码,得到 gpt2.py。它的全部内容只有 120 行代码(如果删除注释和空格,则为 60 行)。
% a# x( i) `- k: r作者通过以下方式测试结果:
/ d4 x1 X. ~3 F6 u5 x) w Q$ M! W- Y
% d, R. ~# z( N+ ?8 N R9 w% K
+ I0 g$ C9 o7 R4 ]7 {5 I输出结果如下:0 A! }9 y0 M: l7 N; ]* R
+ C4 e+ y; B# n- ^4 T& u$ H
! D1 S0 f, b! Y+ N9 z1 r. x
$ Q# L# u! ]( h. { p正如作者说的:这次实验成功了。
/ C; B; O2 V5 h本文只是跟着作者的思路大概介绍了整体流程,想要了解更多内容的小伙伴,可以参考原文链接。6 @6 ^+ N2 f3 j1 d8 U
原文链接:https://jaykmody.com/blog/gpt-from-scratch/#basic-layers' J0 g7 J8 v! |( J O2 b. m% j1 d
全面学习 ChatGPT,机器之心准备了 89 篇文章合集
: \8 v: f c M. N3 \% G这是一份全面、系统且高质量的 ChatGPT 文章合集,我们筛选出来了 89 篇相关文章,设计了阅读框架与学习路径,大家可以根据自己的需求进行浏览与研读。合集内容包括:
2 h. e4 M! L+ o, xChatGPT 及 OpenAI 大事件时间轴
' s$ }$ N) |8 b! L! m* `) n概念 · 真正搞懂 ChatGPT:共 3 篇文章
* W6 Z$ \! _+ u' c6 \研究 · GPT 家族更迭:共 16 篇文章3 G( }$ N, |; u0 L, |
八年 · OpenAI 的历史与现在:共 13 篇文章! L" d" E8 Y4 Z! D. w9 Q/ Z2 I
干货 · GPT 相关研究与技术:共 18 篇文章6 Z) ~8 l7 T) [( v
观点 · 专家谈 ChatGPT:共 8 篇文章
7 r5 i/ E1 s0 u4 s% g! O) ~行业 · 应用与探索:共 23 篇文章
3 K! u- v' D g+ H1 Z行业 · 同类产品:共 8 篇文章1 O: G! h' ^- {# H* j4 s4 @
THE END 7 v" b/ i$ v* o8 a
投稿或寻求报道:content@jiqizhixin.com |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|