引言: python
不知不覺春節假期立刻到來,在今年的春節話題中,不難發現,除了七大姑八大姨親切問候這些常規話題,人工智能的蹤影也是隨處可見。AI在以全新的面貌向咱們展現值得期待的將來,好比今天,咱們能夠用PaddlePaddle來嘗試寫副智能春聯。過年貼春聯已經成爲一個傳統習俗,而商場裏可選的內容很少,不少人想親自出馬,惋惜又不大懂平仄對仗。能不能用人工智能幫咱們寫春聯呢?今年春節,百度、網易和央視網推出了「智能春聯H5」,只要給出2-4個漢字,它就能據此「寫」出一副很是具備觀賞性的藏頭春聯。git
是什麼讓機器擁有對春聯這項技能?經過智能春聯H5,「刷臉」對春聯只需幾秒就能實現,而這背後是一系列「不可描述」的高深技術。視覺方面,主要應用了人臉檢測、屬性分析、人臉融合等技術,可對圖片中的人臉進行檢測,分析人臉對應的年齡、性別、顏值、微笑指數、是否佩戴眼鏡等信息,並經過一個詞語歸納人臉的特性;進而將圖片中的人臉,與指定模板圖中的人臉進行融合,獲得新的圖片。這些技術的難度在於,須要對各類角度的人臉進行檢測,而且可以提取人臉的五官特徵,以便可以生成與原始人臉類似,但也和模板人臉神似,且毫無違和感的新圖片。github
其次是天然語言處理(NLP)方面,基於百度深度學習框架PaddlePaddle先進的神經網絡機器翻譯技術,能夠將春聯創做轉化爲「翻譯」的過程,所不一樣的是,翻譯是在兩種語言之間創建聯繫,而春聯是在同一種語言中創建聯繫。固然,有些人可能會中招「彩蛋」,這些不是AI寫的春聯。好比你刷臉得出「戲精」這個關鍵詞,就會得到一副「流量體質天生有戲,主角光環蓋不住你」,橫批「過足戲癮」的春聯,這麼霸氣十足但是由人工專門爲你埋的梗哦!這樣的春聯出如今朋友圈裏,毫無疑問,點贊人數會瘋狂UpUpUp……算法
讓咱們嘗試體驗一下吧!PaddlePaddle做爲深度學習框架,不只支持深度學習算法的開發和調研,並且官方發佈的模型庫(https://github.com/PaddlePaddle/models)裏面聚集了各類領先的圖像分類、天然語言處理算法。經過這些算法,咱們能夠很方便地實現各類好玩有趣的功能,好比:智能春聯。網絡
智能春聯有各類玩法,能夠根據用戶輸入的關鍵詞,生成一副對聯,實現定製化的專屬春聯,好比:用戶輸入「好運」,百度的人工智能春聯生成程序就會創做出上下聯爲「一年好運滿園錦繡,萬衆同心遍地輝煌」、橫批爲「春光滿園」的春聯;用戶輸入本身的名字,智能春聯生成程序能夠把本身的名字藏在生成的春聯中,造成個性化很是強的春聯,用來發送給本身的朋友;甚至用戶不須要輸入關鍵詞,只須要拍一張照片,而後就能夠根據這張照片生成圖文並茂的春聯。那這些功能都是怎麼作到的呢?這裏咱們給你們介紹一下如何用PaddlePaddle開發一套專屬的智能春聯生成系統。併發
1、咱們的系統須要先作到能理解圖像的內容,好比:用戶輸入的究竟是什麼?框架
這是一個典型圖像分類的問題,圖像分類是根據圖像的語義信息對不一樣類別圖像進行區分,是計算機視覺中重要的基礎問題,是物體檢測、圖像分割、物體跟蹤、行爲分析、人臉識別等其餘高層視覺任務的基礎,在許多領域都有着普遍的應用。在深度學習時代,圖像分類的準確率大幅度提高,PaddlePaddle在經典的數據集ImageNet上,開放了經常使用的模型,包括AlexNet、VGG、GoogLeNet、ResNet、Inception-v四、MobileNet、DPN(Dual Path Network)、SE-ResNeXt模型,同時也開源了訓練的模型方便用戶下載使用。基於這些圖像分類算法,能夠知道用戶輸入的類別,用相似的技術,還能夠知道一些更具體的屬性,好比:對於一張人臉的照片,能夠知道性別、年齡這些屬性。有了圖片的這些特徵和屬性以後,咱們能夠進行關鍵詞擴展。好比:對於年輕的女性能夠聯想出一些關鍵詞「風華絕代」、「秀麗」、「端莊」等等,對於小孩能夠聯想出關鍵詞「活潑可愛」、「機智」、「勇敢」等等。學習
2、拿到這些關鍵詞以後,接下來的任務是什麼?ui
根據一個關鍵詞,自動生成一副相關的春聯。春聯的生成過程能夠分紅2個步驟,第一個步驟是從關鍵詞生成一副上聯。而後再根據上聯生成一副下聯。那麼如何實現這2個生成步驟呢?咱們發現這個任務跟機器翻譯很類似,能夠用相似的技術來實現。機器翻譯(Machine Translation, MT)是用計算機來實現不一樣語言之間翻譯的技術。被翻譯的語言一般稱爲源語言(Source Language),翻譯成的結果語言稱爲目標語言(Target Language)。機器翻譯即實現從源語言到目標語言轉換的過程,是天然語言處理的重要研究領域之一。PaddlePaddle的模型庫(PaddlePaddle/models)裏面,提供了兩個機器翻譯算法的實現,一個是經典的基於LSTM的Seq2Seq模型,另外一個是最新的基於Attention的Transformer模型。 類比於機器翻譯任務,能夠把智能春聯輸入的關鍵詞看做是機器翻譯裏的源語言句子,而後把根據關鍵詞生成的上聯,看做是機器翻譯裏的目標語言譯文。相較於此前 Seq2Seq 模型中普遍使用的循環神經網絡(Recurrent Neural Network, RNN),使用(Self)Attention 進行輸入序列到輸出序列的變換主要具備如下優點:計算複雜度更小、計算併發度更高、更容易學到長距離的依賴關係。咱們推薦使用翻譯效果更好的Transformer模型,一般Transfomer能夠獲得比Seq2Seq更好的翻譯效果。人工智能
圖2. Transformer模型核心組件Multi-Head Attention
def scaled_dot_product_attention(q, k, v, attn_bias, d_key, dropout_rate):
"""
Scaled Dot-Product Attention
"""
scaled_q = layers.scale(x=q, scale=d_key**-0.5)
product = layers.matmul(x=scaled_q, y=k, transpose_y=True)
if attn_bias:
product += attn_bias
weights = layers.softmax(product)
if dropout_rate:
weights = layers.dropout(
weights,
dropout_prob=dropout_rate,
seed=ModelHyperParams.dropout_seed,
is_test=False)
out = layers.matmul(weights, v)
return out
圖3. Scaled Dot-Product Attention的PaddlePaddle代碼實現
3、選定了使用的生成算法以後,如何讓機器可以學會寫春聯呢?
接下來就須要給系統準備訓練數據了,所謂「熟讀唐詩三百首」,對於機器來講,須要見到大量的春聯,纔可以學會春聯裏用詞和用字的規律。咱們能夠去互聯網上找到大量的春聯數據,好比:「爆竹傳吉語」「臘梅報新春」等等,而後把它們做爲訓練數據,一般須要幾萬條。有了這些數據後,咱們從上聯裏抽取出關鍵詞,「爆竹」-> 「爆竹傳吉語」,訓練一個從關鍵詞到上聯的生成模型;而後咱們再用「爆竹傳吉語」「臘梅報新春」訓練一個從上聯到下聯的生成模型。
準備好訓練數據後,就能夠啓動Transformer模型的訓練了,能夠參考PaddlePaddle/models/neural_machine_translation/transformer裏的命令。這個是英德翻譯的例子,在作關鍵詞到上聯的生成時,須要把訓練數據替換成「關鍵詞」到對應「春聯上聯」的數據;在作上聯到下聯生成時,須要把訓練數據替換成「春聯上聯」到對應「春聯下聯」的數據。
python -u train.py \
--src_vocab_fpath gen_data/wmt16_ende_data_bpe/vocab_all.bpe.32000 \
--trg_vocab_fpath gen_data/wmt16_ende_data_bpe/vocab_all.bpe.32000 \
--special_token '<s>''<e>''<unk>' \
--train_file_pattern gen_data/wmt16_ende_data_bpe/train.tok.clean.bpe.32000.en-de \
--token_delimiter ' ' \
--use_token_batch True \
--batch_size 4096 \
--sort_type pool \
--pool_size 200000
訓練完成後就能夠獲得一個關鍵詞到上聯的生成模型,還有一個從上聯到下聯的生成模型。注意生成過程,須要執行2次Transformer的預測過程,先輸入一個關鍵詞,生成上聯;而後輸入生成的上聯,再生成一個下聯。具體生成參考如下命令。
python -u infer.py \
--src_vocab_fpath gen_data/wmt16_ende_data_bpe/vocab_all.bpe.32000 \
--trg_vocab_fpath gen_data/wmt16_ende_data_bpe/vocab_all.bpe.32000 \
--special_token '<s>''<e>''<unk>' \
--test_file_pattern gen_data/wmt16_ende_data_bpe/newstest2016.tok.bpe.32000.en-de \
--token_delimiter ' ' \
--batch_size 32 \
model_path trained_models/iter_100000.infer.model \
beam_size 4 \
max_out_len 255
根據以上PaddlePaddle官方模型庫提供的一些技術,就能夠實現一個好玩的智能春聯繫統了。固然還能夠作不少有意思的擴展,好比,能夠增長一些古詩詞做爲訓練語料,使得生成的春聯內容更爲豐富;藏頭春聯,把關鍵詞按字分開,經過Grid Beam Search的技術,保證生成的關鍵詞會在春聯特定的位置出現。
感興趣的朋友,能夠收集好春聯訓練語料,即可嘗試實現一個好玩的智能春聯繫統了。
Github地址:
https://github.com/PaddlePaddle/models/blob/develop/fluid/PaddleNLP/neural_machine_translation/transformer/README_cn.md