當大火的文圖生成模型遇見知識圖譜,AI畫像趨近於真實世界
作者:朱祥茹、段忠傑、汪誠愚、黃俊
導讀
用戶生成內容(User Generated Content,UGC)是互聯網上多模態內容的重要組成部分,UGC數據級的不斷增長促進了各大多模態內容平台的繁榮。在海量多模態數據和深度學習大模型的加持下,AI生成內容(AI Generated Content,AIGC)呈現出爆發性增長趨勢。其中,文圖生成(Text-to-image Generation)任務是流行的跨模態生成任務,旨在生成與給定文本對應的圖像。典型的文圖模型例如OpenAI開發的DALL-E和DALL-E2。近期,業界也訓練出了更大、更新的文圖生成模型,例如Google提出的Parti和Imagen,基於擴散模型的Stable Diffusion等。
然而,上述模型一般不能用於處理中文的需求,而且上述模型的參數量龐大,很難被開源社區的廣大用戶直接用來Fine-tune和推理。此外,文圖生成模型的訓練過程對於知識的理解比較缺乏,容易生成反常識內容。本次,EasyNLP開源框架在先前推出的基於Transformer的文圖生成模型(看這裡)基礎上,進一步推出了融合豐富知識圖譜知識的文圖生成模型ARTIST,能在知識圖譜的指引上,生成更加符合常識的圖片。我們在中文文圖生成評測基準MUGE上評測了ARTIST的生成效果,其生成效果名列榜單第一。我們也向開源社區免費開放了知識增強的中文文圖生成模型的Checkpoint,以及相應Fine-tune和推理接口。用戶可以在我們開放的Checkpoint基礎上進行少量領域相關的微調,在不消耗大量計算資源的情況下,就能一鍵進行各種藝術創作。
EasyNLP(//github.com/alibaba/EasyNLP)是阿⾥雲機器學習PAI 團隊基於 PyTorch 開發的易⽤且豐富的中⽂NLP算法框架,⽀持常⽤的中⽂預訓練模型和⼤模型落地技術,並且提供了從訓練到部署的⼀站式 NLP 開發體驗。EasyNLP 提供了簡潔的接⼝供⽤戶開發 NLP 模型,包括NLP應⽤ AppZoo 和預訓練 ModelZoo,同時提供技術幫助⽤戶⾼效的落地超⼤預訓練模型到業務。由於跨模態理解需求的不斷增加,EasyNLP也⽀持各種跨模態模型,特別是中⽂領域的跨模態模型,推向開源社區,希望能夠服務更多的 NLP 和多模態算法開發者和研 究者,也希望和社區⼀起推動 NLP /多模態技術的發展和模型落地。
本⽂簡要介紹ARTIST的技術解讀,以及如何在EasyNLP框架中使⽤ARTIST模型。
ARTIST模型詳解
ARTIST模型的構建基於Transformer模型 ,將文圖生成任務分為兩個階段進行,第一階段是通過VQGAN模型對圖像進行矢量量化,即對於輸入的圖像,通過編碼器將圖像編碼為定長的離散序列,解碼階段是以離散序列作為輸入,輸出重構圖。第二階段是將文本序列和編碼後的圖像序列作為輸入,利用GPT模型學習以文本序列為條件的圖像序列生成。為了增強模型先驗,我們設計了一個Word Lattice Fusion Layer,將知識圖譜中的的實體知識引入模型,輔助圖像中對應實體的生成,從而使得生成的圖像的實體信息更加精準。下圖是ARTIST模型的系統框圖,以下從文圖生成總體流程和知識注入兩方面介紹本方案。
第一階段:基於VQGAN的圖像矢量量化
在VQGAN的訓練階段,我們利用數據中的圖片,以圖像重構為任務目標,訓練一個圖像詞典的codebook,其中,這一codebook保存每個image token的向量表示。實際操作中,對於一張圖片,通過CNN Encoder編碼後得到中間特徵向量,再對特徵向量中的每個編碼位置尋找codebook中距離最近的表示,從而將圖像轉換成由codebook中的imaga token表示的離散序列。第二階段中,GPT模型會以文本為條件生成圖像序列,該序列輸入到VQGAN Decoder,從而重構出一張圖像。
第二階段:以文本序列為輸入利用GPT生成圖像序列
為了將知識圖譜中的知識融入到文圖生成模型中,我們首先通過TransE對中文知識圖譜CN-DBpedia進行了訓練,得到了知識圖譜中的實體表示。在GPT模型訓練階段,對於文本輸入,首先識別出所有的實體,然後將已經訓練好的實體表示和token embedding進行結合,增強實體表示。但是,由於每個文本token可能屬於多個實體,如果將多個實體的表示全都引入模型,可能會造成知識噪聲問題。所以我們設計了實體表示交互模塊,通過計算每個實體表示和token embedding的交互,為所有實體表示加權,有選擇地進行知識注入。特別地,我們計算每個實體表徵對對於當前token embedding的重要性,通過內積進行衡量,然後將實體表示的加權平均值注入到當前token embedding中,計算過程如下:
得到知識注入的token embedding後,我們通過構建具有layer norm的self-attention網絡,構建基於Transformer的GPT模型,過程如下:
在GPT模型的訓練階段,將文本序列和圖像序列拼接作為輸入,假設文本序列為w, 生成圖像的imaga token表示的離散序列概率如下所示:
最後,模型通過最大化圖像部分的負對數似然來訓練,得到模型參數的值。
ARTIST模型效果
標準數據集評測結果
我們在多個中文數據集上評估了ARTIST模型的效果,這些數據集的統計數據如下所示:
在Baseline方面,我們考慮兩種情況:zero-shot learning和標準fine-tuning。我們將40億參數的中文CogView模型作為zero-shot learner,我們也考慮兩個模型規模和ARTIST模型規模相當的模型,分別為開源的DALL-E模型和OFA模型。實驗數據如下所示:
從上可以看出,我們的模型在參數量很小的情況(202M)下也能獲得較好的圖文生成效果。為了衡量注入知識的有效性,我們進一步進行了相關評測,將知識模塊移除,實驗效果如下:
上述結果可以清楚地看出知識注入的作用。
案例分析
為了更加直接地比較不同場景下,ARTIST和baseline模型生成圖像質量對比,我們展示了電商商品場景和自然風光場景下各個模型生成圖像的效果,如下圖:
電商場景效果對比
自然風光場景效果對比
上圖可以看出ARTIST生成圖像質量的優越性。我們進一步比較我們先前公開的模型(看這裡)和具有豐富知識的ARTIST模型的效果。在第一個示例「手工古風復原款髮釵漢服配飾宮廷發簪珍珠頭飾發冠」中,原始生成的結果主要突出了珍珠發冠這個物體。在ARTIST模型中,「古風」等詞的知識注入過程使得模型生成結果會更偏向於古代中國的珍珠發簪。
第二個示例為「一顆綠色的花椰菜在生長」。由於模型在訓練時對「花椰菜」物體樣式掌握不夠,當不包含知識注入模塊時,模型根據「綠色」和「菜」的提示生成了有大片綠葉的單株植物。在ARTIST模型中,生成的物體更接近於形如花椰菜的橢圓形的植物。
ARTIST模型在MUGE榜單的評測結果
MUGE(Multimodal Understanding and Generation Evaluation,鏈接)是業界首個大規模中文多模態評測基準,其中包括基於文本的圖像生成任務。我們使用本次推出的ARTIST模型在中文MUGE評測榜單上驗證了前述文圖生成模型的效果。從下圖可見,ARTIST模型生成的圖像在FID指標(Frechet Inception Distance,值越低表示生成圖像質量越好)上超越了榜單上的其他結果。
ARTIST模型的實現
在EasyNLP框架中,我們在模型層構建了ARTIST模型的Backbone,其主要是GPT,輸入分別是token id和包含的實體的embedding,輸出是圖片各個patch對應的離散序列。其核⼼代碼如下所示:
# in easynlp/appzoo/text2image_generation/model.py
# init
self.transformer = GPT_knowl(self.config)
# forward
x = inputs['image']
c = inputs['text']
words_emb = inputs['words_emb']
x = x.permute(0, 3, 1, 2).to(memory_format=torch.contiguous_format)
# one step to produce the logits
_, z_indices = self.encode_to_z(x)
c_indices = c
cz_indices = torch.cat((c_indices, a_indices), dim=1)
# make the prediction
logits, _ = self.transformer(cz_indices[:, :-1], words_emb, flag=True)
# cut off conditioning outputs - output i corresponds to p(z_i | z_{<i}, c)
logits = logits[:, c_indices.shape[1]-1:]
在數據預處理過程中,我們需要獲得當前樣本的輸入文本和實體embedding,從而計算得到words_emb:
# in easynlp/appzoo/text2image_generation/data.py
# preprocess word_matrix
words_mat = np.zeros([self.entity_num, self.text_len], dtype=np.int)
if len(lex_id) > 0:
ents = lex_id.split(' ')[:self.entity_num]
pos_s = [int(x) for x in pos_s.split(' ')]
pos_e = [int(x) for x in pos_e.split(' ')]
ent_pos_s = pos_s[token_len:token_len+self.entity_num]
ent_pos_e = pos_e[token_len:token_len+self.entity_num]
for i, ent in enumerate(ents):
words_mat[i, ent_pos_s[i]:ent_pos_e[i]+1] = ent
encoding['words_mat'] = words_mat
# in batch_fn
words_mat = torch.LongTensor([example['words_mat'] for example in batch])
words_emb = self.embed(words_mat)
ARTIST模型使⽤教程
以下我們簡要介紹如何在EasyNLP框架使⽤ARTIST模型。
安裝EasyNLP
⽤戶可以直接參考GitHub(//github.com/alibaba/EasyNLP)上的說明安裝EasyNLP算法框架。
數據準備
- 準備自己的數據,將image編碼為base64形式:ARTIST在具體領域應用需要finetune, 需要用戶準備下游任務的訓練與驗證數據,為tsv文件。這⼀⽂件包含以製表符\t分隔的三列(idx, text, imgbase64),第一列是文本編號,第二列是文本,第三列是對應圖片的base64編碼。樣例如下:
64b4109e34a0c3e7310588c00fc9e157 韓國可愛日系襪子女中筒襪春秋薄款純棉學院風街頭卡通兔子長襪潮 iVBORw0KGgoAAAAN...MAAAAASUVORK5CYII=
下列⽂件已經完成預處理,可⽤於訓練和測試:
//atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/artist_text2image/T2I_train.tsv
//atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/artist_text2image/T2I_val.tsv
//atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/artist_text2image/T2I_test.tsv
- 將輸入數據與lattice、entity位置信息拼接到一起:輸出格式為以製表符\t分隔的幾列(idx, text, lex_ids, pos_s, pos_e, seq_len, [Optional] imgbase64)
# 下載entity to entity_id映射表
wget wget -P ./tmp //atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/artist_text2image/entity2id.txt
python examples/text2image_generation/preprocess_data_knowl.py \
--input_file ./tmp/T2I_train.tsv \
--entity_map_file ./tmp/entity2id.txt \
--output_file ./tmp/T2I_knowl_train.tsv
python examples/text2image_generation/preprocess_data_knowl.py \
--input_file ./tmp/T2I_val.tsv \
--entity_map_file ./tmp/entity2id.txt \
--output_file ./tmp/T2I_knowl_val.tsv
python examples/text2image_generation/preprocess_data_knowl.py \
--input_file ./tmp/T2I_test.tsv \
--entity_map_file ./tmp/entity2id.txt \
--output_file ./tmp/T2I_knowl_test.tsv
ARTIST文圖生成微調和預測示例
在文圖生成任務中,我們對ARTIST進行微調,之後用於微調後對模型進行預測。相關示例代碼如下:
# 下載entity_id與entity_vector的映射表
wget -P ./tmp //atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/artist_text2image/entity2vec.pt
# finetune
python -m torch.distributed.launch $DISTRIBUTED_ARGS examples/text2image_generation/main_knowl.py \
--mode=train \
--worker_gpu=1 \
--tables=./tmp/T2I_knowl_train.tsv,./tmp/T2I_knowl_val.tsv \
--input_schema=idx:str:1,text:str:1,lex_id:str:1,pos_s:str:1,pos_e:str:1,token_len:str:1,imgbase64:str:1, \
--first_sequence=text \
--second_sequence=imgbase64 \
--checkpoint_dir=./tmp/artist_model_finetune \
--learning_rate=4e-5 \
--epoch_num=2 \
--random_seed=42 \
--logging_steps=100 \
--save_checkpoint_steps=200 \
--sequence_length=288 \
--micro_batch_size=8 \
--app_name=text2image_generation \
--user_defined_parameters='
pretrain_model_name_or_path=alibaba-pai/pai-artist-knowl-base-zh
entity_emb_path=./tmp/entity2vec.pt
size=256
text_len=32
img_len=256
img_vocab_size=16384
'
# predict
python -m torch.distributed.launch $DISTRIBUTED_ARGS examples/text2image_generation/main_knowl.py \
--mode=predict \
--worker_gpu=1 \
--tables=./tmp/T2I_knowl_test.tsv \
--input_schema=idx:str:1,text:str:1,lex_id:str:1,pos_s:str:1,pos_e:str:1,token_len:str:1, \
--first_sequence=text \
--outputs=./tmp/T2I_outputs_knowl.tsv \
--output_schema=idx,text,gen_imgbase64 \
--checkpoint_dir=./tmp/artist_model_finetune \
--sequence_length=288 \
--micro_batch_size=8 \
--app_name=text2image_generation \
--user_defined_parameters='
entity_emb_path=./tmp/entity2vec.pt
size=256
text_len=32
img_len=256
img_vocab_size=16384
max_generated_num=4
'
在阿里雲機器學習平台PAI上使用Transformer實現文圖生成
PAI-DSW(Data Science Workshop)是阿里雲機器學習平台PAI開發的雲上IDE,面向不同水平的開發者,提供了交互式的編程環境(文檔)。在DSW Gallery中,提供了各種Notebook示例,方便用戶輕鬆上手DSW,搭建各種機器學習應用。我們也在DSW Gallery中上架了使用Transformer模型進行中文文圖生成的Sample Notebook(見下圖),歡迎大家體驗!
未來展望
在這一期的工作中,我們在EasyNLP框架中擴展了基於Transformer的中文文圖生成功能,同時開放了模型的Checkpoint,方便開源社區用戶在資源有限情況下進行少量領域相關的微調,進行各種藝術創作。在未來,我們計劃在EasyNLP框架中推出更多相關模型,敬請期待。我們也將在EasyNLP框架中集成更多SOTA模型(特別是中文模型),來支持各種NLP和多模態任務。此外,阿里雲機器學習PAI團隊也在持續推進中文多模態模型的自研工作,歡迎用戶持續關注我們,也歡迎加入我們的開源社區,共建中文NLP和多模態算法庫!
Github地址://github.com/alibaba/EasyNLP
Reference
- Chengyu Wang, Minghui Qiu, Taolin Zhang, Tingting Liu, Lei Li, Jianing Wang, Ming Wang, Jun Huang, Wei Lin. EasyNLP: A Comprehensive and Easy-to-use Toolkit for Natural Language Processing. EMNLP 2022
- Tingting Liu*, Chengyu Wang*, Xiangru Zhu, Lei Li, Minghui Qiu, Ming Gao, Yanghua Xiao, Jun Huang. ARTIST: A Transformer-based Chinese Text-to-Image Synthesizer Digesting Linguistic and World Knowledge. EMNLP 2022
- Aditya Ramesh, Mikhail Pavlov, Gabriel Goh, Scott Gray, Chelsea Voss, Alec Radford, Mark Chen, Ilya Sutskever. Zero-Shot Text-to-Image Generation. ICML 2021: 8821-8831
阿里靈傑回顧
- 阿里靈傑:阿里雲機器學習PAI開源中文NLP算法框架EasyNLP,助力NLP大模型落地
- 阿里靈傑:預訓練知識度量比賽奪冠!阿里雲PAI發佈知識預訓練工具
- 阿里靈傑:EasyNLP帶你玩轉CLIP圖文檢索
- 阿里靈傑:EasyNLP中文文圖生成模型帶你秒變藝術家
- 阿里靈傑:EasyNLP集成K-BERT算法,藉助知識圖譜實現更優Finetune
- 阿里靈傑:中文稀疏GPT大模型落地 — 通往低成本&高性能多任務通用自然語言理解的關鍵里程碑
- 阿里靈傑:EasyNLP玩轉文本摘要(新聞標題)生成
- 阿里靈傑:跨模態學習能力再升級,EasyNLP電商文圖檢索效果刷新SOTA
- 阿里靈傑:EasyNLP帶你實現中英文機器閱讀理解
- 阿里靈傑:EasyNLP發佈融合語言學和事實知識的中文預訓練模型CKBERT