【課程學習】課程2:十行程式碼高效完成深度學習POC

李是李雅普諾夫的李發表於2020-04-18

本文使用者記錄黃埔學院學習的心得,並補充一些內容。

課程2:十行程式碼高效完成深度學習POC,主講人為百度深度學習技術平臺部:陳澤裕老師。

因為我是CV方向的,所以內容會往CV方向調整一下,有所篩檢。

課程主要有以下三個方面的內容:

  1. 深度學習POC的基本流程
  2. 實用預訓練模型應用工具快速驗證
    • 通用模型一鍵檢測
    • 十行程式碼完成工業級文字分類
  3. 自動化調參AutoDL Finetuner

 一、深度學習POC的基本流程

1.1  深度學習發展歷程

2006年,這一年多倫多大學的Geoffrey Hinton教授發表的論文,提出了兩個重要觀點:(1)多層的神經網路模型有很強的特徵學習能力,深度學習模型能夠學習到的資料更本質的特徵;(2)對於深度神經網路獲得全域性最優解的問題,可以採用逐層訓練方法解決。自此,深度學習迅速發展。2007年,深度學習框架Theano釋出,用於優化多維陣列的計算。2011年,深度學習首先在語音識別領域取得突破。2012年,Krizhevsky等人首次將卷積神經網路應用至ImageNet影像識別大賽,大獲全勝。隨後,深度學習在自然語言處理、影像識別等多個領域遍地開發。2016年,基於深度強化學習的AlphaGo戰勝李世石,大放異彩,以深度學習為代表的人工智慧技術在廣大群眾中熱議。2019年,三位深度學習之父:Geoffrey Hinton, Yann LeCun,和Yoshua Bengio共同獲得了圖靈獎。

1.2 深度學習的成功與侷限

深度學習界的聖經,花書《Deep Learning》也提到,深度學習的成功有以下兩個方面的原因:

(1)與日俱增的資料量:“要從一個深度學習演算法獲得良好的效能需要一些技巧。幸運的是,隨著訓練資料的增加,所需的技巧正在減少”。隨著資料量的激增,以大資料驅動的深度學習演算法在某些複雜任務上達到甚至超越了人類的水平。

(2)大算力背景下與日俱增的模型規模:越發龐大的計算資源可以允許我們執行更大的模型,Hinton教授以及很多聯結主義的學者提到,模型的規模更大,特徵學習能力更強(當然也不是模型越大越好)。

也正因為如此,深度學習在小樣本、低算力的場景下效果受限,同時大模型的設計門檻也是比較高的。

1.3 深度學習技術的探索方向

多工學習:比如基於預訓練模型的遷移學習。實際上在很多場合下(特別是工業、醫療等場景),資料——尤其是負樣本的數量是非常少的,基於預訓練模型的遷移學習技術能夠起到比較關鍵的作用。我在看科技部發的“新一代人工智慧”相關檔案的時候,很多專案都提到了研究技能遷移技術,可見其重要性。

自監督學習:自監督學習是無監督學習的一種,也是為了解決小樣本問題。深度學習需要的訓練樣本是需要人工貼標的,但是標註成本非常大。自監督學習的“標註”通常來自於資料本身,比如扣掉視訊中的某些幀,覆蓋掉影像中的某一部分,讓模型依賴其周圍的資訊去預測缺失部分,從而學習到資料的特徵。

1.4 深度學習POC的基本流程

POC,即Proof of Concept,POC的作用是在專案初始階段進行方案的測試性驗證。

深度學習POC的用於明確該專案能否採用深度學習技術完成,基本流程如下圖所示:

(1)明確需求:首先需要明確任務的需求是什麼,然後確定客戶的技術指標,是否能與深度學習模型的效果建立關聯。

(2)資料優化:採取深度學習技術做一個專案,很大比重的經歷要放在資料採集、資料標註和清洗上。資料集的好壞直接關係到任務的上限。

(3)模型選型:確定客戶任務的場景是否能用現成的預訓練模型解決,比如人類檢測、通用分類等等,找到一個合適的預訓練模型可以說能夠解決一半問題;結合部署環境和效能要求選擇模型,比如節拍需求、精度要求、成本問題等等;確定是否需要結合傳統的視覺技術,如影像分割,邊緣檢測等等;是否需要多個模型組合到一起,比如分類+分割,等等。

(4)調參訓練:調參訓練涉及到資料增強、網路調參和訓練引數調參等等。現在有一些自動化的超引數優化策略。

(5)模型部署:部署時需要對邊緣計算裝置算力、成本等多方面考慮,通常需要進行模型壓縮(詳見第一課的內容)。要考慮是服務端部署,還是移動端、嵌入式裝置、ASIC晶片部署、服務化部署等等。

1.5 視覺領域基礎模型

視覺領域有很多典型的模型,根據任務的不同可以分為影像分類、目標檢測、分割任務。分類任務比較好理解,就是解釋“Yes” or “No”的問題。目標檢測任務需要解決“what is where”問題,不光要判斷是什麼,還有定位出它的位置。三種分割任務要解決的是每個畫素點所屬的型別,根據需求的不同分為語義分割、例項分割以及全景分割。

一般需要精細化檢測的時候,需要用到語義分割或者例項分割。只需要知道“what is where”時,用目標檢測就可以。

 1.4 視覺預訓練模型的選型

現在不管做CV還是NLP,都逐步進入了預訓練時代。

下圖表示的是各種的模型 Top-1準確率VS計算複雜度,圓圈大小表示佔用記憶體開銷。

在分類的任務上,一般比較關注下圖靠左的這些模型:精度相對比較高、模型也比較小,算力開銷也不大,能夠在算力有限的部署端取得不錯的效能。在做檢測任務的時候,需要關注單階段還是兩階段。不過在實際的任務中,關注比較多的是多尺度。因為有很多小目標的檢測,多尺度效能會高一些。分割任務的主流是Encoder-Decoder結構,需要關注的就是低層的backbone結構。

整體來說需要關注三個方面:

(1)綜合考慮精度、預測效能、還有記憶體開銷

(2)在未來的有根據硬體特性來設計模型的趨勢

(3)AutoML技術

二、實用預訓練模型應用工具快速驗證

2.1 通用模型一鍵檢測

PaddleHub是飛槳的預訓練模型管理和遷移學習工具,其中內建了面向多種場景和多項任務的預訓練模型。採取高質量的預訓練模型+Fine-tune的方式,可以快速完成遷移學習到部署過程。

連結為:https://github.com/PaddlePaddle/PaddleHub/ 

一個高質量的預訓練模型需要演算法+算力+資料+專家知識四個因素結合起來才能完成。PaddleHub的架構如下圖所示,預訓練模型很豐富,覆蓋了影像分類、檢測等多種任務。

PaddleHub有一個特點,就是把模型都作為Python的軟體包管理起來,這就非常便捷易用了。

如下圖所示,PaddleHub裡有很多預訓練模型。以上一節課提到的人臉識別來說,就可以呼叫PaddleHub裡的pyramidbox_face_detection:

僅僅需要幾行程式碼就能實現人臉識別:

import paddlehub as hub

module = hub.Module(name="pyramidbox_face_detection")
input_dict = {"image": ["PATH/TO/IMAGE"]}
results = module.face_detection(data=input_dict)

類似的例子還有很多,涵蓋影像、文字、視訊等多個領域的多項內容,覆蓋面非常全,就不一一列舉了。

2.1 十行程式碼完成工業級文字分類

課程中介紹如何使用PaddleHub和Fine-tune API,通過極少的程式碼量完成一個工業級的文字分類。

採用預訓練模型加微調的方式,一般需要少量的使用者資料和超大規模預訓練模型,這裡使用的大規模預訓練模型為ERNIE

程式碼及備註如下:

import paddlehub as hub

# 載入ChnSentiCorp中文情感分析資料集
dataset = hub.dataset.ChnSentiCorp()
# 下載並載入ERNIE模型,可在PaddleHub官網搜尋 ernie= hub.Module(name=“ernie”)
# trainable=True表示預訓練模型的引數可以被訓練 inputs, outputs, program = ernie.context(trainable=True)
# 資料預處理,設定最大序列長度 reader = hub.reader.ClassifyReader(
  dataset=dataset, max_seq_len=128,   vocab_path=ernie.get_vocab_path())
# 配置Tensor feed_list= [inputs["input_ids"].name, inputs["position_ids"].name,      inputs["segment_ids"].name, inputs["input_mask"].name]
# 配置優化策略,優化器Adam,學習率衰減 strategy = hub.AdamWeightDecayStrategy(learning_rate=5e-5)
# 配置訓練的引數 config= hub.RunConfig(num_epoch=3, strategy=strategy) # 建立遷移學習任務 task = hub.TextClassifierTask( data_reader=reader, feature=outputs["pooled_output"], feed_list=feed_list, num_classes=dataset.num_labels, config=config )
# 啟動Fine-tuning,自動評估、儲存、視覺化 task.finetune_and_eval()

如果對目標檢測、人臉檢測等任務的遷移學習比較感興趣的話,百度也提供了免費的教程可以學習:

https://aistudio.baidu.com/aistudio/course/introduce/1070

三、自動化調參AutoML Finetuner

3.1 模型調優策略

史丹佛大學的吳恩達教授在他的深度學習課程上,用非常形象的方式將模型的調優策略分成兩類:熊貓策略和魚子醬策略。(因為一個生的少但精心養護,一個雖然不管不問但奈何比較能生。。。)

所謂的熊貓策略就依賴對模型非常熟悉的專家,對一個比較重要的模型精心調優,讓它每天都能優化一點點。魚子醬策略就是多組模型並行訓練,隨便設定若干組超引數,讓模型自己去跑,然後再去甄別哪一組超引數下的模型效果最好。

模型調優是一個黑盒優化問題,在調優的過程中只看到模型的輸入和輸出,而看不到調優過程中的梯度資訊。所以優化的關鍵就在於,怎麼能儘可能少的次數找到一組超引數,能讓模型的效果最優,就涉及到超參搜尋的問題。

3.2 超引數搜尋

超參搜尋的策略有兩種:網格搜尋(Grid Search)和隨機搜尋(Random Search)。

正如表面意思,網格搜尋指的是以某種組合規律來均勻的分佈超引數,隨機搜尋就是直接在引數的設定空間裡隨機的撒入引數組,看看哪一組比較好。

 

在工業中,一般隨機搜尋會取得更好的效果。這是因為深度學習模型的超引數中有些是非常重要的(比如學習率),有些是沒那麼重要的。所以沒必要給重要的超引數和不重要的超引數相同的搜尋機會。比如上圖左側:重要的和不重要的都給了三次搜尋機會。隨機搜尋就可以讓重要超引數和搜尋機會更密集一些,得到的效果也就更好。

除了這兩種自動化調參演算法之外,還有遺傳演算法、粒子群優化、貝葉斯優化等等。不過前兩種優化演算法所需的初始樣本點較多,優化效率也一般。業界用的相對多一些的是貝葉斯優化。

不同黑盒優化策略的對比如下表所示:

  熊貓策略 網格搜尋 隨機搜尋 貝葉斯優化
優點 可以取得較好的超參設定 實現簡單,可並行搜尋 搜尋空間友好,可並行搜尋 搜尋效率高,魯棒性強
缺點 耗時耗力,成本高 搜尋空間高維災難 超參搜尋相互獨立 需要順序優化,並行度低

2017年,Population Based Training(PBT)被提出,下圖中最上面的長條代表網路效能,中間的圓圈代表超引數,下面的長條程式碼模型引數。

圖中(a)策略採取的是一種“序列”的優化策略:先設定一種超引數,經過訓練後看一看模型的效果,然後來評估哪些超參要調整一下。一般人工調參就採取這種策略,成本非常高,效率比較低。

圖中(b)策略採取的是並行的優化策略:在大算力的支援下,同時設定若干組超參去訓練,然後看看哪一組效果最好。這種方式雖然效率會高一些,但是組與組之間的結果是沒有相互交流的,都在各幹各的。

圖中(c)策略就是PBT:在並行優化的過程中,就評估哪一組超參下的模型效果比較好,接著在這一組效果比較好的超參的基礎上,新增一些隨機擾動,然後把它經過輕微改動的超參分享給其他組,加強組與組之間的交流。

3.4 AutoDL Finetuner自動化超參搜尋

PaddleHub中的超參搜尋工具AutoDL Finetune,提供了兩種優化演算法:HAZero和PSHE2。HAZero的核心思想是通過對正態分佈中協方差矩陣的調整來處理變數之間的依賴關係和scaling。PSHE2採用哈密爾頓動力系統搜尋引數空間中“勢能”最低的點,即超引數的最優組合。

為了評估搜尋的超參的效果,AutoDL Finetuner提供了兩種超參評估策略:

Full-Trail::給定一組超參,利用這組超參從頭開始Fine-tune一個新模型,之後在驗證集評估這個模型;

Population-Based:給定一組超參,若這組超參是第一輪嘗試的超參組合,則從頭開始Fine-tune一個新模型;否則基於前幾輪已儲存的較好模型,在當前的超引數組合下繼續Fine-tune並評估。

四、總結

總結一下PaddleHub的內容:

(1)豐富、優秀的預訓練模型庫,涵蓋了自然語言處理和計算機視覺兩個方面;

(2)模型即軟體,便捷、易用的遷移學習,僅需幾行程式碼就能實現遷移學習;

(3)提供自動化的超引數搜尋演算法和評估演算法,優化模型,降低訓練門檻。

相關文章