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