一文詳解深度學(xué)習(xí)中的標(biāo)量、向量、矩陣、張量
在深度學(xué)習(xí)領(lǐng)域,標(biāo)量、向量、矩陣和張量是不可或缺的基本概念。它們不僅是數(shù)學(xué)工具,更是理解和構(gòu)建神經(jīng)網(wǎng)絡(luò)的關(guān)鍵。從簡單的標(biāo)量運(yùn)算到復(fù)雜的張量處理,這些概念貫穿于數(shù)據(jù)表示、模型構(gòu)建和算法優(yōu)化的全過程。本文將簡要介紹這些數(shù)學(xué)基礎(chǔ),幫助讀者更好地理解它們在深度學(xué)習(xí)中的作用和應(yīng)用。
1、標(biāo)量
定義:僅包含一個數(shù)值的量,像北京溫度 52°F,其中 52 就是標(biāo)量。在數(shù)學(xué)里,標(biāo)量變量常用普通小寫字母(如 x、y、z)表示 ,所有(連續(xù))實數(shù)標(biāo)量的空間用 R 表示,x ∈ R 表示 x 是實值標(biāo)量。
表示與運(yùn)算:由只有一個元素的張量表示。通過代碼能對其進(jìn)行加、乘、除、指數(shù)等算術(shù)運(yùn)算。
示例:
import torch
x = torch.tensor(3.0)
y = torch.tensor(2.0)
x + y, x * y, x / y, x**y
結(jié)果:
2、向量
定義:可看作標(biāo)量值組成的列表,其元素或分量具有實際意義。在數(shù)學(xué)表示法中,向量通常記為粗體、小寫符號(如),通過一維張量表示。
表示與運(yùn)算:用下標(biāo)引用元素,如。向量默認(rèn)方向是列向量。
示例:
x = torch.arange(4)
x
結(jié)果:
向量長度通常稱為向量的維度,與普通的Python數(shù)組一樣,可以通過調(diào)用Python的內(nèi)置len()
函數(shù)來訪問張量的長度。
當(dāng)用張量表示一個向量(只有一個軸)時,也可以通過.shape
屬性訪問向量的長度。 形狀(shape)是一個元素組,列出了張量沿每個軸的長度(維數(shù))。 對于只有一個軸的張量,形狀只有一個元素。
x.shape
# 結(jié)果:torch.Size([4])
注意,維度(dimension)這個詞在不同上下文時往往會有不同的含義,這經(jīng)常會使人感到困惑。 為了清楚起見,明確:向量或軸的維度被用來表示向量或軸的長度,即向量或軸的元素數(shù)量。 然而,張量的維度用來表示張量具有的軸數(shù)。 在這個意義上,張量的某個軸的維數(shù)就是這個軸的長度。
3、矩陣
定義:是向量從一階到二階的推廣,通常用粗體、大寫字母(如
表示:矩陣元素用表示,可通過行、列索引訪問。
當(dāng)調(diào)用函數(shù)來實例化張量時, 可以通過指定兩個分量m和n來創(chuàng)建一個形狀為的矩陣。
A = torch.arange(20).reshape(5, 4)
A
結(jié)果:
交換矩陣的行和列時,結(jié)果稱為矩陣的轉(zhuǎn)置(transpose)。 通常用來表示矩陣的轉(zhuǎn)置:
A.T
結(jié)果:
4、張量
定義:就像向量是標(biāo)量的推廣,矩陣是向量的推廣一樣,張量是描述具有任意數(shù)量軸的n維數(shù)組的通用方法,可以構(gòu)建具有更多軸的數(shù)據(jù)結(jié)構(gòu)。 例如,向量是一階張量,矩陣是二階張量。
表示與運(yùn)算:尤其在處理圖像等數(shù)據(jù)時,張量變得更加重要。一般來說,圖像以n維數(shù)組形式出現(xiàn), 其中3個軸對應(yīng)于高度、寬度,以及一個通道(channel)軸, 用于表示顏色通道(紅色、綠色和藍(lán)色)。
X = torch.arange(24).reshape(2, 3, 4)
X
結(jié)果:
5、張量算法的基本性質(zhì)
張量算法的基本性質(zhì)在深度學(xué)習(xí)中至關(guān)重要,它包括按元素運(yùn)算的形狀不變性、張量間運(yùn)算結(jié)果的形狀規(guī)律、與標(biāo)量運(yùn)算的特點,以及降維、非降維求和與累積求和等操作特性。這些性質(zhì)貫穿于深度學(xué)習(xí)的各類計算中,對理解和運(yùn)用深度學(xué)習(xí)模型起著關(guān)鍵作用,具體如下:
按元素運(yùn)算的形狀不變性
從按元素操作的定義可知,任何按元素的一元運(yùn)算都不會改變其操作數(shù)的形狀。例如,對一個張量進(jìn)行取絕對值、平方等一元運(yùn)算,運(yùn)算后的張量形狀與原張量保持一致。這一性質(zhì)確保了在對張量的每個元素進(jìn)行單獨操作時,數(shù)據(jù)的結(jié)構(gòu)不會被破壞,為后續(xù)基于張量形狀的計算和處理提供了穩(wěn)定性。
張量間運(yùn)算結(jié)果的形狀規(guī)律
給定具有相同形狀的任意兩個張量,任何按元素二元運(yùn)算的結(jié)果都將是相同形狀的張量。
兩個相同形狀的矩陣相加,會在這兩個矩陣上執(zhí)行元素加法,得到的結(jié)果矩陣形狀與原矩陣相同。這一性質(zhì)使得在進(jìn)行張量間的批量運(yùn)算時,無需擔(dān)心形狀不匹配的問題,提高了計算的效率和準(zhǔn)確性。
A = torch.arange(20, dtype=torch.float32).reshape(5, 4)
B = A.clone() # 通過分配新內(nèi)存,將A的一個副本分配給B
A, A + B
與標(biāo)量運(yùn)算的特點
將張量乘以或加上一個標(biāo)量不會改變張量的形狀,其中張量的每個元素都將與標(biāo)量相加或相乘。這種特性在深度學(xué)習(xí)中常用于對張量進(jìn)行縮放或平移操作,以調(diào)整數(shù)據(jù)的分布或特征的強(qiáng)度。
a = 2
X = torch.arange(24).reshape(2, 3, 4)
a + X, (a * X).shape
降維操作
求和降維:可以對任意張量進(jìn)行元素求和操作,默認(rèn)情況下,調(diào)用求和函數(shù)會沿所有的軸降低張量的維度,使它變?yōu)橐粋€標(biāo)量。
A = torch.arange(20, dtype=torch.float32).reshape(5, 4)
A.sum()
# 結(jié)果:tensor(190.))
也可指定張量沿某一個軸來通過求和降低維度, 以矩陣為例,為了通過求和所有行的元素來降維(軸0),可以在調(diào)用函數(shù)時指定axis=0
。
A_sum_axis0 = A.sum(axis=0)
A_sum_axis0, A_sum_axis0.shape
# 結(jié)果:(tensor([40., 45., 50., 55.]), torch.Size([4]))
指定axis=1將通過匯總所有列的元素降維(軸1)
A_sum_axis1 = A.sum(axis=1)
A_sum_axis1, A_sum_axis1.shape
# 結(jié)果:(tensor([ 6., 22., 38., 54., 70.]), torch.Size([5]))
對于一個三維張量,軸(axis)的定義如下:
軸0(axis=0):通常表示張量中的第一個維度,可以理解為不同的數(shù)據(jù)樣本或者批次(batch)。
軸1(axis=1):通常表示張量中的第二個維度,可以理解為數(shù)據(jù)的行。
軸2(axis=2):通常表示張量中的第三個維度,可以理解為數(shù)據(jù)的列。
平均值計算:平均值是與求和相關(guān)的量,通過將總和除以元素總數(shù)來計算。計算平均值的函數(shù)也可沿指定軸降低張量的維度。如A.mean(axis = 0)計算矩陣 A 按列的平均值,A.mean()計算所有元素的平均值。
A.mean(), A.sum() / A.numel() # 結(jié)果:(tensor(9.5000), tensor(9.5000))
A.mean(axis=0), A.sum(axis=0) / A.shape[0] # 結(jié)果:(tensor([ 8., 9., 10., 11.]), tensor([ 8., 9., 10., 11.]))
非降維求和與累積求和
非降維求和:有時在調(diào)用函數(shù)計算總和或均值時保持軸數(shù)不變很有用。
例如sum_A = A.sum(axis = 1, keepdims = True)
,對矩陣 A 按行求和后仍保持兩個軸,結(jié)果形狀為 (5, 1) 。
sum_A = A.sum(axis=1, keepdims=True)
sum_A
由于 sum_A 在對每行進(jìn)行求和后仍保持兩個軸,這樣可以通過廣播將 A 除以 sum_A,實現(xiàn)按行的歸一化等操作。
A / sum_A
沿某個軸計算 A 元素的累積總和, 比如 axis=0 (按行計算),可以調(diào)用 cumsum 函數(shù)。 此函數(shù)不會沿任何軸降低輸入張量的維度。
累積求和:沿某個軸計算張量元素的累積總和,如A.cumsum(axis = 0)按行計算累積總和,此函數(shù)不會沿任何軸降低輸入張量的維度。在分析時間序列數(shù)據(jù)或逐步累加的特征時,累積求和操作能幫助獲取數(shù)據(jù)的累積趨勢和狀態(tài)。
A.cumsum(axis=0)
點積(Dot Product)
給定兩個向量, 它們的點積(dot product)(
或
) 是相同位置的按元素乘積的和:
。
1.torch.dot
功能:torch.dot用于計算兩個一維向量的點積(Dot Product)。
輸入要求:兩個輸入必須是一維向量(即形狀為(n,)的張量),且長度相同。
輸出:返回一個標(biāo)量,表示兩個向量的點積。
import torcha = torch.tensor([1, 2, 3])b = torch.tensor([4, 5, 6])dot_product = torch.dot(a, b)print("點積結(jié)果:", dot_product) # 輸出:32
torch.dot用于計算兩個一維向量的點積(Dot Product)。
import torch
a = torch.tensor([1, 2, 3])
b = torch.tensor([4, 5, 6])
dot_product = torch.dot(a, b)
print("點積結(jié)果:", dot_product) # 輸出:32
2.torch.matmul
- 功能:
torch.matmul
用于計算兩個張量的矩陣乘積(Matrix Product),支持一維向量、二維矩陣以及更高維度張量的乘法。 - 輸入要求:
對于一維向量,torch.matmul
會將它們視為行向量和列向量,計算它們的矩陣乘積。
對于二維矩陣,torch.matmul
計算矩陣乘法。
對于高維度張量,torch.matmul
會計算批量矩陣乘積。 - 輸出:返回一個張量,形狀根據(jù)輸入張量的形狀決定。
import torch
# 一維向量
a = torch.tensor([1, 2, 3])
b = torch.tensor([4, 5, 6])
# torch.matmul 會將一維向量視為行向量和列向量,計算矩陣乘積
matmul_result = torch.matmul(a, b)
print("矩陣乘積結(jié)果:", matmul_result) # 輸出:32
# 二維矩陣
A = torch.tensor([[1, 2], [3, 4]])
B = torch.tensor([[5, 6], [7, 8]])
matrix_product = torch.matmul(A, B)
print("矩陣乘積結(jié)果:\n", matrix_product)
# 輸出:
# tensor([[19, 22],
# [43, 50]])
對于一維向量
torch.dot(a, b)
torch.matmul(a, b)
torch.dot
torch.matmul
(1,)
對于二維及高維矩陣:torch.matmul
可以計算矩陣乘積,但torch.dot
不能用于二維矩陣。
Hadamard積
兩個矩陣的按元素乘法稱為Hadamard積(Hadamard product)(數(shù)學(xué)符號
A * B
在深度學(xué)習(xí)中,Hadamard 積和點積的應(yīng)用場景
Hadamard 積是指兩個相同維度的張量逐元素相乘,通常用于以下場景:
- 激活函數(shù)的逐元素操作:在神經(jīng)網(wǎng)絡(luò)中,激活函數(shù)(如 ReLU、Sigmoid 或 Tanh)通常對輸入張量逐元素應(yīng)用。這種操作可以看作是輸入張量與一個逐元素的非線性函數(shù)的 Hadamard 積。例如,
output = activation(input)
,其中activation
是逐元素的非線性函數(shù)。 - 特征融合:在多特征融合時,Hadamard 積可以用于將不同來源的特征逐元素相乘,從而實現(xiàn)特征的加權(quán)融合。例如,在某些注意力機(jī)制中,通過 Hadamard 積對特征進(jìn)行加權(quán),以突出重要特征。
- LSTM 門控機(jī)制:在長短期記憶網(wǎng)絡(luò)(LSTM)中,Hadamard 積用于計算遺忘門和輸入門的輸出。遺忘門和輸入門的輸出通過 Hadamard 積逐元素作用于細(xì)胞狀態(tài)。具體公式為:
。
- 圖像處理:在圖像處理中,Hadamard 積可以用于圖像融合。例如,將不同波段的圖像逐元素相乘,以增強(qiáng)特定的光譜特征。此外,Hadamard 積還可以用于圖像濾波,通過逐元素相乘實現(xiàn)特定的濾波效果。
點積通常用于計算兩個向量的相似度或進(jìn)行線性變換,常見于以下場景:
- 注意力機(jī)制:點積在注意力機(jī)制中廣泛使用,用于計算查詢(query)和鍵(key)之間的相似度。例如,在點積注意力機(jī)制中,通過計算查詢和鍵的點積來生成注意力權(quán)重。具體公式為:
。
- 卷積神經(jīng)網(wǎng)絡(luò)(CNN):在卷積層中,卷積核與輸入特征圖的卷積操作本質(zhì)上是點積計算。每個神經(jīng)元與輸入特征圖上的一個小區(qū)域進(jìn)行點積運(yùn)算,從而提取出有用的特征。
- 特征向量的相似度計算:在自然語言處理(NLP)中,詞向量之間的點積可以用于計算詞與詞之間的相似度。例如,通過點積計算兩個詞向量的相似度,進(jìn)而實現(xiàn)文本分類和情感分析。
- 正則化:在 L2 正則化(權(quán)重衰減)中,點積用于計算權(quán)重矩陣的 Frobenius 范數(shù)。具體來說,權(quán)重矩陣與自身的點積(即 Frobenius 內(nèi)積)用于正則化項。
總結(jié):
- Hadamard 積:適用于逐元素操作,如激活函數(shù)、特征融合、LSTM 門控機(jī)制和圖像處理。
- 點積:適用于計算向量相似度、卷積操作、注意力機(jī)制和正則化。
矩陣-向量積
定義:設(shè)矩陣,向量
,那么矩陣 - 向量積
是一個m維向量
。其計算方式是y的第i個元素
,其中
是矩陣A的第i行第j列的元素,
是向量x的第j個元素。
幾何意義:矩陣 - 向量積可以看作是對向量x進(jìn)行線性變換,將其從n維空間映射到m維空間。例如,在二維平面中,一個2×2的矩陣可以對平面上的向量進(jìn)行旋轉(zhuǎn)、縮放等操作。
計算示例:
- 設(shè)矩陣
,向量
。
- 則
。
torch.mv(A, x)
矩陣-矩陣乘法
定義:設(shè)矩陣,矩陣
,則矩陣C=AB是一個m×p的矩陣,其中C的第i行第j列的元素
。這意味著C的每個元素是A的對應(yīng)行與B的對應(yīng)列的元素乘積之和。
幾何意義:矩陣 - 矩陣乘法可以表示多個線性變換的復(fù)合。例如,先進(jìn)行一個旋轉(zhuǎn)變換,再進(jìn)行一個縮放變換,這兩個變換對應(yīng)的矩陣相乘就得到了表示這兩個變換復(fù)合效果的矩陣。
計算示例:
- 設(shè)矩陣
,矩陣
。
- 則
。
torch.mm(A, B)