Spec-Zone.ru › PyTorch 1

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 типов данных с плавающей запятой, double, cfloat и cdouble. Типы данных U и V совпадают с типом input’s. 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()’s. Обратите внимание, что значение по умолчанию для обоих — 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/1.13/generated/torch.svd.html

Spec-Zone.ru

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