用程序實現自動寫小說,難度有多大?有哪些需要克服的難點,大體思路是怎樣的?

演算法 人工智慧 機器學習 軟體 編程 小說


既然是在機器學習標籤下但是下面的回答要麼就是不會硬答或者長篇答非所問,我覺得有必要簡單表達一下。

基本思路可能是在Recurrent neural network Recurrent neural network 利用已有的小說進行end-to-end的學習,然後按照已有小說的例子生成文字組合,使這些組合看起來像是原小說的風格。一個最近的相關研究的例子就是 char-rnn The Unreasonable Effectiveness of Recurrent Neural Networks 輸入wikipedia的文本生成類似wikipedia的文章,當然這些文章細讀起來什麼都不是,但是能蒙住不少人。char-rnn 也可以根據輸入其他不同文本學習到輸入文本的風格並生成新的文本。 https://github.com/karpathy/char-rnn

char-rnn有個中文版例子是我寫的汪峰作詞機,給汪峰的歌詞生成類似汪峰風格的新歌詞 phunterlau/wangfeng-rnn · GitHub

裡面遇到的難點可能是RNN的訓練長度以及模型的收斂。對於不同的輸入如果想生成一個看上去能蒙住人的新小說不太容易。上面提到的汪峰作詞機其實很不太容易找到一個參數能讓結果看起來還不錯的結果,如果給信息量比較大的比如方文山的詞,這個模型都很難收斂,所以我預測生成小說這個問題應該不簡單。

不過話說回來了,現在那些玄幻仙俠在線網路小說基本上文筆垃圾情節簡單沒有任何變化,包含信息量極少,給足夠訓練文本應該很快可以收斂可以抓住這些信息量生成類似風格的文章。


先潑個冷水,現在讓機器生成詩歌,散文這種長度比較短的文本,還遠遠沒有得到非常好的解決,僅僅是可以勉強接受。對於類似高考作文的問題,現在解決的也僅僅是自動評分,而給定機器一個命題,或者一個話題,讓機器生成一篇正經的高考作文,這個還沒有得到解決。更不用說,生成一部小說了。

下面進入正題

機器生成小說,屬於自然語言生成(Natural Language Generation, NLG)技術的範疇。想讓機器生成一部小說,個人認為主要要解決下面幾個問題

1. 篇章布局 在用戶給定要求下,機器自動進行篇章規劃設計。簡單的說,就是讓機器設計好,每一段要寫什麼內容,就是寫作大綱。

2. 句子規劃 知道一段要寫什麼內容以後,需要進行句子級別的規劃,合理的安排句子的順序,數目,以及每一句話的大致內容。

3. 表層實現 生成符合自然語言表達習慣的真正自然的文本形式,簡單的說,就是生成人話。

第1項和第2項,其實是要解決說什麼的問題,而第3項是解決怎麼說的問題,怎麼說這個問題,目前基本已經得到解決,當前的語言模型技術(Language Model),已經可以判定一句話,是否接近人話,並且生成比較像人話的句子。基於深度學習的技術,在這方面取得了較好的結果,例如RNN,LSTM等。

而第1項和第2項,仍然是目前的難點。當前主流的方法,是用基於模板或者規則,需要大量的人工干預,而且也缺乏靈活性,已經有應用的是現在的新聞寫作機器人。char-rnn,是用指定風格的文本訓練rnn語言模型,對生成內容的要求,僅僅是給定一些初始的內容,後面的生成並不受控制。類似於一個記性非常差的作家,僅僅能記住前面寫過的幾十個字,最多上百個字的內容,然後根據這些內容,來生成下面的字,循環往複。

僅僅告訴機器你要寫一部武俠小說,然後機器就可以自動進行篇章布局,確定小說人物,情節,生成寫作大綱,這個還是太遙遠,步子太大容易扯著蛋啊。而給定一段話的大致框架主題,讓機器生成一段有血有肉的文字,應該是當前研究可以先嘗試解決的問題。我很看好深度學習在這方面的潛力。


只是寫小學的作文,那比較簡單,可是要寫小說就不行了。

難點1,人類視角,大數據只能學習人的作品,而沒有體驗過人的視角,人寫作時的內在邏輯是很難間接模擬的。

難點2,寫作思路,正經的寫作是創作,在某些模板基礎上的創新,多數寫小說的人沒能掌握模板,而對於寫小說的程序來說則是沒法掌握創新,它不能創造小說框架,而源頭還是上一點,它不是人,不懂人是如何思路的。

難點3,有內容。小說只是文體,關鍵還是內容,只有掌握了內容才能寫出來,但是內容一旦掌握,那就不是寫出來那麼簡單,還能用出來。當一個人工智慧詳細的描繪打籃球的技術細節,構建一個籃球天才的形象,沒有人會認為它不會打籃球,只是遺憾它沒有手和腳。當程序可以理解內容,那就和大腦沒有功能區別了,已經有思想了。

如果有人讀過《宇宙巨校閃級生》中的任意兩個段落,就能體會什麼是言之無物、辭彙堆疊。


來破冷水!

完全以生成的方式目前都是刷流氓,不管rnn以及加各種約束得到的文章都是狗屁不通,寫詩可以,因為不通你也可以腦補。

可行的方式:

目前可以用工程的方式初步解決,多文檔融合,通過rewrite的方式還是可以的,市面上能看到的也都是這個方式,不管是摘要,壓縮和融合。

以上只說大篇幅的文章,不針對一句話的形式。


《宇宙巨校閃級生》,這部小說就是程序寫的,你可以讀讀看。


如果瞎逼寫那肯定很容易,問題是讓程序寫一篇真正讓人喜愛的小說是現在做不到的,因為寫小說幾乎動用了人類的最高智慧,而這種智慧目前程序還不具備,所以已經不是難的問題了。

關於一個真正寫小說的智能程序我想到的方案是仿生法。讓機器具備意識、完整語言能力和語言學識並與人類通感,然後具備想像能力,使用想像來寫小說,措辭講究,情感豐沛,結構有張力,內容新穎。


人類的語言,文字,單詞,都是極其有限的。而修辭手法,表現,也是極其有限的。說得難聽點,所有的人類到現在為止寫的所有的書加在一起,也是極其有限的。甚至說,特定類型的文章你要自動寫出來,根本不需要人工智慧這麼高級的東西,一個小程序就行了。日本N年前就有人編寫自動生成色情小說的程序。

思路么,其實很簡單,首先你要搞清楚一點,就是人類的語言,表現是表達的根本,而不是語法邏輯。人類的語言,是表現的合集,而所謂的語法和邏輯只是對於表現的歸納。所以暴力窮舉適合人類語言。中國人房間總知道的吧?

而人工智慧么,其實隨便輸入足夠的完整的表現形式,比如說詩歌也好,小說也好,然後隨便他寫,你挑錯,表現喜歡不喜歡,評個分數之類的,就這麼訓練就行了。怎麼逐漸增加文本,文本之間是有關聯性的,還是徹底無關聯性的,怎麼加權,自己考慮。

我覺得人工智慧訓練員,這個職業提供的崗位數量恐怕將來可以填補被取代的人工崗位。

總的來說,寫文章不難,表達思想困難。寫文章只要你不斷地對他的表現組合挑錯,或者表達喜歡不喜歡之類的,總會越來越好,這是一個概率問題,遠比猴子和打字機成功率高多了。但是么思想表達,這是現實問題,不是對於表現形式的模仿。


來幾個機器寫出來的小說 (Credit to UC Berkeley CS188 Intro):

One day Joe Bear was hungry. He asked his friend
Irving Bird where some honey was. Irving told him
there was a beehive in the oak tree. Joe walked to
the oak tree. He ate the beehive. The End.

Henry Squirrel was thirsty. He walked over to the
river bank where his good friend Bill Bird was sitting.
Henry slipped and fell in the river. Gravity drowned.
The End.

Once upon a time there was a dishonest fox and a vain crow. One day the
crow was sitting in his tree, holding a piece of cheese in his mouth. He noticed
that he was holding the piece of cheese. He became hungry, and swallowed
the cheese. The fox walked over to the crow. The End.

好吧雖然都文通字順,但看起來怎麼總有些不對勁呢……


文學創作源於豐富的生活積累,用於傳播作者的生活感悟,人生觀,價值觀。先不說技術上能不能實現,即使實現了,能從大量語料中拼湊出結構布局、故事情節還不錯的小說。那麼請問,這樣的小說表達了作者怎樣的思想和感悟,它對反映這個時代的背景起到了什麼作用,無非是多了一本拼湊出來的文章而已。


用程序寫論文已經實現了


寫不了小說,可以做情節模擬。

比如創建1000億個人物,上隨機各種情況。最後挑出有主角光環的人物,把他的歷史描述一邊,就是一篇小說。

同樣的隨機挑幾個人物,小說素材源源不絕啊。


推薦閱讀:

獲得ACM ICPC Regional金牌是一種什麼樣的體驗?
如何看待杭電舉辦的acm女生專場?
如何理解 Tarjan 的 LCA 演算法?
二分查找有幾種寫法?它們的區別是什麼?
四軸飛控用的什麼演算法?

TAG:人工智慧 | 演算法 | 機器學習 | 自然語言處理 | 深度學習DeepLearning |