想理解深度學習,究竟應該降維打擊 or 升維思考?
讓我們從一道選擇題開始今天的話題。
什么是神經網絡?
請選擇以下描述正確的一項或多項。
A.神經網絡是一種數學函數,它接收輸入并產生輸出。
B.神經網絡是一種計算圖,多維數組流經其中。
C.神經網絡由層組成,每層都具有「神經元」。
D.神經網絡是一種通用函數逼近器。
你的答案是________。
公布答案了哈,正確答案是……ABCD。
是不是有點懵?對于神經網絡,難道就沒有唯一、統一的描述嗎?
塞思·韋德曼(Seth Weidman)是前Facebook數據科學家。他曾受邀走訪世界各地,為來自不同行業的人們講授數據科學和機器學習。
前Facebook數據科學家塞思·韋德曼 圖源:sethweidman.com
在其著作《Python深度學習入門:從零構建CNN和RNN》中,韋德曼寫道:
對于講解神經網絡,我發現最具挑戰性的就是為「什么是神經網絡」傳達正確的思維模型。這主要是因為,了解神經網絡需要的不是一個而是多個思維模型,每一個都說明了神經網絡工作方式的不同方面(而且每個方面都必不可少)。
誠然,神經網絡與深度學習是一個立體的領域,僅從數學層面或代碼層面學習,難免以偏概全,無法融會貫通。正因為如此,韋德曼提出了一種全新的學習方法:同時從數學、示意圖、Python代碼三個維度立體地理解每一個概念,從而領略深度學習領域的全貌。
想象你要構建自己的深度學習大廈。你或許鐘情于算法,又或許習慣于視覺型學習,但唯有進行「升維思考」,你才能建造出多面玲瓏的建筑。
韋德曼提出以如下步驟學習導數、嵌套函數、鏈式法則等概念。這些基本概念就如同一塊塊磚,有了它們,你終將建造出屬于自己的深度學習大廈。
- 以一個或多個方程式展示數學原理。
- 給出示意圖,類似于在參加編碼面試時畫在白板上的圖。
- 給出對應的Python代碼。
讓我們一起看看用這種學習方法如何理解導數的概念。
導數是深度學習的一個非常重要的概念。總體來說,函數在某一點上的導數,可以簡單地看作函數輸出相對于該點輸入的「變化率」。
維度1:數學
首先在數學維度上定義導數。可以使用一個數來描述極限,即當改變某個特定的輸入值 時,函數 的輸出有多大變化:
通過為Δ設置非常小的值(例如0.001),可以在數值上近似此極限。因此,如果Δ=0.001,就可以將導數計算為:
雖然近似準確,但這只是完整導數思維模型的一部分。下面來從示意圖的維度認識導數。
維度2:示意圖
為函數曲線畫出一條切線,則函數f 在點a 處的導數就是該線在點a 處的斜率。可以通過兩種方式來計算這條線的斜率。第一種方式是使用微積分來實際計算極限,第二種方式是在a−0.001處和a+0.001處取連線f 的斜率,如下圖所示。
另一種可視化方式是將函數想象成小型工廠,并想象其輸入通過一根線連接到輸出。求解導數相當于回答這樣一個問題:如果將函數的輸入a拉高一點,那么根據工廠的內部運作機制,輸出量將以這個小數值的多少倍進行變化呢?
對理解深度學習而言,第二種表示形式比第一種更為重要。
維度3:Python代碼
可以通過編碼來求解前面看到的導數的近似值:
當我們說P 是E(隨機選的字母)的函數時,其實是指存在某個函數f,使得f (E ) =P。或者說,有一個函數f,它接收對象E 并產生對象P。也可以說,P 是函數f 應用于E 時產生的任意函數值:
可以將其編碼為下面這種形式。