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