|
|
机器之心报道6 ~1 a( F. A/ P
机器之心编辑部7 N5 z4 _. k D; k+ a
GPT 模型实现起来有时也很简单。
5 ~4 ^( E, a( [6 V当前,大型语言模型(LLM)被认为是人工智能突破的方向。人们正在尝试用它们做各种复杂的事情,比如问答、创作、数学推理以及编写代码等。近段时间 ChatGPT 持续的爆火是最好的例证。
9 E& \7 X9 A- Y! m9 c然而,对于机器学习从业者来说,大模型的门槛很高:因为体量太大难以训练,很长时间里这个方向一直被大公司垄断。不过最近,简化 GPT 模型的方法越来越多了。1 月中旬,前特斯拉 AI 高级总监 Andrej Karpathy(现已回归 OpenAI)就发布了从零开始构建 GPT 模型的完整教程。不过训练出的 GPT 和 OpenAI 的 GPT-3 比较,两者规模差距达 1 万 - 100 万倍。4 R8 i# ?1 _& h5 `* ?, X- J$ E
近日,加拿大麦克马斯特大学的一位软件工程本科生 Jay Mody 在导入 NumPy 库下,仅用 60 行代码就从头实现了一个 GPT 模型,并将其命名为 PicoGPT。不仅如此,他还将经过训练的 GPT-2 模型权重加载到自己的实现中,并生成了一些文本。下面为 60 行代码展示。
+ U$ j: @2 Y; Y- r2 K3 X9 ~* D. ]
* O4 E2 w+ Y# z# s j0 N1 o8 g" W; C6 [* W2 d* z# j. v
0 n. g9 R' X' G" I- Q2 ?
不过要做到这些,你需要熟悉 Python 和 NumPy,还要有一些训练神经网络的基本经验。作者表示,这篇博客旨在对 GPT 进行简单易懂的完整介绍。因此,作者只使用已经训练的模型权重来实现前向传递代码。
# u* n+ p: u3 g& I. ~$ Q: S
# F- q* U; L0 e: ^! ~. p5 u# n! `1 u& h! n
% p9 i0 A( b; P1 x) r
代码地址:
3 S$ h, l' a$ Xhttps://github.com/jaymody/picoGPT/blob/29e78cc52b58ed2c1c483ffea2eb46ff6bdec785/gpt2_pico.py#L3-L58% {3 k! E# L& X: ?- w; W" n' E
对于此项研究,Andrej Karpathy 给出了四个字:虽迟但到。想当初,Karpathy 构建的 minGPT 和 nanoGPT 还要 300 行代码。
# o4 l( l! u, h' e7 ]# y, M# m0 ]! i- h0 A" p2 e" S
, b$ N7 R5 M( W6 f
1 ]. z/ s M) c; I) U, q# {3 X M ^值得一提的是,这篇教程不是完全零门槛的。为了让读者明白,作者首先介绍了什么是 GPT、它的输入、输出如何等其他内容,介绍得都非常详细。
; }) g8 N3 l( | c H. `" O3 v% W2 M; |8 Q/ A! |0 m
& r$ |/ o+ P, I% T Z+ n0 x) C( a* U+ }5 n
至于 GPT 到底能干什么,作者给出了几个示例,它能写电子邮件、总结一本书、给你 instagram 标题的想法、向 5 岁的孩子解释黑洞、用 SQL 编写代码等。
5 I0 z2 L. a8 Z3 z通过仔细阅读这部分内容后,你能大致了解 GPT 的一些基础知识。有了这些背景介绍,接下来就是如何设置了。
$ j# {( {8 `$ t% G项目介绍
) N m0 J' C2 ^* K% ~设置% L, J+ P! }4 g$ O
这一章节主要介绍了如何设置编码器、超参数以及参数。
2 q- G7 f, `2 |* B* h5 d* X6 r: ]. ~# n" ?: b+ G5 A3 k8 Z* n
; e$ N, }9 B/ J4 Q" e% d5 d$ U3 Z( ?8 E" {. y3 _5 @" x
你要做的,首先是克隆代码库:
" Q: `6 y, @7 h; J: N1 Z* n( I
/ k8 s% G# }4 ~' y6 Y2 X/ J) E" \- j9 B! l7 f3 ]
6 {' {5 R& B& f. q# g- i) r然后安装依赖项:6 ^% W! z& o- k1 p/ L6 R
) Z5 o% Y% M, U2 S
. |& X! Z$ ~; F6 W5 c2 b3 a7 _! g5 x# W. V0 f
注意,如果你使用的是 M1 Macbook,在运行 pip install 之前,你需要在 requirements.txt 中将 tensorflow 更改为 tensorflow-macos。在这个项目下,文件包括 encoder.py、utils.py、gpt2.py、gpt2_pico.py:
; h5 x% F Q% K cencoder.py:包含 OpenAI BPE Tokenizer 的代码,直接取自 gpt-2 repo;! w. P* a- A, L# \* q
gpt2.py:包含 GPT 模型和生成代码,可以将其作为 python 脚本运行;) r" M, C# ^% m# q H. U: n* h3 l2 \
gpt2_pico.py:与 gpt2.py 相同,但是代码行数更少。
6 M4 g! b& K( t7 }0 [5 u9 X: U其中 gpt2.py 需要从头开始实现,因此你要做的是先删除 gpt2.py 并重新创建一个空文件:! H. [$ _* Z7 |$ q- I
0 [; d8 P8 d, L) @( o+ D, g
; Y# U# `* g# W, d0 ~# q; G8 C& q( u# R
然后将下列代码复制到 gpt2.py 中:
$ f1 X( M$ O2 r' f7 ]: V" a4 H4 J0 a- W/ F8 w# z
* T5 M/ N/ n4 o" s8 i, ]
l6 u) U0 c8 K, k
上述代码包含 4 个主要部分:
! m' A* F& `5 zgpt2 函数是本次实现 GPT 的实际代码;: ?6 b; ]9 f4 k. m% U
generate 函数实现自回归解码算法;2 K( X6 r8 a% c3 E, S5 e9 O
main 函数;
( l. j1 D5 M3 g9 bfire.Fire ( main ) 将文件转换为 CLI 应用程序,以便最终可以运行代码:python gpt2.py "some prompt here"。
. s5 a4 B& W* T5 xmain 函数包含有 encode、hparams、params 参数,执行下列代码:
; M+ v2 B8 @ j- I0 X4 C/ _+ z1 W: O6 d, L5 M
6 d1 w2 g4 F6 I0 s: ?9 a3 w; S
; p9 E) n/ k5 C8 D设置完成之后,作者开始介绍编码器、超参数、参数的一些细节内容。就拿编码器来说,本文的编码器和 GPT-2 使用的 BPE tokenizer 一样。下面是该编码器编码和解码的一些文本示例:: Y* _& m5 O3 v# j
: X" i: R% b( B/ k: l- }8 \
, v& F, N; ~% O' c) r/ \
' ^% `% [: z& z# c" z实际的 token 长这个样子:7 ]% t- D1 t s$ N; j% r
* Y+ H. j/ N) h% ~; @
" X; W9 V3 V/ K y8 C4 Z% o! V0 w. k; L6 G
需要注意,有时 token 是单词(例如 Not),有时它们是单词但前面有一个空格(例如 all, 代表一个空格),有时是单词的一部分(例如 capes 被拆分为 cap 和 es ) ,有时它们是标点符号(例如 .)。, S4 q" e0 B% u1 e
BPE 的一个好处是它可以对任意字符串进行编码,如果遇到词汇表中不存在的内容,它会将其分解为它能理解的子字符串:, A- y. U/ V' L+ M7 c
" A+ x# M; d+ @9 _' A o) M, V( @
0 T# A3 D! t% s# q. i3 a1 X6 D4 d& U" F
更细节的内容不再赘述。接下来介绍基础神经网络,这一部分就更加基础了,主要包括 GELU、Softmax 函数以及 Layer Normalization 和 Linear。. X2 D4 X$ y5 G) s2 ^% H
- `; K0 G) ], W# E
f. K( u& d& l# S) D
: r: b5 w% o4 @4 T. j$ I9 _0 A每一小部分都有代码示例,例如在 Linear 部分,作者展示了标准矩阵乘法 + 偏置:, ~: h; ?7 `2 w$ X; X7 {6 P
. J2 i7 ]& o1 V6 G% N
, o& n$ ?$ E9 Q# M+ G" E
T% ]* B6 w- E8 L( f* n线性层从一个向量空间投影到另一个向量空间的代码如下:
7 q' L3 X: C5 P5 U- s( [8 X- u; e8 s" H \/ X
?, V$ Y2 S& n# a0 Y$ T; o- }7 [3 E5 ]+ o/ k3 d7 ^7 l% T
GPT 架构3 N( [0 t8 I/ A7 S7 @. L
这部分介绍 GPT 自身架构。$ T" [, a7 W' V9 R0 k j
( o9 z: F% n* g/ ?2 i! D8 }# q: t6 J8 ?+ Q5 r' ~
4 u2 X& p# J: g. X4 \; n3 J1 h
Transformer 架构如下:
9 R& q" p5 |9 R# K% E4 z3 G( n) W8 |) K! H- h
# B) A. [3 D t
5 f) Z9 N+ h: a! C. l( Z. J9 n; QTransformer 仅使用解码器堆栈(图的右侧部分):2 a+ {9 {$ T5 b+ @! g. M
: `' U- W! B) Q# u, Y* s' W" f* T7 y# M e$ [8 X
0 r8 k# I! G! l需要注意,由于摆脱了编码器,中间的交叉注意力层也被删除了。" }- O( a0 G7 v. D
在高层次上,GPT 体系架构有以下三个部分:7 d3 h0 n& c" H5 `( k
文本 + 位置嵌入;- x3 w9 o$ _$ o" C( w
Transformer 解码器堆栈;
1 o; w, r8 p, c( W9 A P9 ~2 Y投影到词汇表。% Y2 H4 p& s/ l$ j
代码就像下面这样:8 E1 Q9 F7 W8 Q3 L7 X% P
2 ~! {4 D5 d6 T+ b' I% U* B* l1 w
1 W3 E( J) w& l* @7 z; p! Q/ q- w, ~2 f8 t- Q
代码部分截图9 W4 z! G/ D5 \5 O. @# B0 |
接下来更详细地分解以上三个部分中的每一个部分,这里也不再赘述。% B/ J5 a S& w5 U1 K, q/ k- L
以上就是作者对 GPT 的实现,接下来就是将它们组合在一起并运行代码,得到 gpt2.py。它的全部内容只有 120 行代码(如果删除注释和空格,则为 60 行)。7 U( H) Y D6 B" p
作者通过以下方式测试结果:5 M7 k9 m6 A7 c g
( ~& h0 ~2 F% u4 M/ s
& Z2 n- [5 D- X. f/ r5 q
4 h6 M( a' m2 m输出结果如下:: }- n7 u S9 x
# {" i j/ U( e& C
8 ]: F+ o1 ~% ^- ?" j0 W( D
; t. J7 m. k* b正如作者说的:这次实验成功了。% L3 \3 C) A. u; a& K& I W
本文只是跟着作者的思路大概介绍了整体流程,想要了解更多内容的小伙伴,可以参考原文链接。2 j6 c" v" e2 V' m2 o
原文链接:https://jaykmody.com/blog/gpt-from-scratch/#basic-layers
" W8 V" h$ J4 p2 T9 n$ m全面学习 ChatGPT,机器之心准备了 89 篇文章合集4 k+ @7 A4 }! y( T5 y0 G
这是一份全面、系统且高质量的 ChatGPT 文章合集,我们筛选出来了 89 篇相关文章,设计了阅读框架与学习路径,大家可以根据自己的需求进行浏览与研读。合集内容包括:
. M* Y' R4 b' y" D O3 LChatGPT 及 OpenAI 大事件时间轴
$ q; w' }: a6 @% u- ~$ @. Q1 i# Z概念 · 真正搞懂 ChatGPT:共 3 篇文章
' A$ c) O: p1 j0 T; f. r研究 · GPT 家族更迭:共 16 篇文章
+ W8 E# j' Q7 e3 B% k八年 · OpenAI 的历史与现在:共 13 篇文章
! v5 s; L, F( R! a) y" w干货 · GPT 相关研究与技术:共 18 篇文章
& _# E8 v& D4 n7 {# o; ]! ^* B2 q+ A观点 · 专家谈 ChatGPT:共 8 篇文章
1 d/ ]2 U' A/ n( v7 ~( A0 e行业 · 应用与探索:共 23 篇文章
q$ e- M( s& U2 T+ G行业 · 同类产品:共 8 篇文章
; Z' P9 g9 w0 }2 S7 S% K THE END
S2 ^( ^. n; ^) Z' M投稿或寻求报道:content@jiqizhixin.com |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|