你好,機器作詩瞭解一下

你好,機器作詩瞭解一下

 

文章來源:企鵝號 - 語言學午餐Ling-Lunch

 

還記得當年的Alpha Go嗎?人工智能在圍棋領域戰勝了人類,我們都曾爲此唏噓不已。當時,高曉鬆說:“等有一天,機器做出了所有的音樂與詩歌,我們的路也會走完”。 這一天真的會到來嗎?機器的“詩和遠方”又會是怎樣的呢?

隨着人工智能領域的蓬勃發展,人們也開始探索它在文藝領域的應用。在這方面,機器作詩(Automated Poetry Generation)無疑是最受熱議的話題之一。

那繁星閃爍的幾天蒼色

那滿心的紅日

看萬里天使在世界

我就像夢

看那星 閃爍的幾顆星

西山上的太陽

青蛙兒正在遠遠的淺水

她嫁了人間許多的顏色

選自微軟小冰詩集《陽光失了玻璃窗》

2017年5月,微軟亞洲研究院發佈了由智能機器人小冰創作的第一部人工智能詩集《陽光失了玻璃窗》。這個里程碑事件也引起了計算機科學、語言學、文學等領域對人工智能與詩歌本質的大討論。最近,在央視的《機智過人》節目中,清華大學的機器作詩系統“九歌”也得到了專業人士的讚譽。

 

利用九歌作詩系統所創作的藏頭詩

雖然這些作詩系統讓人感到驚喜、有趣,但也有許多人對人工智能創作的所謂“詩歌”抱負面態度。詩人羣體大多認爲這只不過是一場文字遊戲:

"一個語言遊戲而已。但無論輸入多少句子還是寫不了真詩。真詩是靈性的。這個設計者水平有限,它設計不了靈性,設計不了詩成泣鬼神這種東西。"

—— 詩人于堅評價微軟小冰

儘管詩歌的本質以及評判標準還很難界定,機器作詩系統背後的語言學原理仍然非常令人好奇。人工智能系統到底是如何寫出這些詩歌的呢?今天午餐君就來從計算語言學(Computational Linguistics)的角度,和大家簡單聊聊機器作詩的原理。

下文約4500字,預計閱讀時間爲15分鐘。

在聊原理之前,我們先來做個小遊戲,猜猜哪首詩歌是機器所作?

第一首:

白鷺窺魚立,

青山照水開。

夜來風不動,

明月見樓臺。

第二首:

滿懷風月一枝春,

未見梅花亦可人。

不爲東風無此客,

世間何處是前身。

從這兩首詩中,我們可以看到它們基本符合古體詩歌的結構和形式。詩中意象之間的聯繫也非常緊密,比如白鷺、魚、青山和水。不僅如此,第二首詩中後兩句的對仗關係也相當工整。其實這兩首詩歌都是人工智能系統創作的!

這個系統來自愛丁堡大學的博士生 Xingxing Zhang 與 Mirella Lapata 教授在2014年所發表的一篇論文。它是最早的基於人工神經網絡(Artificial Neural Networks)的機器作詩系統之一。近幾年的機器作詩系統都或多或少地受到了此篇論文的啓發,因此我們今天也主要來聊聊它。

在瞭解機器如何作詩之前,我們先來想想,我們人類是如何學習詩歌創作的呢?

 

 

 

《紅樓夢》中“香菱學詩”這個青春勵志的學詩故事告訴我們:首先要多讀詩、讀好詩,其次是需要不斷練習我們的大腦,最後需要一個像林妹妹一樣的老師,可以快速指出我們創作的詩歌哪裏有不足。

其實,一個典型的機器學習(Machine Learning)情景也是類似的:我們需要準備好數據(data)、一個可以優化的計算模型(model)以及一個判斷模型優劣的評價指標(evaluation metric)。

多讀詩、讀好詩 → 準備數據

大腦 → 計算模型

練習、找林妹妹指導 → 模型訓練與評價

數據

數據層面上,香菱和機器所面對的情況類似:他們都需要大量閱讀古人的優秀詩歌,才能掌握詩歌寫作的模式(pattern),也就是我們說的“套路”。不同之處在於,作爲人族少女的香菱就算再怎樣地“苦志學詩,精血誠聚”,恐怕一輩子也讀不完幾萬首詩,更別說去思考了。

然而對於機器而言,處理大量的詩歌語料庫完全沒有問題,尤其是在計算資源極度豐富的今天。這篇論文就採用了七萬首唐宋明清的四行詩(quatrain)作爲數據。

模型

人工神經網絡

香菱相比機器最大的優勢在於她有着世界上幾乎最神奇的學習系統——人類大腦。而人工智能系統只能通過構建計算模型(建模)來模擬人類學習語言的過程。(如果模型的效果不符合正常的人類思維,就成了人工智障啦!)

 

 

 

神經元、人工神經元、人工神經網絡

大部分近年的主流作詩系統都基於人工神經網絡(Artificial Neural Network)。所謂的人工神經網絡(簡稱神經網絡),是一種模仿生物神經系統結構與功能的計算模型。從定義看上去,人們會誤以爲這種計算模型和大腦一樣複雜。但實際上,它只簡單地模擬了神經元的激活函數,以及神經元之間的鏈接方式。

我們今天所要介紹的機器寫詩系統主要是基於一種特殊的人工神經網絡——循環神經網絡(Recurrent Neural Network,RNN)。

 

循環神經網絡 RNN

人類的自然語言句子可以被天然地看作是一種字(或詞)所組成的序列。無論我們是在閱讀還是在寫作,大多都是以一種線性、序列化的方式來去理解或者生成文本的。所以,自然語言文本常常被當做是一種序列型數據(Sequential Data)來被處理和計算,而RNN則是專門對序列型數據建模的網絡結構。

機器寫詩模型的整體流程

生成候選首句集合

人類寫詩需要先定下主題,機器寫詩自然也需要一些輸入才能進行。在常見的寫詩系統中,起點往往是用戶輸入的幾個關鍵詞,比如 {“春”、“琵琶”,“醉”}。當然,不同的寫詩系統有着不同的輸入:藏頭詩寫作系統則需要輸入每句的第一個字,看圖作詩的模型則需要輸入一幅圖片。不過,不同的輸入對模型的核心部分影響不大。我們這裏討論最常見的情況,輸入爲關鍵詞集合。

萬事開頭難,一首詩的第一句往往決定了整首詩的主題、氛圍和氣魄。拿到關鍵詞之後,爲了寫出第一句,模型首先需要擴展主題詞。

這裏作者利用了從《詩學含英》(清 劉文蔚, 1735)裏手工構建的“詩意詞典”。這個詞典有1016個意羣,每個意羣由一個關鍵詞作爲標記。意羣中其他詞則是與標記相關的字或詞組。比如“春”所標記的意羣裏,就會包含有“暖風”,“鶯”這種詩句中常見的詞彙。

有了詩意詞典,產生第一句詩看起來就沒那麼難了。我們要做的無非在找到和每個關鍵詞所相關的所有字和詞組,然後用它們拼湊出第一句詩。

繼續利用這個輸入作爲例子。我們可以從詞典中找到每個詞所對應的意羣,然後將這三個意羣中的所有詞拿出來組成一個新的集合:{鶯,暖風,遲日,醉,百囀,鶯聲}。這樣就完成了主題詞的擴展。

如果我們想作的是五言詩,那麼就可以用程序在這個集合中找出所有長度爲5的序列。利用格律要求(比如平仄規則)去篩選這些五字句後,就生成了許多滿足條件的候選句,比如“暖風/遲日/醉”和“鶯/百囀/鶯聲”。

挑選最優首句

我們接着從中挑選一個最通順、最有詩意的一個候選作爲首句。對比這兩句,我們人類通過閱讀可以很快發現“暖風遲日醉”比 “鶯百囀鶯聲”要更爲通順而富有詩意。那麼問題來了,機器該如何判斷哪句詩的更通順、更有詩意呢?

在計算語言學裏,判斷一句話的通順程度,一般是通過構建統計語言模型(statistical language model, 簡稱語言模型) 來完成的。簡單來說,語言模型是在某個語料庫上計算得到的統計模型。它能夠對任意給定的一個句子,計算出這句話在這個語料庫中出現概率。概率越大,就意味着這句話越符合這個語料庫的特徵,自然也就越“通順”。在寫詩的例子裏,語料庫是詩句組成的,這裏的“通順”自然也就帶上了“詩意”的效果。

RNN可以幫助我們快速有效地對詩歌語料庫建立語言模型。利用這個語言模型,機器便可以計算所有候選首句的概率。我們可以假設“暖風遲日醉”和“鶯百囀鶯聲”存在的概率是這樣計算得到的:

P(暖風遲日醉) = P(暖) * P(風|暖) * P(遲|暖風) * P(日|暖風遲) * P(醉|暖風遲日)

P(鶯百囀鶯聲) = P(鶯) * P(百|鶯) * P(囀|鶯百) *P(鶯|鶯百囀)* P(聲|鶯百囀鶯)

其中,P(X) 表示X這個字在整個語料庫中出現的概率,P(Z|XY) 表示在前兩個字是XY的情況下,第三個字是 Z 的條件概率。

我們可以發現第一句詩的幾個局部概率都應該很高,比如“暖風遲”,“暖風遲日”,聽起來都很順。而在第二句中,雖然“鶯百囀”還算通順,但是“鶯百囀鶯”存在的概率就會非常低。這主要因爲,詩歌語料庫中一句詩中較少會出現兩個相同的字,而且“鶯”接在“囀”的後面的情況也肯定都不如“日”接在“遲”後面的概率。

按照這種計算的方法,我們可以對之前產生的每一個五言句打分。選擇分數最高的,也就是最通順的一句作爲機器作詩的第一句話。

第一句詩產生之後,我們的問題就簡化成了:如何根據已經寫好的前n句詩,來產生第n+1句詩,直到全詩完成?

後續詩句的生成

我們人再寫詩的時候,寫某個字時一定會不斷重複讀前面已經寫過的句子,從而才能使整首詩更加連貫、自然。我們構建的計算模型也應該有這樣的機制。

假設我們的模型正在構思如何寫第3句的第4個字(模型的輸出),那麼我們這個階段的模型所接受的輸入便是“第1句 + 第2句 + 第3句的前3個字”。

一種經典的計算語言學的建模方式是編碼器-解碼器架構 (Encoder-Decoder Architecture)。這種建模方式將核心問題化歸爲兩步:

構建編碼器,將輸入的信息綜合編碼成一個向量;

構建解碼器,對之前編碼後的向量進行解碼,成爲我們需要的輸出。

這種框架其實暗合了我們人腦在創作時的一般邏輯:首先理解(encoding)已創作的部分,得到一個全局的觀感,然後在此基礎上繼續創作(decoding)。

注意到我們已創作的部分有些是整句(第1句和第2句),有些則是半句(第3句前3個字),編碼器對於它們應該做不同的處理:對於完整的詩句,論文作者利用了卷積神經網絡(Convolutional Neural Networks, CNN)來編碼; 而未完成的半句詩,則利用了更合適的RNN的結構來編碼。

等等.....CNN是個什麼東西?爲什麼用它來編碼完整的詩句呢?之前不是說RNN更適合自然語言嗎?

CNN和RNN一樣,都是一種主流的基礎神經網絡結構。它和RNN的主要區別在於處理數據的模式上:CNN着眼於固定的局部結構,利用層層遞進的方式編碼全局信息;而RNN着眼於序列結構,以線性方式編碼信息。

 

基於CNN的貓狗圖片分類器

CNN廣泛應用在計算機視覺領域, 還有像圍棋棋盤這樣的數據模式,而RNN主要應用在計算語言學領域。想象一下我們人在理解圖片/棋盤時,往往是一塊一塊看到圖片,然後拼湊成全局的樣貌;而理解文本/語音則常常是一字一句地順着理解下去。

(視覺和語言是我們人腦感知世界的兩大重要能力,這大概也說明了爲什麼CNN和RNN是現在人工智能研究地最火熱的兩大神經網絡結構。)

午餐君好像有點扯遠了!到底爲什麼這裏我們用CNN而非RNN來處理完整的詩句呢?一個重要的原因就是古詩所特有的結構蘊含着豐富的信息。比如一個完整的詩句有着固定的長度,句讀位置有一定規律;而一個不完整的詩句則沒有固定的長度。

基於CNN對整句詩進行編碼

其實仔細想想,一首完整的中文古詩,是不是也有着視覺上的美感呢?我們之前說CNN適合視覺理解,在此處也有所體現!當然,如果是現代詩的話,CNN的作用就相對小一些了。

最後總編碼器彙總CNN和RNN分別編碼的信息,再送到解碼器,從而算出我們所需要的“第3句的第4個字”。以此類推,我們的整首古詩就可以完成啦!

模型訓練與評測

我們知道了模型正向的運作方式,可是如何利用我們收集到的古人詩句去訓練這個模型,讓它能聰明起來呢?俗話說得好,熟讀唐詩三百首,不會作(吟)詩也會吟。 所以,我們的訓練模型的目標也就可以簡化成:期望這個模型能夠背誦7萬首詩,做到給出上句,能背出下句的程度來。

小學時,如果我們背不出下一句詩然後隨便亂編一個的時候,老師會罰我們站打我們手板。然而,如果模型不記得下一句時能夠憑着它的"語感"編出來了一句還不錯的詩句,這就是勝利呀!

我們想要模型掌握的就是這種語感,這種語感的本身就決定了作詩能力的高下!這就好比張無忌同學在學太極劍法時,張三丰說他完全忘記了纔是學會了。

 

 

 

那麼怎麼來評判模型編的新詩句,好還是不好呢?如果不好,如何改進呢?

聰明的讀者可能已經想到了,請林妹妹來指導呀!也就是找到一個數字化的評價指標,每次機器寫完詩,拿這個指標去衡量模型寫的詩有多好或者有多壞,然後再以此去改善模型。

然而,假如香菱每寫一首詩都讓林妹妹來給她評價一番,做指導,這似乎不太現實。想想林妹妹嬌弱的身體,還要考慮人情債。問多了,林也就煩了。也就是說,好的評價指標(林妹妹)評價一次可能很費計算資源。

 

林妹妹:你咋又來問我了?(嫌棄臉)

 

既然香菱不能每寫一首詩都讓林妹妹去看,那怎麼辦呢?我們只能以一種高效的方式來得到近似的評測結果。

具體來說,我們假設讓香菱去請教林妹妹的貼身丫鬟紫鵑。紫鵑何以擔此重任?一是她和林妹妹日夜相處,也耳濡目染了林妹妹的評價體系,雖然也許不夠精準,但是也不會偏差太大(近似);二是她地位不高,可以頻繁請教(高效)。

 

 

紫鵑:喵喵喵???

所以利用數據訓練模型時,我們不會頻繁利用評測指標來優化模型,而是找到一個間接的方式——損失函數 (loss function)。損失函數一般要求計算複雜度低,可以和模型的參數更好的融合,從而高效地優化模型的參數(parameters/weights)。

而林妹妹這種高級的評價指標,適合我們用來調整整個模型的大局框架,比如是否使用CNN來編碼完整詩歌這種比較重要的、宏觀的改善。紫鵑這種損失函數呢,就來幫我們改改字,提點微觀上的建議。

實際中,我們就算想找林妹妹這樣的人來評價一個寫詩系統的能力,也是非常困難的。論文的作者先是使用了文本生成領域最常見的自動化指標 (比如Perplexity 和 BLEU)。

當然,最理想的評測方式是把機器的詩歌和真正的古詩混在一起,讓人類去分辨,或在不同維度上打分。如果連人們分辨不出哪些是真的古詩,或者給機器做的詩歌打分更高的話,我們就可以相對有自信地認爲這個機器作詩系統比較完善啦。

機器寫詩雖然看似是一個玄妙的過程,但是背後的原理卻遠沒有那麼神祕。午餐君期待未來的機器寫詩系統會融入更加多元化的信息,比如視頻、音頻、社交網絡結構等等,與推薦系統相結合,給人類生活帶來更多的趣味。

打包帶走你的語言學午餐:

大多數人工智能機器作詩系統是基於人工神經網絡模型的,與深度學習(Deep Learning)等領域密切相關。

文中提到的香菱學詩的過程是一個較爲完整和典型的機器學習的例子,她利用了古人的詩集(數據)和自己的大腦(計算模型),還求助了紫鵑和林妹妹(模型的訓練與評測)。

衡量一句話的流暢程度,可以用到(統計)語言模型。

RNN與CNN是兩大主流的基礎神經網絡。

損失函數的存在主要是爲了更加高效地評價並優化模型。

P.S. 小編希望未來繼續和大家聊有關計算語言學的主題,小吃貨們有什麼建議?

最後分享給大家一首關於文字與語言的小詩《來自1979年3月》,作者爲2011年諾貝爾文學獎得主托馬斯·特蘭斯特羅默。

From March 1979

Weary of all who come with words,

words but no language.

I make my way to the snow-covered island.

The untamed has no words.

The unwritten pages spread out on every side!

I come upon the tracks of deer in the snow.

Language but no words.

By Tomas Tranströmer

Translated from the Swedish by Robin Fulton

References

Zhang, Xingxing and Mirella Lapata. “Chinese PoetryGeneration with Recurrent Neural Networks.” EMNLP (2014).

Yan, Rui et al. “Chinese Couplet Generation with NeuralNetwork Structures.” ACL (2016).

Oliveira, Hugo Gonçalo. “A Survey on Intelligent PoetryGeneration: Languages, Features, Techniques, Reutilisation and Evaluation.”(2017).

Yang, Xiaopeng et al. “Generating Thematic Chinese Poetrywith Conditional Variational Autoencoder.” CoRR abs/1711.07632 (2017)

Mikolov, Tomas et al. “Recurrent neural network basedlanguage model.” INTERSPEECH (2010).

He, Jing et al. “Generating Chinese Classical Poems withStatistical Machine Translation Models.” AAAI (2012).

Smedt, Tom De. “The INLG 2017 Workshop on ComputationalCreativity in Natural Language Generation.” (2017).

林禹臣 林語塵

 

 

  • 發表於: 2018-02-02
  • 原文鏈接:http://kuaibao.qq.com/s/20180202B0FUI300?refer=cp_1026
  • 騰訊「雲+社區」是騰訊內容開放平臺帳號(企鵝號)傳播渠道之一,根據《騰訊內容開放平臺服務協議》轉載發佈內容。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章