Fastai深度學習課程的八大最佳實踐
摘要: Fastai社區的Jeremy Howard教授的《Practical Deep Learning for Coders(第一部分)》八大最佳實踐。
原文:http://click.aliyun.com/m/41056/
去年九月,我參加了《Practical Deep Learning for Coders(第一部分)》的課堂,由Fastai社區的Jeremy Howard教授,它將於2018年1月份可在慕課網上線。經過七周的時間,我學會了很多技能:
1.使用預訓練模型構建世界一流的圖像分類器;
2.從調查過的數據集中構建語言模型的情感分析工具;
3.如何對結構化數據集進行深度學習;
4.如何使用深度學習通過協同過濾構建構建推薦引擎。
上述工作都是通過Jupyter筆記本的高效介面以及PyTorch提供的fastai深度學習庫來完成。本文介紹了這8種技術,在每種技術中,我將用較為簡短的fastai代碼片段概括其基本思想,並在括弧內指出該技術是否普遍使用(在做圖像識別和分類,自然語言處理,構建結構化數據或協同過濾時,深度學習是否適用?),或者具體到深度學習應用的某種數據。 在課堂上,圖像識別課程使用Kaggle的 Dogs vs. Cats: Kernels Edition,Dog Breed Identification和Planet: Understanding the Amazon from Space。
我在互聯網上構建了自己的模型,模仿Dogs vs. Cats,取而代之的是蜘蛛和蠍子:Spiders vs. Scorpions。我從Google 上搜索並下載了約1500張「蜘蛛」和「沙漠蠍」,並刪除了所有的非.jpg格式、所有多餘的非圖像文件以及沒有擴展名的圖像來清理數據,現在大約有815張圖片可以使用。訓練集中每個[蜘蛛,蠍子]類有290張,實驗集和驗證集分別有118隻蜘蛛和117隻蠍子。令我感到驚訝的是,模型的準確度達到了95%的準確度。
如何做一個世界一流的分類器
一、微調 VGG-16和ResNext50遷移學習(計算機視覺和圖像分類)
對於圖像分類,您可以通過微調獲得大量好處,可以針對具體問題,建立一個更具有普遍挑戰性的神經網路架構,例如:殘差網路ResNext50是一個有50層的卷積神經網路,它在ImageNet上的1000種類別上進行訓練,並且由於表現出色,所以從圖像數據中提取出來的特徵也很重要。 為了讓它適應我的問題領域,我需要做的就是用輸出為2維矢量的層替換最後一層(輸出為1000維ImageNet矢量)。在上述代碼片段中,兩個輸出類放在上圖代碼中PATH路徑下。對於蜘蛛蠍子分類模型,請看下面:
請注意,train路徑下的兩個內容本身就是文件夾,每個文件夾包含290個圖像。微調程序的示意圖如下,它重新訓練了一個最終層為10維的層。
二、周期性調整學習率(普遍使用)
學習率可能是訓練深度神經網路微調中最重要的一個超參數。在非自適應配置環境(即不使用Adam,AdaDelta或其他變形)中最具有代表性的方法是深度學習從業者/研究人員同時運行多個實驗,每個實驗的學習率差異較小。如果數據集較為龐大且容易出錯,並且你在使用隨機矩陣構建上沒有經驗的話,這將需要很長的時間。然而,在2015年,美國海軍研究實驗室的Leslie N. Smith發現了一種自動搜索最佳學習率的方法:從一個非常小的值開始,在網路上運行幾個小批量數據,調整學習率,同時跟蹤損耗變化,直到損耗開始下降。Fastai社區的學生們解釋了周期學習率的方法。
三、可重啟隨機梯度下降(普遍適用)
另一種加速隨機梯度下降的方法是,隨著訓練的進行逐漸降低學習速度。這有助於觀察學習率的變化和損耗的改善是否一致。當靠近最佳權重時,你需要採取更小步,因為如果採取大步,你可以會跳過誤差曲面的最佳區域。如果學習率和損耗之間的關係不穩定,即如果學習率的較小變化導致損耗的巨大變化,那麼我們不在穩定的區域(上圖2)。那麼,這個策略就會周期性的提高學習率。這裡的「時期」是決定提高學習率的次數。這是周期性學習率計劃。在fastai深度學習中,使用cycle_len和cycle_mult參數賦值給learner.fit。在圖2中,學習率被重置3次。在使用正常的學習率計劃時,通常需要更長的時間才能找到最優的損失,當開發人員等待直到所有的訓練次數完成,然後再以不同的學習率再次手動嘗試。
四、數據增廣(計算機視覺和圖像分類)
數據增廣是為了增加訓練和測試數據數量的簡單方法。對於圖像,這依賴於現成的學習問題,因此也取決於數據集圖像的對稱數量。其中一個例子就是Spiders vs. Scorpions 問題:數據集中的很多圖像都可以被鎖定,並且動物的形狀沒有奇怪的扭曲,稱為transforms_side_on。例如:
五、測試(推斷)時增廣(計算機視覺和圖像分類)
我們也可以在測試(推斷)時間使用數據增廣。在測試時候,你所能做的就是預測,你可以使用測試集中的單個圖像來完成此操作,但是如果在可訪問的測試集中對每個圖像隨機生成幾個增量,則該過程會更加穩健。在fastai深度學習庫中,預測時使用每個測試圖像的4個隨機增量,並且將這些預測的平均值作為該圖像的預測。
六、用預訓練RNN代替詞向量
在不使用詞向量的情況下,得到一個世界一流的情感分析架構的方法是,將你打算分析的整個訓練數據集用來構建一個深度RNN語言模型。當模型具有高精度時,保存模型的編碼器,並使用從編碼器中獲取的嵌入矩陣來構建情感分析模型。這比從詞向量中獲取的嵌入矩陣要好,因為循環神經網路可以比詞向量有更好的依賴關係。
七、時序反向傳播演算法(BPTT) (NLP)
如果在一些時間步(time-step)的反向傳播後沒有重啟,深度循環網路的隱藏狀態可能會變得較難處理。例如,在一個基於字元的循環神經網路中,如果有一百萬個字元,那麼你也會有一百萬個隱藏狀態矢量。為了調整神經網路的梯度,我們需要對每一批的每個字元執行一百萬條鏈式法則的計算,這將會消耗較多的內存。所以,為了降低內存需求,我們設定了字元反向傳播的最大數值。由於循環神經網路的每個循環被稱為時間步,因此,通過反向傳播保持隱藏狀態歷史來限制層的數量的任務被稱為基於時間的反向傳播。層的數量值決定了模型的計算時間和內存要求,但是它提高了模型處理長句或操作序列的能力。
八、分類變數的實體向量化(結構化數據和NLP)
當對結構化數據進行深度學習時,這有助於將包含連續數據的列(如在線商店中的價格信息)從包含分類數據的列(如日期和接送地點)中分離開來。然後,將分類列的獨熱編碼過程轉換為指向神經網路全連接嵌入層的查找表。因此,你的神經網路有機會學習這些分類變數/列,而忽略列的分類性質。它可以學習周期性事件,如一周中哪天銷售量最大。這是預測產品最優價格和協同過濾的非常有效的方法,也是所有擁有表格數據的公司的標準數據分析和預測方法。
以上為譯文。
本文由阿里云云棲社區組織翻譯。
文章原標題《8 Deep Learning Best Practices I Learned About in 2017》,譯者:Mags,審校:袁虎。
推薦閱讀:
※產品經理的用研手冊08 - 用研四式之「切」
※TensorFlow的多平台基準測試
※微博上流傳了一個回答問題測試偶像的網站,很多很多人證實了其真的很準確,請問這是怎麼做到的?
※MQC功能測試大揭秘
※這個地球上不光有老乾媽!還有這麼多辣椒醬,要不要嘗一下?