當大火的文圖生成模型遇見知識圖譜,AI畫像趨近於真實世界

簡介: 模型免費開放!零基礎也能一鍵進行AI藝術創作。本⽂簡要介紹ARTIST的技術解讀,以及如何在EasyNLP框架中使⽤ARTIST模型。

導讀

用戶生成內容(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(https://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模型中,生成的物體更接近於形如花椰菜的橢圓形的植物。

一顆綠色的花椰菜在生長

無知識注入模型

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

⽤戶可以直接參考GitHubhttps://github.com/alibaba/EasyNLP)上的說明安裝EasyNLP算法框架。

數據準備

  1. 準備自己的數據,將image編碼爲base64形式:ARTIST在具體領域應用需要finetune, 需要用戶準備下遊任務的訓練與驗證數據,爲tsv文件。這⼀⽂件包含以製表符\t分隔的三列(idx, text, imgbase64),第一列是文本編號,第二列是文本,第三列是對應圖片的base64編碼。樣例如下:
64b4109e34a0c3e7310588c00fc9e157  韓國可愛日系襪子女中筒襪春秋薄款純棉學院風街頭卡通兔子長襪潮  iVBORw0KGgoAAAAN...MAAAAASUVORK5CYII=

下列⽂件已經完成預處理,可⽤於訓練和測試:

https://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/artist_text2image/T2I_train.tsv
https://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/artist_text2image/T2I_val.tsv
https://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/artist_text2image/T2I_test.tsv
  1. 將輸入數據與lattice、entity位置信息拼接到一起:輸出格式爲以製表符\t分隔的幾列(idx,  text, lex_ids, pos_s, pos_e, seq_len, [Optional] imgbase64)
# 下載entity to entity_id映射表
wget wget -P ./tmp https://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 https://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地址:https://github.com/alibaba/EasyNLP

Reference

  1. 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
  2. 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
  3. 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

阿里靈傑回顧

原文鏈接:https://click.aliyun.com/m/1000363664/

本文爲阿里雲原創內容,未經允許不得轉載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章