2012-02-21 77 views
8

我試圖在觀看Andrew Ng教授關於GLM的講座後,實施Softmax迴歸算法來解決K分類器問題。我以爲我明白了一切,他說,直到它終於來到了編寫代碼來實現對使用SoftMax迴歸成本函數,這是如下:如何矢量化方程?

Cost function for Softmax Regression with Weight Decay

我遇到的問題是試圖以圖找出一種方法來實現這一點。再次,我想到我明白如何去向量化這樣的方程式,因爲我能夠做到線性和邏輯迴歸,但看了那個公式後,我被卡住了。雖然我很想弄清楚這個矢量化解決方案(我意識到已經發布了類似的問題:Vectorized Implementation of Softmax Regression),但我更感興趣的是你們中的任何一個人是否可以告訴我一種方式(你的方式)有條件地將這樣的方程式轉換成矢量化的形式。例如,對於那些ML專家或經驗豐富的退伍軍人來說,當你第一次閱讀文獻中的新算法,並看到他們使用與上述等式相似的符號時,如何將它們轉換爲矢量化的形式?

我意識到我可能會像學生一樣問莫扎特,「你怎麼彈得這麼好?」但是,我的問題只是出於想要更好地利用這種材料的動機,並且假設並非所有人都知道如何對方程進行矢量化,所以有人在那裏必須設計出自己的系統,如果有的話,請分享!提前謝謝了!

乾杯

+0

你能提供一個鏈接到上GLM講座? – justis 2012-02-21 19:57:23

+1

致謝Andrew Ng在斯坦福大學的ML課程:http://cs229.stanford.edu/materials.html - GLM和Softmax迴歸材料可在第1講結尾處找到 – oort 2012-02-21 23:32:54

回答

1

這個看起來相當困難的,因爲矢量化你在做你的求和內指數。我假定你正在提高任意權力。你可以矢量化的第二項是表達式\ sum \ sum theta^2的第二項,只要確保在matlab中使用。*運算符enter link description here到computer \ theta^2

同樣用於內部條件的比率進入對數。 \ theta'x ^(i)是可矢量化的表達。

你也可以從記憶或動態編程技術中受益,並嘗試重新使用e^\ theta'x ^(i)的計算結果。

一般來說,在我的經驗中,矢量化的方法首先是獲得非矢量化的實現工作。然後嘗試將矢量化計算中最明顯的部分。在每一個步驟中都會調整你的函數,並且總是檢查你是否得到與非向量化計算相同的結果。另外,有多個測試用例是非常有用的。

2

附帶倍頻的幫助文件有這個條目:

19.1基本矢量

要一個很好的第一近似,在量化目標是避免迴路,並使用全陣列 寫代碼操作。作爲 簡單的例子,考慮

for i = 1:n 
    for j = 1:m 
    c(i,j) = a(i,j) + b(i,j); 
    endfor 
endfor 

相比要簡單得多

c = a + b; 

這不僅是更容易編寫;它在內部也更容易優化。 Octave將此操作委託給底層的 實現,除其他優化外,可能會使用特殊向量 硬件指令,或者甚至可能會在並行中執行添加操作。一般來說,如果代碼是矢量化的,那麼爲了實現更快的執行,底層的 實現具有更多的自由,這些假設可以在 中做出。

這對於「廉價」機構的循環尤其重要。通常它只需向最內層循環矢量化即可獲得可接受的性能。一般的經驗法則是 向量化主體的「順序」應該大於或等於 封閉循環的「順序」。

作爲以下簡單的例子,而不是

for i = 1:n-1 
    a(i) = b(i+1) - b(i); 
endfor 

寫入

a = b(2:n) - b(1:n-1); 

這說明有關使用陣列來 索引,而不是遍歷索引變量的重要一般概念。 索引表達式。 也慷慨地使用布爾索引。如果需要測試條件 ,則此條件也可以寫爲布爾值 索引。舉例來說,代替

for i = 1:n 
    if (a(i) > 5) 
    a(i) -= 20 
    endif 
endfor 

寫入

a(a>5) -= 20; 

其中利用了 '> 5' 產生一個布爾索引的事實。

儘可能地使用元素向量運算符來避免循環 (運算符如'。*'和'。^')。 算術操作。對於簡單的 內聯函數,'vectorize'函數可以自動執行此操作。

- 內置功能:矢量化(FUN) 通過替換的「」,「/」等 所有出現,與」創建內聯函數FUN的向量化版本。「」 ./」等

This may be useful, for example, when using inline functions with 
numerical integration or optimization where a vector-valued 
function is expected. 

     fcn = vectorize (inline ("x^2 - 1")) 
     => fcn = f(x) = x.^2 - 1 
     quadv (fcn, 0, 3) 
     => 6 

See also:  inline,  formula, 
 argnames. 

還利用在這些的elementwise運營商既 避免循環和不必要的中間存儲器分配廣播。
廣播。

如果可能,請使用內置和庫函數。內置和 編譯功能非常快。即使使用m文件庫函數, 很可能已經被優化,或者將在未來的發行版中更多地優化 。

舉例來說,甚至比

a = b(2:n) - b(1:n-1); 

更好的是

a = diff (b); 

大多數倍頻功能與矢量和陣列參數在 記寫的。如果你發現自己用一個非常簡單的操作編寫了一個循環, 可能就是這樣一個函數已經存在了。經常出現在量化代碼以下 功能:

  • 指數操縱

    * find 
    
    * sub2ind 
    
    * ind2sub 
    
    * sort 
    
    * unique 
    
    * lookup 
    
    * ifelse/merge 
    
  • 重複

    * repmat 
    
    * repelems 
    
  • 矢量化運算

    * sum 
    
    * prod 
    
    * cumsum 
    
    * cumprod 
    
    * sumsq 
    
    * diff 
    
    * dot 
    
    * cummax 
    
    * cummin 
    
  • 形狀更高維數組

    * reshape 
    
    * resize 
    
    * permute 
    
    * squeeze 
    
    * deal 
    

也期待在從斯坦福ML維基上的例子多一些指導這些頁面。

http://ufldl.stanford.edu/wiki/index.php/Vectorization

http://ufldl.stanford.edu/wiki/index.php/Logistic_Regression_Vectorization_Example

http://ufldl.stanford.edu/wiki/index.php/Neural_Network_Vectorization