CS231N 04: 反向傳播和損失函數

2021-02-08 datazero

本文主要參考CS231N官方筆記,省略了一些基礎知識,同時做了擴展。
更好的閱讀體驗文末閱讀原文跳轉。

Introduction


Simple expressions and interpretation of the gradient


下圖展示了反向傳播算法中,梯度的計算方法。其中,前向傳播從輸入計算到輸出(綠色),反向傳播從尾部開始,根據鏈式法則遞歸地向前計算梯度(顯示為紅色),一直到網絡的輸入端

反向傳播可以看做是gate之間通過梯度信號相互通信,只要讓它們的輸入沿著梯度方向變化,無論它們自己的輸出值在何種程度上升或降低,都是為了讓整個網絡的輸出值更高(取決去梯度信號的正負)


下圖是使用sigmoid激活函數的二維神經元的例子。輸入是[x0, x1],可學習的權重是[w0, w1, w2]。該神經元對輸入做點積,然後其激活數據被sigmoid函數縮放到[0,1]之間。

下式是sigmoid函數和求導公式(求導過程中先+1後-1的方法可以簡化導數):

代碼實現:

w = [2,-3,-3] # assume some random weights and datax = [-1, -2]# forward passdot = w[0]*x[0] + w[1]*x[1] + w[2]
f = 1.0 / (1 + math.exp(-dot)) # sigmoid function# backward pass through the neuron (backpropagation)ddot = (1 - f) * f # gradient on dot variable, using the sigmoid gradient derivationdx = [w[0] * ddot, w[1] * ddot] # backprop into xdw = [x[0] * ddot, x[1] * ddot, 1.0 * ddot] # backprop into w# we're done! we have the gradients on the inputs to the circuit

Backprop in practice: Staged computation

假設有以下形式的函數:

這個函數完全沒用,這裡只是用來作為實踐反向傳播的一個例子,需要強調的是,如果對 x 或 y 求微分,結果是一個複雜的表達式。然而如此複雜的運算並不必要,因為我們不需要一個明確的函數來計算梯度,只需知道如何使用反向傳播計算梯度即可。下面是構建前向傳播的代碼描述(計算下式中的dx時,代碼中的+=是梯度累加):

x = 3 # example valuesy = -4# forward passsigy = 1.0 / (1 + math.exp(-y)) # sigmoid in numerator #(1)num = x + sigy # numerator #(2)sigx = 1.0 / (1 + math.exp(-x)) # sigmoid in denominator #(3)xpy = x + y #(4)xpysqr = xpy**2 #(5)den = sigx + xpysqr # denominator #(6)invden = 1.0 / den #(7)f = num * invden # done! #(8)

# backprop f = num * invdendnum = invden # gradient on numerator #(8)dinvden = num #(8)# backprop invden = 1.0 / den dden = (-1.0 / (den**2)) * dinvden #(7)# backprop den = sigx + xpysqrdsigx = (1) * dden #(6)dxpysqr = (1) * dden #(6)# backprop xpysqr = xpy**2dxpy = (2 * xpy) * dxpysqr #(5)# backprop xpy = x + ydx = (1) * dxpy #(4)dy = (1) * dxpy #(4)# backprop sigx = 1.0 / (1 + math.exp(-x))dx += ((1 - sigx) * sigx) * dsigx # Notice += !! See notes below #(3)# backprop num = x + sigydx += (1) * dnum #(2)dsigy = (1) * dnum #(2)# backprop sigy = 1.0 / (1 + math.exp(-y))dy += ((1 - sigy) * sigy) * dsigy #(1)# done! phew

對前向傳播變量進行緩存:在計算反向傳播時,前向傳播過程中得到的一些中間變量非常有用。在實際操作中,最好代碼實現對於這些中間變量的緩存,這樣在反向傳播的時候也能用上它們。

在不同分支的梯度要相加:如果變量 x,y 在前向傳播的表達式中出現多次,那麼進行反向傳播的時候就要非常小心,使用+=而不是=來累計這些變量的梯度(不然就會造成覆寫)。這是遵循了在微積分中的多元鏈式法則(multivariable chain rule),該法則指出如果變量在線路中分支走向不同的部分,那麼梯度在回傳的時候,就應該進行累加。【This follows the multivariable chain rule in Calculus, which states that if a variable branches out to different parts of the circuit, then the gradients that flow back to it will add.】

Patterns in backward flow

有趣的是,在許多情況下,可以直觀地解釋反向傳播中的梯度。例如,神經網絡中三個最常用的門(add,mul,max)在反向傳播期間的很容易解釋。

部分梯度求解(其實就是高數學的鏈式法則…注意max函數的求導規則):

Gradients for vectorized operations

以上各節只涉及單個變量,但是所有概念都可以擴展到矩陣和向量運算。需要注意的是維度和轉置操作。

矩陣-矩陣相乘梯度可能最棘手的運算:

# forward passW = np.random.randn(5, 10)
X = np.random.randn(10, 3)
D = W.dot(X)# now suppose we had the gradient on D from above in the circuitdD = np.random.randn(*D.shape) # same shape as DdW = dD.dot(X.T) #.T gives the transpose of the matrixdX = W.T.dot(dD)

以上代碼中各變量維度計算過程如下:

Backpropagation Tutorial

39頁PPT(不加注釋)
39頁PPT(加注釋)

重要的是向量乘法、矩陣乘法的求導

向量、矩陣求偏導








實例


計算過程如下:

SupplementBackpropagation for a Linear Layer

4頁PDF

Derivatives, Backpropagation, and Vectorization

7頁PDF

Efficient BackProp

44頁PDF

Summary

本文直觀地解釋了梯度的含義,梯度是如何在網絡中反向傳播的,以及它們是如何與網絡的不同部分通信並控制其升高或者降低,使得最終輸出值更高。

討論了分段計算在反向傳播的實現中的重要性。應該將函數分成不同的模塊,這樣計算局部梯度相對容易,然後基於鏈式法則將其「鏈」起來。重要的是,不需要把這些表達式寫在紙上然後演算它的完整求導公式,只需要將表達式分成不同的可以求導的模塊(模塊可以是矩陣向量乘法,取最大值,加法等),然後在反向傳播中一步一步地計算梯度。

Reference

Automatic differentiation in machine learning: a survey

相關焦點

  • 【資源】斯坦福CS231n 2017春季課程全公開,視頻+PPT+英文字幕
    如果你有很多的編程經驗,但使用不同的語言(例如C / C ++ / Matlab / Javascript),你可能會很好。大學微積分,線性代數(例如MATH 19或41,MATH 51)您應該很樂意使用衍生詞和理解矩陣向量運算和符號。基本概率和統計學(例如CS 109或其他統計學課程)您應該知道概率的基礎知識,高斯分布,平均值,標準偏差等。
  • CS231N 02: 損失函數和正則化
    Loss function在上一節中,我們定義了一個從像素值到分類分數的函數,這個函數的參數是由一組權重 W 確定的,數據 (xi,yi) 是固定的,但是我們可以控制這些權重,使預測的分類分數與訓練數據中的真實標籤一致。
  • 教程| 斯坦福CS231n 2017最新課程:李飛飛詳解深度學習的框架實現...
    今年 4 月,CS231n 再度開課,全新的 CS231n Spring 2017 仍舊由李飛飛帶頭,帶來了很多新鮮的內容。今天機器之心給大家分享的是其中的第八講——深度學習軟體(Deep Learning Software)。主要內容有:CPU 和 GPU 的對比;深度學習框架簡介;TensorFlow 和 PyTorch 的實例;以及各種深度學習框架的比較。
  • CS231N 06: 神經網絡、損失函數
    參數 W2, W1 是通過隨機梯度下降學習的,其梯度是通過鏈式規則導出的(並通過反向傳播計算)。一個三層的神經網絡可以類比地看做 s = W3 max(0, W2 max(0, W1 x)),其中 W3, W2, W1 是需要學習的參數,中間隱藏向量的尺寸是網絡的超參數。
  • 資源| 斯坦福CS231n Spring 2017詳細課程大綱(附完整版課件下載)
    機器之心編譯參與:Smith、蔣思源CS231n 近幾年一直是計算機視覺領域和深度學習領域最為經典的課程之一。而最近才剛剛結課的 CS231n Spring 2017 仍由李飛飛帶頭主講,並邀請了 Goodfellow 等人對其中部分章節詳細介紹。
  • 反向傳播原來這麼簡單 | 神經網絡 | 損失函數與Softmax(1)
    回顧深度神經網絡神經網絡是由權值、截距、激活函數、歸一化方法和損失函數逐層構造而成,同樣地,我們將使用由sklearn提供的手寫數字作為神經網絡的數據集。定義這些函數的更好方法是使用 class (類),因為類的屬性是可變的。為了使我們的代碼保持一致性,所有的函數將被重寫為類。在前兩步損失函數與 softmax 函數的反向傳播中,由於沒有轉置和歸一化操作,所以很容易計算梯度。一個常用的導數函數就可以清晰地指導編程工作。相反,為了正確計算梯度,必須認真考慮線性代數的概念1.
  • 資源 | 斯坦福CS231n Spring 2017詳細課程大綱(附完整版課件下載)
    CS231n 近幾年一直是計算機視覺領域和深度學習領域最為經典的課程之一。
  • 斯坦福CS231n Spring 2017開放全部課程視頻(附大綱)
    而最近剛剛結課的CS231n Spring 2017 仍由李飛飛主講,並邀請了Goodfellow等人對其中部分章節詳細介紹。本課程從計算機視覺的基礎概念開始,在奠定了基本分類模型、神經網絡和優化算法的基礎後,詳細介紹了CNN、RNN、GAN、RL等深度模型在計算機視覺上的應用。前天,斯坦福開放了該課程的全部視頻,並且還有配套英文字幕。
  • 教程 | 斯坦福CS231n 2017最新課程:李飛飛詳解深度學習的框架實現與對比
    今年 4 月,CS231n 再度開課,全新的 CS231n Spring 2017 仍舊由李飛飛帶頭,帶來了很多新鮮的內容。今天機器之心給大家分享的是其中的第八講——深度學習軟體(Deep Learning Software)。主要內容有:CPU 和 GPU 的對比;深度學習框架簡介;TensorFlow 和 PyTorch 的實例;以及各種深度學習框架的比較。
  • RNN系列教程之三 | 基於時間的反向傳播算法和梯度消失問題
    前一部分中,我們介紹了如何在Python和Theano框架下實現RNN,但還未深入了解時序反向傳播算法(BPTT)是如何計算梯度的。這周,我們將簡單介紹BPTT,並解釋其與傳統反向傳播的區別。我們還將了解梯度消失問題,這也是推動LSTM(長短時記憶)和GRU(門控循環單元)(目前在NLP和其他領域最流行且有效模型)發展的原因。
  • 學界 Andrej Karpathy:你為什麼應該理解反向傳播
    帶有前向傳播(黑色)和反向傳播(紅色)的 Batch Norm 層的計算圖在 S 型函數上的梯度消失從這裡開始會很簡單。以前某段時間,在全連接層中使用 S 型函數(或雙曲正切函數 tanh)的非線性(non-linearities)非常流行。
  • 斯坦福Serena Yeung帶你認識神經網絡 · 2017CS231n 第4彈
    2017雙語字幕版獨家上線斯坦福Serena Yeung帶你認識神經網絡跟著推算一遍馬上學會反向傳播算法 ▼上手視頻約 2 分鐘,大家做好筆記大滿足的全系列完整視頻前往▼▼▼  www.mooc.ai/course/268課後習題討論問答猛戳▼▼▼   www.mooc.ai/bbs 什麼是CS231n 2017?
  • 【強基固本】卷積神經網絡(CNN)反向傳播算法
    現在我們想把同樣的思想用到CNN中,很明顯,CNN有些不同的地方,不能直接去套用DNN的反向傳播算法的公式。02要套用DNN的反向傳播算法到CNN,有幾個問題需要解決:1)池化層沒有激活函數,這個問題倒比較好解決,我們可以令池化層的激活函數為
  • 斯坦福CS231n Spring 2017詳細課程大綱(附完整版課件下載)
    CS231n 近幾年一直是計算機視覺領域和深度學習領域最為經典的課程之一。而不久前結課的 CS231n Spring 2017 仍由李飛飛帶頭主講,並邀請了 Goodfellow 等人對其中部分章節詳細介紹。本課程從計算機視覺的基礎概念開始,在奠定了基本分類模型、神經網絡和優化算法的基礎後,重點詳細介紹了 CNN、RNN、GAN、RL 等深度模型在計算機視覺上的應用。
  • 深度學習之DNN與反向傳播算法總結
    在深度神經網絡(DNN)模型與前向傳播算法中,我們對DNN的模型和前向傳播算法做了總結,這裡我們更進一步,對DNN的反向傳播算法(Back Propagation,BP)做一個總結。在了解DNN的反向傳播算法前,我們先要知道DNN反向傳播算法要解決的問題,也就是說,什麼時候我們需要這個反向傳播算法?
  • CS231N 07: 數據處理、權重初始化、正則化
    在本節中,我們將討論有關數據預處理(data preprocessing),權重初始化(weight initialization)和損失函數(loss functions)的其他設計選擇。Data Preprocessing
  • 反向傳播(BP)算法的數學原理
    反向傳播算法的核心是求解損失函數C關於任一網絡權重w(或偏置b)的偏微分∂C/∂w (或∂C/∂b)。該偏微分表達式表示損失函數C的值隨權重w或偏置b值變化而變化的變化率。很多時候雖然偏微分表達式看起來非常複雜,但反向傳播算法為偏微分表達式中每項的物理含義提供了自然、直觀和優美的解釋。
  • CS231n 2017中文字幕視頻:如何訓練機器進行視覺識別?
    CS231n 的全稱是 CS231n: Convolutional Neural Networks for Visual Recognition,即面向視覺識別的卷積神經網絡。該課程是史丹福大學計算機視覺實驗室推出的課程。需要注意的是,我們這次翻譯的是 2017 春季(4 月至 6 月)的最新版本。
  • CS231n 2017 今天正式開課!雙語字幕版獨家上線!
    CS231n 2017雙語字幕版獨家上線!我們先來介紹一下,CS231nCS231n的全稱是CS231n: Convolutional Neural Networks for Visual Recognition,即面向視覺識別的卷積神經網絡