雷鋒網 AI 科技評論:對於深度學習而言,在有很多數據的情況下,再複雜的問題也不在話下,然而沒有這麼多數據呢?本文作者 Tyler Folkman 針對這一問題,為大家介紹了幾個在有限的數據上使用深度學習的方法,讓深度學習即便在面臨數據稀缺時,也能大展身手。
眾所周知,深度學習是有史以來最棒的事情。它能夠在大量數據上以低成本解決複雜問題。唯一的問題是你既不在谷歌工作,也不在臉書工作,你的數據是稀缺的,那麼你該怎麼辦?你是能繼續使用是深度學習的能力,還是已無計可施?
下面就讓我介紹幾個在有限的數據上使用深度學習的方法,以及闡述為什麼我認為這可能是未來研究中最令人興奮的領域之一。
在我們探討在有限的數據上使用深度學習的方法之前,請先從神經網絡後退一步,建立一個簡單的基線。用一些傳統模型(如隨機森林)進行實驗通常不會花費很長時間,而這將有助於評估深度學習的所有潛在提升,並針對你的問題提供更多權衡深度學習方法和其他方法的視角。
這聽起來可能很荒謬,但是你真的考慮過自己能否收集更多的數據嗎?我經常向公司提出獲取更多數據的建議,但他們視我的建議如瘋人瘋語,這讓我很吃驚。是的,投入時間和金錢去收集更多的數據是可行的,而事實上,這通常也是你最好的選擇。例如,也許你正試圖對稀有鳥類進行分類,但數據非常有限。幾乎可以肯定地說,你可以僅僅通過標註更多的數據來比較輕易地解決這個問題。你不確定需要收集多少數據?對此,你可以在增加額外的數據時嘗試繪製學習曲線(相關教程連結:https://www.dataquest.io/blog/learning-curves-machine-learning/),並同時查看模型性能的變化,從而確定所需的數據量。
攝影作者 Drew Patrick Miller,來源 Unsplash(網站連結:https://unsplash.com/?utm_source=medium&utm_medium=referral)
現在假設你已經有一個簡單的基線模型,且在獲取更多數據上要麼不可行要麼太昂貴。此時最可靠和正確的方法是利用預訓練模型,然後針對你的問題對模型進行微調。
微調的基本思想是取一個一定程度上跟模型所在域相似的非常大的數據集,訓練一個神經網絡,然後用你的小數據集對這個預先訓練好的神經網絡進行微調。你可以在 A Comprehensive guide to Fine-tuning Deep Learning Models in Keras 這篇文章閱讀更多內容:
對於圖像分類問題,最常用的數據集是 ImageNet。這個數據集涵蓋目標多個類的數百萬張圖像,因此可以用於許多類型的圖像問題。它甚至包括動物,因此可能有助於稀有鳥類的分類。
若需要使用一些用於微調的代碼,請參閱 Pytorch 的教程(教程連結:https://pytorch.org/tutorials/beginner/finetuning_torchvision_models_tutorial.html)。
如果你無法獲得更多的數據,並且無法成功地對大型數據集進行微調,那麼數據增強通常是你接下來的最佳選擇。它還可以與微調一起使用。
數據增強背後的思想很簡單:在不改變標籤值的情況下,以提供新數據的方式改變輸入。
例如,你有一張貓的圖片,旋轉圖片後仍然是一張貓的圖片,這便是一次不錯的數據增強。另一方面,如果你有一張道路的圖片,想要預測適當的方向盤轉度(自動駕駛汽車),若旋轉這張道路的圖片將會改變適當的方向盤轉度,除非你把方向盤轉度調整到適當位置,否則難以預測成功。
數據增強是圖像分類問題中最常見的方法,相關的技術可以在這個網站獲取:https://nanonets.com/blog/data-augmentation-how-to-use-deep-learning-when-you-have-limited-data-part-2/。
你也可以經常思考一些創造性的方式來將數據增強應用到其他領域,例如 NLP(相關示例可參考:https://towardsdatascience.com/these-are-the-easiest-data-augmentation-techniques-in-natural-language-processing-you-can-think-of-88e393fd610),同時大家也在嘗試使用 GANs 來生成新數據。如果對 GAN 方法感興趣,可以閱讀《深度對抗數據增強》(Deep Adversarial Data Augmentation)這篇文章(文章連結:https://github.com/SchafferZhang/DADA)。
最近的一篇論文《不使用餘弦損失進行預訓練的情況下在小數據集上進行深度學習》(Deep Learning on Small Datasets without Pre-Training using Cosine Loss)(論文連結:https://arxiv.org/pdf/1901.09054.pdf)發現,在分類問題中將損失函數從分類交叉熵損失轉換為餘弦損失時,小數據集的準確率提高了 30%,而餘弦損失僅為「 1 - 餘弦相似度」。
從上圖中可以看出,基於每個類的樣本數量的性能是如何變化的,以及微調對於一些小型數據集(CUB)是多麼有價值,而對於其他數據集(CIFAR-100)則沒有那麼有價值。
在一篇 NIPS 論文《小數據集的現代神經網絡泛化》(Modern Neural Networks Generalize on Small Data Sets)(論文連結:https://papers.nips.cc/paper/7620-modern-neural-networks-generalize-on-small-data-sets.pdf)種,作者將深度神經網絡視為集合。具體來說,即「與其說每一層都呈現出不斷增加的特徵層次,不如說最後一層提供了一種集成機制。」
從中得到的關於小數據的益處是確保你建立的深度網絡能利用這種集成效應。
現在已有通過採用更多優化的起始權重成功使用堆棧自編碼器對網絡進行預訓練的案例(該案例可參考論文「Using deep neural network with small dataset to predict material defects」:https://www.sciencedirect.com/science/article/pii/S0264127518308682)。這樣可以避免局部優化和其他不良初始化的陷阱。不過,Andrej Karpathy 建議不要對無監督預訓練過度興奮(相關文章可參考:http://karpathy.github.io/2019/04/25/recipe/)。
如果你需要複習自編碼器相關知識,可以看看史丹福大學的深度學習教程(網址:http://ufldl.stanford.edu/tutorial/unsupervised/Autoencoders/)。自編碼器的基本思想是建立一個預測輸入的神經網絡。
圖 4:攝影作者 Glen Noble,來源 Unsplash(網站連結:https://unsplash.com/?utm_source=medium&utm_medium=referral)
最後一點是嘗試找到結合特定領域知識的方法,以指導學習過程。例如,在論文《通過概率程序規劃歸納進行類人概念學習》(Human-level concept learning through probabilistic program induction,論文連結:https://science.sciencemag.org/content/350/6266/1332)中,作者構建了一個能夠在學習過程中利用先驗知識從部分概念中構造整體概念的模型,這樣的模型能夠實現人類水平的性能,並超出了當時的深度學習方法。
你也可以使用域知識來限制對網絡的輸入,以降低維度或將網絡體系結構調整的更小。
我將其作為最後的選擇,是因為結合先驗知識可能是一個挑戰,通常也是最耗費時間的。
希望本文為你提供了一些關於如何在有限的數據上使用深度學習技術的思路。我個人認為,這是一個目前沒有得到足夠討論的問題,但它具有令人非常興奮的意義。
大量問題的數據非常有限,因為獲取更多的數據要麼非常昂貴要麼不可行,就比如說檢測罕見疾病或教育成果。找到方法來應用深度學習等最好的技術來解決這些問題是非常令人興奮的!正如吳恩達(Andrew Ng)也曾提到:
雷鋒網原創文章,未經授權禁止轉載。詳情見轉載須知。