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()
中的参数化功能来实现。- 参数
- 返回值
-
具有正交参数化并注册到指定权重的原始模块
- 返回类型
示例:
>>> 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)
-