On this page
torch.svd
torch.svd(input, some=True, compute_uv=True, *, out=None)-
Computes the singular value decomposition of either a matrix or batch of matrices
input. The singular value decomposition is represented as a namedtuple(U, S, V), such thatinput. where is the transpose ofVfor real inputs, and the conjugate transpose ofVfor complex inputs. Ifinputis a batch of matrices, thenU,S, andVare also batched with the same batch dimensions asinput.If
someisTrue(default), the method returns the reduced singular value decomposition. In this case, if the last two dimensions ofinputaremandn, then the returnedUandVmatrices will contain onlymin(n, m)orthonormal columns.If
compute_uvisFalse, the returnedUandVwill be zero-filled matrices of shape(m, m)and(n, n)respectively, and the same device asinput. The argumentsomehas no effect whencompute_uvisFalse.Supports
inputof float, double, cfloat and cdouble data types. The dtypes ofUandVare the same asinput’s.Swill always be real-valued, even ifinputis complex.Warning
torch.svd()is deprecated in favor oftorch.linalg.svd()and will be removed in a future PyTorch release.U, S, V = torch.svd(A, some=some, compute_uv=True)(default) should be replaced withU, S, Vh = torch.linalg.svd(A, full_matrices=not some) V = Vh.mH_, S, _ = torch.svd(A, some=some, compute_uv=False)should be replaced withS = torch.linalg.svdvals(A)Note
Differences with
torch.linalg.svd():someis the opposite oftorch.linalg.svd()’sfull_matrices. Note that default value for both isTrue, so the default behavior is effectively the opposite.torch.svd()returnsV, whereastorch.linalg.svd()returnsVh, that is, .- If
compute_uvisFalse,torch.svd()returns zero-filled tensors forUandVh, whereastorch.linalg.svd()returns empty tensors.
Note
The singular values are returned in descending order. If
inputis a batch of matrices, then the singular values of each matrix in the batch are returned in descending order.Note
The
Stensor can only be used to compute gradients ifcompute_uvisTrue.Note
When
someisFalse, the gradients onU[…, :, min(m, n):]andV[…, :, min(m, n):]will be ignored in the backward pass, as those vectors can be arbitrary bases of the corresponding subspaces.Note
The implementation of
torch.linalg.svd()on CPU uses LAPACK’s routine?gesdd(a divide-and-conquer algorithm) instead of?gesvdfor speed. Analogously, on GPU, it uses cuSOLVER’s routinesgesvdjandgesvdjBatchedon CUDA 10.1.243 and later, and MAGMA’s routinegesddon earlier versions of CUDA.Note
The returned
Uwill not be contiguous. The matrix (or batch of matrices) will be represented as a column-major matrix (i.e. Fortran-contiguous).Warning
The gradients with respect to
UandVwill only be finite when the input does not have zero nor repeated singular values.Warning
If the distance between any two singular values is close to zero, the gradients with respect to
UandVwill be numerically unstable, as they depends on . The same happens when the matrix has small singular values, as these gradients also depend onS⁻¹.Warning
For complex-valued
inputthe singular value decomposition is not unique, asUandVmay be multiplied by an arbitrary phase factor on every column. The same happens wheninputhas repeated singular values, where one may multiply the columns of the spanning subspace inUandVby a rotation matrix and the resulting vectors will span the same subspace. Different platforms, like NumPy, or inputs on different device types, may produce differentUandVtensors.- Parameters
-
- input (Tensor) – the input tensor of size
(*, m, n)where*is zero or more batch dimensions consisting of(m, n)matrices. - some (bool, optional) – controls whether to compute the reduced or full decomposition, and consequently, the shape of returned
UandV. Default:True. - compute_uv (bool, optional) – controls whether to compute
UandV. Default:True.
- input (Tensor) – the input tensor of size
- Keyword Arguments
-
out (tuple, optional) – the output tuple of tensors
Example:
>>> 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)
© 2024, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://pytorch.org/docs/2.1/generated/torch.svd.html