深度學習中的基礎線性代數-初學者指南
更多深度文章,請關注雲計算頻道:https://yq.aliyun.com/cloud
上過Jeremy Howard的深度學習課程後,我意識到我在線性代數方麵的不足,而這大大影響我對類似反向傳播這樣的概念的理解。因此我決定在這個方麵花點時間,以補全這方麵的知識。 本文是對線性代數的基本介紹,用於深度學習中會使用到的一些常見的線性代數操作。
什麼是線性代數?
在深度學習的背景下,線性代數是一個數學工具,它提供了有助於同時操作數組的技術。 它提供了像向量和矩陣(電子表格)這樣的數據結構用來保存數字和規則,以便進行加,減,乘,除的運算。
線性代數為什麼有用?
線性代數可以將複雜的問題簡單化,讓我們能夠對問題進行高效的數學運算。 以下是線性代數如何達到這些目標的一個例子。
# Multiply two arrays
x = [1,2,3]
y = [2,3,4]
product = []
for i in range(len(x)):
product.append(x[i]*y[i])
# Linear algebra version
x = numpy.array([1,2,3])
y = numpy.array([2,3,4])
x * y
初始化這兩個數組後,用線性代數的方法會快3倍。
如何在深度學習中使用線性代數?
神經網絡將權重存儲在矩陣中。 線性代數使矩陣運算變得更加快捷簡便,尤其是在GPU上進行訓練的時候。 實際上,GPU是以向量和矩陣運算為基礎的。 比如,圖像可以表示為像素數組。視頻遊戲使用龐大且不斷發展的矩陣來產生令人炫目的遊戲體驗。 GPU並不是處理單個像素,而是並行地處理整個像素矩陣。
向量
向量是1維數組。 在幾何中,向量將大小和方向的潛在變化存儲到一個點。 例如,向量[3,-2]表示向右移3個單位距離和向下移2個單位距離。而具有多個維度的向量稱為矩陣。
向量表示
我們可以以不同的方式來表示向量。 這裏有幾個常見的表示方式。
幾何中的向量
向量通常表示從一個點出發的運動。 它們將大小和方向的潛在變化存儲到一個點。 向量[-2,5]表示左移2個單位,向上5個單位。 參考資料。
向量可以應用於任何空間點。 向量的方向就是向上5個單位和向左2個單位的斜線,它的大小等於斜線的長度。
標量操作
標量運算涉及向量和某個數字。 我們可以通過對向量中的所有項進行加,減,乘,除操作來對其進行修改。
Scalar addition
元素操作
在諸如加法,減法和除法的元素操作中,相應位置的值被重新組合以產生新的向量。 向量A中的第一個值與向量B中的第一個值配對。第二個值與第二個值配對,依此類推。也就是說,這兩個向量必須有著相同的尺寸,才能完成元素操作*。
Vector addition
y = np.array([1,2,3])
x = np.array([2,3,4])
y + x = [3, 5, 7]
y - x = [-1, -1, -1]
y / x = [.5, .67, .75]
*請參閱下麵關於numpy 中的broadcasting方法詳細信息。
向量乘法
向量乘法有兩種類型:點積和Hadamard乘積。
點積
兩個向量的點積是一個標量。 向量和矩陣的點積(矩陣乘法)是深度學習中最重要的操作之一。
y = np.array([1,2,3])
x = np.array([2,3,4])
np.dot(y,x) = 20
Hadamard乘積
Hadamard乘積是元乘法,它的輸出是一個向量。
y = np.array([1,2,3])
x = np.array([2,3,4])
y * x = [2, 6, 12]
向量場
如果我們對一個點(x,y)應用一個加法或乘法的向量函數,向量場則表示了該點可能會移動多遠。 給定空間中某一個點,向量場顯示了圖中各個不同點可能的變化力度和方向。
向量場是非常有趣的,因為它根據不同的起點可以向不同的方向移動。 這是因為向量場背後的向量存儲著2x或x²這樣的函數關係,而不是像-2和5這樣的標量值。對於圖上的每個點,我們將x值代入2x或x²,並從起始點繪製箭頭指向新的位置。向量場對於類似梯度下降(Gradient Descent)這類的機器學習技術的可視化是非常有用的。
矩陣
矩陣是數字或字符的矩形網格(如Excel表格),並具有加,減,乘等運算規則。
矩陣維度
我們用列和行來描述矩陣的維度。
a = np.array([
[1,2,3],
[4,5,6]
])
a.shape == (2,3)
b = np.array([
[1,2,3]
])
b.shape == (1,3)
矩陣標量運算
矩陣的標量運算與向量一樣。 簡單地將標量應用於矩陣中的每個元素進行加,減,乘,除等操作。
Matrix scalar addition
矩陣單元操作
為了對兩個矩陣進行加,減或除法,它們必須具有相等的維度。*我們以元素組合的方式產生對應的值,得到新的矩陣。
a = np.array([
[1,2],
[3,4]
])
b = np.array([
[1,2],
[3,4]
])
a + b
[[2, 4],
[6, 8]]
a — b
[[0, 0],
[0, 0]]
Numpy 的broadcasting方法*
這是個不得不提的話題,因為它在實踐中非常重要。 在numpy中,元素操作的維度要求通過稱為broadcasting的機製來擴展。 如果每個矩陣(行與行,列與列)中的相應維度滿足以下要求,則這兩個矩陣是兼容的:
1.    兩個矩陣維度相等,或
2.  一個矩陣的維度為1
a = np.array([
[1],
[2]
])
b = np.array([
[3,4],
[5,6]
])
c = np.array([
[1,2]
])
# Same no. of rows
# Different no. of columns
# but a has one column so this works
a * b
[[ 3, 4],
[10, 12]]
# Same no. of columns
# Different no. of rows
# but c has one row so this works
b * c
[[ 3, 8],
[5, 12]]
# Different no. of columns
# Different no. of rows
# but both a and c meet the
# size 1 requirement rule
a + c
[[2, 3],
[3, 4]]
但在更高的維度上(3維或4維),事情會變得有點奇怪,但是現在我們不用擔心。 了解二維上的操作是個很好的開始。
矩陣Hadamard乘積
矩陣的Hadamard乘積是一個元素運算,就像向量一樣。 相應位置的值通過乘法運算來產生一個新的矩陣。
a = np.array(
[[2,3],
[2,3]])
b = np.array(
[[3,4],
[5,6]])
# Uses python's multiply operator
a * b
[[ 6, 12],
[10, 18]]
隻要矩陣維度符合broadcasting要求,就可以用Numpy對矩陣和向量進行Hadamard乘積運算。
矩陣轉置
神經網絡經常處理維度不符合要求的矩陣。 而矩陣轉置提供了一種方法來“旋轉”其中一個矩陣,以使其操作符合乘法要求。 轉置矩陣有兩個步驟:
1. 矩陣旋轉90°
2.反轉每行元素的順序(例如[a b c]變為[c b a])
例如,將矩陣M轉置為T:
a = np.array([
[1, 2],
[3, 4]])
a.T
[[1, 3],
[2, 4]]
矩陣乘法
矩陣乘法規定了一組對矩陣進行乘法運算,以產生新矩陣的規則。
規則
並不是所有的矩陣都能進行乘法運算的。 並且,對輸出矩陣的維度也存在要求。參考資料
1.    第一矩陣的列數必須等於第二個矩陣的行數
2.  M×N矩陣和N×K矩陣的乘積是M×K矩陣。 新矩陣取第一個矩陣的行和第二個矩陣的列。
矩陣乘法依賴於點積與行列元素的各種組合。 以下圖為例(取自Khan學院的線性代數課程),矩陣 C中的每個元素都是矩陣A中行與矩陣B中列的點積。
操作a1·b1表示我們取矩陣A中第一行(1,7)和矩陣B中第1列(3,5)的點積。
這裏是另一種方法:
為什麼矩陣乘法以這種方式工作?
矩陣的乘法運算非常有用。但背後並沒有太深奧的數學規律。 之所以數學家發明了這種運算,完全是因為它簡化了以前乏味的計算。 這是一個人為的產物,但卻非常有效。
用一下幾個例子自我測試一下
矩陣乘法與Numpy
Numpy使用函數np.dot(A,B)進行向量和矩陣乘法運算。 它有一些其他有趣的功能和問題,所以我希望大家能在使用前閱讀一下相關文檔。
更多英文教程
Khan Academy Linear Algebra
Deep Learning Book Math Section
Andrew Ng’s Course Notes
Explanation of Linear Algebra
Explanation of Matrices
Intro To Linear Algebra
Immersive Math
本文由北郵@愛可可-愛生活老師推薦,阿裏雲雲棲社區組織翻譯。
文章原標題《Linear algebra cheat sheet for deep learning》,作者:Brendan Fortuner,譯者:friday012,審閱:李烽
文章為簡譯,更為詳細的內容,請查看原文
最後更新:2017-04-01 16:42:10