AliceMind大規模預訓練實踐及AIGC在ModelScope中的應用
一、AIGC 背景介紹
AIGC 的成功開始于 OpenAI 提出的 GPT-3。之前沒有預訓練的生成模型效果和現在有差距,即使用監督學習 + fine-tune 的方式可以在某些 task 得到不錯的效果,但是它的泛化能力比較差,因此當時的 AIGC 并沒有被大家關注。所以當 OpenAI 提出的 GPT-3 可以根據 Prompt 提示詞或者 instruction 指令去生成代碼以及各種各樣的文本時,大家才開始更多去關注和探索 AIGC 方向。另外,除了文本生成以外,DALL-E 和 DALL-E2 在圖片生成方面的進展也是推動 AIGC 發展的重要因素。
二、AliceMind 純文本生成大小模型協同
1、AI 文本生成的三個階段
本次分享主要關注文本生成,下面回顧一下文本生成發展的過程。
?最早的生成是 Encoder-Decoder 架構,沒有預訓練,只是做一些任務上的 fine-tune 工作,當時效果比較差。隨著 GPT-1 預訓練的提出才開始有不錯的效果,之后 BART 和 T5 這兩個模型提出之后發現,用一個生成模型可以做很多 task,而且這些 task 其實效果都可以比較好。比如 T5 可以把各種不同的 NLP 任務都轉化成生成的方式。AliceMind 在 20 年的時候自研了一個 PALM(Pre-training an Autoencoding & Autoregressive Language Model)的生成預訓練模型,后面會介紹。
第二階段的發展從大規模 Language Model 開始。大家發現 GPT-3 有很強的 few-shot 生成和泛化能力,所以也開始廣泛地去做一些大規模的預訓練。包括我們自研中文 PLUG 模型、M6、以及 Google 提出的 PaLM(Pathways Language Model,注意如果忽略大小寫和上面的模型縮寫都是 PALM,這倆模型全稱不一樣,不是一回事),這幾個都是大規模預訓練模型。相比于 GPT-3,后面的模型更偏重于 Prompt,instruct 的生成。我們的 PLUG 也是基于 Prompt,區別在于它是 Encoder-Ddecoder 架構,這個架構和 Decoder-only 不一樣的地方在于,它會更偏理解類的一些生成任務。Google 的PaLM,走的是推理的路線,更能體現模型的智能。
第三階段想要解決的問題是,無監督的大規模預訓練模型在指令方面生成效果比較差。因為它是通過無監督訓練 Language Model 任務去訓練得到的,所以更多偏向續寫的模型。當用戶有一些指令輸入進來,讓模型去做什么事,模型會根據用戶輸入的最后一個詞做續寫,而不是按照指令去回復問題或者回復指令。所以 OpenAI 在 2022 年一月份的時候提出了 Instruct GPT。
Instruct GPT 通過人工標注的指令和 Label 數據訓練,使得模型可以按照指令去生成這個數據,比如我要模型幫我用某種語言寫一個算法。論文中寫到用了 13K Prompt,在無監督訓練得到的 GPT-3 基礎上去做 Supervise 的 fine-tune。這樣模型獲得了對指令的理解能力。同時它因為經過了大量無監督訓練,指令還可以泛化到更多相似的指令。這就是現在 ChatGPT 能在很多場景上都有不錯效果的原因。之后的進一步升級是利用人工標注數據的答案質量高低,再用 Reinforcement Learning 去學習排序,這樣可以提升模型生成的句子。?
2、AliceMind 文本生成模型的發展
?接下來主要介紹 AliceMind 在文本生成大模型上的一些探索。AliceMind 整體是個預訓練模型體系,它包含了很多預訓練模型,今天主要介紹其中的三個。
第一個是生成式預訓練模型 PALM,第二個是我們自研的超大規模中文預訓練的 PLUG,以及我們基于 GPT-3 架構在中文大量無監督數據上去訓練的一個中文 GPT-3。以上是純文本的大模型,還有一個是在圖像多模態上的大模型 mPLUG,它做的是圖文場景、多模態場景的文本生成。?
首先介紹純文本的這幾個模型。對比一下前面介紹過的大小模型,它們各自適用于文本生成哪些場景。
?小模型更偏向資源有限,同時又有一些數據集,而且要求精度和 RT 比較高的一些下游場景。這也可以用預訓練生成小模型,比如 GPT-1,BART 以及 T5,還有我們的 PALM 模型。這些都是參數規模比較小一些的模型,比如這幾個模型的 base、large 規模分別為 1 億、3 億參數。
大模型主要是適用于多生成任務場景。比如我有很多生成任務,但同時我又沒有數據,或者只有很少量數據的情況下,我可以用大模型的一些 few-shot 的泛化能力去實現很多能力。比如現在大模型其實有很多通用能力,比如小說續寫、詩詞生成,對聯生成,還有 QA 問答這些。相比于小模型 fine-tune 之后的效果肯定會差一些,但是可以兼容更多場景。?
這里看一下文本生成任務里面幾種重要的形式。
AliceMind 走了一條先做小模型,取得成果再遷移到大模型,最后再從文本遷移到多模態這樣的道路。下面先從 20 年提出的小模型 PALM 講起。
(1)PALM?
當時的生成預訓練模型,在預訓練任務上都是更偏生成類的,比如 GPT 是 Language Model,把所有的文本去預測下一個詞。BART是把輸入端去做一些 mask,再 decoder 去做一些還原。
我們認為有一類生成類任務,比如文本摘要,有輸入序列長,輸出序列短的特點,這種場景很依賴 encoder 的理解能力。motivation 是看到 EMNLP 上有一篇 paper ,把 BERT encoder 直接拿過來,再加一個隨機 decoder,fine-tune 訓練摘要任務,都得可以得到很好的效果,這說明了 encoder 的重要性。所以我們在做 PALM 的時候結合了自編碼和自回歸的預訓練。
① 自回歸類似于 Language Model 這種去做生成,只不過我們這里會把一個 document 隨機從中間切開,切成兩部分,一部分輸入到 encoder 里面,讓 decoder 去預測后半部分。
② 自編碼預訓練就是在 encoder 側加一個任務,讓模型去提升模型的理解能力。encoder 任務我們采用的是 maskLM,類似于 BERT 的,經過驗證有效的方式去做 mask,直接在 encoder 去做預測。
聯合自編碼自回歸的預訓練它既有 encoder 的理解能力,同時 decoder 也有很好的生成能力。
下面來看實驗的結果。從右側的表可以看出,把自編碼和自回歸任務單獨去掉之后,模型的效果都會下降一個點。另外還對比了幾個生成預訓練模型在大部分數據集上都有提升。
?PALM 2.0 在 1.0 版本上主要是針對中文場景的升級,我們發現通過多階段多任務漸進式預訓練可以進一步提升模型效果。采用課程學習(curriculum learning)的思想,從易到難的學習思路。因為之前的詞編碼這種詞級別的 mask,對于生成有點太簡單了。所以我們這里采用了一個 text infilling,同時也對句子做一些 Shuffle。類似于 BART 的這種方式,只不過它會 mask 更多的詞,同時也會把句子打斷,這樣會使模型生成起來難度更高。相當于從最簡單的這種 maskLM 任務到中間第二階段 text infilling任務。第三階段是延續 PALM 1.0 的自回歸任務。
我們對比了模型在預訓練過程中的這幾個任務的 Accuracy,從 Accuracy 指標的結果可以看出,這幾個任務確實是從易到難的。第一個任務,我們訓練過程中 Accuracy 可以達到 90% 多。第二階段 text infilling & Shuffle 任務,可以達到 80% 的結果。第三階段模型最多能夠達到 40% 以上。畢竟是一個開放性的生成任務,即使人去寫也是比較難的。?
下面看一下多階段漸進式預訓練的實驗結果。開始的詞級別的 mask 作為 Baseline,在此之上加入 text Infilling 對片段 mask 之后,可以看到比較顯著的提升。第三階段再加入自回歸生成之后,模型除了在 ADGEN 數據以外,都有進一步的提升。ADGEN 數據集效果下降是一個比較有趣的現象,原因可能是因為預訓練的任務,如果和下游任務貼合,就會得到不錯的效果。這時候如果進一步進行三階段訓練,效果反而會下降。
PALM 2.0 在幾個中文數據集上面的實驗效果,base/large 均高于其他的 SOTA 模型。
PALM 2.0 模型以及預訓練的 backbone 都已經上傳到 ModelScope 社區中,可以獲取到 modelcard 以及 checkpoint。
下面介紹下游和訓練場景的應用。下游場景以前面介紹的摘要任務為例,只需要寫幾行代碼調用 Pipeline 即可直接做摘要任務的預測。
訓練場景中,用戶只需構造自己的數據集,配置超參就可以做訓練了,也可以更換其中的模型和 backbone。另外訓練過程中會對常用的評價指標進行自動評估,最后保存最好的 checkpoint 模型。之后調用 Pipeline 即可對訓練好的模型做 inference。如果沒有 GPU 機器,也可以用我們提供的一些免費時長,使用在線 notebook 體驗。
(2)中文 GPT-3?
上面講的主要是針對小模型,對預訓練的 backbone 做 fine-tune,下面講兩個大模型,中文 GPT 和我們自研的 PLUG。中文 GPT 延續了英文 GPT Decoder-only 的架構,數據方面用的更多的是中文的無監督語料。因為沒有 Instruct GPT 那么多的標注數據,所以模型的泛化能力差一些。在推理上我們基于 allSpark 做了一些優化,13B 模型生成128 個 tokens 只需要 1 秒。考慮到不同開發者的硬件條件不同,我們目前開放了 6 種不同大小的模型,大家可以根據自己的機器條件選擇。
我們也提供了在線體驗版本供大家測試。詩詞生成場景,模型可以預測詩詞的下半句。小說續寫場景,模型可以根據小說的前半部分續寫。代碼生成場景,可以根據用戶要求的功能以及編程語言生成相應的代碼。
下面展示一個 GPT-3 的訓練體驗樣例。原本的模型不支持詩詞生成(生成的結果并不是一句五個字),對模型使用 Pipeline 重新訓練之后就可以生成詩詞了。
(3)PLUG?
PLUG 中文大模型延續的是 PALM 的思路,結合 NLU 和 NLG 的任務,得到一個理解和生成同時做的模型。NLU 任務是我們自研的 StructBERT 模型,在 BERT的基礎上引入三分類以及對詞級別打亂。NLG 是 PALM 的自編碼自回歸結合。訓練分為兩個階段,第一階段是 StructBERT 的思路,把模型大小提升。第二階段延續 PALM 的思路,用 encoder 做初始化,加上 decoder 之后做生成的訓練。這樣可以得到一個 Encoder-Decoder 統一理解生成模型。做理解相關任務,比如分類/預測時,只需要把 encoder 部分拿出來,沿用 BERT 的方法。做生成相關任務時,再使用全部的 Encoder-Decoder 架構。這里也做了一些推理加速的工作,和中文 GPT 是相同的技術,獲得了 10x 加速的效果。
PLUG 模型在 GLUE 榜單上測試,理解和生成任務都取得了很好的效果。
270 億參數的 PLUG 模型已經在 ModelScope 上開放,大家可以按照流程申請獲取下載鏈接,然后使用 Pipeline 做部署推理。
三、多模態統一生成預訓練模型 mPLUG
下面介紹多模態場景的工作,主要是針對輸入圖+文,輸出文字的情況。
?多模態相關主要的任務有兩種。一個是 VQA,輸入圖片和針對圖片的問題,模型預測答案。另一個是 COCO Caption,輸入圖片,模型預測圖片的描述。
我們提出了多模態統一生成的預訓練模型 mPLUG,主要解決的是多模態融合時,視覺特征序列過長導致的低效性和信息淹沒問題。Vit 結構的問題是,在切 patch 的過程中,如果切的比較小且圖片分辨率高,切下來序列就會很長,序列長會帶來訓練低效的問題。另外在和文本模態融合的過程中,如果圖片數據過長,會淹沒一部分文本的信息。?
mPLUG 結構的底層還是先分別對文本和圖片做編碼,之后用對比學習把兩個維度的特征拉到同一空間,再傳入我們提出的 skip-connection 網絡。之前的 co-attention 或者圖文拼接的方式會存在信息淹沒問題,我們的核心點在于只做非對稱的 attention,即只將視覺特征 cross 到文本側。因為訓練速度慢主要在視覺,這樣可以極大提升模型訓練速度。但是如果只采用這種方式,因為文本序列比較短,會帶來視覺信息的丟失。所以我們在 skip-connection 網絡里面,先通過一個多層的非對稱的 co-attention 網絡,之后把視覺信息拼接進來,然后再過一層的 connected attention。這樣既可以保證視覺信息不丟失,同時防止文本信息被視覺信息淹沒。
以上就是圖片和文本信息融合的 encoder,之后再加上 decoder 做生成的預訓練。這就是我們整體的架構了。這種架構的優勢在,一方面通過這種模塊化多流的 Transformer 結構,可以統一理解和生成。同時它又可以靈活地拆拔不同模塊進行微調。比如做圖文檢索任務,可以不要 decoder,只把 vision 和 text encoder 拆出來做向量檢索,也可以用 ITM 圖文匹配 Score。如果是 caption 任務,則不需要 text encoder,只需要 vision encoder 直接 cross 到 decoder 做圖片描述的生成。如果做開放域的視覺問答,則全部的模塊都會用到。
?在 VQA 任務中,只用了 1400 萬數據就超過了很多用更多數據的模型。在 caption 任務中,我們通過模型的 fine-tune 和加 theta 的優化可以達到很好的效果。圖文檢索中我們用向量和 ITM 的兩個 Score 得到了很好的效果。
在訓練時間方面,skip-connection 相比于之前的幾種方式會減少一些。非對稱 attention 節省的時間更多,但是效果差一些。效果差的原因是,如果只是視覺信息 cross 到文本,文本信息序列太短,不足以承載整個視覺和文本的表示。?
展示幾個 VQA 在開放域上的樣例。
mPLUG 模型同樣放在 ModelScope上。
同樣也有快速體驗和調用,以及針對用戶個性化場景的訓練優化。
四、總結
五、問答環節
Q1:中文 GPT-3 代碼生成是怎么做的,用的什么數據?
A1:第一階段預訓練數據的 common crawl 中包含一些代碼數據。第二階段還專門加了一些代碼數據,另外做了一些 Prompt 整理,優化和標注。
Q2:PLUG 2 萬億是 Dense 的嗎?
A2:不是。開始想嘗試 Dense,但是訓練難度大,所以其實是 MOE 的模型。我們也做一些測試,它在性能上等價于百億千億這種級別。
Q3:中文 GPT-3 開源了嗎?
A3:開源在 ModelScope 社區了。
Q4:海量數據做預訓練,如何加速?
A4:和 NVIDIA 做了一些合作,使用 Megatron 框架做了一些算子,并行上的優化。
Q5:訓練用了多少資源?
A5:base/large 級別的模型,用了 8 卡 A100 的機器訓練了 4-5 天完成的。1.3B/2.7B,用 32 卡的 A100 訓練一兩周的時間。更大的模型,比如 13B/30B 要上百卡級別,接近一個月時間訓練。
Q6:一個是 GPT-3,用于理解類下游任務效果不好?
A6:Decoder-only 結構,不是雙向理解。構建 Prompt 的方式去生成,不如用 encoder 的方式效果好。
Q7:中文 GPT 和 ChatGPT 的區別?
A7:中文 GPT 的架構和 GPT3,ChatGPT 差不多。差別主要在訓練數據上,ChatGPT 使用了有 Label 的 instruction 數據集,效果確實好一些。
今天的分享就到這里,謝謝大家。