向量的内积也称为点积,用来计算两个向量之间的相似度。在数学上,两个向量的内积等于将一个向量投影到另一个向量上得到的长度再乘以两个向量之间的夹角的余弦值。
使用PyTorch进行向量的内积计算非常简单,可以通过torch.dot()函数实现。以下是一个示例代码,计算两个向量的内积:
import torch
# 定义两个向量
a = torch.tensor([1, 2, 3])
b = torch.tensor([4, 5, 6])
# 计算内积
dot_product = torch.dot(a, b)
# 输出结果
print(dot_product)
运行以上代码,将会输出内积的结果,即32。
两个向量a和b的内积可以通过以下数学表达式来表示:
a · b = ||a|| · ||b|| cosθ
其中,
注意,此表达式适用于二维和三维空间中的向量,对于更高维度的向量同样适用。
另外,如果两个向量a和b是n维向量,可以表示为:
a = [a1, a2, …, an]
b = [b1, b2, …, bn]
则内积计算公式可以展开为:
a · b = a1 * b1 + a2 * b2 + … + an * bn
这表示将向量a和向量b对应位置的元素相乘,并将结果累加起来。
Hadamard积,也称为逐元素乘积或Schur积,是指两个具有相同维度的矩阵或向量,对应位置上的元素相乘得到的结果。
假设有两个n维向量a和b,记为:
a = [a1, a2, …, an]
b = [b1, b2, …, bn]
则Hadamard积可以表示为一个新的n维向量c,其每个元素ci满足:
ci = ai * bi
即,c的第i个元素等于a的第i个元素和b的第i个元素相乘。
在数学符号中,Hadamard积通常用⊙表示,因此可以表示为:
c = a ⊙ b
注意,Hadamard积要求两个向量的维度相同,以便对应位置上的元素能够相乘。
在PyTorch中,可以使用torch.mul()
函数来计算Hadamard积。以下是一个示例代码,演示了如何使用PyTorch计算两个向量的Hadamard积:
import torch
# 定义两个向量
a = torch.tensor([1, 2, 3])
b = torch.tensor([4, 5, 6])
# 计算Hadamard积
c = torch.mul(a, b)
# 输出结果
print(c)
运行以上代码,将会输出Hadamard积的结果:
tensor([ 4, 10, 18])
注意,向量的Hadamard积要求两个向量的维度相同,否则将会报错。
范数(Norm)是用来衡量向量或矩阵的大小的一种度量方式。在数学中,范数是一个将向量映射到非负实数的函数。
对于实数向量x=(x?, x?, …, xn),其p范数(p-norm)定义为:
||x||p = (|x?|^p + |x?|^p + … + |xn|p)(1/p)
其中,p为范数的指数,取值可以为任意实数(包括无穷大),常用的p值有:
在PyTorch中,可以使用torch.norm()
函数来计算向量的范数。以下是一个示例代码,演示了如何使用PyTorch计算向量的L2范数:
import torch
# 定义一个向量
x = torch.tensor([1, 2, 3, 4, 5])
# 计算L2范数
l2_norm = torch.norm(x, p=2)
# 输出结果
print(l2_norm)
运行以上代码,将会输出L2范数的结果:
tensor(7.4162)
同样,可以使用torch.norm()
函数来计算其他范数,只需将参数p设置为对应的值即可。
L1 范数
对于L1范数(绝对值范数)的导数,在向量中每个元素的取值都不为零时,可以直接按元素进行求导,导数等于元素的正负号。具体而言,对于一维向量 x = [x1, x2, …, xn],其L1范数为 ||x||1 = |x1| + |x2| + … + |xn|。
L1范数不可微。但是存在次梯度,即是次微分的。
L1范数的次梯度如下:
? ? x ∥ x ∥ 1 = sign ? ( x ) \frac{\partial}{\partial \mathbf{x}}\|\mathbf{x}\|_{1}=\operatorname{sign}(\mathbf{x}) ?x??∥x∥1?=sign(x)
其中,
sign
?
(
x
)
=
{
+
1
x
i
>
0
?
1
x
i
<
0
[
?
1
,
1
]
x
i
=
0
\operatorname{sign}(\mathbf{x})=\left\{\begin{array}{ll}+1 & x_{i}>0 \\-1 & x_{i}<0 \\{[-1,1]} & x_{i}=0\end{array}\right.
sign(x)=?
?
??+1?1[?1,1]?xi?>0xi?<0xi?=0?
综上所述,L1范数的导数是一个分段常函数,在每个元素为非零值时等于元素的正负号,在元素为零值时可以使用次梯度来表示。
数学参考此网址:
https://www.zhihu.com/column/c_1601171263636090880