2010-05-04 144 views
10

我有一個問題,試圖弄清楚如何調整我的感知器算法的參數,使其在看不見的數據上表現相對較好。感知器學習算法的參數調整

我已經實現了一個驗證的工作感知器算法,我想弄清楚一種方法,我可以調整迭代次數和感知器的學習速率。這些是我感興趣的兩個參數。

我知道感知器的學習速度並不影響算法是否收斂和完成。我正在努力掌握如何改變n。太快,它會擺動很多,太低而且需要更長的時間。

至於迭代的次數,我不完全確定如何確定一個理想的數字。

無論如何,任何幫助,將不勝感激。謝謝。

回答

13

從少量迭代開始(它實際上更常規地計數'紀元'而不是迭代 - '紀元'是指通過用於訓練網絡的整個數據集的迭代次數。 「小」讓我們說50個時代的東西。原因是你想看看每個額外的訓練週期(時代)總誤差是如何變化的 - 希望它會下降(更多關於下面的「總誤差」)。

很明顯,您對下一個新紀元不會導致總誤差進一步下降的時間點(時代數量)感興趣。因此,從少數時代開始,您可以通過增加時代來接近這一點。

你開始的學習速度不應該太細或太粗糙(顯然是主觀的,但希望你對大到小的學習率有一個粗略的理解)。

接下來,在您的感知器中插入幾行測試代碼 - 實際上只是幾個恰當的「打印」語句。對於每次迭代,計算並顯示增量(訓練數據中每個數據點的實際值減去預測值),然後對訓練數據中所有點(數據行)上的各個增量值進行求和(我通常取絕對值的絕對值delta,或者你可以取平方差之和的平方根 - 無關緊要,稱之爲總和值「總誤差」 - 只要清楚,這就是總誤差(總誤差所有節點)每時期

然後,情節的總誤差爲時期號的函數(即,在x軸上時期號,在y軸上總誤差)。最初的過程中,你」將會看到左上角的數據點向下和向右傾斜,並且以遞減的斜率

讓算法訓練網絡對訓練數據。 增加(通過例如每次運行10次),直到看到曲線(總誤差與曆元數)變平 - 即,額外的迭代不會導致總誤差減小。

所以這條曲線的斜率很重要,它的垂直位置也是很重要的 - 也就是說,你有多少總的錯誤,以及它是否繼續向下傾斜更多的訓練週期(epochs)。如果在增加新紀元之後,你最終會注意到錯誤的增加,從較低的學習率再次開始。

學習率(通常是0.01到0.2之間的一個分數)肯定會影響網絡訓練的速度 - 也就是說,它可以更快地將您移動到本地最小值。它也可能導致你跳過它。因此,編碼一個訓練網絡的循環,讓我們說五個不同的時間,每次使用固定數量的時代(和相同的起點),但是將學習速率從例如0.05變化到0.2,每次增加學習速率0.05。

此處還有一個參數很重要(雖然不是絕對必要),'勢頭'。顧名思義,使用動量術語可以幫助您更快速地獲得訓練有素的網絡。實質上,動量是學習率的倍數 - 只要錯誤率下降,動量項加速了進度。只要你前往目的地,增加速度',動量項背後的直覺就是''。動量項的典型值是0.1或0.2。在上面的訓練方案中,你應該保持動量不變,同時改變學習速率。

+0

這是正確的答案,但不要限制你的學習速度和動量到一個域的限制(縮放)。生成一個隨機網絡,以0.05步驟訓練0.01-0.99。如果您無法以這種方式擺脫全球最低標準,請確保您正確地對輸入進行標準化。我是Log的忠實粉絲! – deepelement 2014-05-30 01:57:01

3

關於學習率不影響感知器是否收斂 - 這是不正確的。如果您選擇的學習率過高,您可能會得到一個分歧網絡。如果你在學習期間改變了學習速率,並且速度下降得太快(即比1/n更強),你也可以得到一個永不收斂的網絡(這是因爲從1到inf的t(t)之和是有限的。這意味着權重向量只能以有限的量改變)。

理論上可以示出爲簡單的情況下,根據變更N(學習率)1 /噸(其中t是提出的示例的數量)應該工作很好,但事實上,我發現,在實踐中,最好要做到這一點,就是要找到好的高n值(不會讓你的學習發散的最高值)和低n值(這是一個比較狡猾的數字,實際上取決於數據和問題),然後讓n隨着時間從高到低n線性變化

1

學習率取決於數據的典型值。一般來說,沒有經驗法則。特徵縮放是一種用於標準化自變量或數據特徵範圍的方法。在數據處理中,它也被稱爲數據標準化,並且通常在數據預處理步驟期間執行。

將數據標準化爲零均值,單位方差或0-1或任何其他標準形式可以幫助選擇學習率的值。正如道格提到的,0.05到0.2之間的學習率一般很好。

此外,這將有助於使算法更快地收斂。

來源:Juszczak,P .; D. M. M. J. Tax和R. P. W. Dui(2002)。 「支持矢量數據描述中的特徵縮放」。 PROC。第八屆。 CONF。進階學校計算機。成像:95-10。