http://www.renwuyi.com/index.php?action=artinfo&id=19036&cat_id=2#topphp
文本生成是比較學術的說法,一般在媒體上見到的「機器人寫做」、「人工智能寫做」、「自動對話生成」、「機器人寫古詩」等,都屬於文本生成的範疇。網絡
2016年裏,關於文本生成有許多的新聞事件,引發了學術界之外對這一話題的普遍關注。框架
2016年3月3日,MIT CSAIL【1】報道了,MIT計算機科學與人工智能實驗室的一位博士後開發了一款推特機器人,叫DeepDrumpf,它能夠模仿當時的美國總統候選人Donald Trump來發文。機器學習
2016年3月22日,日本共同社報道,由人工智能創做的小說做品《機器人寫小說的那一天》入圍了第三屆星新一文學獎的初審。這一獎項以被譽爲「日本微型小說之父」的科幻做家星新一命名。提交小說的是「任性的人工智能之我是做家」(簡稱「我是做家」)團隊【2】。post
2016年5月,美國多家媒體【3】【4】報道,谷歌的人工智能項目在學習了上千本浪漫小說以後寫出後現代風格的詩歌。學習
基於人工智能的文本生成真的已經達到媒體宣傳的水平了嗎?這些事件背後是怎樣的人工智能技術?關於機器人寫小說的工做,咱們會在另外一篇文章《會有那麼一天,機器人能夠寫小說嗎?》裏進行深刻的討論,他們的工做更多的是基於模板的生成。在這篇文章裏,咱們主要想經過三篇文章介紹另外一大類方法,即基於統計的文本生成。優化
關於基於深度學習的文本生成,最入門級的讀物包括Andrej Karpathy這篇博客【5】。他使用例子生動講解了Char-RNN(Character based Recurrent Neural Network)如何用於從文本數據集裏學習,而後自動生成像模像樣的文本。編碼
圖一直觀展現了Char-RNN的原理。以要讓模型學習寫出「hello」爲例,Char-RNN的輸入輸出層都是以字符爲單位。輸入「h」,應該輸出「e」;輸入「e」,則應該輸出後續的「l」。輸入層咱們能夠用只有一個元素爲1的向量來編碼不一樣的字符,例如,h被編碼爲「1000」、「e」被編碼爲「0100」,而「l」被編碼爲「0010」。使用RNN的學習目標是,可讓生成的下一個字符儘可能與訓練樣本里的目標輸出一致。在圖一的例子中,根據前兩個字符產生的狀態和第三個輸入「l」預測出的下一個字符的向量爲<0.1, 0.5, 1.9, -1.1>,最大的一維是第三維,對應的字符則爲「0010」,正好是「l」。這就是一個正確的預測。但從第一個「h」獲得的輸出向量是第四維最大,對應的並非「e」,這樣就產生代價。學習的過程就是不斷下降這個代價。學習到的模型,對任何輸入字符能夠很好地不斷預測下一個字符,如此一來就能生成句子或段落。人工智能
Andrej Karpathy還共享了代碼【6】,感興趣的同窗不妨下載來試試,效果會讓你震驚。Andrej Karpathy在底層使用的RNN的具體實現是LSTM(Long-Short Term Memory),想了解LSTM能夠閱讀【7】,講得再清楚不過。lua
研究人員用Char-RNN作了不少有趣的嘗試,例如,用莎士比亞的做品來作訓練,模型就能生成出相似莎士比亞的句子;利用金庸的小說來作訓練,模型就能生成武俠小說式的句子;利用汪峯的歌詞作訓練,模型也能生成相似歌詞的句子來。
在本文一開始提到的【1】,MIT計算機科學與人工智能實驗室的博士後Bradley Hayes也正是利用相似的方法開發了一款模仿候任美國總統Donald Trump的推特機器人,叫DeepDrumpf。例如,圖二中,這個機器人說,「我就是伊斯蘭國不須要的。」
據做者介紹,他受到一篇模擬莎士比亞的論文啓發,以Donald Trump的演講和辯論(時常大約幾個小時)的字幕做爲訓練語料,使用深度神經網絡學習去訓練Trump的模型。他也聲稱,由於有一篇文章調侃Trump的發言只有小學四年級的水平,於是想到用Trump的語料多是最容易控制的。
這是一個有趣的應用,記者評論稱這個機器人也並非總能寫出好的句子,但至少部分是通順的。其實,風格並非很難學到,只要使用的訓練語料來自同一我的,而這我的的寫做或者發言具備辨識度高的特色。
推薦閱讀的第二篇文章是諾亞方舟實驗室的尚利峯、呂正東和李航在2015年ACL大會上發表的「Neural Responding Machine for Short-Text Conversation」 【9】。你們也許據說過微軟小冰,它由於開創性的主要作閒聊(即以娛樂爲目的的聊天)式對話,被哈爾濱工業大學的劉挺教授譽爲是第二波人機對話的浪潮的表明【8】。小冰的出現也影響到了學術界。除了原來作知識性的問答,一些研究也開始關注閒聊,讓機器人和人類搭話,這方面諾亞方舟實驗室發表了一系列有影響力的文章。今天介紹的這篇文章在Arxiv.org上發佈短短一年時間,已經有67次的引用。
【9】這篇文章嘗試用encoder-decoder(編碼-解碼)的框架解決短文本對話(Short Text Conversation,縮寫爲STC)的問題。雖然encoder-decoder框架已經被成功應用在機器翻譯的任務中,可是對話與翻譯不一樣,對應一個輸入文本(post)每每有多種不一樣的應答(responses)。文中舉了一個例子,一我的說「剛剛我吃了一個吞拿魚三明治」,不一樣的應答能夠是「天哪,才早晨11點」、「看起來很美味喲」或是「在哪裏吃的」。這種一對多的狀況在對話中很廣泛也很天然。的確,不一樣的人會對同一句話作出不一樣的反應,即便是同一我的,若是每次回答都如出一轍也是很無趣的。
針對這一特色,做者們提出Neural Responding Machine(簡稱NRM,見圖三)框架來解決短文本對話的問題。他們嘗試了全局編碼和局部編碼,最終發現先分別訓練,再用圖四的結構來作微調訓練,效果最佳。全局編碼的優勢是可以得到全局信息,一樣的詞在不一樣情境下會有不一樣的意義,全局信息能夠部分解決這類狀況;缺點是,它供給解碼的輸入比較固定。局部編碼利用局部信息,比較靈活多樣,恰好能夠緩解全局編碼的弱點。
這篇論文的另外一大貢獻是構建了一個比較大的數據集和標註來評價不一樣的方法。經過對比,所提出的混合全局和局部的方法比以往基於搜索的方法和機器翻譯的方法都要好不少。機器翻譯的方法生成的句子每每不通順,得分最低。能比基於搜索的方法好不少也很是不容易,由於基於搜索的方法獲得的已是人使用過的應答,不會不通順。你們能夠在圖五的實例中直接感覺一下生成的效果。NRM-glo是全局編碼的模型,NRM-loc是局部編碼的模型,NRM-hyb是混合了全局和局部的模型,Rtr.-based則是基於搜索的方法。
2015到2016年,這篇論文的做者組織了NTCIR-12 STC任務【10】,公開他們的數據集,並提供公共評測。有16個大學或研究機構參加了中文短文本對話任務的評測。2017年,他們將會繼續組織NTCIR-13 STC【11】,現已開放註冊【12】。除了上一屆的基於搜索的子任務,這一次還設立了生成應答的子任務。咱們預計今年的結果會更精彩。
第三篇文章是Samuel Bowman等發表在Arxiv.org上的名爲「Generating Sentences from a Continuous Space」的文章【13】。做者分別來自斯坦福大學、馬薩諸塞大學阿姆斯特分校以及谷歌大腦部門,工做是在谷歌完成的。
這一工做曾被媒體普遍報道,但我發現不少報道(例如【3】【4】)都對論文的工做有一些誤解。一些記者將圖六所示的文字誤認爲是機器人寫出來的後現代風格的詩歌,其實否則。這只是做者在展現他們的方法可讓句子級別的編碼解碼更連續。具體而言,在他們學習到的空間中,每一個點能夠對應一個句子,任意選定兩個點,例如在圖六中,一對點對應的句子分別是「i want to talk to you.」和「she didn’t want to be with him」,兩點之間的連線上能夠找出間隔均勻的幾個點,將它們也解碼成句子,會發現,這些句子好像是從第一句逐漸變化成了最後一句。
獲得這樣的結果實屬不易。在文章的一開始,做者就給出了一個例子,來講明傳統的自動解碼並不能很好地編碼完整的句子。如圖七所示,從句子「i went to the store to buy some groceries」到句子「horses are my favorite animals」,中間取的點通過解碼獲得的句子呈如今它們之間。能夠發現,這些句子未必是符合語法的英文句子。與之相比,圖六呈現的句子質量要好不少,不只語法正確,主題和句法也一致。
這篇文章的想法很是有意思,他們想使用VAE(varationalautoencoder的簡稱)學習到一個更連續的句子空間。如圖八所示,做者使用了單層的LSTM 模型做爲encoder(編碼器)和decoder(解碼器),並使用高斯先驗做爲regularizer(正規化項),造成一個序列的自動編碼器。比起通常的編碼解碼框架獲得的句子編碼每每只會記住一些孤立的點,VAE框架學到的能夠想象成是一個橢圓形區域,這樣能夠更好地充滿整個空間。個人理解是,VAE框架將貝葉斯理論與深度神經網絡相結合,在優化生成下一個詞的目標的同時,也優化了跟先驗有關的一些目標(例如KL cost和crossentropy兩項,細節請參考論文),使對一個整句的表達更好。
固然,爲了實現這一想法,做者作了不少嘗試。首先,對圖八所展現的結構作一些變形並無帶來明顯的區別。但在優化時,使用退火的技巧來下降KL cost和訓練時把適當比例的詞變爲未知詞(即word dropout)這兩項技術就很是有效。
做者們經過兩個有意思的實驗來展現了他們的結果。一個是作填空題,如圖九所示,隱藏句子的後20%,讓模型來生成後面的部分。從幾個例子看,VAE的方法比RNN語言模型(簡稱RNNLM)更加通順和有信息量。第二個實驗就是在兩個句子之間作輪移(Homotopy,也就是線性插值),對比圖六和圖七,能夠看出VAE給出的句子更平滑並且正確,這一點能夠間接說明學習到的句子空間更好地被充滿。
固然,做者們還給出了一些定量的比較結果。在比較填空結果時,他們使用了adversarial evaluation(對抗評價)。具體的作法是,他們取樣50%的完整句子做爲正例,再拿50%的由模型填空完成的句子做爲負例。而後訓練一個分類器,若是一個模型填的越難與正例分開,就說明這種模型的生成效果更好,更具欺騙性。所以,能夠認爲這一模型在填空任務上更出色。實驗的結果也支持VAE比RNNLM更好。
人工智能真的會創做嗎?使用深度學習技術寫出的文章或者對話,的確是會出現訓練集合裏未見過的句子。例如,一個原句的前半段可能會跟上另外一個原句的後半段;也可能除了詞,搭配組合都是訓練集裏沒有的。這看起來有些創做的意味,可是細究起來,每每是原句的部分更爲通順和有意義。目前的技術能夠拼湊,偶爾出現一兩個好玩的點,可是寫得長了,讀起來會以爲沒頭沒腦,這是由於沒有統領全篇的精神,跟人類的做家比固然仍是相差很遠。
機器學習到的還只是文字表面,沒有具有人要寫文章的內在動因。人寫文章表達的是本身的思想和感覺,這是機器所沒有的。所以,即便是機器寫文章,具體想要表達什麼,彷佛還要由人來控制。但若是控制得太多,看起來又不那麼智能,少了些趣味。我認爲,要想讓機器更自由地寫出合乎邏輯的話來,咱們還須要相似VAE那篇文章同樣更深刻的研究,對句子甚至段落的內在邏輯進行學習。
另外,人在寫一篇文章的時候,很容易自我衡量語句是否通順、思想是否表達清楚以及文章的結構是否清晰有趣,機器卻很難作到。所以,優化的目標很難與真正的質量相一致。目前的天然語言理解技術對於判斷句法語法是否正確可能還有些辦法,但要想判斷內容和邏輯上是否順暢,恐怕還須要常識和推理的幫助,這些部分暫時還比較薄弱。但也並不是毫無辦法,我相信將來對文本生成的研究必定會涉及這些方面。