|
|
机器之心报道
/ { g7 ^4 `+ @( l" e# X6 V+ Q; E! P/ c机器之心编辑部
4 ]3 D& [" Q" o% iGPT 模型实现起来有时也很简单。
+ M+ F/ A9 j, r2 l* V当前,大型语言模型(LLM)被认为是人工智能突破的方向。人们正在尝试用它们做各种复杂的事情,比如问答、创作、数学推理以及编写代码等。近段时间 ChatGPT 持续的爆火是最好的例证。
/ H$ ~% x, o. g2 c: [- D w然而,对于机器学习从业者来说,大模型的门槛很高:因为体量太大难以训练,很长时间里这个方向一直被大公司垄断。不过最近,简化 GPT 模型的方法越来越多了。1 月中旬,前特斯拉 AI 高级总监 Andrej Karpathy(现已回归 OpenAI)就发布了从零开始构建 GPT 模型的完整教程。不过训练出的 GPT 和 OpenAI 的 GPT-3 比较,两者规模差距达 1 万 - 100 万倍。
; z7 l& |- I7 J: }: `近日,加拿大麦克马斯特大学的一位软件工程本科生 Jay Mody 在导入 NumPy 库下,仅用 60 行代码就从头实现了一个 GPT 模型,并将其命名为 PicoGPT。不仅如此,他还将经过训练的 GPT-2 模型权重加载到自己的实现中,并生成了一些文本。下面为 60 行代码展示。
& v. Y! e, a- ^4 Y2 o. X8 N( b& W9 y* H3 a$ I) N. A+ A: u
% i- I/ ?: f5 q3 h4 P
0 k) @ r& \. c4 C/ ^8 Z; _2 o不过要做到这些,你需要熟悉 Python 和 NumPy,还要有一些训练神经网络的基本经验。作者表示,这篇博客旨在对 GPT 进行简单易懂的完整介绍。因此,作者只使用已经训练的模型权重来实现前向传递代码。! k6 M6 o/ ~6 v0 z. `
u6 `! b9 \" f) \* t3 \
% i: s/ e1 d% I( _
( H) m, y9 E" }& P( L3 t代码地址:6 {& r+ R/ f( K+ ?
https://github.com/jaymody/picoGPT/blob/29e78cc52b58ed2c1c483ffea2eb46ff6bdec785/gpt2_pico.py#L3-L58$ k: L4 L, C+ o. K0 f3 v/ P
对于此项研究,Andrej Karpathy 给出了四个字:虽迟但到。想当初,Karpathy 构建的 minGPT 和 nanoGPT 还要 300 行代码。
4 _ p- e$ P. j0 V* ]6 u. [
. F* x# u- B6 I1 A0 w
4 U; W7 K0 ?; |+ D5 z" y5 l7 A# G/ D
值得一提的是,这篇教程不是完全零门槛的。为了让读者明白,作者首先介绍了什么是 GPT、它的输入、输出如何等其他内容,介绍得都非常详细。
8 q8 `8 O |8 Z+ J. ]: o- V D* ^1 p$ g' U( m" ~1 U; k
) K$ {8 ?, l0 G
/ p: B. d# Q1 N* T4 I5 K5 E: k至于 GPT 到底能干什么,作者给出了几个示例,它能写电子邮件、总结一本书、给你 instagram 标题的想法、向 5 岁的孩子解释黑洞、用 SQL 编写代码等。
7 ^3 B# L# K+ _+ I# D2 q/ h/ @通过仔细阅读这部分内容后,你能大致了解 GPT 的一些基础知识。有了这些背景介绍,接下来就是如何设置了。
! g' `# b" Y7 \* N* R+ y项目介绍9 N# g" m! Y! B8 w
设置
8 Q1 E/ P2 q6 c2 v6 U这一章节主要介绍了如何设置编码器、超参数以及参数。
7 u: [& v8 \* W% _7 K4 Q `
6 d1 n5 {( B" c" F, T
/ B* }- h9 \% m; b1 D
; f! J0 _5 |* s9 ]4 j V你要做的,首先是克隆代码库:
" o, p+ V( g) d1 ^8 z1 Q
2 X$ f5 E W; D8 K' ]: U
4 M, |* E0 W/ J7 o/ T5 t5 g0 c0 N, j; T. p% _' D3 e
然后安装依赖项:4 ~7 R1 h b# ^
6 e: V8 B* q& d; q! M5 f
, J/ H5 |% C+ l, h
. f8 P5 C' j: }* f4 s( E8 p注意,如果你使用的是 M1 Macbook,在运行 pip install 之前,你需要在 requirements.txt 中将 tensorflow 更改为 tensorflow-macos。在这个项目下,文件包括 encoder.py、utils.py、gpt2.py、gpt2_pico.py:8 v" z( v K4 F
encoder.py:包含 OpenAI BPE Tokenizer 的代码,直接取自 gpt-2 repo;
x2 Q- r& m7 C2 [- igpt2.py:包含 GPT 模型和生成代码,可以将其作为 python 脚本运行;$ C1 `9 d, ?, W3 O
gpt2_pico.py:与 gpt2.py 相同,但是代码行数更少。, {: ]' K0 ]5 T# z9 `; g. z
其中 gpt2.py 需要从头开始实现,因此你要做的是先删除 gpt2.py 并重新创建一个空文件:7 t d5 b& w) i+ o, i1 h( C! ^
+ J1 c7 i: ]/ z; Z8 |
; R+ F9 o1 U- v5 h$ h, {/ o
- A- F( L, e" v `7 G. ^4 C然后将下列代码复制到 gpt2.py 中:
|: s" C0 b0 X& u
) i, l0 I! B/ A! n# u4 D* n" A+ c+ B5 @
8 J' {) K9 B! E4 M+ w2 a0 N, s+ j
上述代码包含 4 个主要部分:
% a* F+ V6 S+ ?$ r8 X; Dgpt2 函数是本次实现 GPT 的实际代码;. \ y' Y) ~7 d- L
generate 函数实现自回归解码算法;8 [( V& y. Z8 C7 m2 \3 _0 [6 n! Y
main 函数;. o; X' p& w4 W$ x. a% d$ }+ N+ @
fire.Fire ( main ) 将文件转换为 CLI 应用程序,以便最终可以运行代码:python gpt2.py "some prompt here"。" ~6 R, a+ Q+ e+ _$ b& U
main 函数包含有 encode、hparams、params 参数,执行下列代码:
; ?0 `) z# ~2 z5 ?7 C+ ~% y5 `. [
- h) G% l' a* k% v' r! ?1 L
) I' n; @0 s" f5 G2 S6 U2 s! N1 w7 Z1 x. k2 V
设置完成之后,作者开始介绍编码器、超参数、参数的一些细节内容。就拿编码器来说,本文的编码器和 GPT-2 使用的 BPE tokenizer 一样。下面是该编码器编码和解码的一些文本示例: b7 K- T, B, M9 J l7 S( n1 F
# W) P d5 Y# N
4 I1 n( M5 ]5 f( V' [; t/ @+ c" y6 u* s. N( P2 p+ d. O" N
实际的 token 长这个样子:
X" I; D9 e* W1 O7 s: C, Q5 U$ w
2 W3 S. R8 r$ j" `" J6 f- H$ z8 m: k0 _( s
需要注意,有时 token 是单词(例如 Not),有时它们是单词但前面有一个空格(例如 all, 代表一个空格),有时是单词的一部分(例如 capes 被拆分为 cap 和 es ) ,有时它们是标点符号(例如 .)。
: N* m& |7 o1 t( a( S$ YBPE 的一个好处是它可以对任意字符串进行编码,如果遇到词汇表中不存在的内容,它会将其分解为它能理解的子字符串:, W% F& Y* b! F2 I/ y
& i, }% p$ a; j* f$ @
6 I3 [+ b/ B6 h& |4 ], ?
# W* v1 n! L4 ]1 j) p% D1 C更细节的内容不再赘述。接下来介绍基础神经网络,这一部分就更加基础了,主要包括 GELU、Softmax 函数以及 Layer Normalization 和 Linear。
% A# I' s! E- E. U2 f* p0 H
3 l* Z- C) {9 @; B* {* d6 Z- p0 z0 r ^0 c3 T7 [
, T5 R$ m5 [( O) K. Y @1 L9 b+ H每一小部分都有代码示例,例如在 Linear 部分,作者展示了标准矩阵乘法 + 偏置:8 u4 W! d3 ~# I; P# v! ^2 H
* M0 n3 k( T& i5 W- e
% `6 }' q; P: o/ z& v+ o/ T
. _( g. w/ Z( N) P* m8 @线性层从一个向量空间投影到另一个向量空间的代码如下:. v2 B6 B5 ]9 `
; w& `' ?) p: A: i+ N7 e
7 p9 ]# n& e# K% M! ]5 I4 V2 J' p- o/ ?0 \9 ?; s1 Y2 f N) O6 _
GPT 架构& i0 \$ o: f" N' F
这部分介绍 GPT 自身架构。
' Y8 w/ k) A# e8 f* y4 p
. N3 }, h( i% V5 Z+ J B. N% K9 q! o" `4 _/ G! a9 ^( S) `# S
+ ]! _. c. Z: `2 `Transformer 架构如下:' h' u% j# `$ X& t6 W4 T7 C& q j
# c! k$ i7 y, a8 d
z5 z. l7 Z$ O" V
2 J4 n \( m1 e. J' k+ j f' ~# BTransformer 仅使用解码器堆栈(图的右侧部分):" p+ [ y! g" Q# ^5 i: ^
7 Q2 |+ B, i# x3 r; y9 ^- Z/ M8 r6 S5 b8 ^6 k; o1 b
, v& S, E8 L2 V: a# b# q2 Z0 v需要注意,由于摆脱了编码器,中间的交叉注意力层也被删除了。6 i" \2 c% b! n/ G1 B9 x L% Z
在高层次上,GPT 体系架构有以下三个部分:
# }0 L, G; Z% Y) g' G" y1 e+ I文本 + 位置嵌入;
2 [) v1 h( m" @: @/ }Transformer 解码器堆栈;
! _. T9 E4 c% i. @/ g5 w- i投影到词汇表。
1 Z5 u" E. t- V3 D% |- ]: z) {' T3 k代码就像下面这样:" `) w0 q3 K6 F) u
, X5 u0 p) b: L$ b9 s
: u1 W. `8 S0 q+ r/ @% A
6 }# ]; c. U. V9 R4 m9 U代码部分截图. w- d& y2 c. k; k6 g
接下来更详细地分解以上三个部分中的每一个部分,这里也不再赘述。
3 C' X" }% F& ~2 \以上就是作者对 GPT 的实现,接下来就是将它们组合在一起并运行代码,得到 gpt2.py。它的全部内容只有 120 行代码(如果删除注释和空格,则为 60 行)。/ i' {7 Y* E! l9 v1 V) ?
作者通过以下方式测试结果:% d7 k6 {* h! ?
3 ?2 X2 b1 d) F
* z! q; {9 L. y8 Q- v
5 X5 B# G& W1 L, V% O4 A输出结果如下:
" f; t8 Z6 G( F. X0 \! `, j( m5 o+ ]+ v
& Q4 b. X/ H0 H3 Y- \
" H' k( v4 r- r" ] E
正如作者说的:这次实验成功了。
% \/ j M% G5 _+ P( c4 p& l本文只是跟着作者的思路大概介绍了整体流程,想要了解更多内容的小伙伴,可以参考原文链接。
5 m6 a5 ~2 n# V: E原文链接:https://jaykmody.com/blog/gpt-from-scratch/#basic-layers5 R/ c, Q+ z& L1 L: L: N
全面学习 ChatGPT,机器之心准备了 89 篇文章合集3 K. W; i* ]; |' ~0 ^
这是一份全面、系统且高质量的 ChatGPT 文章合集,我们筛选出来了 89 篇相关文章,设计了阅读框架与学习路径,大家可以根据自己的需求进行浏览与研读。合集内容包括:
8 u5 H0 t2 U; O4 p/ K' yChatGPT 及 OpenAI 大事件时间轴; `7 p& G( w5 q/ L; y6 y, s
概念 · 真正搞懂 ChatGPT:共 3 篇文章
. n6 U3 C( W! ]: S( J研究 · GPT 家族更迭:共 16 篇文章2 f2 B d5 |# @
八年 · OpenAI 的历史与现在:共 13 篇文章, R/ ~- O2 {7 M
干货 · GPT 相关研究与技术:共 18 篇文章
J2 `$ e" @, X- h' m- ~观点 · 专家谈 ChatGPT:共 8 篇文章' l+ N4 Y$ }" r0 `/ E& k Y9 O
行业 · 应用与探索:共 23 篇文章
/ q4 m) v8 x( k9 }7 m9 C行业 · 同类产品:共 8 篇文章
3 O; @/ [+ @& \# y, S; t' a THE END 3 I" t& ]" I: p+ l9 i) s
投稿或寻求报道:content@jiqizhixin.com |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|