作者:Omar U. Florez 編譯:專知 神經網絡是線性和非線性模塊的巧妙組合。當我們明智地選擇并連接它們時,,我們就有了一個強大的工具來近似擬合任何數學函數,。例如,用非線性決策邊界分類的方法,。 反向傳播技術負責更新可訓練參數,,盡管它具有直觀和模塊化的特性,但這一概念并不總是得到深入的解釋,。讓我們從頭開始構建一個神經網絡,,看看神經網絡的內部功能,我們將模塊類比為樂高積木塊,,一次一塊積木疊加,。 實現此功能的代碼可以在這個repository中找到: https://github.com/omar-florez/scratch_mlp 神經網絡作為一個組成部分 上圖描述了一些用于訓練神經網絡的數學公式。在本文中,,我們將對此進行解釋,。讀者可能會發(fā)現有趣的是,神經網絡是一堆具有不同目的的模塊組合連接而成,。 為什么要閱讀這篇文檔 如果你理解了神經網絡的內部構成,,你將很快知道當模型不起作用時,,首先要改變什么,并定義一個策略來測試你所知道的算法中的不變量和的預期行為,。當你想要在您使用的ML庫中創(chuàng)建并實現新的功能時,,這也會很有幫助。 因為調試機器學習模型是一項復雜的任務,。根據經驗,,第一次嘗試時,數學模型并不像預期的那樣工作,。它們可能會對新數據的準確性較低,,使你花費較長的訓練時間或過多的內存,返回大量錯誤的值或NaN,,等等,。當你知道這些算法是如何工作的時候,會變得很方便,,比如:
具體例子:學習XOR函數 讓我們打開黑盒子。現在我們將從頭構建一個學習XOR函數的神經網絡,。這種非線性函數的選擇絕不是隨機的,。如果沒有反向傳播,就很難學會用一條直線來分隔類,。 為了說明這個重要的概念,,請仔細看下圖,一條直線是如何不能將XOR函數的輸出0和1分開的?,F實生活中的很多問題也是非線性可分的,。 網絡拓撲結構是很簡單的, -輸入X是一個二維向量; -權重W1是一個具有隨機初始化值的2x3矩陣; -隱含層h1由三個神經元組成,。每個神經元接受一個加權的觀測值作為輸入,,這是下圖中綠色高亮顯示的內積:z1 = [x1, x2][w1, w2]; -權重W2是一個具有隨機初始化值的3x2矩陣; -輸出層h2由兩個神經元組成,因為XOR函數返回0(y1=[0,1])或1 (y2 =[1,0]); 更直觀地如下圖: 現在我們來訓練模型,。在我們的簡單示例中,,可訓練的參數是權重,,但請注意,目前的研究正在探索更多類型的參數進行優(yōu)化,。例如層之間的shortcut,、正則化分布、拓撲結構,、殘差,、學習率等。 反向傳播是一種向(梯度)方向更新權值的方法,,它在給定一批標記的觀測值的情況下最小化一個預先定義的誤差度量(稱為損失函數),。它是一種更通用的技術的特例,這種技術稱為逆向累加模式下的自動微分(automatic differentiation in reverse accumulation mode),。 網絡初始化Network Initialization 讓我們用隨機數初始化網絡權重。 前向步驟Forward Step 這一步的目標是將輸入X向前傳播到網絡的每一層,,直到計算輸出層h2中的向量為止,。 步驟如下: -以權值W1為kernel,線性映射輸入數據X: -使用Sigmoid函數縮放這個加權和z1,,以獲得第一個隱藏層h1的值,。注意,原來的2維向量現在映射到3維度空間; -第二層h2也發(fā)生了類似的過程,。我們先計算第一個隱層的加權和z2,,它現在是輸入數據; -然后計算它們的Sigmoid激活函數。這個向量 [0.37166596 0.45414264]表示給定輸入X的網絡計算的對數概率或預測向量; 計算損失Computing the Total Loss 請注意,,損失函數包含一個正則化組件,,該組件會像Ridge回歸那樣懲罰較大的權重值。換句話說,,換句話說,,較大的平方權重值將增加損失函數,這是我們確實想要最小化的誤差度量,。 反向步驟Backward step 這個步驟的順序是向后的,,而不是向前的。首先計算損失函數對輸出層權重的偏導數(dLoss/dW2),,然后計算隱含層的偏導數(dLoss/dW1),。 (i) dLoss/dW2 鏈式法則表明,我們可以將神經網絡的梯度計算分解為可微的部分: 更直觀地說,,我們的目標是更新下圖中的權重W2(藍色),。為此,我們需要計算沿著鏈的三個偏導數,。 將值代入這些偏導數中,,我們就可以計算出關于權值W2的梯度,,如下所示。 結果是一個3x2矩陣dLoss/dW2,,它將按照最小化損失函數的方向更新原始的W2值,。 (ii) dLoss/dW1 計算用于更新第一個隱藏層W1的權重的鏈式法則顯示了重用現有計算的可能性。 更直觀地說,,從輸出層到權值W1的路徑涉及到已經在后一層計算過的偏導數,。 例如,偏導數dLoss/dh2和dh2/dz2在上一節(jié)中已經被計算為輸出層dLoss/dW2學習權重的依賴項,。 將所有的導數放在一起,,我們可以再次執(zhí)行鏈式法則來更新隱藏層W1的權值: 最后,我們分配了新的權重值,,并完成了網絡訓練的迭代,。 實現Implementation 讓我們將上面的數學方程轉換成僅使用Numpy作為線性代數引擎的代碼。神經網絡是在一個loop中訓練的,,在這個loop中,,每次迭代都向網絡提供已校準的輸入數據。在這個小示例中,,我們只考慮每次迭代中的整個數據集,。由于我們在每個loop中都用相應的梯度(矩陣dL_dw1和dL_dw2)更新可訓練參數(代碼中的矩陣w1和w2),因此對前向傳播,、損失函數和反向傳播的計算具有良好的泛化性,。代碼在這個repository中:https://github.com/omar-florez/scratch_mlp Let's Run This!讓我們來運行這個模型 下面是一些經過訓練的神經網絡,它們可以在多次迭代中逼近XOR函數,。 左圖:Accuracy,。中心圖:Learned decision boundary。右圖:Loss function,。 首先,,讓我們看看隱藏層中有3個神經元的神經網絡是如何具有small capacity的。該模型學習用一個簡單的決策邊界將兩個類分開,,該邊界開始是一條直線,,然后顯示非線性行為。隨著訓練的繼續(xù),,在正確的情況下,,損失函數會很好地降低。 在隱層中有50個神經元可以顯著提高模型學習更復雜決策邊界的能力,。這不僅可以產生更精確的結果,,而且還可以利用梯度,這是訓練神經網絡時一個值得注意的問題。當非常大的梯度在反向傳播過程中乘以權重,,從而生成較大的更新權重時,,就會發(fā)生這種情況。這就是為什么在訓練的最后一步(step> 90)損失值突然增加的原因,。損失函數的正則化部分計算的權重的平方值(sum(W2)/2N) 已經非常大了,。 可以通過降低學習率來避免這個問題,如下所示,?;蛘咄ㄟ^實施一項隨著時間的推移而降低學習速度的政策?;蛘咄ㄟ^加強正則化,,也許是L1而不是L2。解釋梯度和梯度消失是有趣的現象,,我們將在后面進行完整的分析,。 |
|