Spec-Zone.ru › PyTorch 2.14

torch.svd

torch.svd(input, some=True, compute_uv=True, *, out=None)

Вычисляет сингулярное разложение матрицы или пакета матриц input. Сингулярное разложение представлено в виде именованного кортежа (U, S, V), такого что input =Udiag(S)VH= U \text{diag}(S) V^{\text{H}}, где VHV^{\text{H}} — транспонированная матрица 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, то есть VHV^{\text{H}}.
  • Если 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 используются процедуры cuSOLVER gesvdj и gesvdjBatched.

Примечание

Возвращённый U не будет непрерывным. Матрица (или пакет матриц) будет представлена в виде матрицы с порядком хранения по столбцам (то есть непрерывной в формате Fortran).

Предупреждение

Градиенты по U и V будут конечными только в том случае, если входные данные не содержат нулевых или повторяющихся сингулярных значений.

Предупреждение

Если разность между любыми двумя сингулярными значениями близка к нулю, градиенты по U и V будут численно неустойчивы, поскольку зависят от 1min⁡i≠jσi2−σj2\frac{1}{\min_{i \neq j} \sigma_i^2 - \sigma_j^2}. То же происходит, когда матрица имеет малые сингулярные значения, поскольку эти градиенты также зависят от S^{-1}.

Предупреждение

Для input со значениями комплексного типа сингулярное разложение не является единственным, поскольку U и V можно умножить на произвольный фазовый множитель eiϕe^{i \phi} для каждого столбца. То же происходит, когда input имеет повторяющиеся сингулярные значения: столбцы, охватывающие подпространство в U и V, можно умножить на матрицу вращения, и полученные векторы будут охватывать то же подпространство. Разные платформы, например NumPy, а также входные данные на устройствах разных типов могут давать разные тензоры U и V.

Параметры:
  • input (Тензор) – входной тензор размера (*, m, n), где * — ноль или более измерений пакета, состоящих из матриц (m, n).
  • some (bool, необязательный) – определяет, вычислять ли сокращённое или полное разложение и, следовательно, форму возвращаемых U и V. Значение по умолчанию: True.
  • compute_uv (bool, необязательный) – определяет, вычислять ли U и V. Значение по умолчанию: True.
Именованные аргументы:

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API