你吃了藍色的藥丸,故事就結束了,你在床上醒來,相信你願意相信的一切。你吃了紅色的藥丸…你留在仙境,我讓你看看兔子洞有多深。
這是《黑客帝國》中墨菲斯對尼奧說的名言。你必須做出同樣的選擇,你想繼續使用像pytorch和tensorflow這樣的自動化框架而不知道其背後原理?還是想更深入地研究矩陣計算的世界,了解反向傳播算法( backpropagation,BP)的工作原理?
線性代數基礎知識向量和矩陣
這裡,我用不加粗的小寫字母表示标量,如:
列向量會用加粗的小寫字母表示,如:
行向量也用加粗的小寫字母表示,但它們有一個T上标。T上标代表轉置:
代表矩陣的符号将是加粗的大寫字母:
也可以對一個矩陣進行轉置,第一列會變成第一行,反之亦然:
一個向量或矩陣的維度是一個元組( 行數, 列數)。
讓我們考慮下面的情況。
點積
點積也是為向量和矩陣定義的。但順序很重要,左邊的向量/矩陣的列數必須與右邊的向量/矩陣的行數一緻。
結果的維度是(左邊輸入的行數,右邊輸入的列數)
如果你有興趣,下面更詳細的點積是如何進行的。
為了得到輸出的一個元素,我們将左邊的一行和右邊的一列向量/矩陣相乘并求和。
點積的重要性在于,它可以在許多不同的情況下使用。在力學中,它可以用來表示一個物體的旋轉和拉伸。它也可以用來改變坐标系。
分析基礎知識和的導數
當我們想求一個和的導數時,相當于求每個加數的導數。
乘積法則
如果我們想求兩個函數的乘積的導數,這兩個函數都取決于我們想微分的變量,我們可以使用以下規則。
讓我們考慮下面的例子:
那麼?相對于?的導數是:
鍊式法則
我們要對一個函數?進行微分。這個函數取決于?,?取決于?。然後,我們可以應用鍊式法則:
讓我們在這裡做一個簡單的練習:
矩陣微積分了解這麼多基礎知識後,我希望你已經準備好進行矩陣微積分了!
我們可以用兩種方式來寫矩陣微積分,即所謂的 "分子布局(numerator layout)"和 "分母布局(denominator layout)"。在這篇文章中,我将使用分母布局。
标量與矢量的導數
一個标量函數相對于一個變量向量的導數是一個行向量。這個行向量有一列代表我們想要微分的每個變量。
讓我們舉個例子:
然後我們可以應用 "和的導數 "規則:
由于一個變量相對于另一個變量的導數是0,我們可以得到:
标量導數向量
如果我們有一個函數?,它輸出一個向量,并想求它相對于一個變量的導數,我們得到一個列向量作為結果。
讓我們考慮以下我們想要求 導 的向量值函數。
逐個向量求導
當對一個以向量為值的函數進行導數時,我們得到一個矩陣。我使用一個有2個輸出值和3個輸入變量的函數作為例子。
你可以把它看成是 "标量乘矢量 "和 "矢量乘标量導數 "的結合。我們沿着行改變函數輸出的元素,沿着列改變變量的元素。
得到的矩陣的維度為:(輸出的大小,輸入的大小)
現在我們通過一個例子說明:
總結
矢量鍊法則讓我們考慮以下情況。向量?是向量?的一個函數。向量?本身是向量?的函數。因此,?(?(?))相對于?的導數可以通過以下方式計算。
我們可以看到,向量鍊法則與标量鍊法則看起來幾乎一樣。點積仍然在公式中,我們必須構造一個一個向量的導數矩陣。
這裡有一個小例子。
我們計算偏導數。
現在我們展開點積。
最後進行簡化,得到結果。
常數的點積我們可以把常數矩陣和向量看作是标量常數。允許對它們進行因式分解。但是請記住,對于兩個非标量之間的點積來說,順序很重要。
現在我們可以把矩陣?分解出來,如果它是一個常數并且不依賴于?的話。
我們用向量導數矩陣來構造向量:
對角線上有1,其他地方有0的矩陣被稱為單位矩陣。所有與它相乘的東西都保持不變。因此,最終結果是:
有趣的是,盡管整個方程包含了向量和矩陣,但我們得到的結果與我們根據标量微積分所預期的一樣。然而,情況并非總是如此,因為并非所有标量微積分的規則都适用于多變量微積分。
最後我很高興你服用了紅色藥丸,加入了我在矩陣微積分領域的深入研究。如果這對你來說比較陌生,那麼你應該多加練習,自己去看一些例子。
有話要說...