有哪些機器學習模型可以產生一句話?


你說的就是NLP裏最經典的task:語言模型(language model)。目前的state of the art是基於LSTM的方法。
RNN,CRF,HMMs等
語言模型都可以,包括ngram,rnnlm等

最簡單的就是統計語言模型了,你可以通過給機器幾個詞語,然後使用語言模型生成正確順序的文本,拼音輸入法也類似這種。語音識別等方面就在使用語言模型來根據輸入的語音信號產生一句話,就是人說的那一句話。具體可以看下這篇文章: 統計語言模型:從中文拼音到文本 | AI檸檬

======== 原文 ========

統計語言模型:從中文拼音到文本

前言:

自然語言是信息的載體,記錄和傳播著信息,資訊理論之父香農對信息的定義是「信息是用於消除隨機不確定性的東西」。信息通過編碼,經過一定的信道傳輸,然後傳遞到接收者,再解碼成對應的可被人理解感知的東西,就完成了一次信息的傳遞。原始人的通信方式就是說話,而說話是先將信息編碼為對應的語言信號,可以是文本,可以是聲音,也可以就是中文拼音,然後接收者再將收到的信號進行解碼。而我們人類對自然語言的處理經歷了從基於規則的演算法到基於統計的演算法,顯然基於統計的方法比規則更有效,下面我將介紹一種基於統計的語言模型,可以實現從拼音轉為文本。

一、引言

統計語言模型是自然語言處理的基礎,它是一種具有一定上下文相關特性的數學模型,本質上也是概率圖模型的一種,並且廣泛應用於機器翻譯、語音識別、拼音輸入、圖像文字識別、拼寫糾錯、查找錯別字和搜索引擎等。在很多任務中,計算機需要知道一個文字序列是否能構成一個大家理解、無錯別字且有意義的句子,比如這句話:

許多人可能不太清楚到底機器學習是什麼,而它事實上已經成為我們日常生活中不可或缺的重要組成部分。

這一句話很通順,意思也很清楚,人們很容易就知道這句話在說什麼。如果我們改變一些順序,或者替換一些詞:

不太清楚許多人可能機器學習是什麼到底,而它成為已經日常我們生活中組成部分不可或缺的重要。

雖然語句不通順,看起來有些費勁,但是還能大致理解是什麼意思。但是如果這樣呢:

不清太多人機可楚器學許能習是麼到什底,而已常我它成經日為們組生中成活部不重可的或缺分要。

這基本上就是無解了,根本不知所云。

至於為什麼句子會是這樣,語言學家可能會說,第一個句子符合語法規範,詞義清楚,第二個句子詞義尚且還清楚,第三個連詞義都模模糊糊了。這正是從基於規則角度去理解的,在上個世紀70年代以前,科學家們也是這樣想的。而之後,賈里尼克使用了一個簡單的統計模型就解決了這個問題。從統計角度來看,第一個句子的概率很大,比如是10^-30,而第二個其次,比如是10^-50,第三個呢,最小,比如是10^-120。按照這種模型,第一個句子出現的概率是第二個的10的20次方倍,更不用說第三個句子了,不是第一個句子纔怪。

二、模型的建立

嚴格地講,從理論上來說,如果S是一個有意義的句子,有一連串的詞w1,w2,…wn構成(n為句子長度),那麼文本S成立的可能性,即概率P(S)為第一個字出現的概率乘上第二個字在第一個字出現的條件下出現的概率,再乘上第三個字在前兩個字出現的條件下出現的概率,一直到最後一個字。每一個詞的出現的概率,都與前面所有詞有關,那麼我們有如下公式:

P(S) = P(w1,w2,…,wn) = P(w1)*P(w2|w1)*P(w3|w1,w2)…P(wn|w1,w2,…,wn-1)

但是,這裡當前面依賴的詞數太多時,模型的產生和正向計算的計算量將非常的大,非常難算,而且計算機的存儲空間也有限,每個變數的可能性都將是一種語言字典的大小,但是不同長度的句子中的各種詞的排列組合數是幾乎無限的,我們顯然需要更好的辦法。

馬爾可夫曾提出了一種針對類似問題的一種偷懶卻相當有效的辦法,即僅考慮t時刻狀態與t-1時刻的狀態有關,在統計語言模型裏,就是對每一個詞出現的概率僅考慮與前一個詞有關,或者你可以根據需要考慮與前兩個詞、三個詞有關,這樣問題就簡單多了。這就是數學上的馬爾可夫假設。一般來說,僅考慮與前一個詞有關,就可以有著相當不錯的準確率,在實際使用中,通常考慮與前兩個詞有關就足夠了,極少數情況下才考慮與前三個有關,這分別稱為二元、三元和四元語言模型,其中的條件概率稱為轉移概率。二元語言模型情況下,於是概率就簡單多了:

P(S) = P(w1,w2,…,wn) = P(w1)*P(w2|w1)*P(w3| w2)…P(wn|wn-1)

如何得到每一個詞的概率跟前一個詞到這一個詞的轉移概率呢?我們可以使用我博客之前的文章中提到的詞頻統計的方法:

《無需中文分詞演算法的簡單詞頻統計》

那個原文雖然是在說統計相鄰的兩字詞、三字詞等詞頻,那些詞大部分甚至不能稱為詞,因為那些詞並沒有什麼實際意義,但是在統計語言模型中卻是必須的。

有人說每次都還要計算一下總的詞數,其實不必,我們可以使用公式來化簡它,既方便又減少了計算量。

因為

P(wi|wi-1) = P(wi-1,wi) / P(wi-1)

P(wi-1,wi) = #(wi-1,wi) / #

P(wi-1) = #(wi-1) / #

所以

P(wi|wi-1) = #(wi-1,wi) / #(wi-1)

根據大數定理,只要統計足夠,相對頻度就等於概率。

很多人都質疑這種方法的有效性,但事實證明,統計語言模型比任何已知的基於規則的方法更有效。

三、拼音轉文本的實現

拼音轉漢字的演算法是動態規劃,跟尋找最短路徑的演算法基本相同。我們可以將漢語輸入看成一個通信問題,每一個拼音可以對應多個漢字,而每個漢字一次只讀一個音,把每一個拼音對應的字從左到有連起來,就成為了一張有向圖,它被稱為網格圖或者籬笆圖。

y1,y2,…,yn是輸入的拼音串,w11,w12,w13是第一個音y1的候選字,w21,w22是y2對應的候選字,以此類推。整個問題就變成在有向圖中尋找從起點開始,到終點概率最大的路徑,我們可以使用各種最短路徑演算法來實現,這裡我將使用維特比演算法來進行語音到文本的解碼。

維特比演算法是先計算第一步的概率,然後將概率按大小排序,剔除掉概率過低的路徑,然後再走第二步,再剔除掉概率過低的路徑,以此類推。如何剔除概率過低的路徑呢?我們可以設置一個閾值,比如說,設置每一步的閾值為0.001,每走一步就跟0.001的n次方相比較,小於這個閾值的全部路徑都給予剔除,n為當前是第幾步,可從0或者1開始,具體取決於你怎麼看待第一步的初始概率。我在實現的時候,將第一步初始概率統一設置為1,所以我選擇從0.001的0次方開始。這個閾值的設置,我的方法是嘗試,選取一個大小最合適的。

反覆執行,直到最終到達路徑終點。最後,我們可以得到一個概率最大的路徑,即概率最大的一個句子,在演算法執行過程中,我們實際還可以得到一系列概率相對較小的路徑。

四、零概率問題

在實際中,我們可能遇到一些詞並沒有在之前模型訓練中加入進來,可能會遇到本來是有意義的詞,由於未登錄而被置為零。解決方法除了增大語料庫外,還有一種方法就是,總是給未看見的詞設置一個極小的概率,這樣就可以緩解這個問題。但是與之帶來的負面問題是因為減小了剔除的路徑數,導致計算量的大大增加。

五、訓練語料庫的選取

語料庫的選取,取決於目標應用場景,如果你應用與新聞,那麼最好直接選取新聞語料,應用於搜索引擎,就最好直接選取普通互聯網語料,如果是語音識別,那麼普通人說話的場景下的語料更合適些。如果是其他方面,那麼就要根據你的實際情況來判斷。

參考文獻:

[1]吳軍.數學之美[M].北京:人民郵電出版社,2014:27-39,192-194.


rnn啊,sequence to sequence learning
對話模型

natural language generation是一個很大的topic,也很前沿。以dialogue generation為例,偏傳統的方法用一些phrase-based method。目前比較主流的方法一般是基於 RNN LSTM的 sequence-to-sequence learning。但這樣生成的句子或多或少存在過於generic的問題。比方說無論問什麼問題都回答i dont know 是最保險的做法。並且句子中的隨機性也不夠強,下一次問同樣的問題還是會給出同樣的答案。所以感覺嚴格上說其實更像是prediction 而不是generation ┑( ̄Д  ̄)┍

最近有一些基於deep generative network 的方法,從VAE或者GAN的角度解決句子的多樣性問題,比較有趣,值得研究。


如果只是單純的產生一句話的話,ngram就行了,4-grams應該就已經可以產生相當數量有意義的句子了。
1.ngram 2.Word Embedding 利用Word Embedding自動生成語義相近句子
沒做過這種類型,但是我覺得神經網路加遺傳演算法應該可以寫出優美的詩,神經網路打分,遺傳演算法迭代
推薦閱讀:
相關文章