Caffe中學習率策略應如何選擇
今天,在訓練網路時想換一種學習策略試試,因此重新研究了一下Caffe中提供的各種學習率策略,在這裡和大家聊聊我使用時的一些經驗教訓。
我們先來看看和學習率策略有關的引數,以下的內容來自caffe.proto中:
// The learning rate decay policy. The currently implemented learning rate // policies are as follows: // - fixed: always return base_lr. // - step: return base_lr * gamma ^ (floor(iter / step)) // - exp: return base_lr * gamma ^ iter // - inv: return base_lr * (1 + gamma * iter) ^ (- power) // - multistep: similar to step but it allows non uniform steps defined by // stepvalue // - poly: the effective learning rate follows a polynomial decay, to be // zero by the max_iter. return base_lr (1 - iter/max_iter) ^ (power) // - sigmoid: the effective learning rate follows a sigmod decay // return base_lr ( 1/(1 + exp(-gamma * (iter - stepsize)))) // // where base_lr, max_iter, gamma, step, stepvalue and power are defined // in the solver parameter protocol buffer, and iter is the current iteration. optional string lr_policy = 8; optional float gamma = 9; // The parameter to compute the learning rate. optional float power = 10; // The parameter to compute the learning rate.
optional float base_lr = 5; // The base learning rate
// the stepsize for learning rate policy "step"
optional int32 stepsize = 13;
// the stepsize for learning rate policy "multistep"
repeated int32 stepvalue = 34;
其實,上面已經寫得很清楚了,尤其是學習率是如何計算的也已經給出了詳細的說明。我想和大家分享我的一些心得。就我現在看到的使用最多的學習策略有fixed,step,inv,multistep。下面一個個介紹。
1、fixed 固定策略
故名思議就是學習率始終是一個固定值,如果你是一個新手或者你正準備訓練一個全新的網路,我建議您使用這種策略。因為現在你對與資料的分佈和網路引數還都一無所知,fixed策略方便調節,我們可以根據訓練情況包括loss和accuracy的值隨時調節我們的學習率。比如,我喜歡開始時將學習率設定一個較大的值(0.1-0.01之間),但是不能使loss爆掉呦。而後通過觀察loss和accuracy的值,比如兩者下降緩慢或不在下降,出現震盪的情況,就將學習率調小。也就是逐次減小的策略。
2、step 均勻分步策略
這個策略要結合引數stepsize使用,當迴圈次數達到stepsize的整數倍時lr=base_lr*gamma^(floor(iter/stepsize)).在這裡給大家說一個我最近使用這種策略所犯的錯誤。我從250000次開始繼續訓練我的網路,我將base_lr設定成0.001,stepsize設定成100000,gamma設定成0.1,我的本意是想讓訓練在300000次的時候學習率降到0.0001。結果呢?相信大家已經知道答案了學習率變成了1e-6.因此特別提醒你,如果你是在訓練中途將學習策略改變成step,請仔細計算stepsize的值。
3、multistep 多分步或不均勻分步
這種學習策略也是我們最近才看到有人使用,這種學習策略和step策略很相似。這種學習策略需要配合引數stepvalue使用,stepvalue可以在檔案中設定多個,如stepvalue=10000,stepvalue=20000,......,當迭代次數達到我們依次指定的stepvalue的值時,學習率就會根據公式重新計算。這種學習率策略我雖然嘗試的並不多,但是我發現他有一個很好的用處,就是我們在剛開始訓練網路時學習率一般設定較高,這樣loss和accuracy下降很快,一般前200000次兩者下降較快,後面可能就需要我們使用較小的學習率了。step策略由於過於平均,而loss和accuracy的下降率在整個訓練過程中又是一個不平均的過程,因此有時不是很合適。fixed手工調節起來又很麻煩,這時multistep可能就會派上用場了。
4、inv (英語太差不知是哪個單詞的縮寫)
其實,從公式中我們就可以看到,這種學習策略的優勢就在於它使得學習率在每一次迭代時都減小,但每次減小又都是一個非常小的數,這樣就省去的自己手動調節的麻煩。這種策略使用的也很普遍。
以上四種學習策略就是我見到的大家經常使用的策略。本來想把一些典型的引數也給大家貼出來,想了想還是算了,這留給大家了。給大家一個建議多看看Caffe中提供的solve.prototxt裡大神們是怎樣選擇引數的,這對我們很有幫助。