教程|如何使用純NumPy代碼從頭實現簡單的卷積神經網絡

2021-01-11 機器之心Pro

機器學習是當前最重要的技術發展方向之一。近日,雪梨大學博士生 Thushan Ganegedara 開始撰寫一個系列博客文章,旨在為機器學習初學者介紹一些基本概念。本文是該系列的第一篇文章,介紹了 KL 散度(KL divergence)的基本數學概念和初級應用。作者已將相關代碼發布在 GitHub 上。

代碼:https://github.com/thushv89/nlp_examples_thushv_dot_com/blob/master/kl_divergence.ipynb

基礎概念

首先讓我們確立一些基本規則。我們將會定義一些我們需要了解的概念。

分布(distribution)

分布可能指代不同的東西,比如數據分布或概率分布。我們這裡所涉及的是概率分布。假設你在一張紙上畫了兩根軸(即 X 和 Y),我可以將一個分布想成是落在這兩根軸之間的一條線。其中 X 表示你有興趣獲取概率的不同值。Y 表示觀察 X 軸上的值時所得到的概率。即 y=p(x)。下圖即是某個分布的可視化。

這是一個連續概率分布。比如,我們可以將 X 軸看作是人的身高,Y 軸是找到對應身高的人的概率。

如果你想得到離散的概率分布,你可以將這條線分成固定長度的片段並以某種方式將這些片段水平化。然後就能根據這條線的每個片段創建邊緣互相連接的矩形。這就能得到一個離散概率分布。

事件(event)

對於離散概率分布而言,事件是指觀察到 X 取某個值(比如 X=1)的情況。我們將事件 X=1 的概率記為 P(X=1)。在連續空間中,你可以將其看作是一個取值範圍(比如 0.95<X<1.05)。注意,事件的定義並不局限於在 X 軸上取值。但是我們後面只會考慮這種情況。

回到 KL 散度

從這裡開始,我將使用來自這篇博文的示例:https://www.countbayesie.com/blog/2017/5/9/kullback-leibler-divergence-explained。這是一篇很好的 KL 散度介紹文章,但我覺得其中某些複雜的解釋可以更詳細的闡述。好了,讓我們繼續吧。

我們想要解決的問題

上述博文中所解決的核心問題是這樣的:假設我們是一組正在廣袤無垠的太空中進行研究的科學家。我們發現了一些太空蠕蟲,這些太空蠕蟲的牙齒數量各不相同。現在我們需要將這些信息發回地球。但從太空向地球發送信息的成本很高,所以我們需要用儘量少的數據表達這些信息。我們有個好方法:我們不發送單個數值,而是繪製一張圖表,其中 X 軸表示所觀察到的不同牙齒數量(0,1,2…),Y 軸是看到的太空蠕蟲具有 x 顆牙齒的概率(即具有 x 顆牙齒的蠕蟲數量/蠕蟲總數量)。這樣,我們就將觀察結果轉換成了分布。

發送分布比發送每隻蠕蟲的信息更高效。但我們還能進一步壓縮數據大小。我們可以用一個已知的分布來表示這個分布(比如均勻分布、二項分布、正態分布)。舉個例子,假如我們用均勻分布來表示真實分布,我們只需要發送兩段數據就能恢復真實數據;均勻概率和蠕蟲數量。但我們怎樣才能知道哪種分布能更好地解釋真實分布呢?這就是 KL 散度的用武之地。

直觀解釋:KL 散度是一種衡量兩個分布(比如兩條線)之間的匹配程度的方法。

讓我們對示例進行一點修改

為了能夠檢查數值的正確性,讓我們將概率值修改成對人類更友好的值(相比於上述博文中的值)。我們進行如下假設:假設有 100 只蠕蟲,各種牙齒數的蠕蟲的數量統計結果如下。

0 顆牙齒:2(概率:p_0 = 0.02)

1 顆牙齒:3(概率:p_1 = 0.03)

2 顆牙齒:5(概率:p_2 = 0.05)

3 顆牙齒:14(概率:p_3 = 0.14

4 顆牙齒:16(概率:p_4 = 0.16)

5 顆牙齒:15(概率:p_5 = 0.15)

6 顆牙齒:12(概率:p_6 = 0.12)

7 顆牙齒:8(概率:p_7 = 0.08)

8 顆牙齒:10(概率:p_8 = 0.1)

9 顆牙齒:8(概率:p_9 = 0.08)

10 顆牙齒:7(概率:p_10 = 0.07)

快速做一次完整性檢查!確保蠕蟲總數為 100,且概率總和為 1.0.

蠕蟲總數 = 2+3+5+14+16+15+12+8+10+8+7 = 100概率總和 = 0.02+0.03+0.05+0.14+0.16+0.15+0.12+0.08+0.1+0.08+0.07 = 1.0

可視化結果為:

嘗試 1:使用均勻分布建模

我們首先使用均勻分布來建模該分布。均勻分布只有一個參數:均勻概率;即給定事件發生的概率。

均勻分布和我們的真實分布對比:

先不討論這個結果,我們再用另一種分布來建模真實分布。

嘗試 2:使用二項分布建模

你可能計算過拋硬幣正面或背面向上的概率,這就是一種二項分布概率。我們可以將同樣的概念延展到我們的問題上。對於有兩個可能輸出的硬幣,我們假設硬幣正面向上的概率為 p,並且進行了 n 次嘗試,那麼其中成功 k 次的概率為:

公式解讀

這裡說明一下二項分布中每一項的含義。第一項是 p^k。我們想成功 k 次,其中單次成功的概率為 p;那麼成功 k 次的概率為 p^k。另外要記得我們進行了 n 次嘗試。因此,其中失敗的次數為 n-k,對應失敗的概率為 (1-p)。所以成功 k 次的概率即為聯合概率

。到此還未結束。在 n 次嘗試中,k 次成功會有不同的排列方式。在數量為 n 的空間中 k 個元素的不同排列數量為

將所有這些項相乘就得到了成功 k 次的二項概率。

二項分布的均值和方差

我們還可以定義二項分布的均值和方差,如下:

均值= np

方差= np(1-p)

均值是什麼意思?均值是指你進行 n 次嘗試時的期望(平均)成功次數。如果每次嘗試成功的概率為 p,那麼可以說 n 次嘗試的成功次數為 np。

方差又是什麼意思?它表示真實的成功嘗試次數偏離均值的程度。為了理解方差,讓我們假設 n=1,那麼等式就成了「方差= p(1-p)」。那麼當 p=0.5 時(正面和背面向上的概率一樣),方差最大;當 p=1 或 p=0 時(只能得到正面或背面中的一種),方差最小。

回來繼續建模

現在我們已經理解了二項分布,接下來回到我們之前的問題。首先讓我們計算蠕蟲的牙齒的期望數量:

有了均值,我們可以計算 p 的值:

均值 = np

5.44 = 10p

p = 0.544

注意,這裡的 n 是指在蠕蟲中觀察到的最大牙齒數。你可能會問我們為什麼不把蠕蟲總數(即 100)或總事件數(即 11)設為 n。我們很快就將看到原因。有了這些數據,我們可以按如下方式定義任意牙齒數的概率。

鑑於牙齒數的取值最大為 10,那麼看見 k 顆牙齒的概率是多少(這裡看見一顆牙齒即為一次成功嘗試)?

從拋硬幣的角度看,這就類似於:

假設我拋 10 次硬幣,觀察到 k 次正面向上的概率是多少?

從形式上講,我們可以計算所有不同 k 值的概率

。其中 k 是我們希望觀察到的牙齒數量。

是第 k 個牙齒數量位置(即 0 顆牙齒、1 顆牙齒……)的二項概率。所以,計算結果如下:

我們的真實分布和二項分布的比較如下:

總結已有情況

現在回頭看看我們已經完成的工作。首先,我們理解了我們想要解決的問題。我們的問題是將特定類型的太空蠕蟲的牙齒數據統計用儘量小的數據量發回地球。為此,我們想到用某個已知分布來表示真實的蠕蟲統計數據,這樣我們就可以只發送該分布的參數,而無需發送真實統計數據。我們檢查了兩種類型的分布,得到了以下結果。

均勻分布——概率為 0.0909二項分布——n=10、p=0.544,k 取值在 0 到 10 之間。

讓我們在同一個地方可視化這三個分布:

我們如何定量地確定哪個分布更好?

經過這些計算之後,我們需要一種衡量每個近似分布與真實分布之間匹配程度的方法。這很重要,這樣當我們發送信息時,我們才無需擔憂「我是否選擇對了?」畢竟太空蠕蟲關乎我們每個人的生命。

這就是 KL 散度的用武之地。KL 散度在形式上定義如下:

其中 q(x) 是近似分布,p(x) 是我們想要用 q(x) 匹配的真實分布。直觀地說,這衡量的是給定任意分布偏離真實分布的程度。如果兩個分布完全匹配,那麼

,否則它的取值應該是在 0 到無窮大(inf)之間。KL 散度越小,真實分布與近似分布之間的匹配就越好。

KL 散度的直觀解釋

讓我們看看 KL 散度各個部分的含義。首先看看

項。如果 q(x_i) 大於 p(x_i) 會怎樣呢?此時這個項的值為負,因為小於 1 的值的對數為負。另一方面,如果 q(x_i) 總是小於 p(x_i),那麼該項的值為正。如果 p(x_i)=q(x_i) 則該項的值為 0。然後,為了使這個值為期望值,你要用 p(x_i) 來給這個對數項加權。也就是說,p(x_i) 有更高概率的匹配區域比低 p(x_i) 概率的匹配區域更加重要。

直觀而言,優先正確匹配近似分布中真正高可能性的事件是有實際價值的。從數學上講,這能讓你自動忽略落在真實分布的支集(支集(support)是指分布使用的 X 軸的全長度)之外的分布區域。另外,這還能避免計算 log(0) 的情況——如果你試圖計算落在真實分布的支集之外的任意區域的這個對數項,就可能出現這種情況。

計算 KL 散度

我們計算一下上面兩個近似分布與真實分布之間的 KL 散度。首先來看均勻分布:

再看看二項分布:

玩一玩 KL 散度

現在,我們來玩一玩 KL 散度。首先我們會先看看當二元分布的成功概率變化時 KL 散度的變化情況。不幸的是,我們不能使用均勻分布做同樣的事,因為 n 固定時均勻分布的概率不會變化。

可以看到,當我們遠離我們的選擇(紅點)時,KL 散度會快速增大。實際上,如果你顯示輸出我們的選擇周圍小 Δ 數量的 KL 散度值,你會看到我們選擇的成功概率的 KL 散度最小。

現在讓我們看看

的行為方式。如下圖所示:

看起來有一個區域中的

之間有最小的距離。讓我們繪出兩條線之間的差異(虛線),並且放大我們的概率選擇所在的區域。

看起來我們的概率選擇也位於非常接近

有最低差異的區域(但並不是最低差異的區域)。但這仍然是一個很有意思的發現。我不確定出現這種情況的原因是什麼。如果有人知道,歡迎討論。

結論

現在我們有些可靠的結果了。儘管均勻分布看起來很簡單且信息不多而二項分布帶有更有差別的信息,但實際上均勻分布與真實分布之間的匹配程度比二項分布的匹配程度更高。說老實話,這個結果實際上讓我有點驚訝。因為我之前預計二項分布能更好地建模這個真實分布。因此,這個實驗也能告訴我們:不要只相信自己的直覺!

相關焦點

  • 如何使用純NumPy代碼從頭實現簡單的卷積神經網絡!這篇文章真叼
    在這種情況下,最好自己親手構建此類模型,這可以幫助你最大程度地控制網絡。因此在本文中,我們將僅使用 NumPy 嘗試創建 CNN。我們會創建三個層,即卷積層(簡稱 conv)、ReLU 層和最大池化層。所涉及的主要步驟如下:
  • 深度學習入門教程:手把手帶你用Numpy實現卷積神經網絡(一)
    本教程由深度學習中文社區(Studydl.com)持續發布與更新, 教程中完整代碼已上傳至github上, 可關注我百家號後發送消息"CNN代碼", 獲得地址.前言Numpy是一個非常好用的python科學計算的庫,CNN是現在視覺領域深度學習的基礎之一。
  • Pytorch:分步實施3D卷積神經網絡(附代碼教程!)
    如何編寫3d CNN的PyTorch教程首先,我們需要簡單解釋一下什麼是3d CNN,以及它與通用2d CNN的區別。然後,我們將逐步分析如何使用Pytorch實現3D卷積神經網絡。什麼是3D卷積神經網絡?
  • 使用Keras構建具有自定義結構和層次圖卷積神經網絡
    來源:DeepHub IMBA本文約3600字,建議閱讀5分鐘本文為你介紹了如何構建具有自定義結構和層次的神經網絡:Keras中的圖卷積神經網絡(GCNN)。在這個循序漸進的教程中,我們將構建一個包含並行層的神經網絡,其中包括一個圖卷積層。那麼什麼是圖上的卷積呢?圖卷積神經網絡在傳統的神經網絡層中,我們在層輸入矩陣X和可訓練權值矩陣w之間進行矩陣乘法,然後應用激活函數f。因此,下一層的輸入(當前層的輸出)可以表示為f(XW)。
  • 機器之心GitHub項目:從零開始用TensorFlow搭建卷積神經網絡
    機器之心基於 Ahmet Taspinar 的博文使用 TensorFlow 手動搭建卷積神經網絡,並提供所有代碼和注釋的 Jupyter Notebook 文檔。但是機器之心發過許多詳細解釋的入門文章或教程,因此,我們希望讀者能先了解以下基本概念和理論。當然,本文注重實現,即使對深度學習的基本算法理解不那麼深同樣還是能實現本文所述的內容。
  • 應用豐富的「卷積神經網絡」技術,怎樣實現了圖像識別?
    (原標題:應用豐富的「卷積神經網絡」技術,怎樣實現了圖像識別?) 摘要: 本文將使用卷積神經網絡來介紹「圖像識別」的概念、應用和技術方法。
  • 代碼詳解:使用NumPy,教你9步從頭搭建神經網絡
    本文介紹了使用NumPy從頭搭建神經網絡的9個步驟,即從數據預處理到反向傳播這一「必經之路」。對機器學習、人工神經網絡、Python語法和編程邏輯有些基本理解最好,(但這也不是必需條件,你可以邊讀邊學)。1. 初始化導入NumPy。
  • 卷積神經網絡(CNN)介紹與實踐
    - 來源:http://cs231n.github.io/classification/為了「教會」一種算法如何識別圖像中的對象,我們使用特定類型的人工神經網絡:卷積神經網絡(CNN)。他們的名字源於網絡中最重要的一個操作:卷積。卷積神經網絡受到大腦的啟發。
  • 教程| 如何使用TensorFlow構建、訓練和改進循環神經網絡
    目前有很多人工智慧應用都依賴於循環深度神經網絡,在谷歌(語音搜索)、百度(DeepSpeech)和亞馬遜的產品中都能看到RNN的身影。然而,當我們開始著手構建自己的 RNN 模型時,我們發現在使用神經網絡處理語音識別這樣的任務上,幾乎沒有簡單直接的先例可以遵循。
  • 教程 | 如何使用TensorFlow構建、訓練和改進循環神經網絡
    目前有很多人工智慧應用都依賴於循環深度神經網絡,在谷歌(語音搜索)、百度(DeepSpeech)和亞馬遜的產品中都能看到RNN的身影。然而,當我們開始著手構建自己的 RNN 模型時,我們發現在使用神經網絡處理語音識別這樣的任務上,幾乎沒有簡單直接的先例可以遵循。
  • 最全面的卷積神經網絡介紹(含代碼實戰詳解)
    這些神經元接收輸入的數據並處理,然後輸出信息。神經網絡的目標是將輸入層中的原始圖像數據轉到輸出層中的正確類中。普通神經網絡和CNN之間的區別在於使用的層類型以及處理輸入數據的方式。假設CNN的輸入是圖像,這允許其提取特定於圖像的屬性。這使得CNN在處理圖像方面更有效率。那麼,CNN是如何構建的?
  • 卷積神經網絡數學原理解析
    事實上,我們每天都在使用計算機視覺——當我們用面部解鎖手機或在社交媒體上發照片前使用自動修圖。卷積神經網絡可能是這一巨大成功背後最關鍵的構建模塊。這一次,我們將加深理解神經網絡如何工作於CNNs。出於建議,這篇文章將包括相當複雜的數學方程,如果你不習慣線性代數和微分,請不要氣餒。我的目標不是讓你們記住這些公式,而是讓你們對下面發生的事情有一個直觀的認識。
  • 用TensorFlow和Keras構建卷積神經網絡
    全文共9940字,預計學習時長20分鐘或更長不同神經網絡結構各有所長。本文主要介紹如何在Python中使用TensorFlow和Keras構建卷積神經網絡。這就是卷積神經網絡學習識別圖像特徵的方法。讓它們適應自己的卷積核權值比任何手動方法都容易得多。手動表達像素之間的關係是難以實現的。難以想像人應該如何徒手釐清像素之間的關係!
  • 給卷積神經網絡動動刀:加法網絡探究
    卷積神經網絡(CNN)在計算機視覺任務中有著廣泛的應用,然而它的運算量非常巨大,這使得我們很難將CNN直接運用到計算資源受限的行動裝置上。為了減少CNN的計算代價,許多模型壓縮和加速的方法被提出。由於訓練和測試的代碼以及網絡結構的代碼和正常的卷積神經網絡一樣,這裡我們不對它們做解析,我們主要解讀定義adder算子的adder.py文件。adder.py中共含有兩個類和一個函數,兩個類分別是adder2d和adder,一個函數為adder2d_function。我們首先來看adder2d這個類。
  • 大話卷積神經網絡CNN,小白也能看懂的深度學習算法教程,全程乾貨...
    更簡單來說,多層神經網絡做的步驟是:特徵映射到值。特徵是人工挑選。深度學習做的步驟是 信號->特徵->值。特徵是由網絡自己選擇。>單個的感知器就構成了一個簡單的模型,但在現實世界中,實際的決策模型則要複雜得多,往往是由多個感知器組成的多層網絡,如下圖所示,這也是經典的神經網絡模型,由 輸入層、隱含層、輸出層構成。
  • MSRA視頻理解新突破,實現199層三維卷積神經網絡
    隨著網際網路的不斷發展,可處理視頻的深度神經網絡遠比普通神經網絡更難訓練,如何減輕訓練負擔成為了一項不可忽視的工作。(Pseudo-3D Convolution)的深度神經網絡的設計思路,並實現了迄今為止最深的 199 層三維卷積神經網絡。通
  • 9大主題卷積神經網絡(CNN)的PyTorch實現
    上文聚焦於源碼和論文,對於各種卷積神經網絡模型的實現,本文將介紹它們的 PyTorch 實現,非常有用!這份資源已經開源在了 GitHub 上,連結如下:https://github.com/shanglianlm0525/PyTorch-Networks先來個總結介紹,該系列的卷積神經網絡實現包含了 9 大主題,目錄如下:1. 典型網絡2. 輕量級網絡3. 目標檢測網絡4.
  • 谷歌開放GNMT教程:如何使用TensorFlow構建自己的神經機器翻譯系統
    選自谷歌機器之心編譯參與:機器之心編輯部近日,谷歌官方在 Github 開放了一份神經機器翻譯教程,該教程從基本概念實現開始,首先搭建了一個簡單的NMT模型,隨後更進一步引進注意力機制和多層 LSTM 加強系統的性能,最後谷歌根據 GNMT 提供了更進一步改進的技巧和細節,這些技巧能令該NMT系統達到極其高的精度。
  • YJango的卷積神經網絡——介紹
    PS:YJango是我的網名,意思是我寫的教程,並不是一種網絡結構。。關於卷積神經網絡的講解,網上有很多精彩文章,且恐怕難以找到比斯坦福的CS231n還要全面的教程。 所以這裡對卷積神經網絡的講解主要是以不同的思考側重展開,通過對卷積神經網絡的分析,進一步理解神經網絡變體中「因素共享」這一概念。注意:該文會跟其他的現有文章有很大的不同。
  • 了解1D和3D卷積神經網絡|Keras
    當我們說卷積神經網絡(CNN)時,通常是指用於圖像分類的2維CNN。但是,現實世界中還使用了其他兩種類型的卷積神經網絡,即1維CNN和3維CNN。在本指南中,我們將介紹1D和3D CNN及其在現實世界中的應用。我假設你已經大體上熟悉卷積網絡的概念。