MNIST入門:貝葉斯方法
介紹
這篇教程適用於有興趣將貝葉斯方法應用於機器學習的讀者。我們的目的是教你如何訓練你的第一個貝葉斯神經網路,並在TensorFlow上提供了入門示例。
為什麼我們需要貝葉斯神經網路呢?傳統的神經網路被訓練用於產生一些相關變數的點估計。例如,我們可以使用歷史數據來訓練一個神經網路,預測未來某個時間點的股票價格。單一點估計的局限在於,它不能為我們提供任何關於此次預測中不確定性的度量。如果網路以95%的置信度預測股票將上漲,那麼我們也許很容易就決定購買。但是,如果網路給出的置信度只有50%呢?在點估計情況下,我們將無法做出決定。相比之下,貝葉斯神經網路可以通過使用貝葉斯規則來估計預測中的不確定性。
圖中顯示了在置信度為95%時未來40天內股票價格的點估計(紅色圓圈)。由於沒有評估不確定性,我們無法判斷在交易時將承擔多少風險。
關於教程
在本教程中,我們將了解:
· 貝葉斯統計如何應用於機器學習。
· 如何構建用於MNIST圖像分類的貝葉斯模型。
· 貝葉斯神經網路如何量化預測中的不確定性。
想要了解更多關於貝葉斯神經網路的背景知識,Thomas Wiecki關於Bayesian Deep Learning的博客以及Yarin Gal的What my deep model doesn"t know... 博客都是非常好的入門參考。
本教程需要 TensorFlow1.1.0版本以及Edward1.3.1版本。
貝葉斯神經網路
要了解貝葉斯神經網路,我們將從貝葉斯統計的簡要概述開始。 貝葉斯統計的核心是關於如何根據新的信息來改變人的信念。
貝葉斯法則
假設有兩個事件a,b,想要計算在事件b發生的條件下事件a的條件概率,記作P(a|b)。貝葉斯法則定義如下:
其中,P(b|a)是事件a發生的條件下事件b的條件概率。P(a)是事件a的先驗概率,P(b)是事件b的先驗概率。注意,對於變數a的先驗概率是概率分布,並且我們得到的是在給定b的情況下,a的可能值的完整分布而不是單個點估計。
神經網路
那麼,貝葉斯法則是如何應用到神經網路的呢?在本節我們將解釋傳統的神經網路是如何在某個特定假設下使用貝葉斯法則來訓練。假定我們有一組數據集D={(xi,yi)}Ni=1,由數對輸入xi和相應的輸出yi組成,其中i=1,2,...,N。我們可以用神經網路來對似然函數P(y|x;ω)進行建模,其中ω是模型的一組可調參數,即網路的權重和偏差。例如對於分類問題,我們可以用標準的前饋網路,yi=f(xi;ω)後面是softmax層來歸一化輸出,以便它代表一個有效的質量函數P(yi|xi;ω)。
傳統的神經網路訓練方法通常通過優化權重和偏差來產生點估計,以最小化代價函數,例如分類問題情況下的交叉熵代價函數。從概率的觀點來看,這相當於使觀測數據P(D|ω)的對數似然最大化,以發現最大似然估計(MLE)Blundell et. al. 2015。
ωMLE=argmaxωlog?P(D|ω)=argmaxω∑i=1NlogP(yi∣xi,ω).
這種優化通常使用某種形式的梯度下降來執行(例如反向傳播),之後當權重和偏差確定後,我們對於給定的輸入x*預測一個新的輸出y*=f(x*;ω)。
以這種方式訓練神經網路容易過擬合,因此我們通常引入正則項例如L2。可以看出,對權重進行L2方法正則化等同於對權重進行正態高斯先驗P(ω)~(0,I),並且最大化後驗估計P(ω|D)。這就給了我們參數的最大後驗估計(MAP)(詳見MacKay著作的第41章):
ωMAP=argmaxωlogP(ω|D)=argmaxωlogP(D|ω)+logP(ω).
從這一點可以看出,傳統的神經網路訓練和正則化方法可以使用貝葉斯規則進行推理。貝葉斯神經網路進一步嘗試近似整個後驗分布P(ω|D)通過使用蒙特卡洛或變分推斷技術。教程的餘下部分將展示如何使用TensorFlow和Edward來實現這一過程。
數據導入
讓我們用TensorFlow方法來導入MNIST images
In[1]:
In[2]:
Extracting MNIST_data/train-images-idx3-ubyte.gz
Extracting MNIST_data/train-labels-idx1-ubyte.gz
Extracting MNIST_data/t10k-images-idx3-ubyte.gz
Extracting MNIST_data/t10k-labels-idx1-ubyte.gz
建模
回想一下,我們的任務是將手寫的MNIST數字分類到{0,1,2,...,9}之一,並對分類的不確定性進行度量。我們的機器學習模型是一個簡單的soft-max回歸,為此我們首先需要選擇似然函數來量化給定的一組參數(我們給定的權重和偏差)的觀測數據的概率。我們將使用 Categorical似然函數(見第2章, Kevin Murphy的Machine Learning: a Probabilistic Perspective來了解Categorical分布(又稱Multinoulli分布)的詳細內容)。
接下來我們在TensorFlow中設置一些佔位符變數。這遵循與標準神經網路相同的過程,除了我們使用Edward庫對權重和偏差引入先驗。在下方代碼中,我們引入了高斯先驗。
In[3]:
In[4]:
變分推斷
到現在為止我們已經定義了似然函數P(y|x,;ω)和先驗P(ω),接下來我們將使用貝葉斯法則來計算後驗P(ω|y,x)。然而我們面臨著一個問題,即輸出P(y)的概率對於大規模實例而言難於計算,因此我們並不試圖直接計算後驗。
為了解決這個問題,我們將用變分推斷(VI)來代替。在變分推斷中,我們選擇一組關於參數ω的參數化分布Q(ω;λ)來近似真實的後驗,然後優化參數λ,儘可能最佳地匹配真實的後驗分布。這種方法的核心思想是將真正的後驗P(ω|y,x)和近似分布Q(ω;λ)之間的Kullback-Leibler距離最小化,這可以被當作兩個概率分布之間的不相似性的度量。
變分推斷(VI)的原理遠不是此博客中描述的內容所能涵蓋的,更多相關信息可以通過Edward的文檔或者Blei等人的論文《Variational Inference: A Review for Statisticians》了解。 MacKay的書也是一個不錯的參考。
接下來我們將使用Edward庫來設置權重和偏差的近似分布Qω(ω)和Qb(ω):
In[5]:
In[6]:
In[7]:
現在我們準備好執行變分推斷了。我們載入了一個TensorFlow的session並開始迭代。這可能需要幾分鐘的時間...
In[8]:
In[9]:
5000/5000 100%
Elapsed: 5s | Loss: 27902.377
模型評估
現在我們已經準備好在測試數據上運行模型所需要的一切。貝葉斯模型評估的主要區別在於權重和偏差不存在單一值來評估模型。相應的,我們在模型中使用權重和偏差的分布,以便在最終預測中反映這些參數的不確定性。因此,我們不是單一的預測,而是得到一組預測及其準確率。
我們從後驗分布中抽取100個樣本,得到每個樣本的執行結果。採樣是一個較慢的過程,需要一段時間!
In[10]:
In[11]:
In[12]:
Out[12]:
我們獲得了一組採樣的準確率。注意權重和偏差的後驗分布反映了從整個MNIST測試數據獲得的信息。因此上述直方圖表示來自權重和偏差的統計可能範圍的準確率。
我們可以執行一個模型平均,並嘗試獲得一個相當於古典機器學習的模型。我們通過疊加從後驗分布中獲取的100個樣本的預測,然後計算預測的平均值來做到這一點。
In[13]:
預測測試數據的準確率 = 92.44
我們還要看一下後驗分布。不幸的是,即使是這樣的小問題,維度的數量也是相當大的,因此對其進行可視化是非常棘手的!我們選擇前5個維度,併產生一個相關性的三角圖。
In[14]:
Out[14]:
我們從測試數據中載入一個圖像,從權重和偏差的後驗分布中得到的每個樣本的分類。
In[15]:
truth = 7
Out[15]:
In[16]:
In[17]:
Out[17]:
正如所看到的,我們的模型對這裡的預測非常有信心。對於來自後驗的所有樣本,我們預測到真實值(
由於隨機數的產生,
這個數值在不同的機器上略微不同)。模型是如何處理陌生數據的?
如果我們給定與訓練數據完全不同的數據,模型將會得到什麼樣的結果呢?這是一個關鍵的測試,因為我們不僅需要知道預測結果,還要知道預測結果的置信度。在許多人工智慧的應用中,這個信息非常有價值。
第一次測試我們使用字母的非MINST數據,並觀察模型對這些數據的反應如何。我們希望的是,如果輸入一張陌生的圖像,比如字母"D",當模型之前用數字{0,1,...,9}來訓練時,那麼它應該輸出一個分類但不確定是什麼。
我們可以從此處下載非MINST圖像。如何轉換成MNIST格式在此處獲得。在此例中,我們使用的是轉換後的數據。我們假定所有需要的文件都在notMNIST文件夾下,並且使用TensorFlow方法。
git clone git@github.com:davidflanagan/notMNIST-to-MNIST.git
mkdir notMNIST_data
cp notMNIST-to-MNIST/*.gz notMNIST_data
我們假定notMNIST_data和這篇筆記在同一目錄下。因為圖像都是MNIST格式,我們可以像之前那樣利用TensorFlow來載入圖像。
注意如果我們沒有在上面執行bash命令,TensorFlow會將MNIST數據下載到notMNIST_data目錄下,我們獲得的第一張圖像將是數字7而非來自notMNIST數據的字母D。請確保執行前notMNIST_data目錄下是正確的數據。
In[18]:
Extracting ./notMNIST_data/train-images-idx3-ubyte.gz
Extracting ./notMNIST_data/train-labels-idx1-ubyte.gz
Extracting ./notMNIST_data/t10k-images-idx3-ubyte.gz
Extracting ./notMNIST_data/t10k-labels-idx1-ubyte.gz
In[19]:
現在,我們從notMNIST數據集中載入一張圖像並用模型對其進行分類。如往常一樣,我們使用後驗的樣本去執行分類,獲得模型預測的置信水平。
In[20]:
truth = 3
Out[20]:
In[21]:
In[22]:
Out[22]:
直方圖顯示對於新分類而言,模型不再擁有之前的置信水平。這就是對比傳統的機器學習方法,貝葉斯方法可以添加許多值的地方。這裡我們展示的是權重的後驗分布可以被用於檢驗網路對物體進行分類的置信度。
總結
我們學習了使用TensorFlow和Edward來創建一個簡單的貝葉斯統計模型對MNIST圖像進行分類。了解統計推斷的不確定性對於各種應用來說是非常重要的,我們已經探索出一些對此問題進行可視化的基本方法。
結束前我們對環境做水印。你需要[watermark][iPython擴展]來執行下面的操作。
In[23]:
CPython 3.6.1
IPython 6.0.0
numpy 1.12.1
pandas 0.20.1
edward 1.3.1
tensorflow 1.1.0
seaborn 0.7.1
matplotlib 2.0.2
compiler : GCC 4.4.7 20120313 (Red Hat 4.4.7-1)
system : Linux
release : 4.8.0-53-generic
machine : x86_64
processor : x86_64
CPU cores : 8
interpreter: 64bit
英文原文:
https://alpha-i.co/blog/MNIST-for-ML-beginners-The-Bayesian-Way.html
譯者:靜水青燃
※Pyculator: 基於python的計算器
※月考成績公布,誰才是真的強者?
※NumPy首次獲得資助,感謝摩爾基金會
※outfancy - 終端列印表格的利器
※爬蟲培訓9折,機不可失
TAG:Python程序員 |
※RED VELVET節目公開吵架解決方法!成員大讚Irene隊內和平維持者
※撲朔迷離的黑色版本OFF-WHITE x Nike Air Force 1迎來官方發售!入手方法告訴你!
※Whelen案例,六西格瑪設計DMADV方法
※一種改良的CRISPR/Cas9基因編輯方法
※jQuery UI API 類別-方法(Methods)
※TFBC「偽區塊鏈」概念飯票,將面臨TFBOYS官方法律責任追究
※PNAS:大數據方法研究HIV包膜蛋白藍圖 有望開發新型HIV疫苗
※JSON編程的parse() 方法
※The Isle官方簡體中文設置方法
※通過Python實現馬爾科夫鏈蒙特卡羅方法的入門級應用
※4 種方法識別Linux系統 USB 設備
※根據實物或圖片用PROE/CREO畫出3D檔的方法
※蘋果iOS正式版發布 蘋果iOS更新方法
※PNAS:開發出一種更好的HIV唾液測試方法
※jQuery UI API 類別-方法重載(Method Overrides)
※蘋果 VS.Iomega:為什麼創新方法很重要
※EXCEL 分頁列印 的最簡單方法
※H5喚起APP方法小結
※CodeWarrior IDE使用Tips-使用burner將elf文件轉換生成HEX和BIN文件的方法和步驟詳解
※方法:幫你達成計劃的PDCA筆記法