Spec-Zone.ru › PyTorch 2.14

torch.nn.utils.parametrizations.orthogonal

torch.nn.utils.parametrizations.orthogonal(module, name='weight', orthogonal_map=None, *, use_trivialization=True) [исходный код]

Применяет ортогональную или унитарную параметризацию к матрице или пакету матриц.

Пусть K\mathbb{K} — это R\mathbb{R} или C\mathbb{C}, параметризованная матрица Q∈Km×nQ \in \mathbb{K}^{m \times n} является ортогональной, если

QHQ=Inесли m≥nQQH=Imесли m<n\begin{align*} Q^{\text{H}}Q &= \mathrm{I}_n \mathrlap{\qquad \text{if }m \geq n}\\ QQ^{\text{H}} &= \mathrm{I}_m \mathrlap{\qquad \text{if }m < n} \end{align*}

где QHQ^{\text{H}} — эрмитово сопряжённая матрица, если QQ комплексная, и транспонированная матрица, если QQ вещественная, а In\mathrm{I}_n — единичная матрица n-мерного пространства. Проще говоря, у QQ будут ортонормированные столбцы, если m≥nm \geq n, и ортонормированные строки в противном случае.

Если тензор имеет более двух измерений, мы рассматриваем его как пакет матриц формы (…, m, n).

Матрица QQ может быть параметризована тремя различными orthogonal_map исходного тензора:

  • "matrix_exp"/"cayley": matrix_exp() Q=exp⁡(A)Q = \exp(A) и преобразование Кэли Q=(In+A/2)(In−A/2)−1Q = (\mathrm{I}_n + A/2)(\mathrm{I}_n - A/2)^{-1} применяются к кососимметричной матрице AA, чтобы получить ортогональную матрицу.
  • "householder": вычисляет произведение отражений Хаусхолдера (householder_product()).

"matrix_exp"/"cayley" часто обеспечивают более быструю сходимость параметризованных весов, чем "householder", но медленнее вычисляются для очень узких или очень широких матриц.

Если use_trivialization=True (значение по умолчанию), параметризация реализует «Dynamic Trivialization Framework», в рамках которого дополнительная матрица B∈Kn×nB \in \mathbb{K}^{n \times n} сохраняется в module.parametrizations.weight[0].base. Это способствует сходимости параметризованного слоя ценой дополнительного расхода памяти. См. Тривиализации для оптимизации на многообразиях на основе градиентного спуска.

Начальное значение QQ: если исходный тензор не параметризован и use_trivialization=True (значение по умолчанию), начальным значением QQ становится значение исходного тензора, если он ортогонален (или унитарен в комплексном случае); в противном случае он ортогонализуется с помощью QR-разложения (см. torch.linalg.qr()). То же происходит, когда он не параметризован и orthogonal_map="householder", даже если use_trivialization=False. В противном случае начальным значением становится результат композиции всех зарегистрированных параметризаций, применённых к исходному тензору.

Примечание

Эта функция реализована с помощью функциональности параметризации из register_parametrization().

Параметры:
  • module (nn.Module) – модуль, для которого регистрируется параметризация.
  • name (str, необязательный) – имя тензора, который нужно сделать ортогональным. Значение по умолчанию: "weight".
  • orthogonal_map (str, необязательный) – один из вариантов: "matrix_exp", "cayley", "householder". Значение по умолчанию: "matrix_exp" для квадратной или комплексной матрицы, "householder" в противном случае.
  • use_trivialization (bool, необязательный) – использовать ли динамическую тривиализацию. Значение по умолчанию: True.
Возвращает:

Исходный модуль с ортогональной параметризацией, зарегистрированной для указанного веса

Тип возвращаемого значения:

Module

Пример:

>>> orth_linear = orthogonal(nn.Linear(20, 40))
>>> orth_linear
ParametrizedLinear(
in_features=20, out_features=40, bias=True
(parametrizations): ModuleDict(
    (weight): ParametrizationList(
    (0): _Orthogonal()
    )
)
)
>>> Q = orth_linear.weight
>>> torch.dist(Q.T @ Q, torch.eye(20))
tensor(4.9332e-07)

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

Spec-Zone.ru

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