2010-03-08 20 views
2

Problem with arithmetic using logarithms to avoid numerical underflow (take 2)使用對數歸一化矢量,以避免溢出

在看到上述和看過SOFTMAX正常化我試圖同時避免溢出到歸一化矢量 -

即如果我有一個數組 x[1], x[2] x[3], x[4], ... , x[n]

的歸一化形式,我有元件的平方和爲1.0 並且通過將每個元素由 sqrt(x[1]*x[1]+x[2]*x[2]+...+x[n]*x[n])

獲得

現在平方的總和,甚至溢出若平方根小到足以放入一個浮點變量,所以我想象一個可以做類似 s=(2*log(fabs(x[1]))+2*log(fabs(x[2]))+...+2*log(fabs(x[n])))/2

,並計算元素

exp(log(fabs(x[1]))-s), ..., exp(log(fabs(x[n]))-s

BUT

上面的是不正確的日誌(A + B)沒有登錄(A)+日誌(B) - 現在是有辦法做矢量範數避免溢出更好的化名?

+1

'log(A + B)!= logA + logB' – kennytm 2010-03-08 10:11:24

+0

啊對!傻我...所以有辦法做到這一點? – muscicapa 2010-03-08 10:16:01

回答

2

你似乎做的前提是:

log(x^2 + y^2) 

是一樣的:

log(x^2) + log(y^2) 

然而,這是不正確的,因爲你不能簡化的對數這樣的總和。

3

KennyTM是正確的 - 你對對數的想法是錯誤的。

你不能使用L2規範,因爲它要求你計算向量的大小,這正是你遇到的溢出問題。

也許L-infinity範數,你在向量中用最大分量的絕對值先分開每個分量會更好。一定要堅持最大的絕對值,這樣你才能獲得正確的幅度。

我完全理解你所需要的L2標準,但如果溢出確實是你需要採取中間步驟來獲得它的一個問題:

  1. 求向量的最大絕對值。
  2. 將每個分量除以最大絕對值進行標準化;最大值現在是+/- 1。
  3. 計算歸一化分量平方和的平方根。我建議將值排序並按升序添加,以確保小組件不會丟失。
  4. 乘以最大絕對值得到原始矢量的L2範數。
+0

恐怕在這種情況下我需要L2規範。 – muscicapa 2010-03-08 10:27:11

4

而不是

norm = sqrt(x[1] * x[1] + ... + x[n] * x[n]) 

你可能想平方

max_x = max(x[1], ..., x[n]) 
y[1] = x[1]/max_x/n 
... 
y[n] = x[n]/max_x/n 
norm = n * sqrt(y[1] * y[1] + ... + y[n] * y[n]) * max_x 

y載體的規範則應該等於之前由最大可能值向量的要素分割或小於零。 n * max_x的值仍然可能溢出,因此您還需要小心,以非溢出順序執行操作。

+0

除以n是不必要的。單獨的最大值足以使所有值都進入範圍[-1,1] – duffymo 2010-03-08 13:17:34

+0

但是對於某個'N',即使是一個總和也會溢出。 – Debilski 2010-03-08 15:47:03