torch.nn.utils.parametrizations.orthogonal¶
- torch.nn.utils.parametrizations.orthogonal(module, name='weight', orthogonal_map=None, *, use_trivialization=True)[源代码]¶
对矩阵或一批矩阵应用正交或酉参数化。
设 为 或 ,参数化矩阵 是 正交 的,如
其中 是当 为复数时的共轭转置, 当 为实值时的转置,并且 是 n 维单位矩阵。 简单来说, 将在 时具有正交列, 否则具有正交行。
如果张量具有超过两个维度,我们将其视为形状为 (…, m, n) 的矩阵批次。
矩阵 可以通过三种不同的
orthogonal_map来参数化,基于原始张量:"matrix_exp"/"cayley": thematrix_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()中的参数化功能实现。- Parameters
- Returns
具有正交参数化的原始模块注册到指定的权重
- Return type
示例:
>>> orth_linear = orthogonal(nn.Linear(20, 40)) >>> orth_linear 参数化线性( 输入特征=20, 输出特征=40, 偏置=True (参数化): ModuleDict( (权重): 参数化列表( (0): _正交() ) ) ) >>> Q = orth_linear.weight >>> torch.dist(Q.T @ Q, torch.eye(20)) 张量(4.9332e-07)