|
|
机器之心报道8 u1 l5 V7 e7 R; A. q0 K3 c
机器之心编辑部5 a' o4 v1 U) r5 ?+ s! q
GPT 模型实现起来有时也很简单。
* d M$ t$ u# T2 `7 H当前,大型语言模型(LLM)被认为是人工智能突破的方向。人们正在尝试用它们做各种复杂的事情,比如问答、创作、数学推理以及编写代码等。近段时间 ChatGPT 持续的爆火是最好的例证。
/ ?5 m+ |5 m5 e/ ` j然而,对于机器学习从业者来说,大模型的门槛很高:因为体量太大难以训练,很长时间里这个方向一直被大公司垄断。不过最近,简化 GPT 模型的方法越来越多了。1 月中旬,前特斯拉 AI 高级总监 Andrej Karpathy(现已回归 OpenAI)就发布了从零开始构建 GPT 模型的完整教程。不过训练出的 GPT 和 OpenAI 的 GPT-3 比较,两者规模差距达 1 万 - 100 万倍。
1 [! {; k) K) k* L, ^近日,加拿大麦克马斯特大学的一位软件工程本科生 Jay Mody 在导入 NumPy 库下,仅用 60 行代码就从头实现了一个 GPT 模型,并将其命名为 PicoGPT。不仅如此,他还将经过训练的 GPT-2 模型权重加载到自己的实现中,并生成了一些文本。下面为 60 行代码展示。% _, I: ^" F9 j5 c- R q
( x9 i7 G6 G. w: j: g0 g3 d. d, {
6 Z$ h- V0 `- ~6 o5 x( `& \
! @) Y7 J! r" f% O# Y% m
不过要做到这些,你需要熟悉 Python 和 NumPy,还要有一些训练神经网络的基本经验。作者表示,这篇博客旨在对 GPT 进行简单易懂的完整介绍。因此,作者只使用已经训练的模型权重来实现前向传递代码。( f6 L5 f/ W$ E4 h% } O T# e+ J+ _6 x
N* I/ A- m" ]+ n* H! |+ @0 T* K H2 N% X9 X
2 H# u+ b# k; e$ ^- ?代码地址:
# A# `/ A* V- s/ thttps://github.com/jaymody/picoGPT/blob/29e78cc52b58ed2c1c483ffea2eb46ff6bdec785/gpt2_pico.py#L3-L58: V7 V# \, f( J8 M
对于此项研究,Andrej Karpathy 给出了四个字:虽迟但到。想当初,Karpathy 构建的 minGPT 和 nanoGPT 还要 300 行代码。
7 j2 f3 f( C _ k9 M- j
2 Z2 d! D& A( f# K3 ?3 d
( s& C5 Y: _1 \! ]; g& m9 L |- r1 g1 Q" e
值得一提的是,这篇教程不是完全零门槛的。为了让读者明白,作者首先介绍了什么是 GPT、它的输入、输出如何等其他内容,介绍得都非常详细。2 f, M. @3 Y4 K6 I
5 Q O/ J8 d% {& }' Y" Y* e+ w
1 B0 c6 @ `# k. b" `
6 f; G7 y4 ^0 W) f( \) D至于 GPT 到底能干什么,作者给出了几个示例,它能写电子邮件、总结一本书、给你 instagram 标题的想法、向 5 岁的孩子解释黑洞、用 SQL 编写代码等。$ ~/ a- d# A$ M: {
通过仔细阅读这部分内容后,你能大致了解 GPT 的一些基础知识。有了这些背景介绍,接下来就是如何设置了。
& e7 h4 b6 k. X5 h9 T( A% k项目介绍
! v" m* J, p6 }7 q7 s( w; K: {设置2 \; |" p# t! q( x/ k! [; x9 n
这一章节主要介绍了如何设置编码器、超参数以及参数。0 a [+ a6 ^! `) i E
0 _7 Q" O0 @+ ?6 T/ e6 }' m9 g" F
0 y2 K. [" N& ], s) Z$ p( [" K* W, r) e9 m$ h- n1 R3 W
你要做的,首先是克隆代码库:8 N9 D4 j- M# ^) {5 _1 ^
3 t- f4 E! `. d2 c5 K3 M# u i, ^1 A5 x
: L8 i, l& X) `0 c! J( J k1 R
3 k( z0 f% O" R9 M; G
然后安装依赖项:
* V, @; T7 V# L( P0 ?, D2 o0 e1 A
4 l$ }# A: z, H$ e& e
5 L0 V0 u1 V) v- k2 v$ S8 N7 g注意,如果你使用的是 M1 Macbook,在运行 pip install 之前,你需要在 requirements.txt 中将 tensorflow 更改为 tensorflow-macos。在这个项目下,文件包括 encoder.py、utils.py、gpt2.py、gpt2_pico.py:
: |: ]' p2 R2 q7 @" {0 d. w7 Jencoder.py:包含 OpenAI BPE Tokenizer 的代码,直接取自 gpt-2 repo;
4 k" \# y1 k( |9 r2 z. i4 o6 Ogpt2.py:包含 GPT 模型和生成代码,可以将其作为 python 脚本运行;+ H: Z1 [; f0 V% w& \- e
gpt2_pico.py:与 gpt2.py 相同,但是代码行数更少。
! ^0 J7 \0 F+ G其中 gpt2.py 需要从头开始实现,因此你要做的是先删除 gpt2.py 并重新创建一个空文件:5 U. {: `& a1 q9 R) ?% ?+ ~2 o
/ Y% |6 E9 c, y9 E4 H& B1 ~
! x0 _) z" S/ }, s; W; e3 M) o3 v/ X2 Y( w
然后将下列代码复制到 gpt2.py 中:' ~, ~9 G% z3 `0 T+ P8 L' S
* }' ~4 v% v+ U$ r) @* b. U! f: m
5 y" h) O1 U7 J7 R' x
0 C& m; ~: C0 m$ \6 l上述代码包含 4 个主要部分:' r9 h# e$ U R" o$ g7 }* _
gpt2 函数是本次实现 GPT 的实际代码;7 Y, I8 A" Z ?" \6 |/ Q: p
generate 函数实现自回归解码算法;: n. l' a* U$ J
main 函数;( M" p/ @) |0 @" y: I2 I+ \
fire.Fire ( main ) 将文件转换为 CLI 应用程序,以便最终可以运行代码:python gpt2.py "some prompt here"。0 z% r1 v. T" j5 d$ ]
main 函数包含有 encode、hparams、params 参数,执行下列代码:) E: C- U1 O }
I/ \' @: y; m4 L/ u$ J& v
, l o; Q. f; q2 |4 R y) _+ a
% X5 z1 i/ ^+ y) ?* ~设置完成之后,作者开始介绍编码器、超参数、参数的一些细节内容。就拿编码器来说,本文的编码器和 GPT-2 使用的 BPE tokenizer 一样。下面是该编码器编码和解码的一些文本示例:
2 [# J7 o6 v* ^0 b0 U- \6 ~! G+ `/ s
, E3 ]: P- l% J0 Y( l, q6 p1 t# q: R9 k* h( K
# _- N( o# W* g6 C" ~. Z% ]实际的 token 长这个样子:& V- ?( ]8 v9 H0 `
0 L9 D+ z6 g1 h" }' e! X+ V4 K1 A7 j) G. [
3 H% s$ b( ~, k8 t% ]1 z) ~需要注意,有时 token 是单词(例如 Not),有时它们是单词但前面有一个空格(例如 all, 代表一个空格),有时是单词的一部分(例如 capes 被拆分为 cap 和 es ) ,有时它们是标点符号(例如 .)。
# A* ]* f% V9 X6 D5 B/ C! dBPE 的一个好处是它可以对任意字符串进行编码,如果遇到词汇表中不存在的内容,它会将其分解为它能理解的子字符串:
5 `% B' w) D) p$ k+ w/ W! ]
4 [: v2 X1 A; b% m
6 j! N# v" D3 x: x, p" a3 h) n
( O5 p d: E& K$ U更细节的内容不再赘述。接下来介绍基础神经网络,这一部分就更加基础了,主要包括 GELU、Softmax 函数以及 Layer Normalization 和 Linear。7 K1 v/ ~8 s' Q4 W) D
. T( W4 G: i; @9 L' H7 R7 Q3 M9 Q/ D; R
3 j) ` r) c3 j I% {
" J) Y% v& q9 `7 E0 b( Q7 y: M每一小部分都有代码示例,例如在 Linear 部分,作者展示了标准矩阵乘法 + 偏置:- c" i1 T+ y4 N8 W' E, ?
9 `3 G& _1 u8 t5 L! {" J$ S* ~; U2 H9 }! X& K6 o/ F, X
: m% p; e$ H. }. d: }; Z* W线性层从一个向量空间投影到另一个向量空间的代码如下:" W- b1 W6 E- V* V6 d3 K6 j
4 l7 v0 }" o0 c! J* m6 F
) |. _$ n+ N6 k8 m% \& h, n$ h- }8 Y9 \: w" i* q& w
GPT 架构' n8 v, J/ J7 D# e& w
这部分介绍 GPT 自身架构。
: h! ~! L/ t& p# H7 w: ^, p3 Y* v f6 U
4 q+ f0 t( I% ^: J I. {
' Z* x. e' \" g2 T* PTransformer 架构如下:2 s% P" V4 u$ O- Q- p# p- T7 U+ ]
' ~" e. y, S8 }
0 e* Q4 e7 z. c) |7 T ] n3 J: X" b k
Transformer 仅使用解码器堆栈(图的右侧部分):
6 a+ a9 o' P* T' d6 D/ @
/ O# I' l9 _+ R' ?1 @$ _% ~. D7 O
: H3 u. U. ^0 }' p
! k3 B6 Q: d# C% g- t' p- x需要注意,由于摆脱了编码器,中间的交叉注意力层也被删除了。% N" q( O; o: X/ X) ?- q6 g: Y5 N
在高层次上,GPT 体系架构有以下三个部分:6 l+ z' p8 E% A+ ]
文本 + 位置嵌入;* \- |, F% [/ y/ Y
Transformer 解码器堆栈;
9 E3 O4 L& e. A0 x! X% I) p- p1 n* a投影到词汇表。, p" n2 W# n8 u: [% y5 r
代码就像下面这样:
; k7 \ C: l$ e/ ]# ~3 N4 z( L/ \, r! C
6 B- n+ Y9 R' O, G2 ~5 H& ~' {$ x9 {3 W; J9 A
) A9 A2 [; ?. k代码部分截图
" {4 j. y% T$ W2 `+ {* T接下来更详细地分解以上三个部分中的每一个部分,这里也不再赘述。
+ u( O0 s! p. z2 V. S$ M2 H以上就是作者对 GPT 的实现,接下来就是将它们组合在一起并运行代码,得到 gpt2.py。它的全部内容只有 120 行代码(如果删除注释和空格,则为 60 行)。5 S6 P/ z {; |
作者通过以下方式测试结果:
6 P$ ^7 u: m7 _: N: s; ]0 S9 {6 Y5 i
% S5 b" E( L6 k) n
8 L4 e# U# t# k, {输出结果如下:0 `; Q# \5 @: q( r9 S" w1 L
& a6 q; C4 J; k0 d* e
- S; R) B/ ^" O3 R; P+ U0 N* Q
# K' W( [" \% D, g: W正如作者说的:这次实验成功了。
G9 a7 k$ X+ g% R- N5 I本文只是跟着作者的思路大概介绍了整体流程,想要了解更多内容的小伙伴,可以参考原文链接。
- X" l2 f2 E1 S; {1 W3 _原文链接:https://jaykmody.com/blog/gpt-from-scratch/#basic-layers
2 N h6 U, f8 K) }* p/ O全面学习 ChatGPT,机器之心准备了 89 篇文章合集% E! I u' g" r/ d( |
这是一份全面、系统且高质量的 ChatGPT 文章合集,我们筛选出来了 89 篇相关文章,设计了阅读框架与学习路径,大家可以根据自己的需求进行浏览与研读。合集内容包括:) k# ^+ p8 D5 [$ S1 f# o9 D
ChatGPT 及 OpenAI 大事件时间轴+ O$ s8 j7 `' Y
概念 · 真正搞懂 ChatGPT:共 3 篇文章
# h9 T$ y% h' C& g) c1 ?" @& d研究 · GPT 家族更迭:共 16 篇文章% X4 N! n3 e# S7 u f& U
八年 · OpenAI 的历史与现在:共 13 篇文章6 o. `/ J9 |* A+ B* ~
干货 · GPT 相关研究与技术:共 18 篇文章
( l+ t8 z8 B# G1 d" Z* w8 O& H观点 · 专家谈 ChatGPT:共 8 篇文章
0 w# S4 \1 E; ]. a) S5 w/ D' X7 c行业 · 应用与探索:共 23 篇文章% R/ `5 T) N+ k+ E
行业 · 同类产品:共 8 篇文章+ \2 @1 C& {2 n: q6 J( w; y
THE END ( ]! m8 t% j7 [1 J7 D$ H
投稿或寻求报道:content@jiqizhixin.com |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|