柚子快報激活碼778899分享:CodeGeex論文閱讀
柚子快報激活碼778899分享:CodeGeex論文閱讀
《CodeGeeX: A Pre-Trained Model for Code Generation with Multilingual Evaluations on HumanEval-X》
論文地址:https://arxiv.org/pdf/2303.17568.pdf
代碼地址:https://github.com/THUDM/CodeGe
一、簡介
CodeGeeX,是一個具有130億個參數(shù)的多語言模型,用于代碼生成,在23種編程語言的8500億個token上進行了預(yù)訓(xùn)練。
CodeGeeX的特點
(1)CodeGeeX模型本身以及訓(xùn)練代碼都是開源的,有助于理解和改進預(yù)訓(xùn)練代碼模型。也支持在Ascend和NVIDIAGPUs等不同平臺上推理。
(2)除了代碼生成和代碼補全,也支持代碼解釋和代碼翻譯。
(3)與知名的代碼生成模型相比(CodeGen-16B、GPT-NeoX-20B、InCode-6.7B和GPT-J-6B),CodeGeeX的表現(xiàn)優(yōu)于其他模型。
二、模型
CodeGeeX是一個具有13B個參數(shù)的代碼生成模型,由39層從左到右的transformer decoders和一個top query layer組成。它將文本/代碼tokens作為輸入,并自回歸地輸出下一個標(biāo)記的概率
1、使用Transformer為主干。
與GPT-3Codex類似,CodeGeeX也是生成式預(yù)訓(xùn)練(GPT)架構(gòu),使用純解碼器的GPT架構(gòu),采用自回歸(編程)語言建模。
CodeGeeX的核心架構(gòu)是一個39層的transformer解碼器。在每個transformer層中,應(yīng)用了多頭自注意力機制,然后是MLP層,以及層歸一化和殘差連接。使用類GELU的FastGELU,它在Ascend910AI處理器下效率更高:
2、生成式預(yù)訓(xùn)練。
通過采用GPT范式,在大量未標(biāo)記的代碼數(shù)據(jù)上訓(xùn)練模型。其原理是迭代地將代碼token作為輸入,預(yù)測下一個token,預(yù)測下一個token并與真實的token進行比較。對于長度為n的任意輸入序列?{x1,...xn}?,CodeGeeX的輸出都是下一個token的概率分布
?Θ?表示所有參數(shù),v是詞表大小。通過將預(yù)測token與真實分布進行比較,可以優(yōu)化交叉熵?fù)p失函數(shù):
3、Top Query層和解碼層。
原始的GPT使用pooler函數(shù)來獲得最終的輸出。我們在所有transformer層之上使用一個額外的查詢層,通過attention獲得最終的embedding。top query層的輸入被替換為位置n+1的query embedding。最后的輸出再乘以詞嵌入矩陣的轉(zhuǎn)置,得到輸出概率。對于解碼策略,貪心、溫度采樣、top-k采樣、top-p采樣和beam search。最后,去標(biāo)記化將把選中的tokenID變成一個實際的單詞。
三、預(yù)訓(xùn)練設(shè)置
1、代碼語料庫
訓(xùn)練語料庫包含兩部分。第一部分來自開源代碼數(shù)據(jù)集,Pile和CodeParrot6。選擇了23種流行的編程語言的文件,包括c++,Python,Java,JavaScript,C,Go等。根據(jù)每個文件的后綴和它所屬的存儲庫的主要語言來識別其編程語言。第二部分是直接從GitHub公共存儲庫中抓取的Python、Java和c++的補充數(shù)據(jù)。
將訓(xùn)練數(shù)據(jù)分成長度相等的片段。為了幫助模型區(qū)分多種語言,我們在每個片段之前以[注釋符號]language:[LANG]的形式添加了一個特定于語言的標(biāo)簽,例如#language:Python標(biāo)記。
2、Tokenization
第一步是將代碼片段轉(zhuǎn)換為數(shù)值向量。考慮到代碼數(shù)據(jù)中存在大量自然語言注釋,變量、函數(shù)和類的命名通常是有意義的單詞,將代碼數(shù)據(jù)視為文本數(shù)據(jù)并使用GPT-2 tokenizer,它是一種BPE(Byte Pair Encoding)分詞器,使用固定大小的詞表和可變長度的字符來處理開放詞表問題。初始詞匯表大小為50,000,將多個空格編碼為額外的標(biāo)記,以提高編碼效率。具體來說,L個空格用<|extratoken_X|>表示,其中X=8+L。由于詞匯表包含來自各種自然語言的標(biāo)記,因此它允許CodeGeeX處理除英語以外的其他語言的標(biāo)記,如中文。最終的詞表大學(xué)是v=52,224。經(jīng)過分詞后,任何代碼片段或文本描述都可以轉(zhuǎn)換為整數(shù)向量。
3、詞嵌入和位置嵌入
給定token,下一步是將每個token與單詞嵌入相關(guān)聯(lián)。通過在詞嵌入矩 陣中查找token ID,其中h=5120為隱藏大小,為每個token 獲得一個可學(xué)習(xí)的嵌入。為了獲取位置信息,我們還采用了可學(xué)習(xí)的位置嵌入,將當(dāng)前位置ID從映射到一個可學(xué)習(xí)的嵌入,其中nmax=2048為最大序列長度。然后,添加兩個嵌入以獲得模型的輸入嵌入。最后,整個序列可以轉(zhuǎn)化為輸入嵌入,其中n是輸入序列長度。
四、訓(xùn)練
CodeGeeX在 使 用 Mindspore (v1.7.0)的 Ascend 910AI處 理 器 (32GB)集 群 上 進 行 訓(xùn) 練 。? 整 個 預(yù) 訓(xùn) 練 過 程 在 192個 節(jié) 點 和 1536個 AI處 理 器 上 花 費 了 兩 個 月 的 時 間 , 在 此 期 間 , 模 型 消 耗 了 850B個token, 相 當(dāng) 于5個epochs(213000steps)。為了提高訓(xùn)練效率,采用8路模型并行和192路數(shù)據(jù)并行,并使用ZeRO-2優(yōu)化器來進一步降低顯存消耗。最終,每個節(jié)點上的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í)率衰減:
?
vscode的插件體驗
代碼翻譯功能
1、完全不理解原始代碼的意思,會生成一些毫不相干的代碼:比如生成的print函數(shù),里面是一堆莫名其妙的邏輯
2、輸出的代碼語言也不是kotlin,仍然是Java,可能是代碼樣本數(shù)量少的原因
代碼理解
對于簡單的代碼可以正確的理解
柚子快報激活碼778899分享:CodeGeex論文閱讀
推薦文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。