Author:baiyucraft
BLog: baiyucraft’s Home
原文:《动手学深度学习》
在深度学习 1.PyTorch入门中,我们了解了看起来最基本tensor
间的加减乘除运算,但是对于一个拥有多维的数据以及拥有数学线代知识的我们来说,更想的是对tensor
进行转置、点积等运算。
1.tensor降维
一般来说,直观上,行为第0维,列为第1维。
我们可以对任意张量进行的一个有用的操作是计算其元素的和。在数学表示法中,我们使用∑符号表示求和。为了表示长度为d
的向量中元素的总和,可以记为∑i=1dxi。在代码中,我们可以调用计算求和的函数sum()
:
sum(): 将tensor
所有元素相加为一个值;
sum(axis=?): 默认情况下,调用求和函数会沿所有的轴降低张量的维度,使它变为一个数值,即标量。当然我们可以调用函数时指定axis
来得到在哪个维度上的和,即在形状中丢失了这一维。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| X = torch.arange(24).reshape(2, 3, 4) print('\n======X======\n', X) print('\n======X.shape======\n', X.shape)
print('\n======X.sum()======\n', X.sum())
X_sum_axis0 = X.sum(axis=0) print('\n======X.sum(axis=0)======\n', X_sum_axis0) print('\n======X_sum_axis0.shape======\n', X_sum_axis0.shape)
X_sum_axis01 = X.sum(axis=[0, 1]) print('\n======X.sum(axis=[0, 1])======\n', X_sum_axis01) print('\n======X_sum_axis01.shape======\n', X_sum_axis01.shape)
|
运行结果:

一个与求和相关的量是平均值(mean或average)。我们通过将总和除以元素总数来计算平均值。
mean(): 计算任意形状tensor
的平均值;
mean(axis=?): 沿指定轴降低张量的维度计算平均值。
1 2 3 4
| print('\n======X.mean()======\n', X.mean())
print('\n======X.mean(axis=0)======\n', X.mean(axis=0))
|
运行结果:

2.非降维求和
有时在调用函数来计算总和或均值时保持轴数不变会很有用。这就需要用到keepdims
参数。
由于X
在对每行进行求和后仍保持两个轴,我们可以通过广播机制将X
除以X_sum_axis1_keep
得到每个元素关于第0维的平均值。
如果我们想沿某个轴计算 A 元素的累积总和,比如axis=0
(按行计算),我们可以调用cumsum()
函数。此函数不会沿任何轴降低输入张量的维度。
1 2 3 4 5 6
| X_sum_axis1_keep = X.sum(axis=1, keepdims=True) print('\n======X.sum(axis=1, keepdims=True)======\n', X_sum_axis1_keep) print('\n======X / X_sum_axis1_keep======\n', X / X_sum_axis1_keep)
print('\n======X.cumsum(axis=0)======\n', X.cumsum(axis=0))
|
运行结果:

3.点积、向量积和矩阵乘法
dot(): 两向量之间的点积
mv(): 矩阵与向量的向量积
mm(): 矩阵乘法
1 2 3 4 5 6 7 8 9 10 11 12
| x = torch.arange(4, dtype=torch.float32) y = torch.ones(4) A = torch.arange(16, dtype=torch.float32).reshape(4, 4) B = torch.tensor([[0, 1, 0, 0], [1, 0, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]], dtype=torch.float32) print('\n======x======\n', x) print('\n======y======\n', y) print('\n======A======\n', A) print('\n======B======\n', B) print('\n======x、y点积======\n', torch.dot(x, y)) print('\n======A、x向量积======\n', torch.mv(A, x)) print('\n======A、B矩阵乘法======\n', torch.mm(A, B))
|
运行结果:


4.范数
norm(): 向量或矩阵的L2范数
1 2 3 4 5 6
| x = torch.arange(4, dtype=torch.float32) A = torch.arange(16, dtype=torch.float32).reshape(4, 4) print('\n======x======\n', x) print('\n======A======\n', A) print('\n======x的L2范数======\n', torch.norm(x)) print('\n======A的L2范数======\n', torch.norm(A))
|
运行结果:

5.其他
线性代数还有很多,其中很多数学对于机器学习非常有用。例如,矩阵可以分解为因子,这些分解可以显示真实世界数据集中的低维结构。机器学习的整个子领域都侧重于使用矩阵分解及其向高阶张量的泛化来发现数据集中的结构并解决预测问题。