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всегда будет вещественным, даже если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_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.Примечание
Возвращённый
Uне будет непрерывным. Матрица (или пакет матриц) будет представлена в виде матрицы с порядком хранения по столбцам (то есть непрерывной в формате Fortran).Предупреждение
Градиенты по
UиVбудут конечными только в том случае, если входные данные не содержат нулевых или повторяющихся сингулярных значений.Предупреждение
Если разность между любыми двумя сингулярными значениями близка к нулю, градиенты по
UиVбудут численно неустойчивы, поскольку зависят от . То же происходит, когда матрица имеет малые сингулярные значения, поскольку эти градиенты также зависят отS^{-1}.Предупреждение
Для
inputсо значениями комплексного типа сингулярное разложение не является единственным, посколькуUиVможно умножить на произвольный фазовый множитель для каждого столбца. То же происходит, когдаinputимеет повторяющиеся сингулярные значения: столбцы, охватывающие подпространство вUиV, можно умножить на матрицу вращения, и полученные векторы будут охватывать то же подпространство. Разные платформы, например NumPy, а также входные данные на устройствах разных типов могут давать разные тензорыUиV.- Параметры:
-
-
input (Тензор) – входной тензор размера
(*, m, n), где*— ноль или более измерений пакета, состоящих из матриц(m, n). -
some (bool, необязательный) – определяет, вычислять ли сокращённое или полное разложение и, следовательно, форму возвращаемых
UиV. Значение по умолчанию:True. -
compute_uv (bool, необязательный) – определяет, вычислять ли
UиV. Значение по умолчанию:True.
-
input (Тензор) – входной тензор размера
- Именованные аргументы:
-
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) -
© 2026, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://docs.pytorch.org/docs/2.14/generated/torch.svd.html