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

每一個深度學習項目背後的數學知識。html

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

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

爲何是數學?

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

當咱們深刻到底層時,深度學習背後的一切都是數學。所以在學習深度學習和編程以前,理解基本的線性代數知識是相當重要的。算法

源碼編程

深度學習背後的核心數據結構是標量,矢量,矩陣和張量。讓咱們使用這些數據結構,經過編程的方式來解決全部基本的線性代數問題。數組

標量

標量是單個數字,也能夠視爲 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 對本文的貢獻。

相關文章
相關標籤/搜索