1. 程式人生 > 其它 >動手學深度學習 | 線性代數 | 03

動手學深度學習 | 線性代數 | 03

目錄

線性代數

其實我們不需要太多線性代數的知識,但是還是稍微講一下作為一個數學上的入門。

向量的距離使用 ||vecotr|| 來表示。

||a||2這個是L2正規化,其實就是把向量裡面的元素平方再求和,最後開方。

向量的點積: a^T b

向量的正交: a^T b = 0

矩陣乘法,左邊看行,右邊看列(“左行右列”),一個一個元素相乘然後求和,最後填入一個新的shape的矩陣中。

矩陣乘法從直觀上來說,它是一個扭曲的空間。

一個向量通過一個矩陣乘法,變成一個另外的向量,這個矩陣其實是把一個空間進行了扭曲。

特徵向量:不會被矩陣改變方向的向量

對稱矩陣總是可以找到特徵向量

上圖中,紅色的向量被方向改變了,綠色的向量方向沒有改變,因此綠色的向量是特徵向量(大小無所謂)

線性代數實現

操作總結

import torch

# 標量的表示
x = torch.tensor([3.0])
y = torch.tensor([2.0])
x + y, x * y, x / y, x**y

# 向量表示
x = torch.arange(4)
x[3] # 訪問向量的元素
len(x) # 獲取向量長度
x.shape # 獲取向量的shape

# 建立一個矩陣
A = torch.arange(20).reshape(5,4)
A.T # 矩陣的轉置

# 判斷A是否是對稱矩陣
A == A.T

# 多維矩陣
X = torch.arange(24).reshape(2,3,4)

A = torch.arange(20, dtype=torch.float32).reshape(5, 4)
B = A.clone() # 深度克隆一個矩陣
A, A + B

# axis=0 豎直方向
A_sum_axis0 = A.sum(axis=0)
A_sum_axis0, A_sum_axis0.shape

# axis=1 水平方向
A_sum_axis1 = A.sum(axis=1)
A_sum_axis1, A_sum_axis1.shape

# 按照兩個維度求和,其實分兩步做效果也是一樣的 
A.sum(axis=[0, 1]) 

# 求均值操作 
A.mean(), A.sum() / A.numel()

# 豎直方向的求均值操作
A.mean(axis=0), A.sum(axis=0) / A.shape[0]

# 求和,但是不丟掉維度 keepdims=True
# keepdims就是為了方便使用廣播機制
sum_A = A.sum(axis=1, keepdims=True)
A / sum_A # 利用廣播機制進行相除

A.cumsum(axis=0) # 累計求和

torch.dot(x,y) # 向量的點乘
torch.mv(A,x) # 矩陣和向量的乘法
torch.mm(A,B) # 矩陣和矩陣相乘

# L2範數 torch.norm()
u = torch.tensor([3.0, -4.0])
torch.norm(u)

# L1範數 torch.abs().sum()
torch.abs(u).sum()

# F範數,其實就是矩陣的L2範數
torch.norm(torch.ones((4, 9)))

按特定軸求和

QA

  1. 將字串進行one-hot編碼有什麼負面的影響嗎?比如數值變得稀疏。

不會有什麼負面影響,稀疏矩陣對於機器學習來說不會有影響。除了資料變得稀疏,比較耗費記憶體,其餘並沒有什麼負面的影響。

  1. 對哪一維求和就是消除哪一維可以這麼理解嗎?

是的,可以這麼理解。

  1. torch不區分行向量和列向量嗎?

一般如果是一維的話,就是一個array,是不會進行嚴格區分的。

如果一定要區分行向量和列向量的,需要使用矩陣來進行區分,一個shape是(1,n),一個shape是(n,1)

  1. sum(axis=[0,1])怎麼求?

求和順序,先求0再求1