【導讀】推薦一個Terence Parr和Jeremy Howard撰寫的深度學習的矩陣運算基礎教程。我們知道,深度學習是基於線性代數和微積分的,反向傳播也離不開求導和矩陣運算。因此了解深度學習內部的數學原理也至關重要,本文從簡單函數求導,到多元函數求偏導,再到矩陣的微積分運算,逐層深入,引導我們探索深度學習背後的學習規則和數學基礎。
還有網頁版教程:
https://explained.ai/matrix-calculus/index.html
其他更多詳情,下載全文查看:
請關注專知公眾號(掃一掃最下面專知二維碼,或者點擊上方藍色專知)
專知開課啦!《深度學習: 算法到實戰》, 中科院博士為你講授!
深度學習是一個令人興奮的領域,具有巨大的現實世界影響力。 本文是Terence Parr和Jeremy Howard撰寫的基於'深度學習的矩陣運算'的筆記集合。
深度學習是基於線性代數的。它使用許多層的神經網絡來解決複雜的問題。模型輸入,多層神經元權重,激活函數等都可以定義為向量。操作/轉換很自然地需要使用神經網絡進行訓練,同時應用於所有輸入。矢量/矩陣表示和可用於它們的線性代數運算,非常適合神經網絡的流水線的數據流模型。當輸入、權重和函數被視為向量,值的流動可被視為矩陣上的運算時,數學形式變得非常簡單。
深度學習也是基於差異化的!在訓練階段計算變化率對於優化損失函數至關重要。從任意一組網絡模型權重w開始,目標是得到一個「最優」權重集合,以使給定的損失函數最小。幾乎所有的神經網絡都使用反向傳播方法來找到這樣一組權重。這個過程涉及權重值的變化如何影響輸出。基於此,我們決定按比例增加或減少權重值。測量輸出如何隨著權重的變化而變化,與計算輸出w.r.t權重w的(部分)導數相同。對於所有的訓練樣例,對於所有層中的所有權重,重複該過程。
矩陣運算利用數學的兩個基本分支 - 線性代數和微積分。絕大多數人將線性代數和微積分分開學。這兩個學科在各自的領域本身就都很重要。沒有多少本科課程著重於矩陣運算。人們通常依靠直覺來彌補理解上的空白,同時還要考慮反向傳播等概念。大多數機器學習算法中的反向傳播步驟都是基於計算向量和矩陣中的導數來更新值。大多數機器學習框架本身做了大量的工作,我們永遠不會看到實際導數計算的過程。然而,理解框架本身的內部工作是必要的,如果你打算成為一個合格的從業者或想要從頭開發ML庫,這是非常重要的。
雖然該論文面向DL從業者和編程人員,但它本質上是數學的。注意通過符號來鞏固你的理解是非常重要的。特別注意諸如矢量的形狀(長或高),標量或矢量,矩陣的尺寸等。矢量用粗體字表示。沒有經驗的人可能不會注意到粗體f和斜體f字體之間的差異,但這在等式中有很大的差異。向量的形狀和方向也是一樣的。為了理解術語,我嘗試了很多方法才對這些有些理解,順便說一下我一開始理解的很多術語很多都有問題。
慶幸的是,函數的概念(以及計算它們的衍生物的方法)是從簡單到複雜的方式定義的。首先,我們從f(x)表示的簡單參數函數開始。函數和參數x是標量(用斜體表示),我們可以使用傳統的導數規則來計算f(x)的導數。其次,我們會看到的函數往往有很多變量與之相關聯,以f(x,y,z)的形式。為了計算這些函數的導數,我們使用針對特定參數計算的偏導數。處理這些函數要用到多變量微積分知識。
將輸入變量x, y, z統一用粗體x的向量描述,我們可以將輸入參數向量的標量函數表示為f(x)。該領域的運算是向量運算,其中f(x)的偏導數被表示為向量本身並且適合於各種向量操作。最後,深度學習最有用的是同時表示多個這樣的函數。我們使用f(x)來表示一組f(x)形式的函數。微積分領域最常見的是矩陣微積分(matrix calculus)。
回顧一下,f(x)是標量函數(使用簡單的導數規則),f(x)是向量變量x(使用向量運算規則)的標量函數,f(x)是許多向量標量值函數,每個函數依賴於輸入x的向量(使用矩陣微積分規則)。本文演示了如何計算簡單函數的導數,以及多元函數中的偏導數(∂/∂x),矢量演算中的梯度∇f函數和和矩陣演算中的雅可比矩陣J。差不多可以說,∇f(x)函數是矢量形式f的偏導數的集合。f(x)的雅可比矩陣每行基本上是單獨的∇f(x)。
在計算偏導數的過程中,本文做了一些假設。要記住計算輸出函數的偏導數(y = w.x +b)和損失函數是很重要的。第一個假設是向量x的基數等於f中的標量函數的個數。這提供了一個方形雅可比矩陣。如果你想知道為什麼他們需要相等,考慮這樣一個情況,每個神經元xi的輸入都與權重wi相關(這裡的標量函數類似於xi*wi),所以我們擁有和x一樣多的w。
另一個重要的假設是關於元素對角線性質。基本上,該屬性表明f(x)中的第i個標量函數是(僅)矢量x中第項的函數。想像常見的神經元模式你發現,這樣做更有意義。輸入xi的貢獻與單個參數wi成比例。假設元素對角線性質使雅可比行列式(由第一個假設製成的方形)變成對角矩陣,所有非對角線項都為零。
論文的接下來的幾節將解釋計算更複雜函數的導數的過程。函數可以從簡單到複雜有幾種方式。首先,考慮通過在兩個向量(當然具有相同大小)上應用基於元素的二元運算符得到的函數。這些函數的形式為f(x,y) = x + y或max(x, y)。請注意,在這種情況下,(x, y)是向量。接下來,有一些標量擴展函數是通過將矢量乘法/加入標量。該操作涉及將標量「擴展」到與矢量相同的維度,然後執行元素的乘法和加法操作。例如,y = x + b 被擴展到向量b ,並且被元素地添加到x。
第三,考慮將向量中的值轉化為單個值的函數。最常見的例子是計算神經網絡的損失,通常是形式y = sum(f(x))。這裡y是通過將向量 f(x)的元素相加得到的標量值。
本文計算了這三種情況下的衍生方法。有些函數可能很複雜,需要使用導數的鏈式規則。本文描述了簡單標量函數的鏈式規則,並逐漸將其擴展到所有向量的鏈式規則。
參考連結:
https://towardsdatascience.com/notes-on-matrix-calculus-for-deep-learning-b9899effa7cf
https://arxiv.org/abs/1802.01528
請加專知小助手微信(掃一掃如下二維碼添加),諮詢《深度學習:算法到實戰》參團限時優惠報名~
歡迎微信掃一掃加入專知人工智慧知識星球群,獲取專業知識教程視頻資料和與專家交流諮詢!
請PC登錄www.zhuanzhi.ai或者點擊閱讀原文,註冊登錄專知,獲取更多AI知識資料!
點擊「閱讀原文」,了解報名專知《深度學習:算法到實戰》課程