torch.svd
-
torch.svd(input, some=True, compute_uv=True, *, out=None) -
Вычисляет разложение по сингулярным значениям матрицы или набора матриц
input. Разложение по сингулярным значениям представлено в виде именованной кортежа(U, S, V), так чтоinput. где — это транспонированная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. Аргументsomeне оказывает никакого влияния, когдаcompute_uvравноFalse.Поддерживает
inputтипов данных с плавающей запятой, double, cfloat и cdouble. Типы данныхUиVсовпадают с типомinput’s.Sвсегда будет вещественным, даже еслиinputкомплексное.Предупреждение
torch.svd()устарел в пользуtorch.linalg.svd()и будет удалён в будущей версии PyTorch.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():-
someпротивоположноfull_matricestorch.linalg.svd()’s. Обратите внимание, что значение по умолчанию для обоих —True, поэтому поведение по умолчанию фактически противоположное. -
torch.svd()возвращаетV, в то время какtorch.linalg.svd()возвращаетVh, то есть . - Если
compute_uvравноFalse,torch.svd()возвращает тензоры с нулевыми значениями дляUиVh, тогда какtorch.linalg.svd()возвращает пустые тензоры.
Примечание
Сингулярные значения возвращаются в порядке убывания. Если
inputпредставляет собой набор матриц, то сингулярные значения каждой матрицы в наборе возвращаются в порядке убывания.Примечание
Тензор
Sможет быть использован для вычисления градиентов только еслиcompute_uvравноTrue.Примечание
Когда
someравноFalse, градиенты поU[…, :, min(m, n):]иV[…, :, min(m, n):]будут игнорироваться в обратном проходе, так как эти векторы могут быть произвольными базисами соответствующих подпространств.Примечание
Реализация
torch.linalg.svd()на CPU использует подпрограмму LAPACK?gesdd(алгоритм «разделяй и властвуй») вместо?gesvdдля повышения скорости. Аналогично, на GPU она использует подпрограммы cuSOLVERgesvdjиgesvdjBatchedв CUDA 10.1.243 и более поздних версиях, а подпрограмму MAGMAgesddв более ранних версиях CUDA.Примечание
Возвращаемый
Uне будет непрерывным. Матрица (или набор матриц) будет представлена как матрица в порядке следования столбцов (т.е. Fortran-непрерывная).Предупреждение
Градиенты относительно
UиVбудут конечными только в том случае, если входные данные не содержат нулевых или повторяющихся сингулярных значений.Предупреждение
Если расстояние между двумя сингулярными значениями близко к нулю, градиенты по
UиVбудут численно неустойчивыми, поскольку они зависят от . То же самое происходит, когда матрица имеет малые сингулярные значения, так как эти градиенты также зависят отS⁻¹.Предупреждение
Для комплексных
inputразложение по сингулярным значениям не является уникальным, так какUиVмогут быть умножены на произвольный фазовый множитель на каждом столбце. То же самое происходит, когдаinputимеет повторяющиеся сингулярные значения, где можно умножить столбцы охватывающего подпространства вUиVна матрицу вращения, и результирующие векторы будут охватывать то же самое подпространство. Разные платформы, такие как NumPy, или входные данные на разных типах устройств, могут давать разные тензорыUиV.- Параметры:
-
-
input (Tensor) – входной тензор размера
(*, m, n), где*— это ноль или более размерностей набора, состоящие из(m, n)матриц. -
some (bool, необязательно) – управляет тем, вычислять ли сокращённое или полное разложение, и, следовательно, формой возвращаемых
UиV. Значение по умолчанию:True. -
compute_uv (bool, необязательно) – управляет тем, вычислять ли
UиV. Значение по умолчанию:True.
-
input (Tensor) – входной тензор размера
- Ключевые аргументы:
-
out (tuple, необязательно) – кортеж тензоров вывода
Пример:
>>> 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/1.13/generated/torch.svd.html