動手學深度學習 | 線性代數 | 03
阿新 • • 發佈:2021-09-17
目錄
線性代數
其實我們不需要太多線性代數的知識,但是還是稍微講一下作為一個數學上的入門。
向量的距離使用 ||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
- 將字串進行one-hot編碼有什麼負面的影響嗎?比如數值變得稀疏。
不會有什麼負面影響,稀疏矩陣對於機器學習來說不會有影響。除了資料變得稀疏,比較耗費記憶體,其餘並沒有什麼負面的影響。
- 對哪一維求和就是消除哪一維可以這麼理解嗎?
是的,可以這麼理解。
- torch不區分行向量和列向量嗎?
一般如果是一維的話,就是一個array,是不會進行嚴格區分的。
如果一定要區分行向量和列向量的,需要使用矩陣來進行區分,一個shape是(1,n),一個shape是(n,1)
- sum(axis=[0,1])怎麼求?
求和順序,先求0再求1