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типов данных float, double, cfloat и cdouble. Типы данныхUиVтакие же, как уinput’s.Sвсегда будет вещественного типа, даже еслиinputкомплексное.Предупреждение
torch.svd()устарело и будет удалено в будущей версии PyTorch. Рекомендуется использоватьtorch.linalg.svd().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_matricesвtorch.linalg.svd(). Обратите внимание, что значение по умолчанию для обоих равно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/2.1/generated/torch.svd.html