PyTorch深度学习入门
Tensor基础
5. 线性代数运算
简单介绍3种:
使用torch.dot()函数实现向量与向量的点积(也称内积:
a = torch.Tensor([1, 2, 3])
b = torch.Tensor([2, 3, 4])
torch.dot(a, b)
向量的点积定义:
假设有两个向量 a⃗=[a1,a2,⋯ ,an],b⃗=[b1,b2,⋯ ,bn]\vec{a}=\left[a_1, a_2, \cdots, a_n\right], \vec{b}=\left[b_1, b_2, \cdots, b_n\right]a=[a1,a2,⋯,an],b=[b1,b2,⋯,bn], 那么 a⃗\vec{a}a 与 b⃗\vec{b}b 的点积定义为:
a⃗⋅b⃗=a1b1+a2b2+⋯+anbn=∑i=1naibi
\vec{a} \cdot \vec{b}=a_1 b_1+a_2 b_2+\cdots+a_n b_n=\sum_{i=1}^n a_i b_i
a⋅b=a1b1+a2b2+⋯+anbn=i=1∑naibi
所以 a⃗⋅b⃗=1×2+2×3+3×4=20\vec{a} \cdot \vec{b}=1 \times 2+2 \times 3+3 \times 4=20a⋅b=1×2+2×3+3×4=20
使用torch.mv()函数实现矩阵与向量的乘法:
矩阵与向量的乘法规则如下:
[a11a12⋯a1ma21a22⋯a2m⋮⋮⋱⋮an1an2⋯anm][b1b2⋮bm]=[a11b1+a12b2+⋯+a1mbma21b1+a22b2+⋯+a2mbm⋮an1b1+an2b2+⋯+anmbm]
\left[\begin{array}{cccc}
a_{11} & a_{12} & \cdots & a_{1 m} \\
a_{21} & a_{22} & \cdots & a_{2 m} \\
\vdots & \vdots & \ddots & \vdots \\
a_{n 1} & a_{n 2} & \cdots & a_{n m}
\end{array}\right]\left[\begin{array}{c}
b_1 \\
b_2 \\
\vdots \\
b_m
\end{array}\right]=\left[\begin{array}{c}
a_{11} b_1+a_{12} b_2+\cdots+a_{1 m} b_m \\
a_{21} b_1+a_{22} b_2+\cdots+a_{2 m} b_m \\
\vdots \\
a_{n 1} b_1+a_{n 2} b_2+\cdots+a_{n m} b_m
\end{array}\right]
⎣⎢⎢⎢⎡a11a21⋮an1a12a22⋮an2⋯⋯⋱⋯a1ma2m⋮anm⎦⎥⎥⎥⎤⎣⎢⎢⎢⎡b1b2⋮bm⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡a11b1+a12b2+⋯+a1mbma21b1+a22b2+⋯+a2mbm⋮an1b1+an2b2+⋯+anmbm⎦⎥⎥⎥⎤
所以
[123234345][123]=[1×1+2×2+3×32×1+3×2+4×33×1+4×2+5×3]=[142026]
\left[\begin{array}{lll}
1 & 2 & 3 \\
2 & 3 & 4 \\
3 & 4 & 5
\end{array}\right]\left[\begin{array}{l}
1 \\
2 \\
3
\end{array}\right]=\left[\begin{array}{l}
1 \times 1+2 \times 2+3 \times 3 \\
2 \times 1+3 \times 2+4 \times 3 \\
3 \times 1+4 \times 2+5 \times 3
\end{array}\right]=\left[\begin{array}{l}
14 \\
20 \\
26
\end{array}\right]
⎣⎡123234345⎦⎤⎣⎡123⎦⎤=⎣⎡1×1+2×2+3×32×1+3×2+4×33×1+4×2+5×3⎦⎤=⎣⎡142026⎦⎤
使用torch.mm()函数将两个矩阵相乘:
矩阵与矩阵的乘法定义:
[a11a12⋯a1s⋮⋮⋱⋮ai1ai2⋯ais⋮⋮⋱⋮an1an2⋯ans][b11⋯b1j⋯b1mb21⋯b2j⋯b2m⋮⋱⋮⋯⋮bs1⋯bsj⋯bsm]=[c11⋯c1j⋯c1m⋮⋮⋮⋱⋮ci1⋯cij⋯cim⋮⋮⋮⋱⋮cn1⋯cnj⋯cnm] \left[\begin{array}{cccc} a_{11} & a_{12} & \cdots & a_{1 s} \\ \vdots & \vdots & \ddots & \vdots \\ a_{i 1} & a_{i 2} & \cdots & a_{i s} \\ \vdots & \vdots & \ddots & \vdots \\ a_{n 1} & a_{n 2} & \cdots & a_{n s} \end{array}\right]\left[\begin{array}{ccccc} b_{11} & \cdots & b_{1 j} & \cdots & b_{1 m} \\ b_{21} & \cdots & b_{2 j} & \cdots & b_{2 m} \\ \vdots & \ddots & \vdots & \cdots & \vdots \\ b_{s 1} & \cdots & b_{s j} & \cdots & b_{s m} \end{array}\right]=\left[\begin{array}{ccccc} c_{11} & \cdots & c_{1 j} & \cdots & c_{1 m} \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ c_{i 1} & \cdots & c_{i j} & \cdots & c_{i m} \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ c_{n 1} & \cdots & c_{n j} & \cdots & c_{n m} \end{array}\right] ⎣⎢⎢⎢⎢⎢⎢⎡a11⋮ai1⋮an1a12⋮ai2⋮an2⋯⋱⋯⋱⋯a1s⋮ais⋮ans⎦⎥⎥⎥⎥⎥⎥⎤⎣⎢⎢⎢⎡b11b21⋮bs1⋯⋯⋱⋯b1jb2j⋮bsj⋯⋯⋯⋯b1mb2m⋮bsm⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎢⎢⎡c11⋮ci1⋮cn1⋯⋮⋯⋮⋯c1j⋮cij⋮cnj⋯⋱⋯⋱⋯c1m⋮cim⋮cnm⎦⎥⎥⎥⎥⎥⎥⎤
其中 cij=ai1b1j+ai2b2j+⋯+aisbsjc_{i j}=a_{i 1} b_{1 j}+a_{i 2} b_{2 j}+\cdots+a_{i s} b_{s j}cij=ai1b1j+ai2b2j+⋯+aisbsj 。
所以:
[123234345][234345456]=[202632293847385062] \left[\begin{array}{lll} 1 & 2 & 3 \\ 2 & 3 & 4 \\ 3 & 4 & 5 \end{array}\right]\left[\begin{array}{lll} 2 & 3 & 4 \\ 3 & 4 & 5 \\ 4 & 5 & 6 \end{array}\right]=\left[\begin{array}{lll} 20 & 26 & 32 \\ 29 & 38 & 47 \\ 38 & 50 & 62 \end{array}\right] ⎣⎡123234345⎦⎤⎣⎡234345456⎦⎤=⎣⎡202938263850324762⎦⎤
常见的线性代数操作:
方法 | 说明 |
---|---|
dot() | 两个向量点积 |
mv() | 矩阵与向量相乘 |
mm() | 两个矩阵相乘 |
addmm() | 将两个矩阵进行矩阵乘法操作的结果与另一矩阵相加 |
addmv() | 将矩阵和向量相乘的结果与另一向量相加 |
addr() | 将两个向量进行张量积(外积)操作的结果与另一个矩阵相加 |
bmm() | 两个batch内的矩阵进行批矩阵乘法 |
eig() | 计算方阵的特征值和特征向量 |
ger() | 两个向量的张量积 |
inverse() | 对方阵求逆 |
addbmm() | 将两个batch内的矩阵进行批矩阵乘法操作并累加,其结果与另一矩阵相加 |
naddbmm() | 将两个batch内的矩阵进行批矩阵乘法操作,其结果与另一batch内的矩阵相加 |