<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          實操教程|稱霸Kaggle的十大深度學習技巧

          共 7932字,需瀏覽 16分鐘

           ·

          2022-04-17 16:56

          點擊下方卡片,關注“新機器視覺”公眾號

          重磅干貨,第一時間送達

          作者丨Samuel Lynn-Evans
          來源丨量子位
          編輯丨極市平臺

          導讀

          ?

          是什么秘訣讓新手們在短期內(nèi)快速掌握并能構建最先進的DL算法?一位名叫塞繆爾的法國學員總結了十條經(jīng)驗。

          在各種Kaggle競賽的排行榜上,都有不少剛剛進入深度學習領域的程序員,其中大部分有一個共同點:

          都上過Fast.ai的課程。

          這些免費、重實戰(zhàn)的課程非常鼓勵學生去參加Kaggle競賽,檢驗自己的能力。當然,也向?qū)W生們傳授了不少稱霸Kaggle的深度學習技巧。

          是什么秘訣讓新手們在短期內(nèi)快速掌握并能構建最先進的DL算法?一位名叫塞繆爾(Samuel Lynn-Evans)的法國學員總結了十條經(jīng)驗。

          他這篇文章發(fā)表在FloydHub官方博客上,因為除了來自Fast.ai的技巧之外,他還用了FloydHub的免設置深度學習GPU云平臺。

          接下來,我們看看他從fast.ai學來的十大技藝:

          1. 使用Fast.ai庫

          這一條最為簡單直接。

          from?fast.ai?import?*??

          Fast.ai庫是一個新手友好型的深度學習工具箱,而且是目前復現(xiàn)最新算法的首要之選。

          每當Fast.ai團隊及AI研究者發(fā)現(xiàn)一篇有趣論文時,會在各種數(shù)據(jù)集上進行測試,并確定合適的調(diào)優(yōu)方法。他們會把效果較好的模型實現(xiàn)加入到這個函數(shù)庫中,用戶可以快速載入這些模型。

          于是,F(xiàn)ast.ai庫成了一個功能強大的工具箱,能夠快速載入一些當前最新的算法實現(xiàn),如帶重啟的隨機梯度下降算法、差分學習率和測試時增強等等,這里不逐一提及了。

          下面會分別介紹這些技術,并展示如何使用Fast.ai庫來快速使用它們。

          這個函數(shù)庫是基于PyTorch構建,構建模型時可以流暢地使用。

          Fast.ai庫地址:
          https://github.com/fastai/fastai

          2. 使用多個而不是單一學習率

          差分學習率(Differential Learning rates)意味著在訓練時變換網(wǎng)絡層比提高網(wǎng)絡深度更重要。

          基于已有模型來訓練深度學習網(wǎng)絡,這是一種被驗證過很可靠的方法,可以在計算機視覺任務中得到更好的效果。

          大部分已有網(wǎng)絡(如Resnet、VGG和Inception等)都是在ImageNet數(shù)據(jù)集訓練的,因此我們要根據(jù)所用數(shù)據(jù)集與ImageNet圖像的相似性,來適當改變網(wǎng)絡權重。

          在修改這些權重時,我們通常要對模型的最后幾層進行修改,因為這些層被用于檢測基本特征(如邊緣和輪廓),不同數(shù)據(jù)集有著不同基本特征。

          首先,要使用Fast.ai庫來獲得預訓練的模型,代碼如下:

          from?fastai.conv_learner?import?*

          #?import?library?for?creating?learning?object?for?convolutional?#networks
          model?=?VVG16()

          #?assign?model?to?resnet,?vgg,?or?even?your?own?custom?model
          PATH?=?'./folder_containing_images'?
          data?=?ImageClassifierData.from_paths(PATH)

          #?create?fast?ai?data?object,?in?this?method?we?use?from_paths?where?
          #?inside?PATH?each?image?class?is?separated?into?different?folders

          learn?=?ConvLearner.pretrained(model,?data,?precompute=True)

          #?create?a?learn?object?to?quickly?utilise?state?of?the?art
          #?techniques?from?the?fast?ai?library

          創(chuàng)建學習對象之后(learn object),通過快速凍結前面網(wǎng)絡層并微調(diào)后面網(wǎng)絡層來解決問題:

          learn.freeze()

          #?freeze?layers?up?to?the?last?one,?so?weights?will?not?be?updated.

          learning_rate?=?0.1
          learn.fit(learning_rate,?epochs=3)

          #?train?only?the?last?layer?for?a?few?epochs

          當后面網(wǎng)絡層產(chǎn)生了良好效果,我們會應用差分學習率來改變前面網(wǎng)絡層。在實際中,一般將學習率的縮小倍數(shù)設置為10倍:

          learn.unfreeze()

          #?set?requires_grads?to?be?True?for?all?layers,?so?they?can?be?updated

          learning_rate?=?[0.001,?0.01,?0.1]
          #?learning?rate?is?set?so?that?deepest?third?of?layers?have?a?rate?of?0.001,?#?middle?layers?have?a?rate?of?0.01,?and?final?layers?0.1.

          learn.fit(learning_rate,?epochs=3)
          #?train?model?for?three?epoch?with?using?differential?learning?rates

          3. 如何找到合適的學習率

          學習率是神經(jīng)網(wǎng)絡訓練中最重要的超參數(shù),沒有之一,但之前在實際應用中很難為神經(jīng)網(wǎng)絡選擇最佳的學習率。

          Leslie Smith的一篇周期性學習率論文發(fā)現(xiàn)了答案,這是一個相對不知名的發(fā)現(xiàn),直到它被Fast.ai課程推廣后才逐漸被廣泛使用。

          這篇論文是:Cyclical Learning Rates for Training Neural Networks

          https://arxiv.org/abs/1506.01186

          在這種方法中,我們嘗試使用較低學習率來訓練神經(jīng)網(wǎng)絡,但是在每個批次中以指數(shù)形式增加,相應代碼如下:

          learn.lr_find()
          #?run?on?learn?object?where?learning?rate?is?increased??exponentially

          learn.sched.plot_lr()
          #?plot?graph?of?learning?rate?against?iterations
          △ 每次迭代后學習率以指數(shù)形式增長

          同時,記錄每個學習率對應的Loss值,然后畫出學習率和Loss值的關系圖:

          learn.sched.plot()
          #?plots?the?loss?against?the?learning?rate
          △ 找出Loss值在下降但仍未穩(wěn)定的點

          通過找出學習率最高且Loss值仍在下降的值來確定最佳學習率。在上述情況中,該值將為0.01。

          4. 余弦退火

          在采用批次隨機梯度下降算法時,神經(jīng)網(wǎng)絡應該越來越接近Loss值的全局最小值。當它逐漸接近這個最小值時,學習率應該變得更小來使得模型不會超調(diào)且盡可能接近這一點。

          余弦退火(Cosine annealing)利用余弦函數(shù)來降低學習率,進而解決這個問題,如下圖所示:

          △ 余弦值隨著x增大而減小

          從上圖可以看出,隨著x的增加,余弦值首先緩慢下降,然后加速下降,再次緩慢下降。這種下降模式能和學習率配合,以一種十分有效的計算方式來產(chǎn)生很好的效果。

          learn.fit(0.1,?1)
          #?Calling?learn?fit?automatically?takes?advantage?of?cosine?annealing

          我們可以用Fast.ai庫中的**learn.fit()**函數(shù),來快速實現(xiàn)這個算法,在整個周期中不斷降低學習率,如下圖所示:

          △ 在一個需要200次迭代的周期中學習率不斷降低

          同時,在這種方法基礎上,我們可以進一步引入重啟機制。

          5. 帶重啟的SGD算法

          在訓練時,梯度下降算法可能陷入局部最小值,而不是全局最小值。

          △ 陷入局部最小值的梯度下降算法

          梯度下降算法可以通過突然提高學習率,來“跳出”局部最小值并找到通向全局最小值的路徑。這種方式稱為帶重啟的隨機梯度下降方法(stochastic gradient descent with restarts,?SGDR),這個方法在Loshchilov和Hutter的ICLR論文中展示出了很好的效果。

          這篇論文是:SGDR: Stochastic Gradient Descent with Warm Restarts
          https://arxiv.org/abs/1608.03983

          用Fast.ai庫可以快速導入SGDR算法。當調(diào)用learn.fit(learning_rate, epochs)函數(shù)時,學習率在每個周期開始時重置為參數(shù)輸入時的初始值,然后像上面余弦退火部分描述的那樣,逐漸減小。

          每當學習率下降到最小點,在上圖中為每100次迭代,我們稱為一個循環(huán)。

          cycle_len?=?1
          #?decide?how?many?epochs?it?takes?for?the?learning?rate?to?fall?to
          #?its?minimum?point.?In?this?case,?1?epoch

          cycle_mult=2
          #?at?the?end?of?each?cycle,?multiply?the?cycle_len?value?by?2

          learn.fit(0.1,?3,?cycle_len=2,?cycle_mult=2)
          #?in?this?case?there?will?be?three?restarts.?The?first?time?with
          #?cycle_len?of?1,?so?it?will?take?1?epoch?to?complete?the?cycle.
          #?cycle_mult=2?so?the?next?cycle?with?have?a?length?of?two?epochs,?
          #?and?the?next?four.
          △ 每個循環(huán)所包含的周期都是上一個循環(huán)的2倍

          利用這些參數(shù),和使用差分學習率,這些技巧是Fast.ai用戶在圖像分類問題上取得良好效果的關鍵。

          Fast.ai論壇有個帖子專門討論Cycle_mult和cycle_len函數(shù),地址在這里:
          http://forums.fast.ai/t/understanding-cycle-len-and-cycle-mult/9413/8

          更多關于學習率的詳細內(nèi)容可參考這個Fast.ai課程:
          http://course.fast.ai/lessons/lesson2.html

          6. 人格化你的激活函數(shù)

          Softmax只喜歡選擇一樣東西;

          Sigmoid想知道你在[-1, 1]區(qū)間上的位置,并不關心你超出這些值后的增加量;

          Relu是一名俱樂部保鏢,要將負數(shù)拒之門外。

          ……

          以這種思路對待激活函數(shù),看起來很愚蠢,但是安排一個角色后能確保把他們用到正確任務中。

          正如fast.ai創(chuàng)始人Jeremy Howard指出,不少學術論文中也把Softmax函數(shù)用在多分類問題中。在DL學習過程中,我也看到它在論文和博客中多次使用不當。

          7. 遷移學習在NLP問題中非常有效

          正如預訓練好的模型在計算機視覺任務中很有效一樣,已有研究表明,自然語言處理(NLP)模型也可以從這種方法中受益。

          在Fast.ai第4課中,Jeremy Howard用遷移學習方法建立了一個模型,來判斷IMDB上的電影評論是積極的還是消極的。

          這種方法的效果立竿見影,他所達到的準確率超過了Salesforce論文中展示的所有先前模型:
          https://einstein.ai/research/learned-in-translation-contextualized-word-vectors。

          △ 預先存在的架構提供了最先進的NLP性能

          這個模型的關鍵在于先訓練模型來獲得對語言的一些理解,然后再使用這種預訓練好的模型作為新模型的一部分來分析情緒。

          為了創(chuàng)建第一個模型,我們訓練了一個循環(huán)神經(jīng)網(wǎng)絡(RNN)來預測文本序列中的下個單詞,這稱為語言建模。當訓練后網(wǎng)絡的準確率達到一定值,它對每個單詞的編碼模式就會傳遞給用于情感分析的新模型。

          在上面的例子中,我們看到這個語言模型與另一個模型集成后用于情感分析,但是這種方法可以應用到其他任何NLP任務中,包括翻譯數(shù)據(jù)提取

          而且,計算機視覺中的一些技巧,也同樣適用于此,如上面提到的凍結網(wǎng)絡層和使用差分學習率,在這里也能取得更好的效果。

          這種方法在NLP任務上的使用涉及很多細節(jié),這里就不貼出代碼了,可訪問相應課程和代碼。

          課程:
          http://course.fast.ai/lessons/lesson4.html

          代碼:https://github.com/fastai/fastai/blob/master/courses/dl1/lesson4-imdb.ipynb

          8. 深度學習在處理結構化數(shù)據(jù)上的優(yōu)勢

          Fast.ai課程中展示了深度學習在處理結構化數(shù)據(jù)上的突出表現(xiàn),且無需借助特征工程以及領域內(nèi)的特定知識。

          這個庫充分利用了PyTorch中embedding函數(shù),允許將分類變量快速轉(zhuǎn)換為嵌入矩陣。

          他們展示出的技術比較簡單直接,只需將分類變量轉(zhuǎn)換為數(shù)字,然后為每個值分配嵌入向量:

          △ 一周中的每一天都嵌入了四個值

          在這類任務上,傳統(tǒng)做法是創(chuàng)建虛擬變量,即進行一次熱編碼。與之相比,這種方式的優(yōu)點是用四個數(shù)值代替一個數(shù)值來描述每一天,因此可獲得更高的數(shù)據(jù)維度和更豐富的關系。

          這種方法在Rossman Kaggle比賽中獲得第三名,惜敗于兩位利用專業(yè)知識來創(chuàng)建許多額外特征的領域?qū)<摇?/p>

          相關課程:
          http://course.fast.ai/lessons/lesson4.html

          代碼:
          https://github.com/fastai/fastai/blob/master/courses/dl1/lesson3-rossman.ipynb

          這種用深度學習來減少對特征工程依賴的思路,也被Pinterest證實過。他也提到過,他們正努力通過深度學習模型,期望用更少的工作量來獲得更好的效果。

          9. 更多內(nèi)置函數(shù):Dropout層、尺寸設置、TTA

          4月30日,F(xiàn)ast.ai團隊在斯坦福大學舉辦的DAWNBench競賽中,贏得了基于Imagenet和CIFAR10的分類任務。在Jeremy的奪冠總結中,他將這次成功歸功于fast.ai庫中的一些額外函數(shù)。

          其中之一是Dropout層,由Geoffrey Hinton兩年前在一篇開創(chuàng)性的論文中提出。它最初很受歡迎,但在最近的計算機視覺論文中似乎有所忽略。這篇論文是:

          Dropout: A Simple Way to Prevent Neural Networks from Overfitting:

          https://www.cs.toronto.edu/~hinton/absps/JMLRdropout.pdf

          然而,PyTorch庫使它的實現(xiàn)變得很簡單,用Fast.ai庫加載它就更容易了。

          △ 空格表示Dropout函數(shù)的作用點

          Dropout函數(shù)能減弱過擬合效應,因此要在CIFAR-10這樣一個相對較小的數(shù)據(jù)集上取勝,這點很重要。在創(chuàng)建learn對象時,F(xiàn)ast.ai庫會自動加入dropout函數(shù),同時可使用ps變量來修改參數(shù),如下所示:

          learn?=?ConvLearner.pretrained(model,?data,?ps=0.5,?precompute=True)
          #?creates?a?dropout?of?0.5?(i.e.?half?the?activations)?on?test?dataset.?
          #?This?is?automatically?turned?off?for?the?validation?set

          有一種很簡單有效的方法,經(jīng)常用來處理過擬合效應和提高準確性,它就是訓練小尺寸圖像,然后增大尺寸再次訓練相同模型。

          #?create?a?data?object?with?images?of?sz?*?sz?pixels?
          def?get_data(sz):?
          ????tmfs?=?tfms_from_model(model,?sz)
          ????#?tells?what?size?images?should?be,?additional?transformations?such
          ????#?image?flips?and?zooms?can?easily?be?added?here?too

          ????data?=?ImageClassifierData.from_paths(PATH,?tfms=tfms)
          ????#?creates?fastai?data?object?of?create?size

          ????return?data

          learn.set_data(get_data(299))
          #?changes?the?data?in?the?learn?object?to?be?images?of?size?299
          #?without?changing?the?model.

          learn.fit(0.1,?3)
          #?train?for?a?few?epochs?on?larger?versions?of?images,?avoiding?overfitting

          還有一種先進技巧,可將準確率提高若干個百分點,它就是測試時增強(test time augmentation,?TTA)。這里會為原始圖像造出多個不同版本,包括不同區(qū)域裁剪和更改縮放程度等,并將它們輸入到模型中;然后對多個版本進行計算得到平均輸出,作為圖像的最終輸出分數(shù),可調(diào)用learn.TTA()來使用該算法。

          preds,?target?=?learn.TTA()

          這種技術很有效,因為原始圖像顯示的區(qū)域可能會缺少一些重要特征,在模型中輸入圖像的多個版本并取平均值,能解決上述問題。

          10. 創(chuàng)新力很關鍵

          在DAWNBench比賽中,F(xiàn)ast.ai團隊提出的模型不僅速度最快,而且計算成本低。要明白,要構建成功的DL應用,不只是一個利用大量GPU資源的計算任務,而應該是一個需要創(chuàng)造力、直覺和創(chuàng)新力的問題。

          本文中討論的一些突破,包括Dropout層、余弦退火和帶重啟的SGD方法等,實際上是研究者針對一些問題想到的不同解決方式。與簡單地增大訓練數(shù)據(jù)集相比,能更好地提升準確率

          硅谷的很多大公司有大量GPU資源,但是,不要認為他們的先進效果遙不可及,你也能靠創(chuàng)新力提出一些新思路,來挑戰(zhàn)效果排行榜。

          事實上,有時計算力的局限也是一種機會,因為需求是創(chuàng)新的動力源泉。

          關于作者

          Samuel Lynn-Evans過去10年一直在教授生命科學課程,注意到機器學習在科學研究中的巨大潛力后,他開始在巴黎42學校學習人工智能,想將NLP技術應用到生物學和醫(yī)學問題中。

          原文:https://blog.floydhub.com/ten-techniques-from-fast-ai/


          本文僅做學術分享,如有侵權,請聯(lián)系刪文。

          —THE END—
          瀏覽 28
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产精品操| 国产精品伊人 | 亚洲成人免费 | 久久视频网站 | 久久九九热re6这里有精品 |