|
|
机器之心报道
. q+ u: `- E8 t4 M+ j机器之心编辑部* a8 E% i3 m5 J( Y5 g1 B9 Y
GPT 模型实现起来有时也很简单。
5 s! Z7 V' e3 N当前,大型语言模型(LLM)被认为是人工智能突破的方向。人们正在尝试用它们做各种复杂的事情,比如问答、创作、数学推理以及编写代码等。近段时间 ChatGPT 持续的爆火是最好的例证。
5 _0 `* v+ [2 Z$ I* p然而,对于机器学习从业者来说,大模型的门槛很高:因为体量太大难以训练,很长时间里这个方向一直被大公司垄断。不过最近,简化 GPT 模型的方法越来越多了。1 月中旬,前特斯拉 AI 高级总监 Andrej Karpathy(现已回归 OpenAI)就发布了从零开始构建 GPT 模型的完整教程。不过训练出的 GPT 和 OpenAI 的 GPT-3 比较,两者规模差距达 1 万 - 100 万倍。
& H* {# a/ b5 E近日,加拿大麦克马斯特大学的一位软件工程本科生 Jay Mody 在导入 NumPy 库下,仅用 60 行代码就从头实现了一个 GPT 模型,并将其命名为 PicoGPT。不仅如此,他还将经过训练的 GPT-2 模型权重加载到自己的实现中,并生成了一些文本。下面为 60 行代码展示。* Z& g9 G- w0 Y
. \, [7 C' o7 ?( x! c
4 L4 y* J, w, p8 k& R) q% m7 i1 D
# `1 n( C& w. ^不过要做到这些,你需要熟悉 Python 和 NumPy,还要有一些训练神经网络的基本经验。作者表示,这篇博客旨在对 GPT 进行简单易懂的完整介绍。因此,作者只使用已经训练的模型权重来实现前向传递代码。4 ?* S }% J0 L) a: h8 W Q9 z
6 _' c8 c6 W! C
' T# R; c2 G( i P x M! w& q8 f4 _( t* r& n+ l1 m) _
代码地址:
Z3 P* F6 T+ @* F8 thttps://github.com/jaymody/picoGPT/blob/29e78cc52b58ed2c1c483ffea2eb46ff6bdec785/gpt2_pico.py#L3-L58
5 a* z# n7 q" N9 b$ l* Q7 h对于此项研究,Andrej Karpathy 给出了四个字:虽迟但到。想当初,Karpathy 构建的 minGPT 和 nanoGPT 还要 300 行代码。
* _8 c! h$ h$ y1 Q* Z# K- o
6 I) I5 ]2 r6 o5 j% a+ D/ p# _
& |/ y# X" K* T: ~! O2 @, ^9 R% J+ ^
值得一提的是,这篇教程不是完全零门槛的。为了让读者明白,作者首先介绍了什么是 GPT、它的输入、输出如何等其他内容,介绍得都非常详细。
" o6 e3 b {1 a& K
6 _: a) j% ~( l4 ^8 t+ N$ T+ Q6 Y" _$ _- ^( Q# E
: B9 ?' W' A! n2 V
至于 GPT 到底能干什么,作者给出了几个示例,它能写电子邮件、总结一本书、给你 instagram 标题的想法、向 5 岁的孩子解释黑洞、用 SQL 编写代码等。
) P4 [- M/ w! l3 a/ E, R- o9 @% o# z通过仔细阅读这部分内容后,你能大致了解 GPT 的一些基础知识。有了这些背景介绍,接下来就是如何设置了。. ?: D6 Z) i5 U' {
项目介绍
, d: I" x, ^3 w& S; x2 N. v4 u设置& E( N2 U h3 W3 s$ Z( ~- l# D
这一章节主要介绍了如何设置编码器、超参数以及参数。
7 g7 ^+ Z' n; k& F
; ]: r9 @3 z; m' x7 X6 p+ L; G8 ]% O' }7 f$ ?5 F) ]9 Q8 Z- e0 r6 P6 |
5 w O1 x. h/ x" ~1 L4 F
你要做的,首先是克隆代码库:
' g8 b1 I8 Y& p' S7 v+ K3 |. Q4 L; K) j
& u$ G4 M _6 [2 q' G) W n5 H, I
6 o. M# Z u4 N然后安装依赖项:1 R7 |4 W% `" D& U
% P3 _( Q$ ^: @6 z( J
8 k: M s2 {3 F! b& b
) n/ a% V% t1 l; W: l1 F
注意,如果你使用的是 M1 Macbook,在运行 pip install 之前,你需要在 requirements.txt 中将 tensorflow 更改为 tensorflow-macos。在这个项目下,文件包括 encoder.py、utils.py、gpt2.py、gpt2_pico.py:
6 Y( P* f- p& c& ~$ I% Q8 @1 Bencoder.py:包含 OpenAI BPE Tokenizer 的代码,直接取自 gpt-2 repo;/ g2 W) u2 Z, a: Q
gpt2.py:包含 GPT 模型和生成代码,可以将其作为 python 脚本运行;) @3 g9 n) D4 M5 d( ^ F) J& w) d! `
gpt2_pico.py:与 gpt2.py 相同,但是代码行数更少。; \ R, Q2 ?/ p& J0 `: s |7 \
其中 gpt2.py 需要从头开始实现,因此你要做的是先删除 gpt2.py 并重新创建一个空文件:; ]$ U# h' z( @+ G% ~
/ `$ Q# y) a+ X* r' t2 N
" u2 Z9 A5 Z& p
! O/ m: K2 s+ e+ l然后将下列代码复制到 gpt2.py 中:
1 y) W/ G5 @7 D6 }1 f$ H
- [6 f5 g! n; ?7 n- w. K( ^3 A4 {4 u3 f o1 g. u! K
. H* L# [$ m z) w$ |% a上述代码包含 4 个主要部分:
6 J) D1 i5 P& O5 J6 dgpt2 函数是本次实现 GPT 的实际代码;& }6 s' y+ K0 I0 y+ z
generate 函数实现自回归解码算法;
+ L8 h( b, e9 E* u6 Amain 函数;
; ~, ^6 o1 |/ r, `: ]fire.Fire ( main ) 将文件转换为 CLI 应用程序,以便最终可以运行代码:python gpt2.py "some prompt here"。
) D+ v: o& R8 g7 T4 Q1 m0 Bmain 函数包含有 encode、hparams、params 参数,执行下列代码:
( F# Q$ M! D$ h9 a. z' e( o2 A. o+ F
$ s: b3 D. W4 u+ [) _/ ]5 D( P! ~" {& e1 G# i* B7 R* G z& `
设置完成之后,作者开始介绍编码器、超参数、参数的一些细节内容。就拿编码器来说,本文的编码器和 GPT-2 使用的 BPE tokenizer 一样。下面是该编码器编码和解码的一些文本示例:
2 Y' `' q! j& [3 ~0 O+ f$ k1 a2 n5 j3 p; K6 Y4 p0 ~7 {
3 z4 a/ C% `6 ~# d" y3 \( m: d/ A- G
9 e9 h: y* }6 m5 c( A; Y2 ~+ S4 A实际的 token 长这个样子:
4 h$ h3 z9 y' U/ G( R
% K% a' p U1 G4 ~' L# c2 Y3 R( P; a& k
0 K6 b9 `0 Q8 h- F. ]1 s7 C V- \
需要注意,有时 token 是单词(例如 Not),有时它们是单词但前面有一个空格(例如 all, 代表一个空格),有时是单词的一部分(例如 capes 被拆分为 cap 和 es ) ,有时它们是标点符号(例如 .)。. l' a2 \0 m0 Y9 V/ g x* W/ T
BPE 的一个好处是它可以对任意字符串进行编码,如果遇到词汇表中不存在的内容,它会将其分解为它能理解的子字符串:4 J6 m7 g. e1 V* E' R% `$ C
8 T! ^" _. }! j! w7 }% j
. L6 @) Z9 A$ a1 _
5 [1 I" a4 P: a$ Z9 z9 F. ~( i2 T
更细节的内容不再赘述。接下来介绍基础神经网络,这一部分就更加基础了,主要包括 GELU、Softmax 函数以及 Layer Normalization 和 Linear。
, k6 O, o% O; I& s" W3 J1 o% v7 _( o4 N9 D* M$ }
) X$ f$ @. e( N+ r+ h: z
8 P* K) Z" i1 m' ^; B每一小部分都有代码示例,例如在 Linear 部分,作者展示了标准矩阵乘法 + 偏置:
: E8 U* k4 A( H1 o" U9 y j8 ~
. _- P: E! `0 y5 E- f3 K
4 V: B4 M+ s' `" N8 l" v5 v. Q
线性层从一个向量空间投影到另一个向量空间的代码如下:
2 A- y& z5 r& C' `7 I
6 l9 H+ T2 z. W1 S* y2 a8 c1 v5 x1 Q" f
& C! G: z5 v& S
GPT 架构
3 s- W3 P& S7 `! y o- u1 M这部分介绍 GPT 自身架构。
$ Z) I8 T I. }' T2 M
( p: X7 S" F' m3 r5 V# O( l+ }& i' i; f# u, j z. G# p. z4 W
( {" T% c8 U( Q0 d
Transformer 架构如下:! o) `. p1 L9 _" `
& Z5 c @7 G2 f3 F( T7 @6 `( E3 y1 V+ x% w- P" ?
" m9 ?4 \ ]% {
Transformer 仅使用解码器堆栈(图的右侧部分):6 S* i4 B& Z Y5 O3 r
4 c3 N6 x# |* ?9 v& f6 p* @" E* j) J
2 P" M0 [% h( f+ K
* k8 g( {5 {% X需要注意,由于摆脱了编码器,中间的交叉注意力层也被删除了。
3 p" E* X( D* b. ~( d l( X1 E8 z) O在高层次上,GPT 体系架构有以下三个部分:
9 K5 }" J' h2 ?, y5 p, G* i文本 + 位置嵌入;8 G- r1 j, ^: Q u
Transformer 解码器堆栈;. X8 | v3 p( @2 r
投影到词汇表。
4 L; T& _ @7 g1 ~+ H1 R% }1 B代码就像下面这样:
2 l" y+ H& { j) f9 U/ ~7 A i9 G h6 [* P
q' Q2 s4 M9 d2 t A5 h" r
7 @9 ]' J: m; Y3 ~' x代码部分截图
6 E* R6 D, Q% V) I+ \. g接下来更详细地分解以上三个部分中的每一个部分,这里也不再赘述。
% x5 C. b% `9 G4 G& B1 u( x以上就是作者对 GPT 的实现,接下来就是将它们组合在一起并运行代码,得到 gpt2.py。它的全部内容只有 120 行代码(如果删除注释和空格,则为 60 行)。
& H6 t* o: i1 i作者通过以下方式测试结果:
/ K. ]/ w: A7 I4 ]1 G! t Q6 v- v# V! U) |
. p7 K, }* V: z0 U9 c/ z
0 T% K( z9 m) u: P- V# F
输出结果如下:
9 m* S2 ^6 ?: s8 r# S9 m! _2 N/ y: `6 G3 H
( o/ N9 {8 D- E+ t5 s3 n4 z. C& @. S: n+ Q" y
正如作者说的:这次实验成功了。
) R0 T9 E8 i! k7 w9 D3 T' K本文只是跟着作者的思路大概介绍了整体流程,想要了解更多内容的小伙伴,可以参考原文链接。& _# d1 Q$ n1 w" W4 p
原文链接:https://jaykmody.com/blog/gpt-from-scratch/#basic-layers
* w* v: G. W/ ~2 `- n! k全面学习 ChatGPT,机器之心准备了 89 篇文章合集
2 x f$ d* [( a$ ~3 a0 b5 Z这是一份全面、系统且高质量的 ChatGPT 文章合集,我们筛选出来了 89 篇相关文章,设计了阅读框架与学习路径,大家可以根据自己的需求进行浏览与研读。合集内容包括:
% E/ D2 V3 @9 s+ c F4 aChatGPT 及 OpenAI 大事件时间轴- }* V s. f+ o/ {% B* I
概念 · 真正搞懂 ChatGPT:共 3 篇文章0 P8 O, b2 P6 v. g( g3 s: ~0 {
研究 · GPT 家族更迭:共 16 篇文章
1 |* D. o. ^6 k2 _4 C3 M八年 · OpenAI 的历史与现在:共 13 篇文章' f2 D; @# h3 ~% c/ ~2 X; X& u- Y
干货 · GPT 相关研究与技术:共 18 篇文章
% c) ^. I5 ?) P: e观点 · 专家谈 ChatGPT:共 8 篇文章1 U2 D& j% z* X
行业 · 应用与探索:共 23 篇文章
2 q: |6 x) `4 E* \行业 · 同类产品:共 8 篇文章
9 S( a) a7 g) k THE END
) x2 R) ?6 d3 N3 g: W+ F% A投稿或寻求报道:content@jiqizhixin.com |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|