Spec-Zone.ru › PyTorch 2

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. 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, то есть, 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 на CUDA 10.1.243 и новее, а MAGMA gesdd на более ранних версиях CUDA.

Примечание

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

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

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

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

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

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

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

Параметры
  • input (Tensor) – входной тензор размера (*, 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)

© 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

Spec-Zone.ru

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