論文地址:https://arxiv.org/pdf/2303.17568.pdf
相關(guān)博客
【自然語言處理】【大模型】RWKV:基于RNN的LLM
【自然語言處理】【大模型】CodeGen:一個用于多輪程序合成的代碼大語言模型
【自然語言處理】【大模型】CodeGeeX:用于代碼生成的多語言預(yù)訓(xùn)練模型
【自然語言處理】【大模型】LaMDA:用于對話應(yīng)用程序的語言模型
【自然語言處理】【大模型】DeepMind的大模型Gopher
【自然語言處理】【大模型】Chinchilla:訓(xùn)練計算利用率最優(yōu)的大語言模型
【自然語言處理】【大模型】大語言模型BLOOM推理工具測試
【自然語言處理】【大模型】GLM-130B:一個開源雙語預(yù)訓(xùn)練語言模型
【自然語言處理】【大模型】用于大型Transformer的8-bit矩陣乘法介紹
【自然語言處理】【大模型】BLOOM:一個176B參數(shù)且可開放獲取的多語言模型
【自然語言處理】【大模型】PaLM:基于Pathways的大語言模型
【自然語言處理】【chatGPT系列】大語言模型可以自我改進(jìn)
【自然語言處理】【ChatGPT系列】FLAN:微調(diào)語言模型是Zero-Shot學(xué)習(xí)器
【自然語言處理】【ChatGPT系列】ChatGPT的智能來自哪里?
一、簡介
? 代碼生成的目標(biāo)是:給定人類意圖的描述(例如:“寫一個階乘函數(shù)”),系統(tǒng)自動生成可執(zhí)行程序。這個任務(wù)由來已久,解決的方案也層出不窮。近期,通過將程序看作是語言序列,利用深度學(xué)習(xí)的transformer架構(gòu)進(jìn)行建模,顯著的改善了代碼生成的質(zhì)量。特別是當(dāng)大規(guī)模的開源代碼數(shù)據(jù)與大語言模型相結(jié)合。
? OpenAI的12B模型CodeX證明了在數(shù)十億行公開代碼上預(yù)訓(xùn)練的大模型的潛力。通過使用生成式預(yù)訓(xùn)練的方式,CodeX能夠很好地解決python中的入門級編程問題。研究顯示,GitHub Copilot 88%的用戶都表示編程效率提高了。隨后,大量的代碼大語言模型被開發(fā)出來,包括:DeepMind的AlphaCode、Salesforce的CodeGen、Meta的InCoder和Google的PaLM-Coder-540B。
? 本文提出了13B參數(shù)量的多語言代碼生成模型CodeGeeX,其是在23種編程語言上預(yù)訓(xùn)練的。該模型在具有1536個Ascend 910 AI處理器的集群上訓(xùn)練了2個月,共計訓(xùn)練了8500億個tokens。CodeGeeX有以下的一些特性:(1) CodeGeeX不同于CodeX,其模型本身以及訓(xùn)練代碼都是開源的,有助于理解和改進(jìn)預(yù)訓(xùn)練代碼模型。CodeGeeX也支持在Ascend和NVIDIA GPUs等不同平臺上推理。(2) 除了代碼生成和代碼補(bǔ)全,CodeGeeX也支持代碼解釋和代碼翻譯。(3) 與知名的代碼生成模型相比(CodeGen-16B、GPT-NeoX-20B、InCode-6.7B和GPT-J-6B),CodeGeeX的表現(xiàn)一致優(yōu)于其他模型。
? 本文還開發(fā)了HumanEval-X基準(zhǔn)來評估多語言代碼模型,因為:(1) HumanEval和其他基準(zhǔn)僅包含單個語言的編程問題;(2) 現(xiàn)有的多語言數(shù)據(jù)集使用BLEU這樣的字符串相似度指標(biāo)進(jìn)行評估,而不是驗證生成代碼的正確性。具體來說,對于HumanEval中每個Python問題,都人工用C++、Java、JavaScript、GO來重寫其prompt、標(biāo)準(zhǔn)解決方案和測試用例。總的來說,在HumanEval-X中包含了820個手寫的"問題-解決方案對"。此外,HumanEval-X同時支持代碼生成和代碼翻譯的評估。
二、CodeGeeX模型
1.模型架構(gòu)
? Transformer Backbone。CodeGeeX使用純解碼器的GPT架構(gòu),并使用自回歸語言建模。CodeGeeX的核心架構(gòu)是39層的transformer解碼器。在每個transformer層,包含:多頭自注意力機(jī)制、MLP層、layer normalization和殘差連接。使用類GELU的FaastGELU激活,其在Ascend 910 AI處理器上更加高效。
FastGELU
(
X
i
)
=
X
i
1
+
exp
?
(
?
1.702
×
∣
X
i
∣
)
×
exp
?
(
0.851
×
(
X
i
?
∣
X
i
∣
)
)
(1)
\text{FastGELU}(X_i)=\frac{X_i}{1+\exp(-1.702\times|X_i|)\times\exp(0.851\times(X_i-|X_i|))} \tag{1}
FastGELU(Xi?)=1+exp(?1.702×∣Xi?∣)×exp(0.851×(Xi??∣Xi?∣))Xi??(1)
? 生成式預(yù)訓(xùn)練目標(biāo)。采用GPT的范式,在大規(guī)模無監(jiān)督代碼數(shù)據(jù)上訓(xùn)練模型??偟膩碚f,就是迭代地將代碼token作為輸入,預(yù)測下一個token并與真實的token進(jìn)行比較。具體來說,對于長度為
n
n
n的任意輸入序列
{
x
1
,
x
2
,
…
,
x
n
}
\{x_1,x_2,\dots,x_n\}
{x1?,x2?,…,xn?},CodeGeeX的輸出都是下一個token的概率分布
P
(
x
n
+
1
∣
x
1
,
x
2
,
…
,
x
n
,
Θ
)
=
p
n
+
1
∈
[
0
,
1
]
1
×
v
(2)
\mathbb{P}(x_{n+1}|x_1,x_2,\dots,x_n,\Theta)=p_{n+1}\in[0,1]^{1\times v} \tag{2}
P(xn+1?∣x1?,x2?,…,xn?,Θ)=pn+1?∈[0,1]1×v(2)
其中,
Θ
\Theta
Θ表示所有參數(shù),
v
v
v是詞表大小。通過將預(yù)測token與真實分布進(jìn)行比較,可以優(yōu)化交叉熵?fù)p失函數(shù):
L
=
?
∑
n
=
1
N
?
1
y
n
+
1
log
?
P
(
x
n
+
1
∣
x
1
,
)
(3)
\mathcal{L}=-\sum_{n=1}^{N-1}y_{n+1}\log \mathbb{P}(x_{n+1}|x_1,) \tag{3}
L=?n=1∑N?1?yn+1?logP(xn+1?∣x1?,)(3)
? Top Query層和解碼。原始的GPT使用pooler函數(shù)來獲得最終的輸出。我們在所有transformer層上添加一個額外的查詢層(華為"盤古"也使用了這種層)來獲得最終的embedding。如上圖所示,top query層的輸入被替換為位置
n
+
1
n+1
n+1的query embedding。最終的輸出乘以詞嵌入矩陣的轉(zhuǎn)置來獲得輸出概率分布。對于解決策略,CodeGeeX支持貪心、溫度采樣、top-k采樣、top-p采樣和beam search。
2. 預(yù)訓(xùn)練設(shè)置
? 代碼語料。訓(xùn)練語料包含兩個部分。第一部分是開源代碼數(shù)據(jù)集:Pile和CodeParrot。第二部分是直接從GitHub爬取的Python、Java和C++代碼,用于補(bǔ)充第一部分。選擇的代碼倉庫至少有一個star且小于10MB,然后過濾文件:(1) 每行超過100個字符;(2) 自動生成的;(3) 字母比例小于40%的;(4) 大于100KB或者小于1KB的。上圖展示了訓(xùn)練數(shù)據(jù)中23種編程語言的占比。訓(xùn)練數(shù)據(jù)會被劃分為等長的片段。為了幫助模型區(qū)分多種語言,在每個片段前添加了語言相關(guān)的標(biāo)簽,例如:language: Python。
? Tokenization??紤]到代碼數(shù)據(jù)中有大量的自然語言注釋且變量、函數(shù)、類別的命名通常也是有意義的單詞,因此將代碼數(shù)據(jù)也做文本數(shù)據(jù)并使用GPT-2 tokenizer。初始詞表尺寸為50000,并將多個空格編碼為額外的tokens來增加編碼效率。具體來說,L個空白符被表示為<|extratoken_X|>,其中X=8+L。由于詞表包含各種語言的tokens,這允許CodeGeeX處理各種語言的token,例如中文、法語等。最終的詞表尺寸為 v = 52224 v=52224 v=52224。
? 詞嵌入和位置嵌入。詞嵌入矩陣表示為 W w o r d ∈ R v × h W_{word}\in\mathbb{R}^{v\times h} Wword?∈Rv×h,位置嵌入矩陣表示為 W p o s ∈ R n m a x × h W_{pos}\in\mathbb{R}^{n_{max}\times h} Wpos?∈Rnmax?×h,其中 h = 5120 h=5120 h=5120和 n m a x = 2048 n_{max}=2048 nmax?=2048。每個token都對應(yīng)一個可學(xué)習(xí)的詞嵌入 x w o r d ∈ R h x_{word}\in\mathbb{R}^h xword?∈Rh以及一個可學(xué)習(xí)的位置嵌入 x p o s ∈ R h x_{pos}\in\mathbb{R}^{h} xpos?∈Rh。兩個嵌入相加得到輸入的嵌入向量 x i n = x w o r d + x p o s x_{in}=x_{word}+x_{pos} xin?=xword?+xpos?。最終,整個序列被轉(zhuǎn)換為嵌入矩陣 X i n ∈ R n × h X_{in}\in\mathbb{R}^{n\times h} Xin?∈Rn×h, n n n是序列長度。
3. CodeGeeX訓(xùn)練
? Ascend 910并行訓(xùn)練。CodeGeeX在Ascend 910 AI處理器(32GB)的集群上使用Mindspore進(jìn)行訓(xùn)練。訓(xùn)練在192個節(jié)點(diǎn)的1526個AI處理器上進(jìn)行了2個月。共計消耗了850B的tokens,約為5個epochs(213000steps)。為了提高訓(xùn)練效率,采用8路模型并行和192路數(shù)據(jù)并行,并使用ZeRO-2優(yōu)化器來進(jìn)一步降低顯存消耗。最終,每個節(jié)點(diǎn)上的micro-batch size為16,全局batch size為3072。
? 具體來說,使用Adam優(yōu)化器來優(yōu)化loss。模型權(quán)重采用FP16的格式,為了更高的精度和穩(wěn)定性layer-norm和softmax使用FP32。模型占用GPU顯存為27GB。初始學(xué)習(xí)率為1e-4,并應(yīng)用cosine學(xué)習(xí)率調(diào)度:
l
r
c
u
r
r
e
n
t
=
l
r
m
i
n
+
0.5
?
(
l
r
m
a
x
?
l
r
m
i
n
)
?
(
1
+
cos
?
(
n
c
u
r
r
e
n
t
n
d
e
c
a
y
π
)
)
(4)
lr_{current}=lr_{min}+0.5*(lr_{max}-lr_{min})*(1+\cos(\frac{n_{current}}{n_{decay}}\pi)) \tag{4}
lrcurrent?=lrmin?+0.5?(lrmax??lrmin?)?(1+cos(ndecay?ncurrent??π))(4)
? 下表示詳細(xì)的訓(xùn)練參數(shù)。
? 訓(xùn)練效率優(yōu)化。為了優(yōu)化Mindspore框架來釋放Ascend 910的潛力。采用了兩項技術(shù)來顯著改善訓(xùn)練效率:(1) 核融合(Kernel fusion);(2) Auto Tune optimization。下表是優(yōu)化前和優(yōu)化后的對比。
4. 快速推理
? 量化。應(yīng)用post-training量化技術(shù)來降低CodeGeeX推理時的顯存消耗。使用absolute maximum量化將所有線性層的權(quán)重
W
W
W從FP16轉(zhuǎn)換為INT8:
W
q
=
Round
(
W
λ
)
,
λ
=
Max
(
∣
W
∣
)
2
b
?
1
?
1
(5)
W_q=\text{Round}(\frac{W}{\lambda}),\lambda=\frac{\text{Max}(|W|)}{2^{b-1}-1} \tag{5}
Wq?=Round(λW?),λ=2b?1?1Max(∣W∣)?(5)
其中
b
b
b是比特寬度,
b
=
8
b=8
b=8。
λ
\lambda
λ是縮放因子。
? 加速。經(jīng)過8bit量化后,使用NVIDIA的FasterTransformer實現(xiàn)了更快版本的CodeGeeX。
三、HumanEval-X基準(zhǔn)
? HumanEval基準(zhǔn)類似于MBPP和APPS,僅包含手寫的Python編程問題,并不能直接應(yīng)用于多語言代碼生成的系統(tǒng)性評估。因此,本文開發(fā)了一個HumanEval的多語言變體,HumanEval-X。HumanEval中的每個問題都是用Python定義的,我們用C++、Java、JavaScript和Go重寫了prompt、標(biāo)準(zhǔn)解決方案和測試用例。在HumanEval-X中共有820個"問題-解決方案對"。
? 任務(wù)。HumanEval-X會評估2個任務(wù):代碼生成和代碼翻譯。代碼生成任務(wù)將函數(shù)聲明和文本描述作為輸入,并生成函數(shù)的實現(xiàn)代碼。代碼翻譯任務(wù)將源語言實現(xiàn)的解決方案作為輸入,并生成目標(biāo)語言的對應(yīng)實現(xiàn)。
? 度量(Metric)。使用測試用例來評估生成代碼的正確性并衡量其pass@k。具體來說,使用無偏方法來估計pass@k:
pass@k
:
=
E
[
1
?
(
n
?
c
k
)
(
n
k
)
]
,
n
=
200
,
k
∈
{
1
,
10
,
100
}
(6)
\text{pass@k}:=\mathbb{E}[1-\frac{\left(\begin{array}{l}n-c \\ k\end{array}\right)}{\left(\begin{array}{l}n \\ k\end{array}\right)}],\quad n=200,k\in\{1,10,100\} \tag{6}
pass@k:=E[1?(nk?)(n?ck?)?],n=200,k∈{1,10,100}(6)
其中
n
n
n是生成的總數(shù)(200),k是采樣數(shù)量,
c
c
c是通過所有測試用例的樣本數(shù)量。
四、CodeGeeX評估
- 多語言代碼生成
- 多語言代碼翻譯
文章來源:http://www.zghlxwxcb.cn/news/detail-456843.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-456843.html
到了這里,關(guān)于【自然語言處理】【大模型】CodeGeeX:用于代碼生成的多語言預(yù)訓(xùn)練模型的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!