在做相似度任務計算時,通常會計算兩個編碼後向量的內積,再通過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的內建函式,來進行資料的歸一化,在處理大量的資料時,會節省不少的時間。有內建函式用的,盡量用內建函式,可以減少不...