如何直觀地理解條件隨機場,並通過PyTorch簡單地實現

2021-01-11 機器之心Pro

條件隨機場是一種無向圖模型,且相對於深度網絡有非常多的優勢,因此現在很多研究者結合條件隨機場(CRF)與深度網絡獲得更魯棒和可解釋的模型。本文結合 PyTorch 從基本的概率定義到模型實現直觀地介紹了 CRF 的基本概念,有助於讀者進一步理解完整理論。

假設我們有兩個相同的骰子,但是其中的一個是公平的,每個點數出現的概率相同;另一個骰子則被做了手腳,數字 6 出現的概率為 80%,而數字 1-5 出現的概率都為 4%。如果我給你一個 15 次投擲骰子的序列,你能預測出我每次投擲用的是哪一枚骰子嗎?

為了得到較高的準確率,一個簡單的模型是,每當「6」出現的時候,我們那就預測使用了有偏的骰子,而出現其他數字時則預測使用了公平的骰子。實際上,如果我們在每次投擲時等可能地使用任意一個骰子,那麼這個簡單的規則就是你可以做到的最好預測。

但是,設想一種情況:如果在使用了公平的骰子後,我們下一次投擲時使用有偏的骰子的概率為 90%,結果會怎樣呢?如果下一次投擲出現了一個「3」,上述模型會預測我們使用了公平的骰子,但是實際上我們使用有偏的骰子是一個可能性更大的選項。我們可以通過貝葉斯定理來進行驗證這個說法:

其中隨機變量 y_i 是第 i 次投擲所用的骰子類型,x_i 是第 i 次投擲得到的點數。

我們的結論是,在每一步中作出可能性最大的選擇只是可行策略之一,因為我們同時可能選擇其它的骰子。更有可能的情況是,以前對骰子的選擇情況影響了我未來會做出怎樣的選擇。為了成功地進行預測,你將不得不考慮到每次投擲之間的相互依賴關係。

條件隨機場(CRF)是一個用於預測與輸入序列相對應標註序列的標準模型。目前有許多關於條件隨機場的教程,但是我所看到的教程都會陷入以下兩種情況其中之一:1)全都是理論,但沒有展示如何實現它們 2)為複雜的機器學習問題編寫的代碼缺少解釋,不能令讀者對代碼有直觀的理解。

之所以這些作者選擇寫出全是理論或者包含可讀性很差的代碼教程,是因為條件隨機場從屬於一個更廣更深的課題「概率圖模型」。所以要想深入涵蓋其理論和實現可能需要寫一本書,而不是一篇博文,這種情況也使得學習條件隨機場的知識比它原本所需要的更困難。

本教程的目標是涵蓋恰到好處的理論知識,以便你能對 CRF 有一個基本的印象。此外我們還會通過一個簡單的問題向你展示如何實現條件隨機場,你可以在自己的筆記本電腦上復現它。這很可能讓你具有將這個簡單的條件隨機場示例加以改造,用於更複雜問題所需要的直觀理解。

理論

我們對於理論的討論將分為三個部分:1)指定模型參數 2)如何估計這些參數 3)利用這些參數進行預測,這三大類適用於任何統計機器學習模型。因此從這個意義上說,條件隨機場並沒有什麼特別的,但這並不意味著條件隨機場就和 logistic 回歸模型一樣簡單。我們會發現,一旦我們要面對一連串的預測而不是單一的預測,事情就會變得更加複雜。

指定模型參數

在這個簡單的問題中,我們需要擔心的唯一的參數就是與從一次投擲轉換到下一次投擲狀態的分布。我們有六種狀態需要考慮,因此我們將它們存儲在一個 2*3 的「轉移矩陣」中。

第一列對應於「從前一次投擲使用公平骰子的狀態,轉換到當前使用公平骰子狀態的概率或成本(第一行的值),或轉換到有偏骰子狀態的概率(第二行的值)」。因此,第一列中的第一個元素編碼了在給定我本次投擲使用了公平骰子的前提下,預測下一次投擲使用公平骰子的概率。如果數據顯示,我不太可能在連續使用公平骰子,模型會學習到這個概率應該很低,反之亦然。同樣的邏輯也適用於第二列。

矩陣的第一和第二列假設我們知道在前一次投擲中使用了哪個骰子,因此我們必須將第一次投擲作為一個特例來對待。我們將把相應的概率存儲在第三列中。

參數估計

假設給定一個投擲的集合 X* *以及它們相應的骰子標籤 Y。我們將會找到使整個訓練數據的負對數似然最小的轉移矩陣 T。我將會向你展示單個骰子投擲序列的似然和負對數似然是什麼樣的。為了在整個數據集上得到它,你要對所有的序列取平均。

P(x_i | y_i) 是在給定當前的骰子標籤的前提條件下,觀測到一個給定骰子投擲點數的概率。舉例而言,如果 y_i 為公平骰子,則 P(x_i | y_i) = 1/6。另一項 T(y_i | y_{i-1}) 是從上一個骰子標籤轉換到當前投資標籤的概率,我們可以直接從轉移矩陣中讀取出這個概率。

請注意在分母中,我們是怎樣在所有可能標籤 y' 的序列上進行求和的。在傳統的二分類問題 logistic 回歸中,我們在分母中會有兩個項。但是現在,我們要處理的是標註序列,並且對於一個長度為 15 的序列來說,一共有 2^15 種可能的標籤序列,所以分母項是十分巨大的。條件隨機場的「秘密武器」是,它假定當前的骰子標籤僅僅只取決於之前的骰子標籤,來高效地計算這個大規模求和。

這個秘密武器被稱為「前向-後向算法」。對該算法的深入討論超出了這篇博文的範圍,因此這裡不做詳細的解釋。

序列預測

一旦我們估計出了我們的轉移矩陣,我們可以使用它去找到在給定一個投擲序列的條件下,最有可能的骰子標註序列。要做到這一點,最簡單的方法就是計算出所有可能的序列的似然,但這即使對於中等長度的序列也是十分困難的。正如我們在參數估計中所做的那樣,我們將不得不用一種特殊的算法高效地搜索可能性最大的序列。這個算法與「向前-向後算法」很相近,它被稱為「維特比算法」。

具體實現參見:https://mp.weixin.qq.com/s/1KAbFAWC3jgJTE-zp5Qu6g

相關焦點

  • 雲計算學習:用PyTorch實現一個簡單的分類器
    主要流程分為以下三個部分:1,自定義生成一個訓練集,具體為在二維平面上的一些點,分為兩類;2,構建一個淺層神經網絡,實現對特徵的擬合,主要是明白在 pytorch 中網絡結構如何搭建;3,完成訓練和測試部分的工作,熟悉 pytorch 如何對網絡進行訓練和測試。1.
  • 理解隨機森林:基於Python的實現和解釋
    本文將介紹如何使用 Python 構建和使用隨機森林。我們不只是簡單地展示代碼,而會盡力解釋模型的工作方式。我們將從一個解決簡單問題的單個決策樹開始,然後逐漸深入,最終完成一個針對某個真實世界數據科學問題的隨機森林。
  • 教程| 通過可視化隱藏表示,更好地理解神經網絡
    本文使用的工具是 Neural Embedding Animator,大家可以利用該工具更好地理解模型行為、理解訓練過程中數據表示的變化、對比模型、了解此詞嵌入的變化。對於監督學習而言,神經網絡的訓練過程可以看做是學習如何將一組輸入數據點轉換為可由線性分類器進行分類的表示。本文我想利用這些(隱藏)表示進行可視化,從而更加直觀地了解訓練過程。這種可視化可以為神經網絡的性能提供有趣的見解。
  • ConvCRF:一種結合條件隨機場與CNN的高效語義分割方法 - 機器之心Pro
    因此,有人認為,簡單的前饋卷積神經網絡也許並不是完成類似語義分割等結構化預測任務的最佳選擇 [40,20,41]。為了解決上述問題,一些研究者成功地將卷積神經網絡的有效性與條件隨機場的建模能力相結合,以獲得更好的性能 [20,4,41]。儘管結構化模型的成功是無可爭議的,但在最近的方法和研究成果卻鮮有人問津 [37,7,40]。
  • 實戰:用Python實現隨機森林
    因為有Scikit-Learn這樣的庫,現在用Python實現任何機器學習算法都非常容易。實際上,我們現在不需要任何潛在的知識來了解模型如何工作。雖然不需要了解所有細節,但了解模型如何訓練和預測對工作仍有幫助。比如:如果性能不如預期,我們可以診斷模型或當我們想要說服其他人使用我們的模型時,我們可以向他們解釋模型如何做出決策的。
  • 直觀理解KKT條件
    這組最優化條件在Kuhn和Tucker發表之後才逐漸受到重視,因此許多情況下只記載成庫恩塔克條件(Kuhn-Tucker conditions)庫恩塔克條件(Kuhn-Tucker conditions)是非線性規劃領域裡最重要的理論成果之一,是確定某點為極值點的必要條件。如果所討論的規劃是凸規劃,那麼庫恩-塔克條件也是充分條件。
  • PyTorch可視化理解卷積神經網絡
    如今,機器已經能夠在理解、識別圖像中的特徵和對象等領域實現99%級別的準確率。生活中,我們每天都會運用到這一點,比如,智慧型手機拍照的時候能夠識別臉部、在類似於谷歌搜圖中搜索特定照片、從條形碼掃描文本或掃描書籍等。造就機器能夠獲得在這些視覺方面取得優異性能可能是源於一種特定類型的神經網絡——卷積神經網絡(CNN)。
  • Pytorch 0.3.0 發布,實現多方面提速,增加對ONNX支持
    根據官方文檔的介紹,此次增加了多個函數和功能,多方面的性能均實現提升。重大變更0.3 版本中刪掉了 Variable.reinforce() 等隨機函數,因為它們的功能有限,並且會影響到性能。設置隨機函數的初衷是為了避免採樣值的 book-keeping,在實際中,由於各種各樣的原因,用戶的代碼中仍然會包括 book-keeping。
  • 自然語言處理條件隨機場CRF
    1.2 What is conditional random field?Random 指的是隨機變量 Conditional 指的是條件概率 Conditional probability. 這就意味著CRF是一個判別式模型。通常,判別式模型 discriminative model 計算條件概率,而生成式模型 generative model 計算聯合概率分布。我們先從隱馬爾科夫模型(HMM)入手理解這兩種模型的區別,然後從HMM推廣出CRF。
  • 重磅| Torch7團隊開源PyTorch:Python優先的深度學習框架
    據官網介紹,PyTorch 是一個 Python 優先的深度學習框架,能夠在強大的 GPU 加速基礎上實現張量和動態神經網絡。但使用 PyTorch,通過一種我們稱之為「Reverse-mode auto-differentiation(反向模式自動微分)」的技術,你可以零延遲或零成本地任意改變你的網絡的行為。我們靈感來自關於這一主題的許多研究論文以及當前和過去的研究成果,比如 autograd、autograd、Chainer 等。
  • 用Java實現目標檢測 | PyTorch
    很多論文都選擇使用PyTorch去實現也證明了它在訓練方面的效率以及易用性。在PyTorch領域,儘管部署一個模型有很多選擇,可為Java開發人員準備的選項卻屈指可數。在過去,用戶可以用PyTorch C++ 寫JNI (Java Native Interface) 來實現這個過程。
  • 用Java實現目標檢測|PyTorch
    這篇來自AWS軟體工程師的投稿,結合實例,詳細介紹了DJL這個為Java開發者設計的深度學習庫:5分鐘,你就能在PyTorch上,用Java實現目標檢測。5分鐘,用Java實現目標檢測文 / 知乎用戶@LankingPyTorch在深度學習領域中的應用日趨廣泛,得益於它獨到的設計。無論是數據的並行處理還是動態計算圖,一切都為Python做出了很多簡化。
  • PyTorch實現,GitHub4000星:微軟開源的CV庫
    近年來,計算機視覺領域突飛猛進,在人臉識別、圖像理解、搜索、無人機、地圖、半自動和自動駕駛方面得到廣泛應用。而這些應用的核心部分是視覺識別任務,如圖像分類、目標檢測和圖像相似度。在各種計算機視覺模型和應用層出不窮的當下,如何把握髮展脈絡,跟進領域前沿發展呢?微軟創建了一個庫,提供構建計算機視覺系統的大量示例和最佳實踐指導原則。
  • 簡明條件隨機場CRF介紹 | 附帶純Keras實現
    它可以簡單寫為矩陣形式:那麼剩下的最後一步,就是模型訓練完成後,如何根據輸入找出最優路徑來。跟前面一樣,這也是一個從 k^n 條路徑中選最優的問題,而同樣地,因為馬爾可夫假設的存在,它可以轉化為一個動態規劃問題,用 viterbi 算法解決,計算量正比於 n。
  • 《醉漢的腳步》:沒有幾個人能夠真正地理解隨機性所發揮的作用
    隨機事件,或者簡單稱為運氣,在勝負成敗中扮演著關鍵性的角色,但我們經常選擇不去承認運氣的作用,而是將其歸結為技能、領導力和自信心等錯誤的原因。結果是當我們有時在進行評估或決策時,我們甚至都意識不到,我們對機遇的作用實際上做出了很多假設,而且和那位西班牙人一樣,我們也沒能意識到自己的評估或決策是錯誤的——實際上,沒有幾個人能夠真正地理解隨機性所發揮的作用。
  • PyTorch框架歷史和特性更迭與安裝過程
    通過使用改進的JIT,可以把PyTorch的動態計算圖編譯成靜態計算圖,方便模型的部署。為了減少Python前端在運行深度學習模型的時間損耗,PyTorch也加強了對C++前端的支持,這樣一個Python訓練和保存的模型就能通過C++前端運行,有效地提高了模型的運行效率。
  • 1個GUI界面,隨機生成若干姓名並保存為Excel,python如何實現?
    前面內容,我們詳細介紹了如何使用Python生成一定數量的隨機姓名。這就是我們今天要利用Python實現的效果。如何實現首先,我們生成一個GUI界面,接收用戶對於隨機姓名的一些個性化定製。我們使用GUI界面來獲取用戶輸入相關設置(當然,還可以選擇控制臺方式),GUI界面看起來相對直觀一點。我們來看下界面效果。
  • 初學AI神經網絡應該選擇Keras或是Pytorch框架?
    軟體開發者畢竟不是科學家,很多時候簡單易學易用是程式設計師選擇的第一要素。目前,兩個主要的深度學習庫Keras和Pytorch獲得了大量關注,主要是因為它們的使用比較簡單。使用函數式API,神經網絡被定義為一系列順序化的函數,一個接一個地被應用。定義神經網絡是非常直觀的,因為使用API可以將層定義為函數。如下圖示例(偽代碼)在Pytorch中,你將網絡設置為一個繼承來自Torch庫的torch.nn.Module的類。
  • 圖靈獎得主力推:PyTorch 1.3 今天發布
    PyTorch 1.3 項目地址:https://github.com/pytorch/pytorch/releases/tag/v1.3.0茁壯成長的 PyTorch由於 PyTorch 一直致力於滿足研究者的需求,因此它在不斷地進行版本迭代,現在已經成為開源社區僅次於 TensorFlow 的深度學習框架。
  • 使用PyTorch從理論到實踐理解變分自編碼器VAE
    為了充分理解VAE背後的數學意義,我們將通過對其理論講解以及與一些傳統方法進行比較來說明。這篇文章將包含以下內容如何對隱藏空間進行定義?如何高效的從隱藏空間中生成數據?VAE最終的框架是什麼?通過一些實驗來展示VAE中的一些有趣特徵。