torch中張量歸一化後訓練變慢問題

2021-10-09 16:23:45 字數 2005 閱讀 1647

在做相似度任務計算時,通常會計算兩個編碼後向量的內積,再通過softmax+cross entropy進行分類。那麼在內積前是否需要對向量歸一化?歸一化對梯度反向傳播的影響是怎樣的?本文通過簡單的**演示表明:歸一化嚴重影響訓練速度,因此在內積時無需做歸一化處理。

**示例:

1、不歸一化:

torch.manual_seed(

100)

x1, x2 = torch.rand(10,

768)

, torch.rand(10,

768)

# x1 = x1 / torch.norm(x1, dim=1, keepdim=true)

# x2 = x2 / torch.norm(x2, dim=1, keepdim=true)

a = torch.autograd.variable(x1, requires_grad=

true

)b = torch.autograd.variable(x2, requires_grad=

true

)loss = torch.nn.crossentropyloss(

)optimizer = torch.optim.adam(

[a, b]

, lr=1e-

3)for i in

range(10

):p = torch.mm(a, b.t())

loss = loss(p, torch.arange(0,

10)) loss.backward(

) optimizer.step(

) optimizer.zero_grad(

)print

(loss.item(

))

結果

8.94

4.00

1.41

0.83

0.66

0.31

0.086

0.012

0.0017

0.0003

loss減少的百分比為99.9966%

2、歸一化

torch.manual_seed(

100)

x1, x2 = torch.rand(10,

768)

, torch.rand(10,

768)

x1 = x1 / torch.norm(x1, dim=

1, keepdim=

true

)x2 = x2 / torch.norm(x2, dim=

1, keepdim=

true

)a = torch.autograd.variable(x1, requires_grad=

true

)b = torch.autograd.variable(x2, requires_grad=

true

)loss = torch.nn.crossentropyloss(

)optimizer = torch.optim.adam(

[a, b]

, lr=1e-

3)for i in

range(10

):p = torch.mm(a, b.t())

loss = loss(p, torch.arange(0,

10)) loss.backward(

) optimizer.step(

) optimizer.zero_grad(

)print

(loss.item(

))

結果:

2.08

1.83

1.52

1.16

0.78

0.43

0.20.078

0.028

loss減少的百分比為98.78%

很明顯,訓練變慢了。

歸一化能夠加速訓練的原因

這裡引用吳恩達教授在課程中的截圖。一 w,b分布 我們首先分析一下為什麼非歸一化的的cost呈現這種分布。對於乙個沒有歸一化的資料,x和y可能呈現很大的數量級差距,如果x相較於y非常大的話,改變w對z的影響將會相對b來說非常大。舉個例子,如果y在0,1之間,而x在100000以上,在梯度下降的過程中...

Matlab中的資料歸一化

歸一化的具體作用是歸納統一樣本的統計分布性。歸一化在0 1之間是統計的概率分布,歸一化在 1 1之間是統計的座標分布。歸一化有同 一 統一和合一的意思。無論是為了建模還是為了計算,首先基本度量單位要同一,神經網路是以樣本在事件中的統計分別機率來進行訓練 概率計算 和 的,且sigmoid函式的取值是...

matlab中的歸一化方法

在資料處理的過程中,為了標準的統一,我們往往要對資料進行歸一化。大多數人覺得這比較簡單,不就是形如 x min max min 這樣麼。事實上,這樣想是沒錯的。事實上,我們使用matlab的內建函式,來進行資料的歸一化,在處理大量的資料時,會節省不少的時間。有內建函式用的,盡量用內建函式,可以減少不...