記得那個會寫雞湯文的馬爾科夫鏈嗎?我們把它解剖了

之前我們分享過一篇文章,提到國外有位程序猿小哥藉助馬爾科夫鏈,用 20 行 Python 打造了一款會寫雞湯句子的「AI咪蒙」。

景略集智:用20行Python代碼生成雞湯,打造AI咪蒙指日可待。?

zhuanlan.zhihu.com圖標

那麼什麼是馬爾科夫鏈?什麼時候使用它們?它們是如何工作的?

馬爾科夫鏈是一種對隨機過程進行統計建模的相對常見且簡單的方法。

文本生成金融建模,它們已應用在很多領域。一個很著名的例子是論壇 Reddit 上的一個版塊 r/SubredditSimator,它用馬爾科夫鏈自動創建整個版塊的內容。總的來說,馬爾科夫鏈在概念上相當直觀,並且非常容易理解,因為它們可以在不使用任何高級統計或數學概念的情況下實現。掌握它們是入門學習概率建模與數據科學技能的很好方式。

使用場景

首先,我會用一個非常常見的例子來描述它們:

假設有兩種可能的天氣狀態:晴天或多雲。你總是可以直接觀察到當前的天氣狀況,並且保證它永遠是上述兩種狀態之一。

現在,你來決定你希望能預測出明天是哪種天氣。因為當前的天氣對第二天的天氣有一定的影響,直覺上你假設在這個過程中有個內在的轉變。因此,本著認真負責的精神,你收集了幾年的天氣數據,並計算出陰天過後晴天發生的幾率是 0.25。你還注意到,由於只有兩種可能的狀態,因此,多雲天氣發生在多雲天之後的概率一定為 0.75。現在利用這種概率分布,你就可以根據當前的天氣狀況預測接下來幾天的天氣狀況。

這個例子說明了馬爾科夫鏈的一些關鍵概念。馬爾科夫鏈本質上是由一組滿足馬爾科夫屬性的狀態轉移,而這些轉移由一些概率分布所決定。

觀察這個例子中,概率分布是如何通過觀察從今天到下一天的狀態改變得到的。這說明了馬爾科夫屬性,也是馬爾科夫過程的獨特特徵,這種獨特的特質使它們沒有記憶。這通常使它們無法成功地產生一些可能會出現潛在趨勢的序列。例如,雖然馬爾科夫鏈可以模仿作者的寫作風格是基於詞頻,無法產生具有深刻意義或主題的文本,因為這些內容是在較長的文本序列上發展而來的。因此,它們缺乏產生與上下文相關的內容的能力,因為它們不能考慮到前面狀態的整個鏈條。

天氣例子的概率分布可視化圖

模型

從形式上講,馬爾科夫鏈好比一個概率自動機。狀態轉移的概率分布通常表示為馬爾科夫鏈的轉移矩陣。如果馬爾科夫鏈有 N 個可能的狀態,則該矩陣將是一個 NxN 矩陣,這樣 entry(i,J)就是從狀態 I 向狀態J過渡的概率。此外,轉換矩陣必須是隨機矩陣,它的每一行中的 entry 必須加起來正好等於1。這完全合理,因為每一行都代表自己的概率分布。

馬爾科夫鏈示例圖

上面示例的3種可能狀態的轉換矩陣

此外,馬爾科夫鏈還有個初始狀態向量,表示為 Nx1 矩陣(向量),描述在 N 個可能狀態中的每一種狀態下開始的概率分布。向量的 entry I 從狀態 I 開始描述鏈狀態的概率。

模型和場景通常是表示了馬爾科夫鏈所需的全部內容。

我們現在知道了如何獲得從一種狀態過渡到另一種狀態的機會,但是如何找到在多個步驟中發生這種轉變的機會呢?為了使它正式化,我們現在要確定在M步中從狀態I轉到狀態J的概率。

事實證明,這其實很簡單。給定一個轉換矩陣 p,可以通過計算 p 的 M 次冪以計算矩陣 entry(I,J) 的值來確定。 對於 M 的小值,我們可以很容易地用重複乘法的手動完成。然而,對於M的大值,如果熟悉簡單線性代數,將矩陣對角化是更有效的方法。

結論

既然你已經了解了馬爾科夫鏈的基本知識,也應該能夠用自己選擇的語言輕鬆地實現它們。如果編程不是你的強項,那麼可以去深入研究馬爾科夫鏈和馬爾科夫過程的許多更高級的特性。在我看來,沿著理論路線的自然探究方向時隱藏的馬爾科夫過程或 MCMC。簡單的馬爾科夫鏈將會為其他更複雜的建模技術的搭建模塊,因此,有了這些知識,擬現在可以在諸如信念建模和取樣等主題中應用各種技術。


參考資料:

towardsdatascience.com/

推薦閱讀:

[Python入門] 05 元組與資料庫
AI已經決定了,ta就是未來每一屆奧斯卡最佳男主。
邊看邊練的簡明機器學習教程,你還不趕緊來!
用20行Python代碼生成雞湯,打造AI咪蒙指日可待。

TAG:景略集智 | Python | 心靈雞湯 |