【乾貨】深度學習中的線性代數---簡明教程
線性代數對於理解機器學習和深度學習內部原理至關重要,
線性代數
是有關連續值的數學。許多計算機科學家在此方面經驗不足,傳統上計算機科學更偏重離散數學。
這篇博文主要介紹了線性代數的基本概念,包括標量、向量、矩陣、張量,以及常見的矩陣運算,並且也有相應的Python代碼實現。作者 | Vihar Kurama
編譯 | 專知
整理 | Mandy
Linear Algebra for Deep Learning
深度學習(Deep Learning)
是機器學習的一個子領域,涉及的演算法模仿大腦的功能和結構,稱為人工神經網路。
線性代數(linear algebra)
是有關連續值的數學。許多計算機科學家在此方面經驗不足(傳統上計算機科學更偏重離散數學)。想要理解和使用許多機器學習演算法,特別是深度學習演算法,對線性代數的良好理解是不可或缺的。
為什麼要學習數學?
線性代數、概率論和微積分是用來表達機器學習的「語言」。學習這些內容將有助於深入理解底層的演算法機制,也有助於開發新的演算法。
當被限制在足夠小的尺度上,深度學習背後的一切都是數學。所以在開始深度學習之前,了解基本的線性代數是非常重要的。
深度學習背後的核心數據結構是標量(Scalar)、向量(Vector)、矩陣(Matrix)、張量(Tensor)。在編程中,讓我們使用這些數據結構求解基本的線性代數問題。
標量(Scalars)
標量是一個數字,或者說,是一個0階張量。符號表示是一個屬於實數集的標量。
深度學習中有著不同的數字集合。表示正整數集。表示整數集,包括正整數,負整數和零。表示有理數集,可以表達兩個整數之比的數。
在Python中有幾個內置的標量類型:
int、float、complex、bytes、Unicode
。Numpy又增加了二十多種新的標量類型。有關數據類型的更多信息,請參閱文檔。在Python中定義標量和一些運算: 下面的代碼片段展示了對標量的幾個運算操作。
# In-Built Scalars
5
7.5
print(type(b))
print(a + b)
print(a - b)
print(a * b)
print(a / b)
輸出結果:
<
class
"int"
><
class
"float"
>12.5
2.5
37.5
0.6666666666666666
下面的代碼片段用來檢查給定的變數是否是標量。
import
numpyas
np# Is Scalar Function
def
isscalar(num):if
isinstance(num,
generic):return True
else
return False
print(np.isscalar(3.1
))print(np.isscalar([
3.1
]))print(np.isscalar(
False
))輸出結果:
True
False
True
向量(Vectors)
向量是由單個數字組成的有序數組,或者說,1階張量。向量是向量空間這一對象的組成部分。一個向量空間可以看作是一個特定長度(或維度)的所有可能向量的集合。三維實數向量空間()常用於表示現實世界中的三維空間
。 為了明確地識別向量的分量(component),向量的第個標量元素被記為
。
在深度學習中,向量通常表示特徵向量,其原始分量定義了特定特徵的相關性。這些元素可以是二維圖像中一組像素的強度的相關性或者是金融工具截面的歷史價格值。
在Python中定義向量和一些運算:
import
numpyas
np# 聲明向量
x = [1
,
2
,
3
]y = [
4
,
5
,
6
]print(type(x))
# +並不表示向量的加法,而是列表的連接:
# 需要使用Numpy進行向量加法:
,
y)print(z)
print(type(z))
# 向量的叉積(cross product):兩個向量的叉積向量,
大小等於以這兩個向量為鄰邊的平行四邊形面積,方向與這兩個向量所在平面垂直
,
y)print(mul)
輸出結果:
<
class
"list"
>[
1
,
2
,
3
,
4
,
5
,
6
][
5 7 9
]<
class
"numpy.ndarray"
>[-
3 6
-3
]矩陣(Matrices)
矩陣是由數字組成的矩形數組,或者說,
2階張量。如果和為正整數,即 ,那麼一個的矩陣包含個數字,行列。 一個的矩陣可表示成:
有時可簡寫為:
在Python中,我們使用numpy庫創建n維數組,也就是矩陣。我們將列表傳入matrix方法,以定義矩陣。
>>>
import
numpyas
np>>> x = np.matrix([[
1
,
2
],
[2
,
3
]])>>> x
matrix([[
1
,
2
],
2
,
3
]])>>> a = x.mean(
0
)>>> a
matrix([[
1.5
,
2.5
]])>>>
# Finding the mean with 1 with the matrix x.
1
)>>> z
matrix([[
1.5
],
2.5
]])>>> z.shape
(
2
,
1
)>>> y = x - z
matrix([[-
0.5
,
0.5
],
0.5
,
0.5
]])>>>
type
(z))<
class
"numpy.matrixlib.defmatrix.matrix"
>在Python中定義矩陣和一些運算:
矩陣加法
矩陣可以與標量、向量和其他矩陣相加。每個操作都有一個精確的定義。這些技術在機器學習和深度學習中經常被使用,所以你需要熟悉它們。
# Matrix Addition
import
numpyas
npx = np.matrix([[
1
,
2
],
[4
,
3
]])sum = x.sum()
# Output: 10
矩陣-矩陣相加
C = A + B(矩陣A和矩陣B應該具有相等的行數和列數)
兩個矩陣的相對應的元素分別相加,如果矩陣的形狀不相同,則會拋出一個錯誤,說明不能相加。
# Matrix-Matrix Addition
import
numpyas
npx = np.matrix([[
1
,
2
],
[4
,
3
]])y = np.matrix([[
3
,
4
],
[3
,
10
]])# (2, 2)
# (2, 2)
m_sum = np.add(x,
y)"""
Output :
[[ 4 6]
[ 7 13]]
(2, 2)
"""
矩陣-標量相加
將給定的標量與給定矩陣中的所有元素相加。
# Matrix-Scalar Addition
import
numpyas
npx = np.matrix([[
1
,
2
],
[4
,
3
]])s_sum = x +
1
"""
Output:
[[2 3]
[5 4]]
"""
矩陣-標量相乘
將給定的標量與給定矩陣中的所有元素相乘。
# Matrix Scalar Multiplication
import
numpyas
npx = np.matrix([[
1
,
2
],
[4
,
3
]])s_mul = x *
3
"""
[[ 3 6]
[12 9]]
"""
矩陣-矩陣相乘
矩陣A(m行n列)與矩陣B(n行p列)得到矩陣C(m行p列),如下圖所示:
# Matrix Multiplication
import
numpyas
npa = [[
1
,
0
],
[0
,
1
]]b = [
1
,
2
]np.matmul(a
,
b)# Output: array([1, 2])
complex_mul = np.matmul([2j
,
3j
],
[2j
,
3j
])# Output: (-13+0j)
矩陣轉置
矩陣轉置交換原矩陣的行和列(行變為列,列變為行)。通過轉置,可以將行向量轉換為列向量,反之亦然:
# Matrix Transpose
import
numpyas
npa = np.array([[
1
,
2
],
[3
,
4
]])"""
[[1 2]
[3 4]]
"""
"""
array([[1, 3],
[2, 4]])
"""
張量(Tensors)
比標量、向量、矩陣更通用的概念是張量。在物理科學和機器學習中,有時需要使用超過二階的張量(如前文中所說,標量、向量、矩陣分別可以視為0、1、2階張量。)
一般來說,我們使用像tensorflow或PyTorch這樣的Python庫來聲明張量。
在PyTorch中定義一個簡單的張量:
import
torcha = torch.Tensor([
26
])print(type(a))
# <class "torch.FloatTensor">
print(a.shape)# torch.Size([1])
# Creates a Random Torch Variable of size 5x3.
5
,
3
)print(t)
"""
0.0000e+00 0.0000e+00 0.0000e+00
0.0000e+00 7.0065e-45 1.1614e-41
0.0000e+00 2.2369e+08 0.0000e+00
0.0000e+00 0.0000e+00 0.0000e+00
nan nan -1.4469e+35
[torch.FloatTensor of size 5x3]
"""
# torch.Size([5, 3])
Python中對張量的一些算術運算:
import
torch# Creating Tensors
p = torch.Tensor(4
,
4
)q = torch.Tensor(
4
,
4
)ones = torch.ones(
4
,
4
)print(p
,
q,
ones)"""
Output:
0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00
1.6009e-19 4.4721e+21 6.2625e+22 4.7428e+30
3.1921e-09 8.0221e+17 5.1019e-08 8.1121e+17
8.1631e-07 8.2022e+17 1.1703e-19 1.5637e-01
[torch.FloatTensor of size 4x4]
0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00
1.8217e-44 1.1614e-41 0.0000e+00 2.2369e+08
0.0000e+00 0.0000e+00 2.0376e-40 2.0376e-40
nan nan -5.3105e+37 nan
[torch.FloatTensor of size 4x4]
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
[torch.FloatTensor of size 4x4]
"""
print(
"Addition:{}"
.format(p + q))print(
"Subtraction:{}"
.format(p - ones))print(
"Multiplication:{}"
.format(p * ones))print(
"Division:{}"
.format(q / ones))"""
Addition:
0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00
1.6009e-19 4.4721e+21 6.2625e+22 4.7428e+30
3.1921e-09 8.0221e+17 5.1019e-08 8.1121e+17
nan nan -5.3105e+37 nan
[torch.FloatTensor of size 4x4]
Subtraction:
-1.0000e+00 -1.0000e+00 -1.0000e+00 -1.0000e+00
-1.0000e+00 4.4721e+21 6.2625e+22 4.7428e+30
-1.0000e+00 8.0221e+17 -1.0000e+00 8.1121e+17
-1.0000e+00 8.2022e+17 -1.0000e+00 -8.4363e-01
[torch.FloatTensor of size 4x4]
Multiplication:
0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00
1.6009e-19 4.4721e+21 6.2625e+22 4.7428e+30
3.1921e-09 8.0221e+17 5.1019e-08 8.1121e+17
8.1631e-07 8.2022e+17 1.1703e-19 1.5637e-01
[torch.FloatTensor of size 4x4]
Division:
0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00
1.8217e-44 1.1614e-41 0.0000e+00 2.2369e+08
0.0000e+00 0.0000e+00 2.0376e-40 2.0376e-40
nan nan -5.3105e+37 nan
[torch.FloatTensor of size 4x4]
"""
有關張量和PyTorch的更多文檔,請查閱文檔。
原文鏈接:
https://towardsdatascience.com/linear-algebra-for-deep-learning-506c19c0d6fa