线性代数应该这样讲(一)
前言
小夕為什么要講線性代數呢?因為有人已經做了機器學習一段時間了,竟然認為矩陣就是用來存儲數據的。小夕表示非常震驚。
而深刻透徹的理解核函數、PCA、LSI、譜聚類等以空間映射為理論核心的機器學習理論時,靠大學里教的那一套線性代數,很有可能是悲劇的(小夕所在的本科學校,數學專業全國top5,還是大牛的老師教的線性代數,然而小夕依然覺得學了假線性代數,心塞)
因此,在對國內高等教育不信任的基礎上,小夕還是決定自己寫文章講點線代,以免讓大家對以后小夕寫的更高深的機器學習知識產生瓶頸式理解困難(雖然小夕的數學很渣很渣)。
?
但是注意,閱讀本系列文章,最好已經有線性代數的基礎了,比如最起碼要知道矩陣看起來是什么樣子,矩陣相乘是怎么乘的之類的。然后如果你雖然知道它們看起來的樣子,卻并不知道它們是什么意思,那么相信本系列文章會讓您有所收獲嗒。
?
注意!以下講解線性代數的時候,小夕有時會建模到很多機器學習問題中,但是完全依賴線性代數解決機器學習問題的話,解決方案注定是極其簡化的模型!它可以幫助你理解線性代數,但是其本身的工程價值很小!但是它還是后續很多高端算法的基礎甚至原型!所以在本系列文章里不要太糾結工程上的可行性或者實用性啦。
?
為了提高大家的空間想象能力、思維抽象能力,小夕在這篇文章中盡量不畫圖(不要拆穿真實的原因是小夕比較懶\(//?//)\)
好啦,啰嗦了好多,正式開始!
所謂矩陣
?
想象一下,你操縱著兩個空間,一個是無邊界的三維實數空間A,一個是無邊界的二維實數空間B。然后你想建立一個橋梁,將這兩個空間連接起來。這個橋梁可以將空間A的任意的點映射到空間B的某個點上。那么這個橋梁該如何表示呢?
?
沒錯!就是矩陣!矩陣就是映射!
?
舉個最最簡單的栗子。
?
空間A的任何一個點a一定是3個維度吧,設為a={a1,a2,a3}。空間B的任何一個點一定是2個維度吧,設為b={b1,b2}。那么如何將空間A的a點映射成空間B的某點b呢?
?
只需要建造一個叫做矩陣的橋梁,這個橋梁只需要滿足維度是3*2就可以了,也就是3行2列。比如這個矩陣是。那么作為1*3維度的行向量a,乘以矩陣C后就成了1*2維度的行向量,也就是B空間的一個點(忘了矩陣乘法的見下文或者Google一下)。而不同的3*2矩陣就對應著不同的映射規則,會將A空間的同一個點a映射到B空間的不同位置。但是它們都是連通A與B的橋梁。
何為矩陣運算
有人學線代的時候問,矩陣乘法怎么這么麻煩!矩陣的逆運算就更加麻煩到爆了啊!然而他們有什么用呢?老師讓我們學會做這些運算干什么?
?
這都是有原因的,只不過國內教材的悲劇就在于空講知識不講前因后果(莫非作者自己都不知道前因后果?)。跟著小夕一點點來~
?
下面是課本的講解:
矩陣加法就是,對于一個矩陣和一個矩陣,A+B就是
矩陣乘法就是,對于一個維度為i*j的矩陣A和一個維度為j*k的矩陣B,A*B就是將A中的每行分別點積B中的每列(點積就是將兩個向量的每個位置的元素進行相乘后,再將每個位置的相乘結果累加的運算),因此得到一個維度為i*k的矩陣C。
?
矩陣的逆就是。。。手算太難了啊~假如我們已經算出來了矩陣A的逆是矩陣B,那么一定有A*B=I。其中I就是單位矩陣(對角線元素為1,其他元素為0的矩陣,更準確定義見下文)
?
然后是小夕的補充:?
矩陣的加法就是映射規則的調整。矩陣A+矩陣B就可以看作,用B中各個元素的值去調整A這個映射規則!
?
矩陣的乘法是什么?就是代表著線性映射的疊加!比如,我們已知如何從X空間映射到Z空間了,也知道如何從Z空間映射到Y空間了。然而,恰好我們的機器學習樣本就是在X空間!樣本的類別恰好就在Y空間!怎么將樣本映射成標簽呢?
?
沒錯,X映射到Z(記為X->Z)的規則就是一個矩陣A,Z->Y就是一個矩陣B,所以若要X->Y,那么就是A*B的結果。這就是矩陣乘法。
?
矩陣逆運算是什么呢?就是映射的逆映射啊~比如在一個機器翻譯問題中,源語言在X空間,目標語言在Y空間,我們通過訓練知道了如何從X空間映射成Y空間了,就是通過訓練得到的矩陣A。那么我們如何反向翻譯呢?那就是求A的逆矩陣就可以了,完全無需再反向重新訓練。
?
它們為什么特殊
?
還有同學不知道我們為什么要單獨的討論一些特殊的矩陣,比如零矩陣,單位矩陣,對角矩陣等。
?
課本上學過了:
零矩陣就是所有元素都是0的矩陣,如;
?
單位矩陣就是對角元素都是1,其余元素都是0的方陣,如;
?
對角矩陣就是非對角元素全為0的矩陣。如。
?
然后是小夕的補充:?
零矩陣就是將任何空間映射成原點的矩陣。所以,某個空間的所有的點,一旦被吸入零矩陣的映射規則后,就像被吸進黑洞一樣吸到原點。
?
注意,兩個非零矩陣的線性映射疊加后(矩陣相乘后),完全可能變成零矩陣。也就是說變成一個黑洞,比如乘以后,就成了,即一個黑洞(零矩陣)。
?
單位矩陣就是將空間映射成自己的矩陣!有同學疑惑,為什么單位矩陣不是所有元素都是1的矩陣呢?正是因為矩陣就是映射,單位矩陣的意義是將空間映射成自己,因此單位矩陣才是這個樣子的。如果你讓一個矩陣的所有的元素都是1,那么空間經過這個假單位矩陣的映射后,就不再是原來的空間了!(原來空間上的大部分點都不再位于它原來的位置了,也就是說被映射到了新的空間中,雖然新空間和舊空間的維數一樣)
?
對角矩陣就是將原空間的各個坐標軸進行不同尺度的拉伸或擠壓后生成新空間的矩陣!比如任何一個二維空間乘上一個對角矩陣后,這個空間的第一個維度的坐標軸一定會縮短為原來的一半!第二個維度的坐標軸一定會膨脹成原來的兩倍!所以比如這個二維空間中原來的點(2,2)經過這個對角矩陣的映射后,會變成(1,4),看,是不是這樣子!
?
為什么要分塊?
?
還有分塊矩陣,很多人也不理解有什么用。
?
課本上愛這樣講分塊矩陣:?
分塊矩陣就是將一個大矩陣用橫線和豎線分成好幾塊,這樣就得到了好幾個子矩陣。然后當大矩陣參與運算時,就可以讓這些子矩陣分別參與運算。
?
小夕的補充:
分塊矩陣對應的算法思想就是分治!一個很重要的應用就是并行化矩陣運算,這也是深度學習中離不開的底層運算。
設想,一個10000*10000維的超大矩陣再乘以一個10000*20000維的超大矩陣,如果讓一個單核CPU去計算的話,那會累壞它的。我們知道,在深度學習任務中,由于參數非常多,數據維數也經常很高,因此大矩陣運算就是家常便飯。而我們還知道,深度學習任務喜歡用GPU去訓練,為什么呢?一個很重要的原因就是GPU的“核”太多啦!經常幾百幾千,甚至幾萬核。因此,在深度學習中,通過將大矩陣分塊,分成好多好多塊,再將這些小塊丟進GPU的成千上萬的核里并行計算,那么這個大矩陣的運算瞬間就完成了!
?
如果沒有大一你學到的矩陣分塊這個姿勢,那么讓你寫深度學習背后的科學計算包的話,你將一個大矩陣丟給CPU的一個核去計算那不得被上司罵死啦。
?
總結一下。矩陣的本質就是描述空間的映射,因此它就可以看作一個函數,接收一個空間作為輸入,輸出一個映射后的新空間。
總結
以上是生活随笔為你收集整理的线性代数应该这样讲(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 消息中间件系列(六):什么是流量削峰?如
- 下一篇: 淘宝网Java五面:现场面试49题含答案