[譯]深度學習中所需的線性代數知識

_Fururur發表於2019-03-04

每個深度學習專案背後的數學知識。

深度學習是機器學習的一個子領域,涉及一些模仿人腦結構和功能的人工神經網路演算法。

線性代數是一種連續的而非離散的數學形式,許多電腦科學家對它幾乎沒有經驗。對於理解和使用許多機器學習演算法,特別是深度學習演算法,理解線性代數是非常重要的。

[譯]深度學習中所需的線性代數知識

為什麼是數學?

線性代數,概率論和微積分是組成機器學習的三種“語言”。學習這些數學知識將有助於深入理解底層演算法機制,並且開發新的演算法。

當我們深入到底層時,深度學習背後的一切都是數學。因此在學習深度學習和程式設計之前,理解基本的線性代數知識是至關重要的。

[譯]深度學習中所需的線性代數知識

來源

深度學習背後的核心資料結構是標量,向量,矩陣和張量。讓我們使用這些資料結構,通過程式設計的方式來解決所有基本的線性代數問題。

標量

標量是單個數字,也可以視為 0 階張量。符號 x∈ℝ 表示 x 是一個標量,屬於一組實數值 ℝ。

以下是深度學習中不同數集的表示。ℕ 表示正整數集合 (1,2,3,…)。ℤ 表示結合了正值,負值和零值的整數集合。ℚ 表示有理數集合。

在 Python 中有一些內建的標量型別,intfloatcomplexbytes and Unicode。在 Numpy(一個 Python 庫)中,有 24 種新的基本資料型別來描述不同型別的標量。有關資料型別的資訊,請參閱 文件

在 Python 中定義標量和相關操作:

下面的程式碼段解釋了一些運算運算子在標量中的應用。

# 內建標量
a = 5
b = 7.5
print(type(a))
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 numpy as np

# 判斷是否為標量的函式
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
複製程式碼

向量

向量是單數的有序陣列,是一階張量的例子。向量是被稱為向量空間的物件的片段。向量空間可以被認為是特定長度(或維度)的所有可能向量的整個集合。用 ℝ^3 表示的三維實值向量空間,通常用於從數學角度表示我們對三維空間的現實世界概念。

[譯]深度學習中所需的線性代數知識

為了明確地定位到向量的某個分量,向量的第 i 個標量元素被寫為 x[i]。

在深度學習中,向量通常代表特徵向量,其原始組成部分定義了具體特徵的相關性。這些元素可以包括二維影象中一組畫素的強度的相關重要性或者各種金融工具的歷史價格值。

在 Python 中定義向量和相關操作:

import numpy as np

# 定義向量

x = [1, 2, 3]
y = [4, 5, 6]

print(type(x))

# 這樣做不會得到向量和
print(x + y)

# 使用 Numpy 進行向量相加

z = np.add(x, y)
print(z)
print(type(z))

# 向量叉乘
mul = np.cross(x, y)
print(mul)
複製程式碼
<class 'list'>
[1, 2, 3, 4, 5, 6]
[5 7 9]
<class 'numpy.ndarray'>
[-3  6 -3]
複製程式碼

矩陣

矩陣是由數字組成的矩形陣列,是 2 階張量的一個例子。如果 m 和 n 是正整數,即 m,n∈ℕ,則 m×n 矩陣包含 m*n 個數字,m 行 n 列。

完整的 m×n 矩陣可寫為:

[譯]深度學習中所需的線性代數知識

將全矩陣顯示簡寫為以下表示式通常很有用:

[譯]深度學習中所需的線性代數知識

在 Python 中,我們使用 Numpy 庫來幫助我們建立 N 維陣列。陣列基本上可看做矩陣,我們使用矩陣方法,並通過列表來構造一個矩陣。

$python

>>> import numpy as np
>>> x = np.matrix([[1,2],[2,3]])
>>> x
matrix([[1, 2],
        [2, 3]])

>>> a = x.mean(0)
>>> a
matrix([[1.5, 2.5]])
>>> # 對矩陣求均值。(其中 axis 不設定值,對 m*n 個數求均值,返回一個實數;axis = 0:壓縮行,對各列求均值,返回 1* n 矩陣;axis =1 :壓縮列,對各行求均值,返回 m *1 矩陣)。
>>> z = x.mean(1)
>>> z
matrix([[1.5],
        [2.5]])
>>> z.shape
(2, 1)
>>> y = x - z
matrix([[-0.5,  0.5],
        [-0.5,  0.5]])
>>> print(type(z))
<class 'numpy.matrixlib.defmatrix.matrix'>
複製程式碼

在 Python 中定義矩陣和相關操作:

矩陣加法

矩陣可以與標量、向量和其他矩陣進行加法運算。每個操作都有精確的定義。這些技術經常用於機器學習和深度學習,所以值得花時間去熟悉它們。

# 矩陣加法

import numpy as np

x = np.matrix([[1, 2], [4, 3]])

sum = x.sum()
print(sum)
# Output: 10
複製程式碼

矩陣與矩陣相加

C = A + B (**A 與 B 的維度需要相同 **)

shape 方法返回矩陣的維度,add 方法接受兩個矩陣引數並返回這兩個矩陣的和。如果兩個矩陣的維度不一致 add 方法將會丟擲一個異常,說無法將其相加。

# 矩陣與矩陣相加

import numpy as np

x = np.matrix([[1, 2], [4, 3]])
y = np.matrix([[3, 4], [3, 10]])

print(x.shape)
# (2, 2)
print(y.shape)
# (2, 2)

m_sum = np.add(x, y)
print(m_sum)
print(m_sum.shape)
"""
Output :
[[4  6]
 [7 13]]
(2, 2)
"""
複製程式碼

矩陣與標量相加

將給定的標量新增到給定矩陣中的所有元素。

# 矩陣與標量相加

import numpy as np

x = np.matrix([[1, 2], [4, 3]])
s_sum = x + 1
print(s_sum)
"""
Output:
[[2 3]
 [5 4]]
"""
複製程式碼

矩陣與標量的乘法

將給定的標量乘以給定矩陣中的所有元素。

# 矩陣與標量的乘法

import numpy as np

x = np.matrix([[1, 2], [4, 3]])
s_mul = x * 3
print(s_mul)
"""
[[3  6]
 [12  9]]
"""
複製程式碼

矩陣乘法

維度為(m x n)的矩陣 A 和維度為(n x p)的矩陣 B 相乘,最終得到維度為(m x p)的矩陣 C。

[譯]深度學習中所需的線性代數知識

來源

# 矩陣乘法

import numpy as np

a = [[1, 0], [0, 1]]
b = [1, 2]
np.matmul(a, b)
# Output: array([1, 2])

complex_mul = np.matmul([2j, 3j], [2j, 3j])
print(complex_mul)
# Output: (-13+0j)
複製程式碼

矩陣轉置

通過轉置,您可以將行向量轉換為列向量,反之亦然:

A=[a_ij_]mxn

AT=[a_ji_]n×m

[譯]深度學習中所需的線性代數知識


# 矩陣轉置

import numpy as np

a = np.array([[1, 2], [3, 4]])
print(a)
"""
[[1 2]
 [3 4]]
"""
a.transpose()
print(a)
"""
array([[1, 3],
       [2, 4]])
"""
複製程式碼

張量

更加泛化的實體 —— 張量,封裝了標量、向量和矩陣。在物理科學和機器學習中,有時需要使用超過兩個順序的張量。

[譯]深度學習中所需的線性代數知識

來源

我們使用像 TensorFlow 或 PyTorch 這樣的 Python 庫來宣告張量,而不是使用巢狀矩陣來表示。

在 PyTorch 中定義一個簡單的張量:


import torch

a = torch.Tensor([26])

print(type(a))
# <class 'torch.FloatTensor'>

print(a.shape)
# torch.Size([1])

# 建立一個 5*3 的隨機 torch 變數。
t = torch.Tensor(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]
"""
print(t.shape)
# torch.Size([5, 3])
複製程式碼

Python 中張量的運算操作:

import torch

# 建立張量

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 的更多文件點選這裡


重要的連結

在 Python 中入門深度學習:

結束語

感謝閱讀。如果你發現這個故事很有用,請點選下面的 ? 來傳播愛心。

特別鳴謝 Samhita Alla 對本文的貢獻。

如果發現譯文存在錯誤或其他需要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可獲得相應獎勵積分。文章開頭的 ** 本文永久連結 ** 即為本文在 GitHub 上的 MarkDown 連結。


掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 AndroidiOS、[前端](https://github.com/xitu/gold-miner# 前端)、[後端](https://github.com/xitu/gold-miner# 後端)、[區塊鏈](https://github.com/xitu/gold-miner# 區塊鏈)、[產品](https://github.com/xitu/gold-miner# 產品)、[設計](https://github.com/xitu/gold-miner# 設計)、[人工智慧](https://github.com/xitu/gold-miner# 人工智慧) 等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章