Spec-Zone.ru › PyTorch 1

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().

Параметры:
  • 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)

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

Spec-Zone.ru

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