Spec-Zone.ru › PyTorch 2

torch.nn.utils.parametrizations.orthogonal

torch.nn.utils.parametrizations.orthogonal(module, name='weight', orthogonal_map=None, *, use_trivialization=True) [source]

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

Пусть 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{если }m \geq n}\\ QQ^{\text{H}} &= \mathrm{I}_m \mathrlap{\qquad \text{если }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 (по умолчанию), параметризация реализует «динамическую тривиализацию», где дополнительная матрица B∈Kn×nB \in \mathbb{K}^{n \times n} хранится в module.parametrizations.weight[0].base. Это помогает сходимости параметризованного слоя за счёт некоторого дополнительного использования памяти. См. Trivializations for Gradient-Based Optimization on Manifolds.

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

Примечание

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

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

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

Return type

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)

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

Spec-Zone.ru

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