torch.nn.utils.parametrizations.orthogonal
-
torch.nn.utils.parametrizations.orthogonal(module, name='weight', orthogonal_map=None, *, use_trivialization=True)[source] -
Применяет ортогональную или унитарную параметризацию к матрице или набору матриц.
Пусть — или , параметризованная матрица является ортогональной, как
где — сопряжённый транспонированный, когда комплексное, и транспонированный, когда вещественное, а —
n-мерная единичная матрица. Проще говоря, будет иметь ортогональные столбцы, когда , и ортогональные строки в противном случае.Если тензор имеет более двух измерений, мы рассматриваем его как набор матриц формы
(…, m, n).Матрица может быть параметризована тремя различными
orthogonal_mapотносительно исходного тензора:-
"matrix_exp"/"cayley":matrix_exp()и преобразование Кэли применяются к кососимметричной , чтобы получить ортогональную матрицу. -
"householder": вычисляет произведение отражений Хаусхолдера (householder_product()).
"matrix_exp"/"cayley"часто ускоряют сходимость параметризованного веса по сравнению с"householder", но они медленнее вычисляются для очень узких или очень широких матриц.Если
use_trivialization=True(по умолчанию), параметризация реализует «динамическую тривиализацию», где дополнительная матрица хранится вmodule.parametrizations.weight[0].base. Это помогает сходимости параметризованного слоя за счёт использования дополнительной памяти. См. Trivializations for Gradient-Based Optimization on Manifolds.Начальное значение : Если исходный тензор не параметризован и
use_trivialization=True(по умолчанию), начальное значение соответствует исходному тензору, если он ортогонален (или унитарный в комплексном случае), в противном случае он ортогонализуется с помощью 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.
- Возвращает:
-
Исходный модуль с зарегистрированной ортогональной параметризацией для указанного веса
- Тип возвращаемого значения:
Пример:
>>> 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