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"
:matrix_exp()
和 Cayley 映射 應用於斜對稱矩陣 以產生正交矩陣。"householder"
:計算 Householder 反射器的乘積 (householder_product()
)。
"matrix_exp"
/"cayley"
通常會比"householder"
更快地使參數化的權重收斂,但對於非常細長或非常寬的矩陣,它們的計算速度會較慢。如果
use_trivialization=True
(預設值),參數化會實作「動態平凡化框架」(Dynamic Trivialization Framework),其中一個額外的矩陣 儲存在module.parametrizations.weight[0].base
下。這有助於參數化層的收斂,但會犧牲一些額外的記憶體使用量。請參閱 Trivializations for Gradient-Based Optimization on Manifolds 。的初始值:如果原始張量未被參數化且
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)