torch.linalg.svd
-
torch.linalg.svd(A, full_matrices=True, *, driver=None, out=None)[исходный код] -
Вычисляет сингулярное разложение (SVD) матрицы.
Пусть — это или . Полное SVD матрицы , если
k = min(m,n), определяется следующим образом:где , — это эрмитово-сопряжённая матрица, если комплексная, и транспонированная матрица, если вещественная. Матрицы , (а значит, и ) ортогональны в вещественном случае и унитарны в комплексном случае.
Если
m > n(соответственно,m < n), можно отбросить последниеm - n(соответственно,n - m) столбцовU(соответственно,V), чтобы получить сокращённое SVD:где . В этом случае столбцы и также ортонормированы.
Поддерживаются типы данных float, double, cfloat и cdouble. Также поддерживаются пакеты матриц; если
Aпредставляет собой пакет матриц, выходные данные имеют те же пакетные размерности.Возвращаемое разложение представляет собой именованный кортеж
(U, S, Vh), компоненты которого соответствуют указанным выше , , .Сингулярные значения возвращаются в порядке убывания.
Параметр
full_matricesзадаёт выбор между полным (по умолчанию) и сокращённым SVD.Именованный аргумент
driverможно использовать в CUDA с бэкендом cuSOLVER для выбора алгоритма вычисления SVD. Выбор драйвера представляет собой компромисс между точностью и скоростью.-
Если
Aхорошо обусловлена (её число обусловленности не слишком велико) или допустима некоторая потеря точности.- Для общей матрицы:
‘gesvdj’(метод Якоби) - Если
Aвысокая или широкая (m >> nилиm << n):‘gesvda’(приближённый метод)
- Для общей матрицы:
- Если
Aплохо обусловлена или важна точность:‘gesvd’(на основе QR)
По умолчанию (
driver= None) вызывается‘gesvdj’, а в случае сбоя выполняется переход к‘gesvd’.Отличия от
numpy.linalg.svd:- В отличие от
numpy.linalg.svd, эта функция всегда возвращает кортеж из трёх тензоров и не поддерживает аргументcompute_uv. Вместоcompute_uv=Falseиспользуйтеtorch.linalg.svdvals(), которая вычисляет только сингулярные значения.
Примечание
Если
full_matrices= True, градиенты поU[…, :, min(m, n):]иVh[…, min(m, n):, :]игнорируются, поскольку эти векторы могут быть произвольными базисами соответствующих подпространств.Предупреждение
Возвращаемые тензоры
UиVне являются единственными и не являются непрерывными относительноA. Из-за этой неоднозначности на разном оборудовании и в разных программных средах могут вычисляться разные сингулярные векторы.Эта неоднозначность вызвана тем, что умножение любой пары сингулярных векторов на
-1в вещественном случае или на в комплексном случае даёт ещё два корректных сингулярных вектора матрицы. Поэтому функция потерь не должна зависеть от этой величины , поскольку она не определена однозначно. Для комплексных входных данных эта зависимость проверяется при вычислении градиентов функции. Поэтому при комплексных входных данных на устройстве CUDA вычисление градиентов этой функции синхронизирует устройство с CPU.Предупреждение
Градиенты, вычисленные с помощью
UилиVh, будут конечными только в том случае, еслиAне имеет повторяющихся сингулярных значений. ЕслиAпрямоугольная, её сингулярным значением также не должен быть ноль. Кроме того, если расстояние между любыми двумя сингулярными значениями близко к нулю, градиент будет численно неустойчивым, поскольку он зависит от сингулярных значений через вычисление . В прямоугольном случае градиент также будет численно неустойчивым, еслиAимеет малые сингулярные значения, поскольку он также зависит от вычисления .См. также
torch.linalg.svdvals()вычисляет только сингулярные значения. В отличие отtorch.linalg.svd(), градиентыsvdvals()всегда численно устойчивы.torch.linalg.eig()— функция для вычисления другого типа спектрального разложения матрицы. Спектральное разложение работает только с квадратными матрицами.torch.linalg.eigh()— более быстрая функция для вычисления разложения на собственные значения и векторы эрмитовых и симметричных матриц.torch.linalg.qr()— ещё одно (значительно более быстрое) разложение, применимое к общим матрицам.- Параметры:
- Именованные аргументы:
- Возвращает:
-
Именованный кортеж
(U, S, Vh), компоненты которого соответствуют указанным выше , , .Sвсегда будет вещественным, даже еслиAкомплексный. Значения также будут упорядочены по убыванию.UиVhбудут иметь тот же тип данных, что иA. Левые и правые сингулярные векторы будут представлены соответственно столбцамиUи строкамиVh.
Примеры:
>>> A = torch.randn(5, 3) >>> U, S, Vh = torch.linalg.svd(A, full_matrices=False) >>> U.shape, S.shape, Vh.shape (torch.Size([5, 3]), torch.Size([3]), torch.Size([3, 3])) >>> torch.dist(A, U @ torch.diag(S) @ Vh) tensor(1.0486e-06) >>> U, S, Vh = torch.linalg.svd(A) >>> U.shape, S.shape, Vh.shape (torch.Size([5, 5]), torch.Size([3]), torch.Size([3, 3])) >>> torch.dist(A, U[:, :3] @ torch.diag(S) @ Vh) tensor(1.0486e-06) >>> A = torch.randn(7, 5, 3) >>> U, S, Vh = torch.linalg.svd(A, full_matrices=False) >>> torch.dist(A, U @ torch.diag_embed(S) @ Vh) tensor(3.0957e-06)
-
© 2026, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://docs.pytorch.org/docs/2.14/generated/torch.linalg.svd.html