丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網賬號安全和更好的產品體驗,強烈建議使用更快更安全的瀏覽器
此為臨時鏈接,僅用于文章預覽,將在時失效
人工智能開發(fā)者 正文
發(fā)私信給AI研習社
發(fā)送

0

如何找到最優(yōu)學習率?

本文作者: AI研習社 2017-11-30 11:45
導語:經過了大量煉丹的同學都知道,超參數(shù)是一個非常玄乎的東西...

雷鋒網按:本文作者Sherlock,本文首發(fā)于作者的知乎專欄《深度煉丹》, 雷鋒網獲其授權發(fā)布。

經過了大量煉丹的同學都知道,超參數(shù)是一個非常玄乎的東西,比如batch size,學習率等,這些東西的設定并沒有什么規(guī)律和原因,論文中設定的超參數(shù)一般都是靠經驗決定的。但是超參數(shù)往往又特別重要,比如學習率,如果設置了一個太大的學習率,那么loss就爆了,設置的學習率太小,需要等待的時間就特別長,那么我們是否有一個科學的辦法來決定我們的初始學習率呢?

在這篇文章中,我會講一種非常簡單卻有效的方法來確定合理的初始學習率。

學習率的重要性

目前深度學習使用的都是非常簡單的一階收斂算法,梯度下降法,不管有多少自適應的優(yōu)化算法,本質上都是對梯度下降法的各種變形,所以初始學習率對深層網絡的收斂起著決定性的作用,下面就是梯度下降法的公式

如何找到最優(yōu)學習率?

這里如何找到最優(yōu)學習率?就是學習率,如果學習率太小,會導致網絡loss下降非常慢,如果學習率太大,那么參數(shù)更新的幅度就非常大,就會導致網絡收斂到局部最優(yōu)點,或者loss直接開始增加,如下圖所示。

如何找到最優(yōu)學習率?

學習率的選擇策略在網絡的訓練過程中是不斷在變化的,在剛開始的時候,參數(shù)比較隨機,所以我們應該選擇相對較大的學習率,這樣loss下降更快;當訓練一段時間之后,參數(shù)的更新就應該有更小的幅度,所以學習率一般會做衰減,衰減的方式也非常多,比如到一定的步數(shù)將學習率乘上0.1,也有指數(shù)衰減等。

這里我們關心的一個問題是初始學習率如何確定,當然有很多辦法,一個比較笨的方法就是從0.0001開始嘗試,然后用0.001,每個量級的學習率都去跑一下網絡,然后觀察一下loss的情況,選擇一個相對合理的學習率,但是這種方法太耗時間了,能不能有一個更簡單有效的辦法呢?

一個簡單的辦法

Leslie N. Smith 在2015年的一篇論文“Cyclical Learning Rates for Training Neural Networks”中的3.3節(jié)描述了一個非常棒的方法來找初始學習率,同時推薦大家去看看這篇論文,有一些非常啟發(fā)性的學習率設置想法。

這個方法在論文中是用來估計網絡允許的最小學習率和最大學習率,我們也可以用來找我們的最優(yōu)初始學習率,方法非常簡單。首先我們設置一個非常小的初始學習率,比如1e-5,然后在每個batch之后都更新網絡,同時增加學習率,統(tǒng)計每個batch計算出的loss。最后我們可以描繪出學習的變化曲線和loss的變化曲線,從中就能夠發(fā)現(xiàn)最好的學習率。

下面就是隨著迭代次數(shù)的增加,學習率不斷增加的曲線,以及不同的學習率對應的loss的曲線。

如何找到最優(yōu)學習率?

如何找到最優(yōu)學習率?

從上面的圖片可以看到,隨著學習率由小不斷變大的過程,網絡的loss也會從一個相對大的位置變到一個較小的位置,同時又會增大,這也就對應于我們說的學習率太小,loss下降太慢,學習率太大,loss有可能反而增大的情況。從上面的圖中我們就能夠找到一個相對合理的初始學習率,0.1。

之所以上面的方法可以work,因為小的學習率對參數(shù)更新的影響相對于大的學習率來講是非常小的,比如第一次迭代的時候學習率是1e-5,參數(shù)進行了更新,然后進入第二次迭代,學習率變成了5e-5,參數(shù)又進行了更新,那么這一次參數(shù)的更新可以看作是在最原始的參數(shù)上進行的,而之后的學習率更大,參數(shù)的更新幅度相對于前面來講會更大,所以都可以看作是在原始的參數(shù)上進行更新的。正是因為這個原因,學習率設置要從小變到大,而如果學習率設置反過來,從大變到小,那么loss曲線就完全沒有意義了。

實現(xiàn)

上面已經說明了算法的思想,說白了其實是非常簡單的,就是不斷地迭代,每次迭代學習率都不同,同時記錄下來所有的loss,繪制成曲線就可以了。下面就是使用PyTorch實現(xiàn)的代碼,因為在網絡的迭代過程中學習率會不斷地變化,而PyTorch的optim里面并沒有把learning rate的接口暴露出來,導致顯示修改學習率非常麻煩,所以我重新寫了一個更加高層的包mxtorch,借鑒了gluon的一些優(yōu)點,在定義層的時候暴露初始化方法,支持tensorboard,同時增加了大量的model zoo,包括inceptionresnetv2,resnext等等,提供預訓練權重,model zoo參考于Cadene的repo。目前這個repo剛剛開始,歡迎有興趣的小伙伴加入我。

下面就是部分代碼,近期會把找學習率的代碼合并到mxtorch中。這里使用的數(shù)據集是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()
   lr.append(optimizer.learning_rate)
   losses.append(loss.data[0])
   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,而上面的論文別出心裁,提出了一種循環(huán)變化學習率的思想,能夠更快的達到最優(yōu)解,非常具有啟發(fā)性,推薦大家去閱讀閱讀。

雷峰網版權文章,未經授權禁止轉載。詳情見轉載須知

如何找到最優(yōu)學習率?

分享:
相關文章

編輯

聚焦數(shù)據科學,連接 AI 開發(fā)者。更多精彩內容,請訪問:yanxishe.com
當月熱門文章
最新文章
請?zhí)顚懮暾埲速Y料
姓名
電話
郵箱
微信號
作品鏈接
個人簡介
為了您的賬戶安全,請驗證郵箱
您的郵箱還未驗證,完成可獲20積分喲!
請驗證您的郵箱
立即驗證
完善賬號信息
您的賬號已經綁定,現(xiàn)在您可以設置密碼以方便用郵箱登錄
立即設置 以后再說