torch.nn.utils.parametrizations.orthogonal¶
- torch.nn.utils.parametrizations.orthogonal(module, name='weight', orthogonal_map=None, *, use_trivialization=True)[source][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
下。这有助于参数化层的收敛,但以牺牲一些额外的内存使用为代价。请参阅 流形上基于梯度的优化的平凡化 。的初始值:如果原始张量未参数化且
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)