我们通过一维张量处理向量。一般来说,张量可以具有任意长度,取决于机器的内存限制。
本书和大量文献认为列向量是向量的默认方向。向量的长度通常称为向量的维度。当用张量表示一个向量(只有一个轴)时,也可以通过.shape属性访问向量的长度。形状(shape)是一个元素组,列出了张量沿每个轴的长度(维数)。对于只有一个轴的张量,形状只有一个元素。
向量或轴的维度被用来表示向量或轴的长度,即向量或轴的元素数量,而张量的维度用来表示张量具有的轴数。张量的某个轴的维数就是这个轴的长度。
尽管单个向量的默认方向是列向量,但在表示表格数据集的矩阵中,将每个数据样本作为矩阵中的行向量更为常见。
两个矩阵的按元素乘法称为Hadamard积。A*B的结果为两个矩阵对应元素乘积组成的新矩阵。
将张量乘以或加上一个标量不会改变张量的形状,其中张量的每个元素都将与标量相加或相乘。
默认情况下,调用求和函数.sum()会沿所有的轴降低张量的维度,使它变为一个标量,还可以指定张量沿哪一个轴来通过求和降低维度。以矩阵为例,为了通过求和所有行的元素来降维(轴0),可以在调用函数时指定axis=0.由于输入矩阵沿0轴降维以生成输出向量,因此输入轴0的维数在输出形状中消失。
A= torch.arange(20,dtype=torch.float32).reshape(5,4)
A_sum_axis0 = A.sum(axis=0)
print(A_sum_axis0,A_sum_axis0.shape)
沿着行和列对矩阵求和,等价于对矩阵的所有元素进行求和。即A.sum(axis=[0,1])等价于A.sum()。一个与求和相关的量是平均值。可以采用.mean()或A.sum()/A.numel()。同样,计算平均值的函数也可以沿指定轴降低张量的维度。
有时在调用函数来计算总和或均值时保持轴数不变会很有用。
sum_A = A.sum(axis=1, keepdims=True)
print(sum_A)
tensor([[ 6.],
[22.],
[38.],
[54.],
[70.]])
如果想沿某个轴计算A元素的累积总和,比如axis=0(按行计算),可以调用cumsum函数,此函数不会沿任何轴降低输入张量的维度。
给定两个向量X、Y,它们的点积是相同位置的按元素乘积的和。我们也可以通过执行按元素乘法,然后进行求和来表示两个向量的点积。点积在很多场合都很有用,例如给定一组由向量x表示的值,和一组由w表示的权重,x中的值根据权重w的加权和,可以表示为点积
。当权重为非负数且和为1时,点积表示加权平均。将两个向量规范化得到单位长度后,点积表示它们夹角的余弦。
x=torch.arange(4,dtype=torch.float32)
y=torch.ones(4,dtype=torch.float32)
print(x,y,torch.dot(x,y))
另外,用torch.sum(x*y)也可以达到相同的效果。
在代码中使用张量表示矩阵-向量积,我们使用与点积相同的mv函数。当为矩阵A和向量x调用torch.mv(A,x)时,会执行矩阵-向量积。注意,A的列维数(沿轴1的长度)必须与x的维数(其长度)相同。矩阵乘法采用.mm()函数,不应与hadamard积混淆。
一个向量的范数告诉我们一个向量有多大,这里考虑的大小概念不涉及维度,而是分量的大小。在线性代数中,向量范数是将向量映射到标量的函数f。给定任意向量x,向量范数要满足一些属性。1.如果按常数因子a缩放向量的所有元素,其范数也会按相同常数因子的绝对值缩放:.2.三角不等式:
.3.范数必须是非负的。4.范数最小为0,当且仅当向量全由0组成。实际上,欧几里得距离是一个L2范数,是向量元素平方和的平方根。计算L2范数用.norm()函数。L1范数表示为向量元素的绝对值之和,我们用abs(u).sum()来计算它。
L2范数和L1范数都是更一般的Lp范数的特例:
类似于向量的L2范数,矩阵的Frobenius范数是矩阵元素平方和的平方根:
Frobenius范数满足向量范数的所有性质,它就像是矩阵形向量的L2范数。调用以下函数将计算矩阵的Frobenius范数:torch.norm(torch.ones((4,9)))