確保算法能收斂以及選擇合適的學(xué)習(xí)速率α惦蚊。
對于隨機梯度下降算法幽歼,為了檢查算法是否收斂导饲,沿用之前定義的cost函數(shù)捞高。在算法掃描到樣本(x(i),y(i)) 但在更新參數(shù)θ之前,使用這個樣本算出這個樣本對應(yīng)的cost函數(shù)渣锦。例如:每1000次迭代運算中硝岗,我們對最后1000個樣本的cost值求平均然后畫出來,通過觀察這些畫出來的圖袋毙,我們就能檢查出隨機梯度下降是否在收斂型檀。
圖1:看起來是有噪聲的,代價值在下降听盖,后面開始變得平緩胀溺。這樣的大致走向基本說明你的學(xué)習(xí)算法已經(jīng)收斂了裂七。如果你使用了更小的學(xué)習(xí)速率,那么很有可能使得算法的學(xué)習(xí)變得更慢了仓坞,代價函數(shù)的下降也變慢了背零。但由于你使用了更小的學(xué)習(xí)速率,你很有可能會讓算法收斂到一個好一點的解无埃。(紅色的曲線代表隨機梯度下降使用一個更小的學(xué)習(xí)速率)徙瓶。隨機梯度下降不是直接收斂到全局最小值,而是在局部最小附近反復(fù)振蕩嫉称,所以使用一個更小的學(xué)習(xí)速率侦镇,最終的振蕩就會更小,有時候這一點小的區(qū)別可以忽略澎埠,但有時候一點小的區(qū)別就會得到更好一點的參數(shù)虽缕。
圖2:看起來已經(jīng)收斂了。如果你把這個數(shù) 1000 提高到5000組樣本蒲稳,那么可能你會得到一條更平滑的曲線。這是增大平均的訓(xùn)練樣本數(shù)的情形伍派。當(dāng)然增大樣本數(shù)的缺點就是現(xiàn)在每5000個樣本才能得到一個數(shù)據(jù)點江耀,因此你所得到的關(guān)于學(xué)習(xí)算法表現(xiàn)的反饋就顯得有一些“延遲”,因為每5000個樣本才能得到圖上的一個數(shù)據(jù)點而不是每1000個樣本就能得到诉植。
圖3:運行梯度下降代價函數(shù)就沒有在減小祥国,算法沒有很好地學(xué)習(xí),需要更大量的樣本進(jìn)行平均晾腔,你很可能會觀察到紅線所示的情況舌稀。使用一個較大的樣本數(shù)量,還是可能會發(fā)現(xiàn)這條學(xué)習(xí)曲線比較平坦灼擂,那可能就更肯定地說明不知道出于什么原因算法確實沒怎么學(xué)習(xí)好壁查,那么你就需要調(diào)整學(xué)習(xí)速率或者改變特征變量或者改變其他的什么
圖4:曲線實際上是在上升,這是一個很明顯的信號表示算法正在發(fā)散剔应。那么你要做的事就是用一個更小一點的學(xué)習(xí)速率α睡腿。
線看起來噪聲較大或者老是上下振動,那就試試增大你要平均的樣本數(shù)量峻贮,這樣應(yīng)該就能得到比較好的變化趨勢席怪。如果你發(fā)現(xiàn)代價值在上升,那么就換一個小一點的α值纤控。
運行隨機梯度下降時挂捻,算法會從某個點開始然后曲折地逼近最小值,但它不會真的收斂船万,而是一直在最小值附近徘徊刻撒,因此你最終得到的參數(shù)實際上只是接近全局最小值惜辑,而不是真正的全局最小值。如果你想讓隨機梯度下降確實收斂到全局最小值疫赎,你可以隨時間的變化減小學(xué)習(xí)速率α的值盛撑。一種典型的方法來設(shè)置α的值是讓α等于某個常數(shù)1 除以 迭代次數(shù)加某個常數(shù)2。?該α的設(shè)置存在的問題是把時間花在確定常數(shù)1和常數(shù)2上捧搞,這讓算法顯得更繁瑣抵卫。但是減小了學(xué)習(xí)速率,振蕩也會越來越小直到落到幾乎靠近全局最小的地方胎撇。這個公式起作用的原因是隨著算法的運行介粘,迭代次數(shù)會越來越大,因此學(xué)習(xí)速率α?xí)冃⊥硎鳎虼四愕拿恳徊骄蜁絹碓叫∫霾桑钡阶罱K收斂到全局最小值。