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