春節對聯哪家強 人工智慧對得狂!
- 2020 年 2 月 3 日
- 資訊
對聯傳統源遠流長,一幅寫春聯的需要極高的文學素養,不僅要求平仄齊整、意境對稱,還要表達辟邪除災、迎祥納福的美好願望。但是對於現代人來說,由於對傳統文學的生疏和缺乏對對聯的練習,對對聯變得不容易了。
但是人工智慧技術普及的今天,攻克對聯難關早就有人來嘗試進行了。其中最為著名,最富有文學氣息的當屬微軟亞洲研究院的對聯繫統,其由微軟亞洲研究院副院長周明負責開發,並能夠利用本交互方式可以隨意修改下聯和橫批。如下圖所示,就“千江有水千江月”一對就可對出“萬里無雲萬里天”。
地址:http://duilian.msra.cn/default.htm
不過,在新奇以及個性化方面不如最近新崛起的百度春聯繫統,百度開發的對聯繫統有刷臉出對聯以及藏頭對聯等系統。如下圖所示,以人工智慧為題眼,AI給出的一幅對聯。
手機打開喲:https://aichunlian.cctv.com/?from=singlemessage&isappinstalled=0
不僅能刷臉生成對聯,還可以預測合成你20歲年紀模樣。雷鋒網用李飛飛博士的一張照片試了一下,可以在下方滾動區域清晰的看到每一步的文字。結果顯示預測年齡為32歲,AI給顏值打80分。另外,生成的李博士20歲的照片頗為青春(* ̄︶ ̄)。
當然,還有去年非常火的個人版AI對聯,設計者是本科畢業於黑龍江大學電腦專業,碩士畢業於英國萊斯特大學讀電腦碩士的王斌。從測試結果(如下圖)來看,對於一般的對聯效果也是杠杠滴~
對聯地址:https://ai.binwang.me/couplet/
雷鋒網介紹,這個AI的訓練,是基於深度學習seq2seq模型,用到了TensorFlow和Python 3.6,程式碼已經開源,你可以自行打開下面的GitHub地址下載開源程式碼嘗試訓練。另外,訓練它所用的數據集來自一位名為馮重朴_梨味齋散葉的部落客的新浪部落格,總共包含超過70萬副對聯。
開源程式碼:
https://github.com/wb14123/seq2seq-couplet
訓練數據集:https://github.com/wb14123/couplet-dataset
所以想自己寫春聯的,但又憋不出大招的小夥伴,可以使用上述任一AI系統打造出屬於你自己的對聯。
AI對聯背後的技術
關於AI對聯所採用的技術,微軟周明在部落格中曾經寫過這樣一段話:“我設計了一個簡單的模型,把對聯的生成過程看作是一個翻譯的過程。給定一個上聯,根據字的對應和詞的對應,生成很多選字和候選詞,得到一個從左到右相互關聯的詞圖,然後根據一個動態規劃演算法,求一個最好的下聯出來。
從上述文字我們可以知道,AI對聯採用的是一系列機器翻譯演算法。和不同語言之間的翻譯不同的是,給出上聯,AI對出下聯是同種語言之間的翻譯。
這也就是說對聯繫統的水平直接依賴於機器翻譯系統的發展歷程。
機器翻譯的最初的源頭可以追溯到1949年,那時的技術主流都是基於規則的機器翻譯, 最常見的做法就是直接根據詞典逐字翻譯,但是這種翻譯方法效果確實不太好。“規則派”敗北之後,日本京都大學的長尾真教授提出了基於實例的機器翻譯,即只要存上足夠多的例句,即使遇到不完全匹配的句子,也可以比對例句,只要替換不一樣的詞的翻譯就可以。但這種方式並沒有掀起多大的風浪。
1993年發布的《機器翻譯的數學理論》論文中提出了由五種以詞為單位的統計模型,其思路主要是把翻譯當成機率問題,這種翻譯方式雖然在當時風靡一時,但真正掀起革命的還是2014年深度學習的興起。
2016年Google正式宣布將所有統計機器翻譯下架,神經網路機器翻譯上位,成為現代機器翻譯的絕對主流。具體來說,目前市面上的AI對聯基本上都是基於attention機制的seq2seq模型的序列生成任務訓練而成。seq2seq模型又叫Encoder-Decoder。
關於此模型AI科技評論之前曾經寫過一篇文章詳細介紹,尚未理解的讀者請戳此《完全圖解RNN、RNN變體、Seq2Seq、Attention機制》閱讀。
現在我們也把關鍵部分摘要如下:Encoder-Decoder結構先將輸入數據編碼成一個上下文向量c:
得到c有多種方式,最簡單的方法就是把Encoder的最後一個隱狀態賦值給c,還可以對最後的隱狀態做一個變換得到c,也可以對所有的隱狀態做變換。
拿到c之後,就用另一個網路對其進行解碼,這部分網路結構被稱為Decoder。具體做法就是將c當做之前的初始狀態h0輸入到Decoder中:
還有一種做法是將c當做每一步的輸入:
由於這種Encoder-Decoder結構不限制輸入和輸出的序列長度,因此應用的範圍非常廣泛。
Attention機制
在Encoder-Decoder結構中,Encoder把所有的輸入序列都編碼成一個統一的語義特徵c再解碼,因此,c中必須包含原始序列中的所有資訊,它的長度就成了限制模型性能的瓶頸。如機器翻譯問題,當要翻譯的句子較長時,一個c可能存不下那麼多資訊,就會造成翻譯精度的下降。
Attention機制通過在每個時間輸入不同的c來解決這個問題,下圖是帶有Attention機制的Decoder:
每一個c會自動去選取與當前所要輸出的y最合適的上下文資訊。具體來說,我們用aij衡量Encoder中第j階段的hj和解碼時第i階段的相關性,最終Decoder中第i階段的輸入的上下文資訊 ci就來自於所有 hj 對 aij 的加權和。以機器翻譯為例(將中文翻譯成英文):
輸入的序列是“我愛中國”,因此,Encoder中的h1、h2、h3、h4就可以分別看做是“我”、“愛”、“中”、“國”所代表的資訊。在翻譯成英語時,第一個上下文c1應該和“我”這個字最相關,因此對應的a11就比較大,而相應的 a12、a13、a14就比較小。c2應該和“愛”最相關,因此對應的a22就比較大。最後的c3和h3、h4最相關,因此a33、a34的值就比較大。
至此,關於Attention模型,我們就只剩最後一個問題了,那就是:這些權重aij是怎麼來的?
事實上,aij同樣是從模型中學出的,它實際和Decoder的第i-1階段的隱狀態、Encoder第j個階段的隱狀態有關。
同樣還是拿上面的機器翻譯舉例,a1j的計算(此時箭頭就表示對h'和 hj 同時做變換):
a2j 的計算:
a3j的計算:
以上就是帶有Attention的Encoder-Decoder模型計算的全過程。
關於解碼器和編碼器
解碼器和編碼器所用的網路結構,在深度學習時代大多使用卷積網路(CNN)和循環網路(RNN),然而Google 提出了一種新的架構 Transformer也可以作為解碼器和編碼器。
註:Transformer最初由論文《Attention is All You Need》提出,漸漸有取代RNN成為NLP中主流模型的趨勢,現在更是Google雲TPU推薦的參考模型,包括Google給自己TPU打廣告的Bert就是Transformer模型。總的來說,在NLP任務上其性能比前兩個神經網路的效果要好。
這徹底顛覆了過去的理念,沒用到 CNN 和 RNN,用更少的計算資源,取得了比過去的結構更好的結果。
Transformer引入有以下幾個特點:提出用注意力機制來直接學習源語言內部關係和目標語言內部關係,1.拋棄之前用 RNN 來學習;2.對存在多種不同關係的假設,而提出多頭 (Multi-head) 注意力機制,有點類似於 CNN 中多通道的概念;3..對詞語的位置,用了不同頻率的 sin 和 cos 函數進行編碼。
機器翻譯任重而道遠
從對聯的角度來看,當前的機器翻譯還有很大的改進方向,例如前段時間有句很火的上聯“莫言路遙余秋雨”,我們用微軟對聯繫統輸入之後,就沒有答案。出現這種問題的原因在於演算法和數據集。
然而我們把這個上聯輸入王斌版的對聯繫統,就會得到“看雲山遠處春風”的下聯。雖說給出了下聯,但是意境和上聯相比卻相差甚遠:“莫言路遙余秋雨”的字面意思是近現代三位文人,意境是“不必言道路漫長空餘寂寥秋雨”,AI給出的下聯不僅在意境上無法呼應,字面意思也對應不上。
管中窺豹,僅此一例便能看出當前的機器翻譯存在一些問題,正如AI科技評論從百度處獲悉:“當前主要都是採用端到端序列生成的模型來自動寫對聯和寫詩,對於一般用戶來說生成的春聯或者詩歌讀起來也能朗朗上口,感覺也不錯。
從專業角度來說其實還有很大的改進空間,例如現有的模型都是基於語料學習生成的,而採集的春聯庫通常包含的辭彙是有限的,生成的春聯有一定的同質性,內容新意上有待繼續提升。其次是機器有時候會生成一些不符合常理的內容,對生成內容的理解也值得繼續深挖。”
宏觀到整個機器翻譯層面,不同語言之間的機器翻譯還存有很多技術難點亟待攻克,比如語序混亂、詞義不準確等。
當前的演算法和算力的發展確實能夠解決一些特定的困難,但是機器翻譯的研究應在以下三個方面有所突破:大語境,而不再是孤立句子地處理;基於理解而不再是停留在句法分析的層面;高度專業化和專門化。
參考文獻:
https://www.jianshu.com/p/7e66bec3123b
http://www.citnews.com.cn/e/wap/show.php?classid=9&id=101568