torch.nn.utils.parametrizations.orthogonal

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

对矩阵或矩阵批进行正交或酉参数化。

$\mathbb{K}$$\mathbb{R}$$\mathbb{C}$,参数矩阵 $Q \in \mathbb{K}^{m \times 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*}$

其中$Q^{\text{H}}$ 是当$Q$ 为复数时的共轭转置,当$Q$ 为实数值时则是普通转置。而$\mathrm{I}_n$n维单位矩阵。简单来说,当$m \geq n$ 时,$Q$ 的列是正交的;否则,它的行是正交的。

如果张量的维度大于两个,我们就把它看作是一批形状为(…, m, n)的矩阵。

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

  • "matrix_exp"/"cayley": 使用matrix_exp() $Q = \exp(A)$Cayley变换 $Q = (\mathrm{I}_n + A/2)(\mathrm{I}_n - A/2)^{-1}$ 将一个反对称的$A$矩阵转换为正交矩阵。

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

"matrix_exp""cayley" 通常能使参数化权重比 "householder" 更快地收敛,但它们在处理非常细长或非常宽的矩阵时计算速度较慢。

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

$Q$ 的初始值:如果原始张量未参数化且 use_trivialization=True(默认值),则当原始张量是正交矩阵时,$Q$ 的初始值即为其自身的值;否则通过 QR 分解使其正交化(参见 torch.linalg.qr())。当未参数化且 orthogonal_map="householder" 时,即使 use_trivialization=False,情况也是如此。否则,初始值是将所有已注册的参数化应用于原始张量后的结果。

注意

此函数通过register_parametrization()中的参数化功能来实现。

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

  • name (str, optional) – 要使正交化的张量的名称。默认值:"weight"

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

  • use_trivialization (bool, optional) – 是否启用动态简化框架。默认值: True

返回值

具有正交参数化并注册到指定权重的原始模块

返回类型

Module

示例:

>>> 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)
本页目录