這個方法在**中是用來估計網路允許的最小學習率和最大學習率,我們也可以用來找我們的最優初始學習率,方法非常簡單。首先我們設定乙個非常小的初始學習率,比如1e-5,然後在每個batch之後都更新網路,同時增加學習率,統計每個batch計算出的loss。最後我們可以描繪出學習的變化曲線和loss的變化曲線,從中就能夠發現最好的學習率。
下面就是隨著迭代次數的增加,學習率不斷增加的曲線,以及不同的學習率對應的loss的曲線。
從上面的可以看到,隨著學習率由小不斷變大的過程,網路的loss也會從乙個相對大的位置變到乙個較小的位置,同時又會增大,這也就對應於我們說的學習率太小,loss下降太慢,學習率太大,loss有可能反而增大的情況。從上面的圖中我們就能夠找到乙個相對合理的初始學習率,0.1。
之所以上面的方法可以work,因為小的學習率對引數更新的影響相對於大的學習率來講是非常小的,比如第一次迭代的時候學習率是1e-5,引數進行了更新,然後進入第二次迭代,學習率變成了5e-5,引數又進行了更新,那麼這一次引數的更新可以看作是在最原始的引數上進行的,而之後的學習率更大,引數的更新幅度相對於前面來講會更大,所以都可以看作是在原始的引數上進行更新的。正是因為這個原因,學習率設定要從小變到大,而如果學習率設定反過來,從大變到小,那麼loss曲線就完全沒有意義了。
實現上面已經說明了演算法的思想,說白了其實是非常簡單的,就是不斷地迭代,每次迭代學習率都不同,同時記錄下來所有的loss,繪製成曲線就可以了。下面就是使用pytorch實現的**,因為在網路的迭代過程中學習率會不斷地變化,而pytorch的optim裡面並沒有把learning rate的介面暴露出來,導致顯示修改學習率非常麻煩,所以我重新寫了乙個更加高層的包mxtorch,借鑑了gluon的一些優點,在定義層的時候暴露初始化方法,支援tensorboard,同時增加了大量的model zoo,包括inceptionresnetv2,resnext等等,提供預訓練權重,model zoo參考於cadene的repo。目前這個repo剛剛開始,歡迎有興趣的小夥伴加入我。
下面就是部分**,近期會把找學習率的**合併到mxtorch中。這裡使用的資料集是kaggle上的dog breed,使用預訓練的resnet50,scheduledoptim的原始碼點這裡。
criterion = torch.nn.crossentropyloss()net = model_zoo.resnet50(pretrained=true)net.fc = nn.linear(2048, 120)with torch.cuda.device(0):
net = net.cuda()basic_optim = torch.optim.sgd(net.parameters(), lr=1e-5)optimizer = scheduledoptim(basic_optim)lr_mult = (1 / 1e-5) ** (1 / 100)lr = losses = best_loss = 1e9for data, label in train_data:
with torch.cuda.device(0):
data = variable(data.cuda())
label = variable(label.cuda())
# forward
out = net(data)
loss = criterion(out, label)
# backward
optimizer.zero_grad()
loss.backward()
optimizer.step()
optimizer.set_learning_rate(optimizer.learning_rate * lr_mult)
if loss.data[0] < best_loss:
best_loss = loss.data[0]
if loss.data[0] > 4 * best_loss or optimizer.learning_rate > 1.:
breakplt.figure()plt.xticks(np.log([1e-5, 1e-4, 1e-3, 1e-2, 1e-1, 1]), (1e-5, 1e-4, 1e-3, 1e-2, 1e-1, 1))plt.xlabel('learning rate')plt.ylabel('loss')plt.plot(np.log(lr), losses)plt.show()plt.figure()plt.xlabel('num iterations')plt.ylabel('learning rate')plt.plot(lr)
one more thing
通過上面的例子我們能夠有乙個非常有效的方法尋找初始學習率,同時在我們的認知中,學習率的策略都是不斷地做decay,而上面的**別出心裁,提出了一種迴圈變化學習率的思想,能夠更快的達到最優解,非常具有啟發性,推薦大家去閱讀閱讀。
Dijkstra演算法 尋找最優路徑
一般情況下,dijkstra演算法是解決單源最短路徑問題的,也就是在已知終點時,求出圖中的每個點到終點的最短距離,但是一般只記錄距離值,不會記錄具體的路徑,即怎麼走能從起點通過最短路徑來到達終點 思路就是引入乙個path表,其中path x 表示,如果從x節點要到達終點的最短路徑,在x節點下一步應該...
如何估算深度神經網路的最優學習率
學習率如何影響訓練?from 深度學習模型通常由隨機梯度下降演算法進行訓練。隨機梯度下降演算法有許多變形 例如 adam rmsprop adagrad 等等。這些演算法都需要你設定學習率。學習率決定了在乙個小批量 mini batch 中權重在梯度方向要移動多遠。如果學習率很低,訓練會變得更加可靠...
最優停止理論的推導 利用最優停止理論,尋找你的真愛
故事要從蘇格拉底他老人家開始說起 一天,蘇格拉底帶領幾個 來到一塊長滿麥穗的田地邊,對 們說 你們去麥地裡摘乙個最大的麥穗,只許進,不許退。第乙個 走幾步看見一支又大又漂亮的麥穗,高興地摘下了。但是他繼續前進時,發現前面有許多比他摘的那支大,只得遺憾地走完了全程。第二個 吸取了教訓 每當他要摘時,總...