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()
的 和 Cayley 映射 应用于斜对称矩阵 以得到一个正交矩阵。"householder"
: 计算 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()
中的参数化功能来实现。- 参数
- 返回
已向指定权重注册了正交参数化的原始模块
- 返回类型
示例
>>> 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)