當前位置:
首頁 > 知識 > 在 fast.ai 課堂上,我總結的 8 個深度學習最佳實踐

在 fast.ai 課堂上,我總結的 8 個深度學習最佳實踐

本文為雷鋒字幕組編譯的技術博客,原標題 8 Deep Learning Best Practices I Learned About in 2017,作者為 Brian Muhia。

翻譯 | 付騰 林立宏 整理 | 凡江

在 2017 年我感到最開心的事情就是,我更多地通過實踐來參與最新 AI 的發展,學到了很多的數學知識。這很有趣,但是卻沒有接觸什麼實踐項目。因此,也沒有什麼東西能體現我付出的努力。

為了彌補這點,在四月份,我在 AI Grant(https://aigrant.org/)網站上申請了一個 AI 項目,目標是用 FastText(https://fasttext.cc/) 的 skip-gram 模型來為肯亞語建模。我獲得了初選的決賽資格,但是,卻沒有笑到最後。

1. 在已經訓練好的模型上構建世界級的圖像分類器。

2. 通過對數據進行調查,來構建語言模型,進而建立情感分析工具。

3. 如何在結構化的數據集上進行深度學習。

4. 如何通過協同篩選和深度學習來構建推薦引擎。

所有這些都是在一個更夠提供非常高生產效率的開發界面:Jupyter Notebook 來實現的,它目前是由 fastai(https://github.com/fastai/fastai) 的深度學習庫支持的,而這個庫本身又是由 PyTorch 所支持的。

來看看這裡的八個技術。在每個具體案例下,我會結合 fast.ai 的代碼片段來大概的列出其基本的原理,並且在括弧中指出哪些技術是比較適用的(這點很有用,無論你是用深度學習來做圖像識別或者分類,NLP,給結構化數據建模或者協同篩選),又或者對更加具體的,某些可以應用深度學習來學習的特殊類型數據進行討論。在這個課程中,圖像識別的課程使用 Kaggle challenges 的案例來做實踐的 1. 是貓還是狗?狗品種的鑒別。(http://t.cn/ROAno5h) 2. 地球數據,如何從太空中看懂亞馬遜雨林。(http://t.cn/RXS17EJ)

這是互聯網時代,我要自我挑戰一下。克隆一下 狗 vs 貓 的形式,不過換成 蜘蛛 vs 蠍子。嗯,蜘蛛 vs 蠍子。我從 Google 圖片 上搜索了關鍵詞 「蜘蛛」 和 「沙漠蠍」,然後抓取下載了大約 1500 張左右的圖片。我當然是用程序來自動抓取。我可不想自動的成為資深的蜘蛛學專家,然後右鍵點點點。。。

我先是對數據進行清理,去除那些非 jpg 格式的圖片,非圖片文件和沒有擴展名的圖片。當我完成這些雜項清理之後,我有了大約 815 張可用圖片。每個類 [蜘蛛,蠍子],有 290 張圖片作為訓練集,然後 118 張蜘蛛和 117 張蠍子用來做測試 / 驗證集。令我驚訝的是(對我而言,尤其是我看到結果後),這個模型很成功!這個模型達到了 95% 的準確率。

from fastai.imports import *

from fastai.transforms import *

from fastai.conv_learner import *

from fastai.model import *

from fastai.dataset import *

from fastai.sgdr import *

from fastai.plots import *

sz=224 # image size

# architecture, from https://github.com/facebookresearch/ResNeXt

arch=resnext50

# batch size

bs=64

PATH = "data/spiderscorpions/"

# Enable data augmentation, and precompute=True

# transforms_side_on flips the image along the vertical axis

# max_zoom: 1.1 makes images up to 10% larger

tfms = tfms_from_model(arch, sz, aug_tfms=transforms_side_on, max_zoom=1.1)

data=ImageClassifierData.from_paths(PATH,tfms=tfms)

learn = ConvLearner.pretrained(arch, data, precompute=True)

# Use lr_find() to find highest learning rate where loss is still clearly improving

learn.lr_find()

# check the plot to find the learning rate where the losss is still improving

# assuming the optimal learning rate is 0.01, train for 3 epochs

learn.fit(0.01, 3)

# train last layer with data augmentation (i.e. precompute=False) for 2-3 epochs with cycle_len=1

learn.precompute=False

learn.fit(1e-2, 3, cycle_len=1)

# unfreeze all layers, thus opening up resnext50"s original ImageNet weights for the

# features in the two spider and scorpion classes

learn.unfreeze()

lr = 0.01

# fastai groups the layers in all of the pre-packaged pretrained convolutional networks into three groups

# retrain the three layer groups in resnext50 using these learning rates for each group

# We set earlier layers to 3x-10x lower learning rate than next higher layer

lrs = np.array([lr/9, lr/3, lr])

learn.fit(lrs, 3)

# Use lr_find() again

learn.lr_find()

learn.fit(1e-2, 3, cycle_len=1, cycle_mult=2)

log_preds,y = learn.TTA()

preds = np.mean(np.exp(log_preds),0)

accuracy(log_preds, y)

1. 通過微調 VGG-16 和 ResNext50 來學習 (計算機視覺和圖像分類)

對於圖像分類的工作,一個神經網路的架構已經在多個挑戰中測試過,可以得到非常好的結果了。針對特定的問題,你可以通過微調模型從而得到非常具有里程碑的結果。殘留網路 ResNext50(https://arxiv.org/abs/1611.05431) 就是一個例子,一個 50 層的卷積神經網路。它接受了 1000 種 ImageNet 挑戰的訓練, 而且因為它表現得非常好,所以從圖像數據中提取的特徵足以被重用 。要讓它在我的問題上使用,我需要做的是替換最後一層神經網路,輸出一個 1000 維的向量作為 ImangeNet 的預測,並帶有一層網路輸出一個 2 維向量。在上面代碼片段中,這兩個輸出被特定放在稱為 PATH 的文件夾。對於蜘蛛 VS 蠍子的挑戰,有以下的內容:

注意到 train 文件夾的兩個內容都是文件夾,每一個都包含了 290 兩張圖片。

一個微調流程示意圖展示如下,重新訓練最後一層 10 維的神經網路。

圖片從這裡(http://t.cn/REoLOof)獲取

2. 周期學習率(通常適用)

學習率可能是用於訓練調整深度神經網路最重要的超參數(http://t.cn/REoLgrp)。通常在非自適應環境中完成的(即不使用 Adam,AdaDelta 或其變體),而是由 DL 從業者 / 研究者同時運行多個實驗,每個實驗在學習速率之間具有小的差異。如果你有一個非常大的數據集,這需要花費非常多的時間。如果你對用隨機矩陣建立直覺的方法缺乏經驗,很容易出錯。然而,在 2015,美國海軍研究實驗室的 Leslie N. Smith ,找到了一種自動搜索最佳學習率的方法(http://arxiv.org/abs/1506.01186),從一個非常小的值開始,通過網路運行幾個小批量,調整學習率,同時跟蹤損失的變化,直到損失開始下降。在 fast.ai 上面兩篇博客解釋了周期學習率的方法,分別在這裡(http://t.cn/REoLgrp)和這裡(http://t.cn/REoyyhN)。

在 fast.ai,你可以利用通過在學習者對象上運行 lr_find() 來利用學習速率退火的優勢, 運行 sched.plot() 以確定與最佳學習率一致的點 ,截圖如下:

0.1 seems like a good learning rate

從周期性學習率論文摘錄中顯示,它表現更好, 達到最高的準確度,比學習速率指數衰減的方法快兩倍以上。

圖一:Smith (2017) 「使用周學習率訓練神經網路」

3. 帶重新啟動的隨機梯度下降(通常適用)

Fig. 2: SGD vs. snapshot ensembles (Huang et al., 2017,https://arxiv.org/abs/1704.00109)

另外一個方法來加速隨機梯度下降,包含了逐漸降低學習率的訓練過程。 這有助於注意到學習速度的變化與損失的改善是否一致 。當你接近最優的權重,你要採取更小的步驟,因為如果你採取大步驟,你可能會跳過錯誤表面的最佳區域。如果學習率和損失之間的關係是不穩定的,比如學習率一個小的改變,就會導致損失變化很大,那我們就處在一個不穩定的區域,就像上圖所示。那麼此時策略變成周期性地提高學習率。這裡的 「周期」 是指提高學習率的次數。這是周期學習率的流程。在 fast.ai,將參數 cycle_len 和 cycle_mult 傳入到 learner.fit,在上圖中,學習率被重置了 3 次。在使用正常的學習速率時間表時,通常需要更長的時間才能找到最佳的損失,開發人員等待所有的訓練周期完成後,再手動嘗試不同的學習速率。

4. 數據增加(計算機視覺和圖像分類 - 現在)

數據增加是一個在你已有的訓練和測試數據集中簡單的方法。比如圖片,這取決於你手頭的學習問題,並取決於數據集中圖像的對稱數量。比如說蜘蛛 VS 蠍子挑戰,在數據集中的很多圖片可以垂直翻轉,仍然顯示動物,沒有奇怪的扭曲,這被稱為:transforms_side_on. 比如:

5. 測試時間增加 (計算機視覺和圖像分類 - 現在)

我們在推理的時候使用數據增加(或者時間,這由此而得名)。在推理時間時,你只是在做預測。你可以用測試集中的單個圖像來完成,但是如果在被訪問的測試集中隨機生成每個圖像的幾個增量,這個過程會變得更加健壯。在 fast.ai 中,每個測試圖像的 4 個隨機增量用於預測,並將這些預測的平均值用作該圖像的預測。

6. 用預訓練的循環神經網路替換詞向量

一種獲得世界級的情緒分析框架的方法, 不使用詞向量,而是通過使用整個你想要訓練的數據集進行分析,從中建立一個深層循環的神經網路語言模型。當模型具有高精度時,保存模型的編碼器,並使用從編碼器獲得的嵌入來構建情感分析模型。這比從詞向量獲得的嵌入矩陣更好,因為 RNN 可以比詞向量更好地跟蹤更大範圍的依賴性。

7. 通過時間反向傳播 (BPTT) (NLP)

深層遞歸神經網路中的隱藏狀態, 如果在反向傳播一些時間後它沒有被重置,可能會增長到難以處理的大小 。比如說,在字元級 RNN 上,如果你有一百萬個字元,那麼你也有一百萬個隱藏的狀態向量,每個都有自己的歷史狀態。為了調整神經網路的梯度,我們需要對每個字元每批執行一百萬條鏈規則的計算。這會消耗太多的內存。因此,為了降低內存,我們設置了一個最大字元數量來反向傳播。由於循環神經網路中的每個循環被稱為時間步長,所以限制反向傳播保持隱藏狀態歷史層數的任務被稱為時間反向傳播。這個數字的值決定了模型計算的時間和內存要求,但它提高了模型處理長句或行動序列的能力。

8. 實體嵌入分類變數 (結構數據和 NLP)

當在結構化的數據集進行深度學習時, 它有助於區分包含連續數據的列,比如說在線商店的價格信息,列中包含了,比如日期和生產地址的連續數據。然後,可以將這些分類列,通過熱編碼過程轉換為指向神經網路的完全連接的嵌入層的查找表。你的神經網路因此獲得機會學習這些分類好的變數 / 列,如果忽略了這些列的分類性質,那麼這個問題就會被忽略。它可以學習周期性事件,比如在很多年的數據集上,公眾假期之前和之後,一周中的哪一天有最多的事情。這樣做的最終結果是在預測產品最優定價和協同篩選的一個非常有效的方法。這應該是所有擁有表格數據公司的標準數據分析和預測方法。所有的公司都應該使用這個。

這個方法在 Rossmann Store Sales Kaggle(http://suo.im/21aqbD) 比賽中 Guo 和 Berkhahn 應用了, 即使他們只用最少的特徵進行深度學習,也能獲得第三名。 他們在本文( this paper )概述了他們的方法。

Guo, Berkhahn (2016,https://arxiv.org/abs/1604.06737)

最後

AI 中深度學習的分支變得越來越容易學習,庫也變得越來越好。感覺研究人員和從業人員就像爬山一樣,步伐越來越大,通過艱苦的工作編譯大型數據集和性能更好的 GPU,公開發表了一套承諾顛覆人類歷史進程的工具。在我看來,AI 最大的潛力在於教育和醫學,尤其是復興生物技術。既是在我們使用深度學習(https://nnaisense.com/)來創造真正的人工智慧(http://suo.im/1uYa3o)之前,用正確的策略,在洞察力,動力和全球協調上,我們會變得更聰明,更富有,並且應該期望在本世紀末能因為這些工具,而活得更長壽,更健康。

博客原址https://hackernoon.com/8-deep-learning-best-practices-i-learned-about-in-2017-700f32409512

更多文章,關注 AI 研習社,添加雷鋒字幕組微信號(leiphonefansub)為好友

備註「我要加入」,To be a AI Volunteer !

NLP 工程師入門實踐班:基於深度學習的自然語言處理

三大模塊,五大應用,手把手快速入門 NLP

海外博士講師,豐富項目經驗

演算法 + 實踐,搭配典型行業應用

隨到隨學,專業社群,講師在線答疑

新人福利

關注 AI 研習社(okweiwu),回復1領取

【超過 1000G 神經網路 / AI / 大數據,教程,論文】

深度學習對話系統實戰篇 -- 簡單 chatbot 代碼實現


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 AI研習社 的精彩文章:

用Python 實現的機器人演算法示例集合——PythonRobotics
從NLP到CV+NLP:計算機視覺和自然語言處理結合介紹

TAG:AI研習社 |