• 文档 >
  • torch >
  • torch.svd
快捷键

torch.svd

torch.svd(input, some=True, compute_uv=True, *, out=None)

计算矩阵或矩阵批量的奇异值分解。奇异值分解表示为命名元组(U,S,V),其中 input =Udiag(S)VH= U \text{diag}(S) V^{\text{H}} 。其中 VHV^{\text{H}} 是 V 的转置,对于实数输入,对于复数输入是 V 的共轭转置。如果 input 是矩阵批,则 U、S 和 V 也以与 input 相同的批维度进行批处理。

如果 some 为 True(默认),则方法返回降阶奇异值分解。在这种情况下,如果 input 的最后两个维度为 m 和 n,则返回的 U 和 V 矩阵将只包含 min(n, m) 个正交列。

如果 compute_uv 为 False,则返回的 U 和 V 将是形状为 (m, m) 和 (n, n) 的零填充矩阵,并且与 input 相同的设备。当 compute_uv 为 False 时,参数 some 无效。

支持 input 浮点型、双精度浮点型、复浮点型和复双精度浮点型数据类型。U 和 V 的数据类型与 input 的相同。S 总是实值,即使 input 是复数。

警告

torch.svd() 已被弃用,并将在未来的 PyTorch 版本中删除,建议使用 torch.linalg.svd() 代替。

U, S, V = torch.svd(A, some=some, compute_uv=True) (默认)应替换为

U, S, Vh = torch.linalg.svd(A, full_matrices=not some)
V = Vh.mH

应将 _, S, _ = torch.svd(A, some=some, compute_uv=False) 替换为

S = torch.linalg.svdvals(A)

注意

torch.linalg.svd() 的区别:

  • sometorch.linalg.svd()full_matrices 的相反数。请注意,两者的默认值都是 True,因此默认行为实际上是相反的。

  • torch.svd() 返回 V,而 torch.linalg.svd() 返回 Vh,即 VHV^{\text{H}}

  • 如果 compute_uv 为 False,则 torch.svd() 返回填充为零的张量 U 和 Vh,而 torch.linalg.svd() 返回空张量。

注意

特征值按降序返回。如果 input 是一个矩阵批,则每个矩阵的特征值按降序返回。

注意

只有当 compute_uv 为 True 时,S 张量才能用于计算梯度。

注意

some 为 False 时,在反向传播过程中将忽略 U[…, :, min(m, n):]和 V[…, :, min(m, n):]上的梯度,因为这些向量可以是相应子空间的任意基。

注意

在 CPU 上, torch.linalg.svd() 的实现使用 LAPACK 的?gesdd(一种分而治之算法)来提高速度,而不是?gesvd。类似地,在 CUDA 10.1.243 及以后的版本上,它使用 cuSOLVER 的 gesvdj 和 gesvdjBatched 例程,在较早的 CUDA 版本上使用 MAGMA 的 gesdd 例程。

注意

返回的 U 将不是连续的。矩阵(或矩阵批)将以列主序矩阵(即 Fortran 连续)的形式表示。

警告

只有当输入没有零或重复的奇异值时,相对于 U 和 V 的梯度才会是有限的。

警告

如果任意两个奇异值之间的距离接近于零,那么关于 U 和 V 的梯度将数值上不稳定,因为它们依赖于 1minijσi2σj2\frac{1}{\min_{i \neq j} \sigma_i^2 - \sigma_j^2} 。当矩阵具有小的奇异值时,同样会发生这种情况,因为这些梯度也依赖于 S^{-1}。

警告

对于复值 input ,奇异值分解不是唯一的,因为 U 和 V 的每一列都可以乘以一个任意的相位因子 eiϕe^{i \phi} 。当 input 有重复的奇异值时,也会发生这种情况,此时可以乘以 U 和 V 中生成子空间的列的旋转矩阵,得到的向量将生成相同的子空间。不同的平台,如 NumPy,或者不同设备类型的输入,可能会产生不同的 U 和 V 张量。

参数:
  • 输入(张量)- 大小为(*, m, n)的输入张量,其中*表示零个或多个批处理维度,包含(m, n)矩阵。

  • some(布尔值,可选)- 控制是否计算降维或全分解,从而确定返回的 U 和 V 的形状。默认:True。

  • compute_uv (bool, 可选) – 控制是否计算 U 和 V。默认:True。

关键字参数:

out (元组,可选) – 张量的输出元组

示例:

>>> a = torch.randn(5, 3)
>>> a
tensor([[ 0.2364, -0.7752,  0.6372],
        [ 1.7201,  0.7394, -0.0504],
        [-0.3371, -1.0584,  0.5296],
        [ 0.3550, -0.4022,  1.5569],
        [ 0.2445, -0.0158,  1.1414]])
>>> u, s, v = torch.svd(a)
>>> u
tensor([[ 0.4027,  0.0287,  0.5434],
        [-0.1946,  0.8833,  0.3679],
        [ 0.4296, -0.2890,  0.5261],
        [ 0.6604,  0.2717, -0.2618],
        [ 0.4234,  0.2481, -0.4733]])
>>> s
tensor([2.3289, 2.0315, 0.7806])
>>> v
tensor([[-0.0199,  0.8766,  0.4809],
        [-0.5080,  0.4054, -0.7600],
        [ 0.8611,  0.2594, -0.4373]])
>>> torch.dist(a, torch.mm(torch.mm(u, torch.diag(s)), v.t()))
tensor(8.6531e-07)
>>> a_big = torch.randn(7, 5, 3)
>>> u, s, v = torch.svd(a_big)
>>> torch.dist(a_big, torch.matmul(torch.matmul(u, torch.diag_embed(s)), v.mT))
tensor(2.6503e-06)

© 版权所有 PyTorch 贡献者。

使用 Sphinx 构建,并使用 Read the Docs 提供的主题。

文档

PyTorch 的全面开发者文档

查看文档

教程

深入了解初学者和高级开发者的教程

查看教程

资源

查找开发资源并获得您的疑问解答

查看资源