Spec-Zone.ru › PyTorch 2.14

torch.linalg.svd

torch.linalg.svd(A, full_matrices=True, *, driver=None, out=None) [исходный код]

Вычисляет сингулярное разложение (SVD) матрицы.

Пусть K\mathbb{K} — это R\mathbb{R} или C\mathbb{C}. Полное SVD матрицы A∈Km×nA \in \mathbb{K}^{m \times n}, если k = min(m,n), определяется следующим образом:

A=Udiag⁡(S)VHU∈Km×m,S∈Rk,V∈Kn×nA = U \operatorname{diag}(S) V^{\text{H}} \mathrlap{\qquad U \in \mathbb{K}^{m \times m}, S \in \mathbb{R}^k, V \in \mathbb{K}^{n \times n}}

где diag⁡(S)∈Km×n\operatorname{diag}(S) \in \mathbb{K}^{m \times n}, VHV^{\text{H}} — это эрмитово-сопряжённая матрица, если VV комплексная, и транспонированная матрица, если VV вещественная. Матрицы UU, VV (а значит, и VHV^{\text{H}}) ортогональны в вещественном случае и унитарны в комплексном случае.

Если m > n (соответственно, m < n), можно отбросить последние m - n (соответственно, n - m) столбцов U (соответственно, V), чтобы получить сокращённое SVD:

A=Udiag⁡(S)VHU∈Km×k,S∈Rk,V∈Kn×kA = U \operatorname{diag}(S) V^{\text{H}} \mathrlap{\qquad U \in \mathbb{K}^{m \times k}, S \in \mathbb{R}^k, V \in \mathbb{K}^{n \times k}}

где diag⁡(S)∈Kk×k\operatorname{diag}(S) \in \mathbb{K}^{k \times k}. В этом случае столбцы UU и VV также ортонормированы.

Поддерживаются типы данных float, double, cfloat и cdouble. Также поддерживаются пакеты матриц; если A представляет собой пакет матриц, выходные данные имеют те же пакетные размерности.

Возвращаемое разложение представляет собой именованный кортеж (U, S, Vh), компоненты которого соответствуют указанным выше UU, SS, VHV^{\text{H}}.

Сингулярные значения возвращаются в порядке убывания.

Параметр 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. Вместо compute_uv=False используйте torch.linalg.svdvals(), которая вычисляет только сингулярные значения.

Примечание

Если full_matrices= True, градиенты по U[…, :, min(m, n):] и Vh[…, min(m, n):, :] игнорируются, поскольку эти векторы могут быть произвольными базисами соответствующих подпространств.

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

Возвращаемые тензоры U и V не являются единственными и не являются непрерывными относительно A. Из-за этой неоднозначности на разном оборудовании и в разных программных средах могут вычисляться разные сингулярные векторы.

Эта неоднозначность вызвана тем, что умножение любой пары сингулярных векторов uk,vku_k, v_k на -1 в вещественном случае или на eiϕ,ϕ∈Re^{i \phi}, \phi \in \mathbb{R} в комплексном случае даёт ещё два корректных сингулярных вектора матрицы. Поэтому функция потерь не должна зависеть от этой величины eiϕe^{i \phi}, поскольку она не определена однозначно. Для комплексных входных данных эта зависимость проверяется при вычислении градиентов функции. Поэтому при комплексных входных данных на устройстве CUDA вычисление градиентов этой функции синхронизирует устройство с CPU.

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

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

См. также

torch.linalg.svdvals() вычисляет только сингулярные значения. В отличие от torch.linalg.svd(), градиенты svdvals() всегда численно устойчивы.

torch.linalg.eig() — функция для вычисления другого типа спектрального разложения матрицы. Спектральное разложение работает только с квадратными матрицами.

torch.linalg.eigh() — более быстрая функция для вычисления разложения на собственные значения и векторы эрмитовых и симметричных матриц.

torch.linalg.qr() — ещё одно (значительно более быстрое) разложение, применимое к общим матрицам.

Параметры:
  • A (Tensor) – тензор формы (*, m, n), где * — ноль или более пакетных размерностей.
  • full_matrices (bool, необязательно) – определяет, вычислять ли полное или сокращённое SVD, а следовательно, и форму возвращаемых тензоров U и Vh. По умолчанию: True.
Именованные аргументы:
  • driver (str, необязательно) – название метода cuSOLVER. Этот именованный аргумент работает только для входных данных CUDA. Доступны следующие варианты: None, gesvd, gesvdj и gesvda. По умолчанию: None.
  • out (tuple, необязательно) – выходной кортеж из трёх тензоров. Игнорируется, если None.
Возвращает:

Именованный кортеж (U, S, Vh), компоненты которого соответствуют указанным выше UU, SS, VHV^{\text{H}}.

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)

© 2026, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://docs.pytorch.org/docs/2.14/generated/torch.linalg.svd.html

Spec-Zone.ru

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