入門 | 深度學習模型的簡單優化技巧

2021-02-23 機器之心

選自toward data science

作者:Jonathan Balaban

機器之心編譯

參與:張倩、劉曉坤

本文介紹了幾個深度學習模型的簡單優化技巧,包括遷移學習、dropout、學習率調整等,並展示了如何用 Keras 實現。

以下是我與同事和學生就如何優化深度模型進行的對話、消息和辯論的摘要。如果你發現了有影響力的技巧,請分享。

首先,為什麼要改進模型?


像卷積神經網絡(CNN)這樣的深度學習模型具有大量的參數;實際上,我們可以調用這些超參數,因為它們原本在模型中並沒有被優化。你可以網格搜索這些超參數的最優值,但需要大量硬體計算和時間。那麼,一個真正的數據科學家能滿足於猜測這些基本參數嗎?

改進模型的最佳方法之一是基於在你的領域進行過深入研究的專家的設計和體系結構,他們通常擁有強大的硬體可供使用。而且,他們經常慷慨地開源建模架構和原理。

深度學習技術


以下是一些通過預訓練模型來改善擬合時間和準確性的方法:

研究理想的預訓練體系架構:了解遷移學習的好處,或了解一些功能強大的 CNN 體系架構。考慮那些看起來不太適合但具有潛在共享特性的領域。

使用較小的學習率:由於預訓練的權重通常優於隨機初始化的權重,因此修改要更為精細!你在此處的選擇取決於學習環境和預訓練的表現,但請檢查各個時期的誤差,以了解距離收斂還要多久。

使用 dropout:與回歸模型的 Ridge 和 LASSO 正則化一樣,沒有適用於所有模型的優化 alpha 或 dropout。這是一個超參數,取決於具體問題,必須進行測試。從更大的變化開始——用更大的網格搜索跨越幾個數量級,如 np.logspace() 所能提供的那樣——然後像上面的學習率一樣下降。

限制權重大小:可以限制某些層的權重的最大範數(絕對值),以泛化我們的模型。

不要動前幾層:神經網絡的前幾個隱藏層通常用於捕獲通用和可解釋的特徵,如形狀、曲線或跨域的相互作用。我們應該經常把這些放在一邊,把重點放在進一步優化元潛在級別的特徵上。這可能意味著添加隱藏層,這樣我們就不需要匆忙處理了!

修改輸出層:使用適合你的領域的新激活函數和輸出大小替換模型默認值。不過,不要把自己局限於最明顯的解決方案。儘管 MNIST 看起來似乎需要 10 個輸出類,但有些數字有共同的變量,允許 12-16 個類可能會更好地解決這些變量,並提高模型性能!與上面提到的提示一樣,深度學習模型應該隨著我們接近輸出而不斷修改和定製。

Keras 中的技術


在 Keras 中修改 MNIST 的 dropout 和限制權重大小的方法如下:




model = Sequential()
model.add(Dropout(0.2, input_shape=(784,)))

model.add(Dense(128, input_dim=784, kernel_initializer='normal', activation='relu', kernel_constraint=maxnorm(5)))
model.add(Dropout(0.5))
model.add(Dense(128, kernel_initializer='normal', activation='tanh', kernel_constraint=maxnorm(5)))
model.add(Dropout(0.5))
model.add(Dense(1, kernel_initializer='normal', activation='sigmoid'))

dropout 最佳實踐


使用 20-50 % 的 dropout,建議輸入 20%。太低,影響可以忽略;太高,可能欠擬合。

在輸入層和隱藏層上使用 dropout。這已被證明可以提高深度學習的性能。

使用伴有衰減的較大的學習速率,以及較大的動量。

限制權重!較大的學習速率會導致梯度爆炸。通過對網絡權值施加約束(如大小為 5 的最大範數正則化)可以改善結果。

使用更大的網絡。在較大的網絡上使用 dropout 可能會獲得更好的性能,從而使模型有更多的機會學習獨立的表徵。

下面是 Keras 中的最終層修改示例,其中包含 14 個 MNIST 類:

from keras.layers.core import Activation, Dense
model.layers.pop()
model.outputs = [model.layers[-1].output]
model.layers[-1].outbound_nodes = []
model.add(Dense(14, activation='softmax'))

以及如何凍結前五層權重的示例:

for layer in model.layers[:5]:
   layer.trainable = False

或者,我們可以將該層的學習速率設為零,或者使用每個參數的自適應學習算法,如 Adadelta 或 Adam。這有點複雜,在其他平臺(如 Caffe)中實現得更好。

預訓練網絡庫


Keras

Kaggle 列表:https://www.kaggle.com/gaborfodor/keras-pretrained-models

Keras 應用:https://keras.io/applications/

OpenCV 示例:https://www.learnopencv.com/keras-tutorial-fine-tuning-using-pre-trained-models/

TensorFlow


VGG16:https://www.learnopencv.com/keras-tutorial-fine-tuning-using-pre-trained-models/

Inceptiom V3:https://github.com/tensorflow/models/blob/master/inception/README.md#how-to-fine-tune-a-pre-trained-model-on-a-new-task

ResNet:https://github.com/tensorflow/models/blob/master/inception/README.md#how-to-fine-tune-a-pre-trained-model-on-a-new-task

Torch


Caffe


在 Jupyter 中查看你的 TensorBoard 圖


模型的可視化通常很重要。如果你用 Keras 編寫模型,它的抽象很好,但不允許你深入到模型的各個部分進行更細緻的分析。幸運的是,下面的代碼可以讓我們直接使用 Python 可視化模型:



from IPython.display import clear_output, Image, display, HTML
def strip_consts(graph_def, max_const_size=32):
   """Strip large constant values from graph_def."""
   strip_def = tf.GraphDef()
   for n0 in graph_def.node:
       n = strip_def.node.add()
       n.MergeFrom(n0)
       if n.op == 'Const':
           tensor = n.attr['value'].tensor
           size = len(tensor.tensor_content)
           if size > max_const_size:
               tensor.tensor_content = bytes("<stripped %d bytes>"%size, 'utf-8')
   return strip_def

def rename_nodes(graph_def, rename_func):
   res_def = tf.GraphDef()
   for n0 in graph_def.node:
       n = res_def.node.add()
       n.MergeFrom(n0)
       n.name = rename_func(n.name)
       for i, s in enumerate(n.input):
           n.input[i] = rename_func(s) if s[0]!='^' else '^'+rename_func(s[1:])
   return res_def

def show_graph(graph_def, max_const_size=32):
   """Visualize TensorFlow graph."""
   if hasattr(graph_def, 'as_graph_def'):
       graph_def = graph_def.as_graph_def()
   strip_def = strip_consts(graph_def, max_const_size=max_const_size)
   code = """
       <script>
         function load() {{
           document.getElementById("{id}").pbtxt = {data};
         }}
       </script>
       <link rel="import" href="https://tensorboard.appspot.com/tf-graph-basic.build.html" onload=load()>
       <div style="height:600px">
         <tf-graph-basic id="{id}"></tf-graph-basic>
       </div>
   """.format(data=repr(str(strip_def)), id='graph'+str(np.random.rand()))

   iframe = """
       <iframe seamless style="width:800px;height:620px;border:0" srcdoc="{}"></iframe>
   """.format(code.replace('"', '&quot;'))
   display(HTML(iframe))


graph_def = tf.get_default_graph().as_graph_def()
tmp_def = rename_nodes(graph_def, lambda s:"/".join(s.split('_',1)))
show_graph(tmp_def)

使用 Keras 可視化你的模型


這一步將繪製模型的圖並將其保存為 png 文件:

from keras.utils.visualize_util import plot
plot(model, to_file='model.png')

plot 採用兩個可選參數:

也可以直接獲得 pydot.Graph 對象並自己對其進行渲染,如在 iPython notebook 中顯示它:

from IPython.display import SVG
from keras.utils.visualize_util import model_to_dot
SVG(model_to_dot(model).create(prog='dot', format='svg'))

原文連結:https://towardsdatascience.com/deep-learning-tips-and-tricks-1ef708ec5f53

本文為機器之心編譯,轉載請聯繫本公眾號獲得授權

✄---

加入機器之心(全職記者/實習生):hr@jiqizhixin.com

投稿或尋求報導:content@jiqizhixin.com

廣告&商務合作:bd@jiqizhixin.com

相關焦點

  • 如何優化深度學習模型
    深度學習的一個非常重要的步驟是找到正確的超參數,超參數是模型無法學習的。在本文中,我將向你介紹一些最常見的(也是重要的)超參數,這些參數是你抵達Kaggle排行榜#1的必經之路。但是對於我們絕大多數隻想在黑色星期五銷售之後用經濟型機器分類貓狗的人來說,現在是時候該弄清楚如何使這些深度學習模型真正起作用了。網格搜索這是獲得良好超參數的最簡單方法。它實際上就是暴力解決。算法:從一組給定的超參數中嘗試一堆超參數,看看哪種方法效果最好。
  • 普通程式設計師如何入門深度學習?
    例如,想知道照片中的人是不是開心,我們希望有一個模型,能將成千上萬的低級特徵(像素值),轉化為高度抽象的輸出(開心程度)。選擇正確模型並不簡單,不同的模型適合不同的數據集。在這本書中,我們會主要聚焦於深度神經網絡模型。這些模型包含了自上而下聯結的數據多層連續變換,因此稱之為深度學習。在討論深度神經網絡之前,我們也會討論一些簡單、淺顯的模型。我們需要對比模型的輸出和真實值之間的誤差。
  • 深度學習-機器學習從入門到深入全套資源分享
    ⭐️        《AI算法工程師手冊》        【完結】深度學習CV算法工程師從入門到初級面試有多遠,大概是25篇文章的距離        計算機相關技術面試必備        算法工程師面試        深度學習面試題目        深度學習500問        AI算法崗求職攻略
  • 知乎 | 機器/深度學習入門建議
    吳恩達深度學習網易雲課堂(中字)傳送門:深度學習工程師微專業 - 一線人工智慧大師吳恩達親研-網易雲課堂 - 網易雲課堂(https://mooc.study.163.com/smartSpec/detail/1001319001.htm)簡介:這應該是最好的入門教程了神經網絡和深度學習改善深層神經網絡:超參數調試、正則化以及優化
  • 深度學習模型壓縮方法
    我們介紹了一些在已有的深度學習模型的基礎上,直接對其進行壓縮的方法,包括核的稀疏化,和模型的裁剪兩個方面的內容,其中核的稀疏化可能需要一些稀疏計算庫的支持,其加速的效果可能受到帶寬、稀疏度等很多因素的制約;而模型的裁剪方法則比較簡單明了,直接在原有的模型上剔除掉不重要的filter,雖然這種壓縮方式比較粗糙,但是神經網絡的自適應能力很強,加上大的模型往往冗餘比較多,將一些參數剔除之後,
  • 深度學習 Python 入門與實戰
    課程簡介:如今,深度學習發展迅速,其影響力也越來越大,在機器視覺、語音識別、機器翻譯等領域都取得了前所未有的發展
  • Google深度學習TensorFlow最好的入門文章!
    這是一個3小時的課程(視頻+ppt),本課程為開發者提供簡要的深度學習基礎知識的介紹,以及 TensorFlow 的教學。深度學習(又名神經網絡)是建立機器學習模型的流行方法,許多開發者使用深度學習實現了他們的想法。如果你想學會深度學習,但又缺少時間,我深有同感。我大學時有一位數學老師,會對我大喊大叫:「Görner!積分在幼兒園就教過了!」
  • 模型壓縮公開課上線,浪潮算法優化專家詳解ResNet50的極致優化技巧
    深度學習模型作為機器學習的前沿方向,對推進人工智慧發展具有重要意義。然而,由於計算的複雜度以及參數冗餘,深度學習模型在一些場景和設備上很難進行部署,通常需要藉助模型壓縮、優化加速等方法突破瓶頸。目前,模型壓縮方法可以分為線性或非線性量化、結構或非結構剪枝、網絡結構搜索等,可以有效的降低參數冗餘,從而減少存儲佔用、通信帶寬和計算複雜度。
  • AI | 怎樣快速入門機器學習和深度學習?
    編者按:入門機器學習和深度學習並不是一件容易的事情。需要學習大量的知識,初學者常常會迷茫不知所措。現在我們給你帶來一篇純乾貨,幫助你入門機器學習和深度學習。一些坑:《Tensorflow實戰》:真的還不如就看官方教程或者斯坦福的課程CS 20SI《深度學習》:Goodfellow的大作,但真心不適合入門,適合進階5.
  • 深度學習入門首推資料--吳恩達深度學習全程筆記分享
    最近有學弟問我有沒有深度學習方面的入門資料,說他最近比較閒,想學點東西。
  • 12本深度學習書籍推薦:有入門,有深度
    人工智慧和深度學習中的複雜概念被簡單地闡述出來,使得讀者很容易理解。作者也避免了數學符號,而是通過 30 多個代碼片段來解釋概念。通過本書,你將從頭開始學習深度學習。學習圖像分類模型,學習如何在文本和序列數據上使用深度學習技術,如何使用聖經網絡生成文本和圖像。
  • 深度學習第17講:keras入門和快速上手指南
    作者:魯偉一個數據科學踐行者的學習日記。
  • 【模型蒸餾】從入門到放棄:深度學習中的模型蒸餾技術
    較前者的一些工作[3-4],這是一個通用而簡單的、不同的模型壓縮技術。(CVPR 2017) A Gift from Knowledge Distillation Yim等人的工作[12]展示了KD對於以下三種任務有幫助:1、網絡快速優化,2、模型壓縮,3、遷移學習。作者的知識蒸餾方法是讓學生網絡的FSP矩陣(the flow of solution procedure)和教師網絡的FSP矩陣儘可能相似。
  • 基於Keras/Python的深度學習模型Dropout正則項
    dropout技術是神經網絡和深度學習模型的一種簡單而有效的正則化方式。
  • 【機器學習】人人都可以做深度學習應用:入門篇(中)
    本文承接上篇文章人人都可以做深度學習應用:入門篇(上)(請戳我),在本文會總結深度學習環境的搭建以及一個經典的demo:識別手寫數字(MNIST
  • 主流的深度學習模型有哪些?
    隨著隱藏層的增多,更深的神經網絡(一般來說超過5層)就都叫做深度學習(DNN)。然而,「深度」只是一個商業概念,很多時候工業界把3層隱藏層也叫做「深度學習」,所以不要在層數上太較真。在機器學習領域的約定俗成是,名字中有深度(Deep)的網絡僅代表其有超過5-7層的隱藏層。神經網絡的結構指的是「神經元」之間如何連接,它可以是任意深度。
  • 快速入門深度學習,從 Deeplearning4j 開始
    這些都是以 Python 和 C/C++ 語言為主,而在目前企業項目中,無論是 Web 應用、Andriod 開發還是大數據應用,Java 語言都佔有很大的比例。此外,我們必須看到,越來越多的從事傳統 Java 應用開發的工程師嘗試將 AI 技術融入到項目中,或者自身在嘗試轉型 AI 領域。
  • 加速深度學習在線部署,TensorRT安裝及使用教程
    基本做法都是基於現有的經典模型提出一種新的模型結構,然後用這些改造過的模型重新訓練,再重新部署。而tensorRT 則是對訓練好的模型進行優化。tensorRT就只是推理優化器。當你的網絡訓練完之後,可以將訓練模型文件直接丟進tensorRT中,而不再需要依賴深度學習框架(Caffe,TensorFlow等),如下:
  • 利用Python進行深度學習的完整入門指南(附資源)
    如果你有興趣了解關於深度學習的最新趨勢,本文是一個很全面的匯總。在這裡,我們的目標是為新手和想進一步探索深度學習的人們提供一個學習路徑。那麼,你準備好踏上徵服深度學習的徵程了嗎?我們上路吧。步驟0:出徵準備建議在進入深入學習領域之前,應該了解機器學習的基本知識。
  • 深度學習模型壓縮與加速綜述
    因此,如何在不影響深度學習模型性能的情況下進行模型壓縮與加速,成為了學術界和工業界的研究熱點。1、簡介深度學習模型壓縮與加速是指利用神經網絡參數和結構的冗餘性精簡模型,在不影響任務完成度的情況下,得到參數量更少、結構更精簡的模型。被壓縮後的模型對計算資源和內存的需求更小,相比原始模型能滿足更廣泛的應用需求。