torch.linalg.svd
-
torch.linalg.svd(A, full_matrices=True, *, driver=None, out=None) -
Вычисляет сингулярное разложение (SVD) матрицы.
Пусть — или , полное сингулярное разложение матрицы , если
k = min(m,n), определяется какгде , — сопряжённый транспонированный, если комплексный, и транспонированный, если вещественный. Матрицы , (и, следовательно, ) ортогональны в вещественном случае и унитарны в комплексном.
Когда
m > n(соответственноm < n) мы можем опустить последниеm - n(соответственноn - m) столбцыU(соответственноV) для получения сокращённого сингулярного разложения:где . В этом случае, столбцы и также ортонормированы.
Поддерживает типы данных 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. Используйтеtorch.linalg.svdvals(), который вычисляет только сингулярные значения, вместоcompute_uv=False.
Примечание
Когда
full_matrices= True, градиенты относительноU[…, :, min(m, n):]иVh[…, min(m, n):, :]игнорируются, так как эти векторы могут быть произвольными базисами соответствующих подпространств. -
Предупреждение
Возвращаемые тензоры
UиVне являются уникальными и не являются непрерывными относительноA. Из-за этого отсутствия уникальности различное аппаратное и программное обеспечение может вычислять различные сингулярные векторы.Это отсутствие уникальности вызвано тем, что умножение любой пары сингулярных векторов на
-1в вещественном случае или на в комплексном случае порождает ещё две допустимые сингулярные вектора матрицы. По этой причине функция потерь не должна зависеть от этой величины , так как она не определена однозначно. Это проверяется для комплексных входных данных при вычислении градиентов этой функции. Таким образом, когда входные данные комплексные и находятся на устройстве CUDA, вычисление градиентов этой функции синхронизирует это устройство с процессором.Предупреждение
Градиенты, вычисленные с помощью
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)
© 2024, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://pytorch.org/docs/1.13/generated/torch.linalg.svd.html