Shortcuts

torch.nn.utils.parametrizations.orthogonal

torch.nn.utils.parametrizations.orthogonal(module, name='weight', orthogonal_map=None, *, use_trivialization=True)[源代码]

对矩阵或一批矩阵应用正交或酉参数化。

K\mathbb{K}R\mathbb{R}C\mathbb{C},参数化矩阵 QKm×nQ \in \mathbb{K}^{m \times n}正交 的,如

QHQ=Inif mnQQH=Imif m<n\begin{align*} Q^{\text{H}}Q &= \mathrm{I}_n \mathrlap{\qquad \text{if }m \geq n}\\ QQ^{\text{H}} &= \mathrm{I}_m \mathrlap{\qquad \text{if }m < n} \end{align*}

其中 QHQ^{\text{H}} 是当 QQ 为复数时的共轭转置, 当 QQ 为实值时的转置,并且 In\mathrm{I}_nn 维单位矩阵。 简单来说,QQ 将在 mnm \geq n 时具有正交列, 否则具有正交行。

如果张量具有超过两个维度,我们将其视为形状为 (…, m, n) 的矩阵批次。

矩阵 QQ 可以通过三种不同的 orthogonal_map 来参数化,基于原始张量:

  • "matrix_exp"/"cayley": the matrix_exp() Q=exp(A)Q = \exp(A)Cayley 映射 Q=(In+A/2)(InA/2)1Q = (\mathrm{I}_n + A/2)(\mathrm{I}_n - A/2)^{-1} 被应用于一个反对称矩阵 AA 以得到一个正交矩阵。

  • "householder": 计算Householder反射器的乘积 (householder_product()).

"matrix_exp"/"cayley" 通常比 "householder" 使参数化权重更快收敛,但对于非常窄或非常宽的矩阵,它们的计算速度较慢。

如果 use_trivialization=True(默认),参数化实现了“动态平凡化框架”, 其中额外的矩阵 BKn×nB \in \mathbb{K}^{n \times n} 存储在 module.parametrizations.weight[0].base 下。这有助于 参数化层的收敛,但会以增加一些额外的内存使用为代价。 参见 流形上基于梯度的优化的平凡化

QQ 的初始值: 如果原始张量未参数化且 use_trivialization=True(默认),则 QQ 的初始值为原始张量的值(如果它是正交的,或者在复数情况下是酉的), 否则通过 QR 分解进行正交化(参见 torch.linalg.qr())。 当它未参数化且 orthogonal_map="householder" 时,即使 use_trivialization=False,也会发生同样的情况。 否则,初始值是所有注册的参数化应用于原始张量的结果的组合。

注意

此函数使用 register_parametrization() 中的参数化功能实现。

Parameters
  • 模块 (nn.Module) – 要注册参数化的模块。

  • 名称 (字符串, 可选) – 要正交化的张量的名称。默认值: "weight"

  • orthogonal_map (str, 可选) – 以下之一:"matrix_exp", "cayley", "householder"。 默认值:如果矩阵是方阵或复数矩阵,则为"matrix_exp",否则为"householder"

  • use_trivialization (布尔值, 可选) – 是否使用动态平凡化框架。 默认值: True

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)
优云智算