如何優化深度學習模型

2021-02-23 大數據文摘

大數據文摘出品

來源:nanonets

編譯:劉佳瑋、張秋玥、毅航、夏雅薇

看過了各式各樣的教程之後,你現在已經了解了神經網絡的工作原理,並且也搭建了貓狗識別器。你嘗試做了了一個不錯的字符級RNN。你離建立終端只差一個pip install tensorflow命令了對嗎?大錯特錯。

深度學習的一個非常重要的步驟是找到正確的超參數,超參數是模型無法學習的。

在本文中,我將向你介紹一些最常見的(也是重要的)超參數,這些參數是你抵達Kaggle排行榜#1的必經之路。此外,我還將向你展示一些強大的算法,可以幫助你明智地選擇超參數。

超參數就像是模型的調節旋鈕。

如果您將AV接收機設置為立體聲,那麼配備低音揚聲器的7.1級杜比全景聲(Dolby Atmos)家庭影院系統將對你毫無用處,儘管它的超低音揚聲器可以產生低於人耳可聽範圍的聲音。

同樣,如果你將超參數關閉,帶有萬億參數的inception_v3網絡甚至不會讓你在MNIST數據集上測試通過。

所以現在,讓我們然後在學會如何調「旋鈕」之前先看看這些「旋鈕」。

學習率可以說是最重要的超參數,粗略地說,它可以控制神經網絡「學習」的速度。

那麼,為什麼我們不把學習率設置得非常大,體驗飆車的樂趣呢?

事情不是那麼簡單。請記住,在深度學習中,我們的目標是儘量最小化損失函數。如果學習率太高,我們的損失函數將開始在某點來回震蕩,不會收斂。

如果學習率太小,模型將花費太長時間來收斂,如上所述。

由於本文側重於超參數優化,我不打算解釋動量的概念。但簡而言之,動量常數可以被認為是在損失函數表面滾動的球的質量。

球越重,下落越快。但如果它太重,它可能會卡住或超過目標。

如果你了解這個概念,我會直接帶你去看Amar Budhiraja關於丟棄(dropout)的文章。

但我們做一個快速複習,dropout是Geoff Hinton提出的一種正則化技術,它將神經網絡中的激活函數隨機地設置為0,概率為p。這有助於防止神經網絡過擬合數據而不是學習它。

p是一個超參數。

另一個(最近的)想法是使神經網絡的架構本身成為一個超參數。

雖然我們通常不會讓機器弄清楚我們模型的架構(否則AI研究人員會丟失他們的工作),但是神經架構搜索(Neural Architecture Search)等一些新技術已經實現了這個想法並取得了不同程度的成功。

如果你聽說過AutoML,那麼Google基本上就是這樣做的:將所有內容都設置為超參數,然後扔大量TPU在這個問題上讓它自行解決。

但是對於我們絕大多數隻想在黑色星期五銷售之後用經濟型機器分類貓狗的人來說,現在是時候該弄清楚如何使這些深度學習模型真正起作用了。

網格搜索

這是獲得良好超參數的最簡單方法。它實際上就是暴力解決。

算法:從一組給定的超參數中嘗試一堆超參數,看看哪種方法效果最好。

優點:五年級學生都很容易實現,而且可以輕鬆並行化。

缺點:正如你可能猜到的那樣,它的計算成本非常高(因為所有暴力算法都是如此)。

我是否應該使用它:可能不會。網格搜索非常低效。即使你想保持簡單,你也最好使用隨機搜索。

隨機搜索

正如它的本意,隨機搜索。完全隨機化。

算法:在一些超參數空間上從均勻分布中嘗試一堆隨機超參數,看看哪種方法效果最好。

優點:可以輕鬆並行化。就像網格搜索一樣簡單,但性能稍好一點,如下圖所示:

缺點:雖然它提供了比網格搜索更好的性能,但它仍然只是計算密集型。

我是否應該使用它:如果瑣碎的並行化和簡單性是最重要的,那就去吧。但是,如果你願意花費時間和精力,那麼通過使用貝葉斯優化,你的模型效果將大大提升。

貝葉斯優化

與我們迄今為止看到的其他方法不同,貝葉斯優化使用了算法的先前迭代的知識。使用網格搜索和隨機搜索,每個超參數猜測都是獨立的。但是,使用貝葉斯方法,每次我們選擇並嘗試不同的超參數時,表現都在一點點提升。

(如果我告訴了你,深度學習不過是貝葉斯而已)

貝葉斯超參數調整背後的想法歷史悠久且細節豐富。所以為了避免太多坑,我會在這裡給你一個要點。但如果你感興趣,一定要仔細閱讀高斯過程和貝葉斯優化。

請記住,我們使用這些超參數調整算法的原因是,單獨實際評估多個超參數選擇是不可行的。例如,假設我們想要手動找到一個好的學習率。這將涉及設置學習率,訓練模型,評估它,選擇不同的學習率,再次訓練你從頭開始模型,重新評估它,並繼續循環。

問題是,「訓練你的模型」可能需要幾天時間(取決於問題的複雜性)才能完成。因此,在會議提交截止日期之前,您只能嘗試一些學習率。而你知道什麼,你甚至沒有開始設置動量。糟糕極了。

算法:貝葉斯方法試圖建立一個函數(更準確地說,是關於可能函數的概率分布),用於估計模型對於某個超參數選擇的好壞程度。通過使用這種近似函數(在文獻中稱為代理函數),您不必在設置、訓練、評估的循環上花費太多時間,因為你可以優化代理函數的超參數。

例如,假設我們想要最小化此函數(將其視為模型損失函數的代理):

代理函數來自於高斯過程(注意:還有其他方法來模擬代理函數,但我將使用高斯過程)。就像我提到的那樣,我不會做任何數學上的重要推導,但是所有關於貝葉斯和高斯的討論歸結為:

公式看上去很複雜。但是,讓我們試著理解它。

左側告訴你涉及概率分布(假設存在P)。在括號內看,我們可以看到它是P的概率分布,這是一個任意的函數。為什麼?請記住,我們正在定義所有可能函數的概率分布,而不僅僅是特定函數。本質上,左側表示將超參數映射到模型的度量的真實函數(如驗證準確性,對數似然,測試錯誤率等)的概率為Fn(X),給定一些樣本數據Xn等於右側的式子。

現在我們有了優化函數,就開始進行優化吧。

以下是在開始優化過程之前高斯過程的樣子☟

在利用兩個數據點迭代之前的高斯過程。

使用你最喜歡的優化器(大佬們一般喜歡最大化預期改善),但其實只需跟著信號(或梯度)引導,你還沒有反應過來的時候就已經得到局部最小值。

經過幾次迭代後,高斯過程在近似目標函數方面變得更好:

在利用兩個數據點迭代三次之後的高斯過程。

無論你使用哪種方法,你現在都找到了代理函數最小化時的參數。那些最小化代理函數的參數居然是最優超參數(的估計)哦!好極了。

最終結果應如下所示:

在利用兩個數據點迭代七次之後的高斯過程。

使用這些「最佳」超參數你的神經網絡上進行訓練,你應該會看到一些改進。但是,你也可以使用這些新信息重新一次又一次地重做整個貝葉斯優化過程。你可以想跑多少次這一貝葉斯循環就跑多少次,但還是要謹慎行事。你實際上在「跑錢」。你不要忘了AWS又不是免費的。

優點:貝葉斯優化比網格搜索和隨機搜索提供更好的結果。

缺點:並行化並不容易。

我應該使用它嗎:在大多數情況下,是的!唯一的例外是如果:

我們到目前為止看到的所有方法有一個隱含主題:自動化機器學習工程師的活兒。這確實很有用很厲害——直到你的老闆聽說了之後決定用4個RTX Titan卡取代你。呵呵。你本應該堅持用手動搜索的。

不過不要擔心啊,還是有些關於讓研究者少幹點活但是多拿點錢的活躍研究呢。其中一個效果非常好的想法是學習率範圍測試,據我所知,這首先出現在Leslie Smith的論文中。

這篇論文實際上是關於一種隨時間調度(改變)學習率的方法。LR(Learning Rate,學習率)範圍測試只是個作者一不小心遺落在一旁的大寶貝。

當你使用那種學習速率可以從最小值取到最大值的學習速率計劃時(例如循環學習速率或具有熱重啟動的隨機梯度下降),作者建議在每次迭代之後將學習速率從小數值線性增加到大數值(例如,1e-7到1e-1),評估每次迭代時的損失,並在對數刻度上繪製損失(或測試誤差,或準確度)與學習率的關係。你的圖像看起來應該是這樣的:

如圖所示,你可以設置學習率在最小和最大學習率之間變化,這可以通過在圖像上肉眼觀察最陡梯度區域來找到。

Colab Notebook上畫的LR範圍測試圖(CIFAR10上訓練的DenseNet):

Colab Notebook

https://colab.research.google.com/gist/iyaja/988df5818fd887cc7542074ea2bfb74e/fastai-imagefolder-playground.ipynb

在CIFAR10數據集上訓練的DenseNet 201的學習率範圍測試

根據經驗,如果你沒有做任何花哨的學習率安排的話,那麼只需將你的恆定學習率設置為低於繪圖上最小值的數量級即可。在這種情況下大約就是1e-2。

這種方法最酷地方在於,它很好用很省時省心省計算力,它幾乎不需要任何額外的計算。

其他算法——即網格搜索、隨機搜索和貝葉斯優化——要求你運行與訓練良好神經網絡目標相關的整個項目。LR範圍測試只是執行簡單定期的訓練循環,並保持跟蹤一些變量。

以下是使用最佳學習速率時大致可以獲得的收斂速度(來自Notebook的示例):

Notebook

https://colab.research.google.com/gist/iyaja/ef385db236775f881af0056d1ae8c477/kernel303b922372-2.ipynb

最佳學習率擬合的模型的損失與batch大小圖

LR範圍測試已經由fast.ai團隊實施過了。你一定要看看他們實現LR範圍測試的庫(他們稱之為學習速率查找器)以及許多其他算法。

如果你有興趣,這兒還有一個純pytorch編寫的notebook實現了上述功能。這可能會幫助你更好地了解幕後訓練流程:

https://colab.research.google.com/gist/iyaja/f9fc63ef65b6cc74409dc635c2d80861/hyperparameter-optimization-pytorch.ipynb

當然,所有這些算法——儘管它們都很好——並不總是在實踐中起作用。在訓練神經網絡時還有許多其他因素需要考慮,例如你將如何預處理數據,定義模型,你還需要真的搞定足夠跑這一整個流程的計算力。

Nanonets提供易於使用的API來訓練和部署自定義深度學習模型。它能負責所有的繁重工作,包括數據擴充,轉移學習,以及超參數優化!

Nanonets在其龐大的GPU集群上使用貝葉斯搜索來找到正確的超參數集,你壓根不用擔心得在最新的顯卡上再大花一筆錢啦。

一旦找到最佳模型,Nanonets就會把它放在雲端,以便你使用其Web界面測試模型,或使用兩行代碼將其集成到你的程序中。

跟不完美模型說拜拜吧。

在本文中,我們討論了超參數和一些優化它們的方法。但這一切意味著什麼?

隨著人們越來越努力地使AI技術民主化,自動超參數調整可能是朝著正確方向邁出的一步。它允許像你我這樣的普通人在沒有數學博士學位的情況下構建厲害的深度學習應用程式。

雖然你可能會認為,讓模型重度依賴於計算立會導致只有那些能夠承受如此計算力的人群獲得最好的模型,但像AWS和Nanonets這樣的雲服務有助於實現我們普通民眾對強大機器計算力的訪問、使深度學習更容易普及。

但更重要的是,我們真正在這裡做什麼——用數學來解決更多的數學。這很有意思,不僅因為聽起來很酷炫啦,還因為它真的很容易被錯誤解釋。

從打孔卡和excel表時代,到我們」優化優化函數的函數以優化函數「的時代,我們已經走過了漫長的道路。但是,我們依然無法建造能夠自己「思考」的機器。

這一點都不令人沮喪,因為如果人類用這麼少的東西就能夠做到這個高度的話,當我們的願景變成我們實際可以看到的東西時,想像一下未來會怎樣吧!

我們坐在一張襯墊網椅上,盯著一個空白的終端屏幕——每個按鍵都能給我們一個可以擦乾淨磁碟的sudo指令。

我們會整天坐在那裡一動不動——因為下一個重大突破和我們可能只差一條pip install哦。

相關報導:

https://blog.nanonets.com/hyperparameter-optimization/

實習/全職編輯記者招聘ing

加入我們,親身體驗一家專業科技媒體採寫的每個細節,在最有前景的行業,和一群遍布全球最優秀的人一起成長。坐標北京·清華東門,在大數據文摘主頁對話頁回復「招聘」了解詳情。簡歷請直接發送至zz@bigdatadigest.cn

相關焦點

  • 入門 | 深度學習模型的簡單優化技巧
    ,包括遷移學習、dropout、學習率調整等,並展示了如何用 Keras 實現。以下是我與同事和學生就如何優化深度模型進行的對話、消息和辯論的摘要。如果你發現了有影響力的技巧,請分享。首先,為什麼要改進模型?像卷積神經網絡(CNN)這樣的深度學習模型具有大量的參數;實際上,我們可以調用這些超參數,因為它們原本在模型中並沒有被優化。
  • 深度學習模型壓縮方法
    複雜的模型固然具有更好的性能,但是高額的存儲空間、計算資源消耗是使其難以有效的應用在各硬體平臺上的重要原因。最近正好在關注有關深度學習模型壓縮的方法,發現目前已有越來越多關於模型壓縮方法的研究,從理論研究到平臺實現,取得了非常大的進展。
  • 如何從零開發一個複雜深度學習模型
    batch深度學習的優化算法,說白了就是梯度下降。每次的參數更新有兩種方式。第一種,遍歷全部數據集算一次損失函數,然後算函數對各個參數的梯度,更新梯度。這種方法每更新一次參數都要把數據集裡的所有樣本都看一遍,計算量開銷大,計算速度慢,不支持在線學習,這稱為Batch gradient descent,批梯度下降。
  • 含代碼 | 支付寶如何優化移動端深度學習引擎?
    考慮到移動端資源的限制,深度學習引擎的落地面臨著性能、機型覆蓋、SDK尺寸、內存使用、模型尺寸等多個方面的嚴峻挑戰。本文介紹如何從模型壓縮和引擎實現兩個方面的聯合優化,應對上述挑戰,最終實現技術落地,希望對大家有所啟發。
  • 深度學習模型壓縮與加速綜述
    因此,如何在不影響深度學習模型性能的情況下進行模型壓縮與加速,成為了學術界和工業界的研究熱點。1、簡介深度學習模型壓縮與加速是指利用神經網絡參數和結構的冗餘性精簡模型,在不影響任務完成度的情況下,得到參數量更少、結構更精簡的模型。被壓縮後的模型對計算資源和內存的需求更小,相比原始模型能滿足更廣泛的應用需求。
  • 主流的深度學習模型有哪些?
    作者:阿薩姆 | 普華永道 數據科學家量子位 已獲授權編輯發布轉載請聯繫原作者深度學習大熱以後各種模型層出不窮,很多朋友都在問到底什麼是
  • 【深度】工程師必備—AI模型訓練+推理優化+嵌入部署
    3.1 高手也愛的黑科技:無損的半精度模型  上面,我們介紹了以yolov5 吸菸檢測為例的目標檢測,接下來我們在此基礎上提升,說說高手們也想要的黑科技。1:混合精度模型,半精度模型如何可以以降低顯存卻可以保持精度呢?裝好apex後在代碼中添加,在optimizer中amp初始化一下優化反向傳播。
  • 深度學習模型真的越大越好嗎?
    AI 前線導讀:今年早些時候,NVIDIA 的研究人員發布了 MegatronLM,這是一個擁有 83 億個參數(比 BERT 大 24 倍)的巨型轉換模型,它在各種語言任務中都取得了最頂尖的性能。雖然這無疑是一項令人印象深刻的技術成就,但我不禁要問:深度學習的方向是否正確?
  • 高效深度學習:讓模型更小、更快、更好!
    >:某些新應用程式提供了現有現成模型可能無法解決的新約束模型爆炸:同一基礎設施(託管)上為不同的應用程式訓練和/或部署多個模型可能最終會耗盡可用資源今天,我們分享一份實用的模型訓練和部署優化指南(高效深度學習),主要關注模型效率問題,包括模型技術、基礎設施和硬體等
  • AI | 深度學習中的Normalization模型
    不管是傳統機器學習,還是當前火熱的的深度學習,Normalization技術都是能夠提升算法性能的大殺器。本文以非常宏大和透徹的視角分析了深度學習中的多種Normalization模型,包括大家熟悉的Batch Normalization (BN)和可能不那麼熟悉的Layer Normalization (LN)、Instance Normalization (IN) 及Group Normalization (GN)模型;用生動形象的例子闡述了這些Normalization模型之間的區別和聯繫;並在一個統一的數學框架下分析了它們的性質
  • 微軟開源深度學習優化庫DeepSpeed,可訓練1000億參數模型
    人工智慧的最新趨勢是,更大的自然語言模型可以提供更好的準確性,但是由於成本、時間和代碼集成的障礙,較大的模型難以訓練。微軟日前開源了一個深度學習優化庫 DeepSpeed,通過提高規模、速度、可用性並降低成本,可以在當前一代的 GPU 集群上訓練具有超過 1000 億個參數的深度學習模型,極大促進大型模型的訓練。同時,與最新技術相比,其系統性能可以提高 5 倍以上。
  • 普通程式設計師如何入門深度學習?
    因此我們要入門深度學習就要先了解一些機器學習的基礎知識。機器學習最基本的做法,是使用算法來解析數據、從中學習,然後對真實世界中的事件做出決策和預測。與傳統的為解決特定任務、硬編碼的軟體程序不同,機器學習是用大量的數據來「訓練」,通過各種算法從數據中學習如何完成任務。有人曾舉過一個例子,很形象生動,當你使用手機的語音識別進行喚醒時,有沒有想過實現這一功能的全部內部流程呢?
  • 深度學習模型的對抗樣本與可視化生成工具AdvTool
    對抗樣本的由來深度學習近年來領來了飛速的發展,使得人工智慧在圖像識別、語音識別等任務的能力上有了質的提高。人們開始在無人車、無人機、機器人等智能無人系統中利用深度學習理論搭建的模型。不幸的是,研究[1]發現基於神經網絡的深度學習模型脆弱無比,特別容易被欺騙。
  • 【深度學習系列】CNN模型的可視化
    ,熟悉Tensorflow,PaddlePaddle等深度學習框架,負責過多個機器學習落地項目,如垃圾評論自動過濾,用戶分級精準營銷,分布式深度學習平臺搭建等,都取了的不錯的效果。博客專欄:https://www.cnblogs.com/charlotte77/前文傳送門:【好書推薦&學習階段】三個月教你從零入門深度學習【深度學習系列】PaddlePaddle之手寫數字識別【深度學習系列】卷積神經網絡CNN原理詳解(一)——基本原理【深度學習系列】PaddlePaddle之數據預處理
  • 深度學習中的Normalization模型(附實例&公式)
    本文以非常宏大和透徹的視角分析了深度學習中的多種Normalization模型,從一個新的數學視角分析了BN算法為什麼有效。[ 導讀 ]不管是傳統機器學習,還是當前火熱的深度學習,Normalization技術都是能夠提升算法性能的大殺器。
  • 深度學習下一步如何發展?
    另外技術上的發展使得訓練大模型成為了可能,例如上千層的深度神經網絡,這個在四年以前都覺得不能想像的事情,現在都已經發展成為現實,並且在產品中都有了很廣泛的使用。再就是大計算,從CPU到GPU,可獲取的計算資源越來越豐富。大數據、大模型、大計算是深度學習的三大支柱,因此這三個方向都是當前研究的熱點,例如如何從更多更大的數據裡面進行學習,如何訓練更大更深的模型。
  • 教程 | 如何使用 Kubernetes 輕鬆部署深度學習模型
    Python、Keras、Flask 和 Docker 在 Kubernetes 上部署深度學習模型。本文展示了如何用 Keras 構建深度學習模型的簡單示例,將其作為一個用 Flask 實現的 REST API,並使用 Docker 和 Kubernetes 進行部署。本文給出的並不是一個魯棒性很好的能夠用於生產的示例,它只是為那些聽說過 Kubernetes 但沒有動手嘗試過的人編寫的快速上手指南。
  • Keras 深度學習模型可視化
    深度學習可視化深度學習的過程是一個黑盒子,模型通過大量的權重去學習擬合輸入的數據和學習目標,模型的性能很大程度上取決於模型的輸入的數據;深度學習的擬合效果往往出乎我們的的想像,但是模型如何擬合數據和學習目標之間的關係,我們知之甚少。
  • 【二】零基礎入門深度學習:用一個案例掌握深度學習方法
    ,提升AI技能) 作者 | 畢然  百度深度學習技術平臺部主任架構師 內容來源 | 百度飛槳深度學習集訓營 本文轉自飛槳PaddlePaddle百度深度學習技術平臺部主任架構師畢然老師,繼續開始零基礎入門深度學習的授課。
  • 強強聯合,OpenCV搭載飛槳模型,幫你輕鬆玩轉深度學習
    飛槳(PaddlePaddle)以百度多年的深度學習技術研究和業務應用為基礎,集深度學習核心訓練和推理框架、基礎模型庫、端到端開發套件和豐富的工具組件於一體,是中國首個自主研發、功能豐富、開源開放的產業級深度學習平臺。