<label id="jgr5k"></label>
    <legend id="jgr5k"><track id="jgr5k"></track></legend>

    <sub id="jgr5k"></sub>
  1. <u id="jgr5k"></u>
      久草国产视频,91资源总站,在线免费看AV,丁香婷婷社区,久久精品99久久久久久久久,色天使av,无码探花,香蕉av在线
      您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號安全和更好的產(chǎn)品體驗,強(qiáng)烈建議使用更快更安全的瀏覽器
      此為臨時鏈接,僅用于文章預(yù)覽,將在時失效
      人工智能開發(fā)者 正文
      發(fā)私信給AI研習(xí)社
      發(fā)送

      0

      如何找到最優(yōu)學(xué)習(xí)率?

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

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

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

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

      學(xué)習(xí)率的重要性

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

      如何找到最優(yōu)學(xué)習(xí)率?

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

      如何找到最優(yōu)學(xué)習(xí)率?

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

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

      一個簡單的辦法

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

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

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

      如何找到最優(yōu)學(xué)習(xí)率?

      如何找到最優(yōu)學(xué)習(xí)率?

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

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

      實(shí)現(xiàn)

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

      下面就是部分代碼,近期會把找學(xué)習(xí)率的代碼合并到mxtorch中。這里使用的數(shù)據(jù)集是kaggle上的dog breed,使用預(yù)訓(xùn)練的resnet50,ScheduledOptim的源碼點(diǎn)這里

      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

      通過上面的例子我們能夠有一個非常有效的方法尋找初始學(xué)習(xí)率,同時在我們的認(rèn)知中,學(xué)習(xí)率的策略都是不斷地做decay,而上面的論文別出心裁,提出了一種循環(huán)變化學(xué)習(xí)率的思想,能夠更快的達(dá)到最優(yōu)解,非常具有啟發(fā)性,推薦大家去閱讀閱讀。

      雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。

      如何找到最優(yōu)學(xué)習(xí)率?

      分享:
      相關(guān)文章

      編輯

      聚焦數(shù)據(jù)科學(xué),連接 AI 開發(fā)者。更多精彩內(nèi)容,請訪問:yanxishe.com
      當(dāng)月熱門文章
      最新文章
      請?zhí)顚懮暾埲速Y料
      姓名
      電話
      郵箱
      微信號
      作品鏈接
      個人簡介
      為了您的賬戶安全,請驗證郵箱
      您的郵箱還未驗證,完成可獲20積分喲!
      請驗證您的郵箱
      立即驗證
      完善賬號信息
      您的賬號已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
      立即設(shè)置 以后再說
      主站蜘蛛池模板: 无码人妻精品丰满熟妇区| 欧美激情肉欲高潮视频| 久久婷婷激情| 亚洲成人aⅤ| 国产精品污双胞胎在线观看| 四虎成人精品国产永久免费 | 给我播放片在线观看| 亚洲国产人成在线观看69网站| 国产麻豆天美果冻无码视频| 国产AV影片麻豆精品传媒| 一本色道久久综合中文字幕| 国产av夜夜欢一区二区三区| 无码久久久久久| 蜜臀av在线观看| 亚洲小视频| 国产精品成人嫩草影院| 亚洲精品无码专区| 亚洲成色www久久网站夜月 | 灵台县| 无码福利一区二区三区| 色www88| 亚洲国产黄色| 亚洲av激情综合在线| 国产激爽大片高清在线观看| 大桥久未无码吹潮在线观看 | 岳乳丰满一区二区三区| 日韩偷拍电影| 少妇精品视频| 亚洲鲁丝片AV无码多人| 国产喷水1区2区3区咪咪爱AV| 国产一级小视频| 午夜一区欧美二区高清三区 | 亚洲熟妇丰满xxxxx| 性夜黄a爽影免费看| 国产高清在线精品一区免费| 亚洲精品久久中文字幕| jizzjizz日本人妻| av天堂永久资源网| 亚洲精品自拍在线视频| 久久久久人妻精品一区三寸 | 成人av无码一区二区三区|