智慧春聯新玩法:AI「刷臉」生成的春聯效果如何?
在 1 月 28 日小年夜的晚會上,百度推出的智慧春聯工具正式上線了。基於人臉識別、自然語言處理等人工智慧技術,這項技術可以憑藉使用者的人臉特性,為你生成充滿創意的個性化春聯。當然使用者也可在這個小工具中輸入名字、甚至任何一段話,獲取屬於自己的專屬春聯。
連結: http://news.163.com/special/test_smart_spring2018/
讓我們看看人工智慧生成春聯的效果如何。首先,貓的圖片是不被認可的,百度的 AI 可以識別圖片中是否為人臉。
於是我們上傳了一張人的圖片。
我們找到了一張百度高管的照片
上傳照片生成的對聯
在智慧春聯的背後,是計算機視覺、自然語言處理等 AI 技術。據介紹,百度通過先進的視覺技術讓 H5 具有刷臉能力,通過其中的人臉檢測、屬性分析和人臉融合等,可對圖片中的人臉進行檢測,分析人臉對應的年齡、性別、顏值、微笑指數、是否佩戴眼鏡等資訊,並通過以一個詞語概括人臉的特性;進而將圖片中的人臉,與指定模板圖中的人臉進行融合,得到新的圖片。這些技術的難度在於,需要對各種角度的人臉進行檢測,並且能夠提取人臉的五官特徵,以便能夠生成與原始人臉相似,但也和模板人臉神似,且毫無違和感的新圖片。
對聯生成的關鍵詞擴充套件技術和對聯生成系統背後的執行機制是什麼樣的?我們從百度工程師那邊瞭解到,具體流程圖如下:
線上系統流程圖
關鍵詞擴充套件技術: 關鍵詞擴充套件技術主要用於解決語義擴充套件問題,正如所有深度學習問題面對的問題一樣,不在訓練語料中出現的字或者詞很容易造成生成結果不理想。在這裡,百度引入了語義相似度匹配技術,將輸入串同對聯中的詞計算相似度,用最相似的詞替換原始輸入串,例如:詠春 -> 武術,當紅->流行等。這樣既能滿足語義層面最大程度的匹配,又能確保生成的對聯符合要求。線上系統為了滿足大規模服務的要求,系統會離線將常用詞提前算好候選,直接使用快取查詢的方式最快的完成語義擴充套件。對於那些低頻詞,還是保留原樣輸入到對聯生成系統中。
對聯生成系統:包含關鍵詞生成上聯,上聯生成下聯和上下聯生成橫批等功能,具體流程如下:
根據輸入串,首先判別此串是否為人名,如果為人名,需要對串進行截斷,三字名擷取最後兩個字,二字名,去掉姓,將名在對聯分詞資料中查詢,找到包含這個字且頻次最高的詞,若無結果,則簡單的將名重複,形成兩字輸入。否則不對串做任何處理
對輸入串切字,挨個字輸入深度學習序列到序列模型,使用模型輸出當作上聯。在最終實現中,我們發現如果任由模型產出而不加任何限制,會出現大量重複,例如:春光 -> 春光無限春光無,這種重複在 7-9 字春聯中十分影響整體效果,所以研究人員在解碼過程中加入了重複限制,只允許一個字重複,且最多重複兩次,加完限制後效果:春光 -> 春光無限江山秀。
在這裡,研究人員採用基於 RNN 的 encoder-decoder 框架進行序列建模
根據上聯智慧生成下聯。上聯生成下聯時,也是使用了一個深度學習序列到序列模型,將上聯的挨個字輸入,產出下聯。類似於上聯,下聯生成的過程中同樣會有很多不確定因素。首先最大的問題是,單純依靠模型,上下聯的字數會不同;其次上下聯對應字的對仗會不工整;最後生成下聯的時候也會出現字重複問題。在解碼過程中,系統首先會確保在模型生成字數未達到要求時 (即同上聯字數相同),解碼不會終止。其次,百度根據大量春聯語料統計出每個字可能對仗的候選,在解碼時,如果輸入的字有候選,那我們只預測候選字的概率,否則預測整個詞表中所有字的概率。這在一定程度上會縮短解碼時間,提升產品併發效能。最後對於重複字,不同於上聯的處理流程,下聯只能在上聯重複字對應的位置上重複,其餘位置均不能重複。例如:春草滿庭吐秀,花花遍地迎春->春草滿庭吐秀,神州遍地迎春。
智慧橫批生成。產生上下聯之後,會根據相似度選擇最合適的橫批。首先將上下聯和候選橫批進行分詞,其次 Jaccard Distance 來計算最相似的橫批,按照得分從高到低排序,選擇分數最高的橫批。正如 Jaccard Distance 公式所示,很容易出現分子為 0,對於這類情形,在這裡會隨機選擇一個橫批,確保春聯的完整性。
離線系統:包括語料收集與預處理、平仄處理、模型訓練和語義擴充套件四部分。具體流程圖如下:
離線系統流程圖
對聯語料收集與預處理:通過定點網站的挖掘和人工收集,過濾掉字數不符合的對聯 (上聯和下聯長度保證 7-12 個字)。使用黃反策略,識別出劣質對聯。對上聯進行分詞,只保留詞長度在 2-4 個字之間的上聯,形成詞 => 上聯的匹配對,並對其分字作為關鍵詞生成上聯的候選訓練語料。如春聯為「百花齊放春光好」,生成的訓練語料則為「百花 => 百花齊放春光好」。上聯生成下聯的模型候選語料為一組對聯分字之後的結果。
平仄處理:對聯的一大特點就是平仄協調,為了能讓模型學習到平仄關係,我們可以從候選語料中只挑選了滿足平仄的對聯作為訓練語料。具體做法為:對於上聯和下聯的最後一個字,查拼音表,如果上聯最後一個字為第三或第四聲,下聯最後一個字為第一或第二聲,則保留這幅對聯,否則刪除這條訓練資料。對於多音字,在這裡取其常用發音。
模型訓練:不同於平常深度學習序列到序列模型使用分詞後的結果作為輸入,百度的程式採用基於字的序列模型,這樣做的原因在於,對聯中上下聯對仗工整,並且每個位置上的字都有對仗關係。其次,在對聯上切詞很容易切出單字這會造成詞表巨大,反而不利於訓練。因為春聯資料規模不大,為了防止過擬合,在這裡加入了 dropout,early stop 等策略,增加驗證的頻率,來選取最優的模型。
語義擴充套件:如上文所述,為了提升對聯效果,減少訓練集合中未出現的字對於模型的影響,模型會離線計算出常用詞同訓練集中切詞後詞 (長度在 2-4 個字之間) 的相似度。在相似度計算部分,模型使用了 simnet 框架進行語義匹配計算。考慮到最長可能會輸入 4 個字,模型也將成語進行了提前計算,從百度百科中抓取下來 4 字詞語,根據詞條類別判斷,只保留類別為詞彙的那些。由於四字成語具有不同的形式,例如:興高采烈 (ABCD),高高興興 (AABB),大吉大利 (ABAC),考慮到訓練語料中會將成語切分開,對於 ABCD 型成語,模型將成語分成 AB 和 CD 分別同對聯中的詞算相似度,再將結果合併,只保留得分高的結果;對於 AABB 型成語,模型只計算 AB 的語義相似度;ABAC 型只計算 BC 的語義相似度。