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()для другого (намного более быстрого) разложения, которое работает с общими матрицами.- Параметры
- Ключевые аргументы
-
-
driver (строка, необязательно) – имя метода cuSOLVER, который будет использоваться. Этот ключевой аргумент работает только с входными данными CUDA. Доступные варианты:
None,gesvd,gesvdj, иgesvda. По умолчанию:None. -
out (кортеж, необязательно) – кортеж вывода из трёх тензоров. Игнорируется, если
None.
-
driver (строка, необязательно) – имя метода cuSOLVER, который будет использоваться. Этот ключевой аргумент работает только с входными данными CUDA. Доступные варианты:
- Возвращает
-
Именованный кортеж
(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/2.1/generated/torch.linalg.svd.html