向量空間
為了定義向量空間,首先需要定義向量的加法和標量乘法運算:
將集合 V 上的加法定義為一個函數,要求對于 u,v ∈ V,需要滿足 u + v ∈ V,這個性質也稱為這個集合對于加法封閉 closed under addition
將集合 V 上的標量乘法定義為一個函數,要求對于任意 λ ∈ F, v ∈ V,需要滿足 λv ∈ V,這個性質也稱為這個集合對于標量乘法封閉 closed under scalar multiplication
向量空間 Vector Space 本質上是一個定義了上述加法和標量乘法的向量的集合,且進一步要求向量空間中的加法和標量乘法運算符合如下性質:
加法的交換性 commutativity:對所有 u,v ∈ V,滿足 u + v = v + u
加法和標量乘法的結合性 associativity:對所有 u,v,w ∈ V 和 a,b ∈ F,滿足 (u + v) + w = u + (v + w) 和 (ab)v = a(bv)
唯一加法單位元 additive identity:即存在元素 0 ∈ V 使得對于所有 v ∈ V,滿足 0 + v = v,且這個 0 是唯一的
唯一的加法逆元 additive inverse:對每個 v ∈ V 都存在 w,使得 v + w = 0,且 w 是唯一的
乘法單位元 multiplicative identity:對所有 v ∈ V 都有 1v = v
分配性質 distributive properties:對所有 a,b ∈ F 和 u,v ∈ V,滿足 a(u + v) = au + av 和 (a+b)v = av + bv,這一性質將加法和標量乘法聯系在一起
由于上述向量空間的標量乘法依賴于 F,因此為了清楚展示二者之間的關系,我們會說 V 是 F 上的向量空間,更具體地,Rn 是 R 上的向量空間,Cn 是 C 上的向量空間。
前面這些性質的定義是為了滿足數學嚴謹性和證明的需要,為了便于直觀的理解這些定義的必要性,舉例說明如下:
針對加法的定義:最基本的我們需要這個運算不會對增加向量的維度,即加法運算后的向量應該仍屬于這個空間,更具體地,兩個 3 維向量相加的結果可以是 2 維向量,但不能是 4 維向量
加法的交換性、加法和標量乘法的結合性:這在線性變換中可以保證這兩個運算的結果不受運算順序的影響,更具體地,在通過對行或列做初等變換求矩陣的秩的時候,不同的操作者采用不同的操作順序,在計算正確的前提下結果是一致的
線性組合 linear combination 和張成空間 span
對于一個向量組中的向量分別施加標量乘法后再做加法運算的結果就是這個向量組的線性組合,更加正式的定義為——向量組 v1 , ... , vm 的線性組合是構建于如下計算形式的一個向量:a1v1 + ... + amvm,其中 a1 , ... , am ∈ F。例如 (17, -4, 2) = 6(2, 1, -3) + 5(1, -2, 4),因此 (17, -4, 2) 是 (2, 1, -3) 和 (1, -2, 4) 的一個線性組合。如果一個向量可以由另一個向量組的線性組合來構建,則稱這個向量可以由這個向量組線性表示。
相應地,一個向量組 v1 , ... , vm 的所有可能的線性組合 a1v1 + ... + amvm 得到的向量的全體構成的空間稱為這個向量組張成的空間 span,記為 span(v1 , ... , vm),對應前面的例子:(17, -4, 2) ∈ span((2, 1, -3), (1, -2, 4))。
作為一個非英語國家的學生,在學習的時候可能會遇到很多由于翻譯西方著作而來的概念而非常讓人費解,如果去查看對應的英文書籍,對應的單詞很可能更容易讓人理解。例如上面提到的 span 這個詞,最初學習的時候書上翻譯為“張成的空間”,就非常難以理解,后來查看原版書籍才恍然大悟。對應 span 的一個更為具體的例子是機械手的各個關節的轉動和移動最終使得執行機構的工作空間在某個范圍內,對應這個范圍就是 span。
內積空間
內積空間就是在加法和數乘的基礎上定義了內積的向量空間。
數學對象及表示
線性代數中主要用到的數學對象及在 Deep Learning 這本書中的符號表示如下:
標量 Scalar:一個數字,通常為實數,用斜體小寫字母表示 s
向量 Vector:一組數字,可以是行向量,但默認是列向量,用黑體小寫字母表示 x,其中向量的第 i 個元素用 xi 表示,在 Numpy 中的表示形式是 1 維數組,在 Pandas 中對應一個 Series
矩陣 Matrix:一個包括行和列的二維數字表,用黑斜體大寫字母表示 A,對于 m 行 n 列的矩陣用 Amxn 來表示,在 Numpy 中的表示形式是 2 維數組,在 Pandas 中對應一個無嵌套索引的 DataFrame
張量 Tensor:這是一個相對較新的概念,可以理解為多張并列的表,或者一個矩形的數據箱,用黑體字母 A 來表示,相應的在 Numpy 中的表示形式是 2 維以上的數組,在 Pandas 中對應一個嵌套索引的 DataFrame
注意這里每一個低序號的數學對象都可以理解為后面高序號數學對象的一個特殊實例,例如標量可以理解為 1 維向量,也可以理解為一個 1 x 1 的矩陣,還可以理解為一個 0 維張量。推而廣之,向量是 1 維張量,矩陣是 2 維張量,一個卷積神經網絡中的 3 層過濾器則可以理解為 3 維張量。
矩陣和向量的運算
向量的點乘 dot product
對于 Rn 中的向量 x,y,定義運算 x · y = x1y1 + ... + xnyn 為向量 x 與向量 y 的點乘,其結果是一個標量。
點乘按相應位置元素乘積再相加的運算形式是被定義規定好的,這個定義的一個重要意義就是它可以與范數完美的結合起來,即: x · y = ||x||2||y||2cosθ,其中 θ 在二維空間中可以直觀的理解為兩個向量的夾角,而當 x = y 時,點乘的結果就是 L2 范數的平方。
當 x,y 都是列向量時,x · y = xTy,這個運算是矩陣和向量相乘的基石。
矩陣和向量相加
在線性代數中,兩個矩陣能夠加減運算則二者必須是同型的,即行和列都相等。在深度學習中,如果使用過 Numpy 這個庫的人可以知道矩陣是可以和標量、向量相加的:
當矩陣和標量相加時,會將標量加到矩陣的每一個元素中
當矩陣和向量相加時,則是將向量加到矩陣的每一行,即 Ci,j = Ai,j + bj,這里隱含要求向量的維數等于矩陣的列數,這樣定義的原因目前我還沒找到
矩陣和向量乘法
矩陣和向量的乘法就是對向量施加線性變換,在線性代數中如果已知 A,b,且 A 可逆,則 Ax = b 的求解可以通過 x = A-1b 來進行,但在實際運算中 A-1 由于在計算機中只能由有限精度的數字表示,所以一般不采用這種方法,而是利用 b 的值。
Ax = b 按照元素展開得到一個非齊次線性方程組,其求解時還可以對增廣矩陣進行高斯消元,并比較增廣矩陣和參數矩陣的秩的情況:
- 如果 r(A) < r(A, b) :方程組無解
- 如果 r(A) = r(A, b) = n:方程組有唯一解
- 如果 r(A) = r(A, b) < n:方程組有無窮多個解
當 b = 0 時,方程組稱為齊次線性方程組,其必有 0 解,其有非 0 解的充分必要條件是 r(A) < n。
范數
向量的 Lp 范數的定義為:Lp = ||x||p = (Σ|xi| p)1/p,其中 p 為 ≥ 1 的實數,可以直觀的將范數理解為向量距離原點的距離,或者說長度。當 p = 2 時,也稱為歐幾里德范數。
在機器學習中,L2 范數的平方使用最為廣泛,其中的一個優點是其對于各項的偏導數是相應項的函數 2xi ,而 L2 范數本身對各項的偏導數則是所有項的函數,最典型的 L2 范數應用場合是當模型出現過擬合時的 L2 正則化。但當向量距離原點較近,其各項均取很小的值時,L2 范數的平方增長很慢,此時如果算法對于結果是否取 0 值還是接近 0 的很小值有要求的時候,一般用 L1 范數代替。
另一個較為重要的范數是 max 范數: L∞ = ||x||∞ = max|xi|,表示向量中取最大值的元素的絕對值。
幾個特殊的矩陣
對角矩陣 Diagonal matrix
標準的對角矩陣的定義要求其一個方陣,且除了對角線上的元素外,其他元素均為 0,用 diag(v) 來表示用向量 v 中的元素作為對角線元素的對角陣。將矩陣通過初等變換轉換成對角陣后為計算提供了很多的便利:
矩陣和向量的乘法相當于對于向量 x 各個位置的元素 xi 乘以 v 的相應位置的元素 vi
可以直觀的看出矩陣是否可逆
實際應用中的對角陣并不總是方陣,而如果能通過初等變換將矩陣的某一子塊轉化成對角陣,也能夠為計算提供很多便利,對于一個非方陣的對角陣 D,D?x 的結果處理如下:
當 D 的行數超過列數時,可以在結果的末尾添加相應行的 0
當 D 的列數超過行數的時候,可以考慮將結果的末尾幾個數字忽略
對陣矩陣 Symmetric matrix
對稱矩陣 A = AT,實際使用中一般有某些特定功能的函數來生成,如當 A 的各個位置的元素是相應位置的兩個點之間的距離,此時其就是一個對稱矩陣。
正交矩陣 Orthogonal matrix
兩個非 0 向量正交的定義是 xTy = 0,當一個矩陣 A 當中的向量彼此兩兩正交,此時 ATA 的結果是一個對角陣。進一步地,如果這個對角陣對角線上的元素都為 1 ,也即這些向量的范數都是 1 的時候,這個矩陣進一步被稱為正交矩陣,此時 ATA = AAT = I,也即對于正交陣來說,AT = A-1。這里需要注意正交矩陣不僅要求其中的向量彼此正交,還要求各個向量的范數均為 1,這點很容易被忽略,對于向量彼此正交但各個向量范數不是 1 的矩陣沒有專門稱謂。
矩陣分解 Decomposition
我們之所以討論矩陣的分解,是因為很多數學對象在按照一定的方式分解成相應的組成部分后會更加容易理解,很多性質也可以一目了然的得以呈現,例如將整數分解為質數相乘:對于 12 = 2 x 2 x 3,我們可以直觀的知道 12 能夠被 3 整除而不能被 5 整除。同樣地,矩陣也可以通過一定的方式進行分解,使得我們可以透過向量組這種表示方式來看到一些更重要的特性。一個比較常用的矩陣分解的方式是將其分解為一系列本征向量和本征值構成的矩陣的方式,稱為本征值分解。
相似矩陣
在討論本征值分解之前我們先理解一下相似矩陣,以及矩陣相似的意義。
在線性代數中,我們看到的任何矩陣中的數值都是對應在某一個基 basis 下的坐標,大多數情況下我們看到矩陣其默認的基都是主對角線元素都是 1 其他位置元素都為 0 的自然基,這個矩陣在英文中也被稱作單位矩陣 Identity matrix,也可以理解為它是對于一類以其為基的矩陣的“身份”的確認標準。
import numpy as np
In [2]:
np.identity(4)
Out[2]:
array([[ 1., 0., 0., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 1., 0.],
[ 0., 0., 0., 1.]])
對于同一個向量來說,其在不同基下的坐標是不同的,這就是我們想要討論基的置換的原因。如果我們通過左乘一個矩陣對這個向量施加一個線性變換,那么對應同一個線性變換,例如完成同樣角度的旋轉,或相同比例和方向的拉伸,來自不同基下的矩陣的坐標表示形式也是不同的,有些表示形式異常簡單,有些表示形式則異常復雜,這兩個對應同一個線性變換的不同基下的矩陣之間的關系就是線性代數語境中的“相似"。
例如對于 [ -1, 2 ]T 這個列向量來說,其在自然基下的線性組合系數就是向量坐標本身 [ -1, 2 ]T = -1 x [ 1, 0 ]T + 2 x [ 0, 1 ]T,如果我們通過施加線性變換線性變換將前面自然基的兩個列向量變換成了 [ 1, -2 ]T 和 [ 3, 0 ]T 構成一個新的基,注意這里施加線性變換的矩陣就是新基的兩個列向量構成的矩陣,這兩個列向量既是基變換的原因,又是基變換的結果,并且新的基的基還是自然基。此時,在這個新的基下 [ -1, 2 ]T 的坐標將變成 [ 5, 2 ]T,但由于做的是同一個線性變換,所以線性組合系數并未發生改變,即 [ 5, 2 ]T = -1 x [ 1, -2 ]T + 2 x [ 3, 0 ]T,這里有些繞,但請仔細體會。
在線性代數中所見到的相似矩陣的定義:P-1AP = B ,這其中默認隱含 A 與 B 的坐標是基于標準基的。式中 P 對應的英文單詞是 Permutation,翻譯為”置換“,實際上 P 就是對于不同基進行切換的置換矩陣,并且實現基的置換的方法就是通過 P 左乘想要置換基的矩陣和向量即可,這實際是矩陣左乘實現線性變換的一個特殊實例。
對上式左乘一個 P,即 AP = PB,此時,這個公式中又暗含一個秘而不宣的“易證”:矩陣 A 和矩陣 P 的基都是自然基底 E,相應的,PB 這個矩陣當中的數值表示也是基于自然基定下來的。如果采用 PB 這個矩陣對任何向量 x 進行一個線性變換,變換后的向量的坐標也是基于自然基確定的。
上文中如果 B 是對角陣這個簡單的形式,我們就說矩陣 A 可以相似對角化,而討論相似對角化的目的是通過 B 矩陣這個簡潔的形式來完成和觀察同樣的變換操作。
本征值分解 Eigendecomposition
這里需要稍作擴展的是,通過矩陣施加線性變換的結果不外乎三種形式:
通過正交矩陣施加旋轉
通過對角矩陣施加拉伸
通過非方矩陣施加投影
對于有一類方陣來說,其對于某些向量的線性變換相當于對這個向量左乘一個標量來對向量進行一個縮放而不產生平移或旋轉,這個矩陣和向量的關系就是向量稱為矩陣的本征向量。相應的把這個矩陣分解成由特征向量構成的正交陣和一個由標量構成的對角陣的乘積的形式稱為本征分解,相關說明如下:
本征向量和本征值:對于一個 n x n 方陣 A 來說,如果存在一個非 0 向量 v 使得 Av = λv,其中 λ 為一個標量,此時稱 v 為 A 的一個本征向量,而 λ 為對應這個本征向量 v 的本征值
直觀的理解矩陣和本征向量的關系就是通過矩陣施加線性變換后會將本征向量所在的空間在特定的方向上進行縮放
如果 v 是方陣 A 的本征向量,則對它乘以任意一個標量,其結果也是 A 的本征向量,因此在取得本征向量后會將其縮放為范數為 1 的向量
如果 A 有 n 個線性無關的本征向量和相應的 n 個本征值,則可以將這 n 個本征向量組成一個新的矩陣 V = [v(1), ... , v(n)],再將這 n 個本征值構成一個對角陣 diag(λ),此時可以通過計算得知,A = Vdiag(λ)V -1,即將 A 分解為三個由其本征向量和本征值構成的矩陣的乘積
本征分解不總是存在的,也有時本征值是一個復數而非實數
特別地,實對稱矩陣的本征值都是實數,且都可以通過本征分解展開成 A = QΛQT= QΛQ-1,其中 Q 為正交矩陣,Λ 為本征值構成的對角陣
由于不同的本征向量本征值可以是相同的,此時這些本征向量的線性組合也是對應這個矩陣的本征向量,因此只有在本征值都不同的情況下本征分解才是唯一的
本征值都是正數的矩陣稱為正定矩陣,這個矩陣的一個特點是對于任意向量 x,xTAx 的結果永遠是正數
根據相似矩陣的定義有 P-1AP = B ,對比相似矩陣和本征分解的公式的關系可以知道本征分解中的原矩陣與分解后的對角陣是相似的關系
矩陣的本征分解的意義就在于使得我們可以清楚的看出線性變換的形變主要發生在哪個方向上,根據特征值和特征向量的定義 Ax = λx,其最為關鍵的變化在于在特征向量的方向上進行一個本征值大小的縮放,這也就是我們稱之為“本征”的意義。
上面這一部分是書中內容的一個總結,后續我可能會繼續添加一些其他關于本征分解的內容。如果當時上學的時候的教材里對這一部分是這樣介紹的,那么線性代數學習起來就不會這么的抽象和枯燥。
奇異值分解 Singular value decomposition
由于本征分解只能對正方形的矩陣進行操作,因此應用的場合比較有限,奇異值分解則提供了矩陣分解的另一種方法,且任何矩陣都可以進行奇異值分解。其分解形式為:
A = UDV -1,假設 A 是一個 m x n 的矩陣,則分解后 U 為一個 m x m 的正交矩陣,D 為 m x n 的對角矩陣,V 則為一個 n x n 的正交矩陣
對角矩陣 D 對角線上的元素稱為 A的奇異值,U 的列向量稱為左奇異向量,V 的列向量稱為右奇異向量
奇異值分解和本征分解的關系為:矩陣 A 的左奇異向量是 AAT 的本征向量,右奇異向量是 ATA 的本征向量
參考閱讀
關于相似矩陣的更精彩和直觀的解釋請見馬同學高等數學,作者講解的比我清楚 100 倍。之所以做這個筆記是因為即便讀了再多遍,沒有內化的知識也是淺薄的,我希望可以通過筆記的方式記錄并真正的消化這些知識。在這里強烈推薦這個公眾號,這可能是國內最好的關于數學的公眾號,并且絕對原創。我承認這是一個廣告,但是是出于個人喜好的無利益支持。
另外這個筆記里也參考了 Linear Algebra Done Right 這本書。