使用PyTorch進行主動遷移學習:讓模型預測自身的錯誤

2020-12-11 雷鋒網

機器學習模型可以用來預測自身的錯誤,因此相信在未來,未標記的數據點以後會被正確地標記,而不是被定為錯誤。本文詳細說明主動遷移學習, 它是主動學習和遷移學習技術的結合,本文將實現書籍  Human-in-the-Loop Machine Learning 中的所有用到 PyTorch 的方法。

寫在開始之前

在我之前為 PyTorch 撰寫的文章《Active Learning with PyTorch》中,我介紹了主動學習的構建模塊。如果你不熟悉主動學習,你可以從這裡開始了解,也可以看看我關於兩種主動學習——不確定性抽樣和多樣性抽樣的文章,以及相關的主動學習技術來將知識串聯起來:

文章網址:https://towardsdatascience.com/uncertainty-sampling-cheatsheet-ec57bc067c0b

文章網址:https://towardsdatascience.com/https-towardsdatascience-com-diversity-sampling-cheatsheet-32619693c304

文章網址:https://towardsdatascience.com/advanced-active-learning-cheatsheet-d6710cba7667

在我的免費 PyTorch 庫中,也有所有主動學習算法的相關例子,包括本文中介紹的新算法:

github 網址:https://github.com/rmunro/pytorch_active_learning

理想情況下,你應該在接觸本文中更高級的方法之前,親自嘗試實現更簡單的主動學習策略。

什麼是遷移學習?

遷移學習是將為一個特定任務建立的機器學習模型應用於另一個任務的過程。

「我們要去的地方不需要道路」。機械遷移學習:一輛車可以被改造成一臺時間機器,或者一艘船 (圖片來源:SF Chronicle)

將技術從一個用例調整到另一個用例是很有趣的。我永遠不會忘記,有一天,當我在 San Francisco 附近透過火車車窗看到一輛汽車在 Brisbane Lagoon 的水裡與火車相撞時的激動心情。

每當為一個特定目的而構建的機器學習模型適應於一個全新的用例時,你都可以感受到同樣的喜悅。如果這個用例碰巧是主動學習,那麼我們將把機器學習中最有趣的部分應用到解決機器學習中最重要的問題中:人類和人工智慧如何一起解決問題?

在當前的機器學習中,遷移學習通常是指獲取一個現有的神經模型,然後對最後一層 (或最後幾層) 進行再訓練,以完成新的任務,它可以表示為:

遷移學習的一個例子。模型預測標籤為「a」、「B」、「C」或「D」,單獨的數據集標籤為「W」、「X」、「Y」和「Z」。再訓練模型的最後一層模型現在能夠預測標籤「W」、「X」、「Y」和「Z」。

遷移學習的最大優點是,與從頭開始訓練一個模型相比,你需要更少的人工標記的示例,這意味著你可以用更少的數據獲得更高精度的模型。如果你有計算機視覺背景,你可能已經用遷移學習來適應一個來自 ImageNet 分類任務的模型;如果你有自然語言處理背景,你可能已經用遷移學習來適應一個像 BERT 這樣的預先訓練過的模型。

讓你的模型預測它自己的錯誤

遷移學習的新標籤可以是任何你想要的類別,這包括任務本身的信息!這是主動遷移學習三個核心觀點中的第一個:

觀點 1:你可以使用遷移學習,通過讓你的模型預測自己的錯誤,來發現模型哪裡被混淆了。

這篇文章涵蓋了三種主動遷移學習的變體,最簡單的一種是二進位的「correct/incorrect」任務,用來預測模型可能在哪裡出錯:

不確定性抽樣的主動遷移學習。驗證項由模型預測,並根據分類是否正確將其劃分為「incorrect」或「incorrect」。然後對模型的最後一層進行重新訓練,以預測項目是「correct」還是「incorrect」,從而有效地將兩個  bucket 轉換為新的標籤。

這個過程有三個步驟:

  • 將模型應用於驗證數據集,並捕獲哪些驗證項被正確分類了,哪些被錯誤分類了。這是你的新的訓練數據:你的驗證項現在有一個附加的「correct」或「incorrect」標籤。

  • 為模型創建一個新的輸出層,並在新的訓練數據上訓練這個新層,預測新的「correct」/「incorrect」標籤。

  • 在新模型中運行未標記的數據項,並對預測為「不正確」的數據項進行抽樣,這是最可靠的。

PyTorch 使這一過程變得非常簡單,它能夠將每個神經元的激活傳遞迴其他進程,從而使我們能夠在原有模型的基礎上構建我們的主動遷移學習模型。假設我們有一個簡單的網絡,有一個隱含層,使用這個 forward() 函數:

def forward(self, feature_vec, return_all_layers=False):   

  

   hidden1 = self.linear1(feature_vec).clamp(min=0)
   output = self.linear2(hidden1)
   log_softmax = F.log_softmax(output, dim=1)   


   if return_all_layers:
         return [hidden1, output, log_softmax]        
     else:
        return log_softmax

然後我們可以迭代我們的驗證數據,並為每個驗證項分配一個值,即它是「correct」還是「incorrect」,並將其隱含層作為輸入存儲到我們的新模型中:

correct_predictions = [] # validation items predicted correctly
incorrect_predictions = [] # validation items predicted incorrectly
item_hidden_layers = {} # hidden layer of each item, by id


for item in validation_data:

   # assume "item" contains id, label & features of each data point
   id = item["id"]
   label = item["label"]
   feature_vector = item["feature_vector"]
   
   hidden, logits, log_probs = model(feature_vector, True)   


   item_hidden_layers[id] = hidden # record hidden layer value
   
   if is_correct(label, log_probs):
       correct_predictions.append(item)
   else:
       incorrect_predictions.append(item)

然後我們可以訓練一個新的模型來預測「correct」或「incorrect」,使用隱藏層作為新的輸入 (特徵) 向量。假設我們在代碼中調用了新模型 correct_model。

在這個新模型被訓練之後,唯一棘手的部分是,我們需要從兩個模型中得到未標記數據的預測:第一個預測從第一個模型中得到隱含層,然後第二個預測新的「correct/incorrect」模型:

active_transfer_preds = []


with torch.no_grad():    #A
   v=0
   for item in unlabeled_data:
       id = item["id"]
       label = item["label"]
       feature_vector = item["feature_vector"]
       
       # get prediction from initial model
       hidden, logits, log_probs = model(feature_vector, True)

      # get predictions from correct/incorrect model
       correct_log_probs = correct_model(hidden, False)

此時,在代碼 correct_log_probs 中有未標記項被正確預測的概率。通過對被正確預測的置信度最低的項進行抽樣,就是對那些本應由人類檢查的應用標籤的項目進行抽樣。

這段代碼是免費 PyTorch 庫中的 advanced_active_learning.py 文件中的代碼的一個稍微簡化的版本:https://github.com/rmunro/pytorch_active_learning/blob/master/advanced_active_learning.py

你可以使用以下命令立即在用例——識別與災難相關的消息上運行它:

python advanced_active_learning.py——transfer_learned_uncertainty = 10

這將運行整個過程,然後給你提供 10 個最不確定的項目,以便你提供正確的標籤。

此時,該模型可能並不比簡單的不確定性抽樣算法更好,因此,首先實現簡單的方法作為基線也是一個好主意。但不要放棄:這是構建更強大的算法的第一步。

比起簡單的方法,我們從遷移學習中獲得的最大優勢是,它使我們的主動學習策略更容易適應。主動學習策略的一個常見問題是,它們會對未標記的項目進行抽樣,這些項目都來自特徵空間的一部分,因此缺乏多樣性,因此需要使用像聚類這樣的多樣性抽樣方法來避免這個問題。有一些先進的主動學習技術將不確定性抽樣和多樣性抽樣單獨地結合起來,但是本文中的以下方法具有將這兩者結合成單一架構的優點。

通常情況下,實時的人類標籤很難獲得,更實際的做法是採樣大量未標記的物品,並將其標記為一批。所以在這些情況下,自適應代表性抽樣的主動遷移學習在抽樣過程中是合適的,即使我們還不知道標籤是什麼。

代表性抽樣的主動遷移學習

對於許多實際的用例,你的數據會隨著時間而變化。例如,在自動駕駛汽車用例中,總是會遇到新類型的對象,並且對象的範圍可能會擴大,比如在道路之外的開闊水域駕駛。

代表性抽樣是多樣性抽樣的一種形式,其目的是對與當前機器學習模型的應用領域最相似的未標記項進行抽樣。

因為我們採樣的項目將獲得一個人工標籤,我們可以假設它們是訓練數據的一部分,而不需要知道標籤是什麼。

自適應代表性抽樣的主動遷移學習

步驟如下:

  1. 從與訓練數據相同的分布中獲取驗證數據,並給它一個「Training」標籤。從我們的目標域獲取未標記的數據,並給它一個「Application」標籤。

  2. 訓練一個新的輸出層來預測訓練/應用程式標籤,讓它訪問模型的所有層。

  3. 將新模型應用於未標記的數據,並對最有可能被預測為「應用程式」的項目進行抽樣。

  4. 假設新抽樣的項目稍後將獲得標籤並成為訓練數據的一部分:將這些項目的標籤從「Application」更改為「training」,然後重複步驟 2。

這是一個非常強大的算法,因為它避免了只對特徵空間的一部分進行採樣,在任何人為標記之前對一組不同的項目進行採樣。

觀點 2:即使你還不知道標籤是什麼,你也可以假設一個未標記的項目以後會得到一個標籤。

自適應採樣的主動轉遷移學習 (ATLAS)

主動遷移學習最複雜的應用是自適應採樣 (ATLAS) 的主動學習。它綜合了本文中前面兩個模型的原則:在添加任何人工標記之前預測不確定性並適應數據。

我們用時間旅行來對此進行類比。想像一下,你把你的車變成了一臺時間機器,但你必須以每小時 88 英裡的速度行駛,才能進行時空旅行。即使你還不知道未來的路會是什麼樣子,你也可以把車開到未來。然後,即使沒有充分的知識背景,你也可以考慮汽車將會在哪裡,開始制定未來的計劃。

我們可以對我們的模型做同樣的事情,假設我們有數據知識,我們將在以後標記並使用這些知識來採樣更多的數據供人類檢查:

用於自適應採樣的主動遷移學習

步驟如下:

  1. 將模型應用於驗證數據集,並捕獲哪些驗證項被正確分類了,哪些被錯誤分類了。這是你的新訓練數據:你的驗證項現在有一個附加的「correct」或「incorrect」標籤。

  2. 為模型創建一個新的輸出層,並在新的訓練數據上訓練這個新層,預測新的「correct」/「incorrect」標籤。

  3. 在新模型中運行未標記的數據項,並對預測為「incorrect」的數據項進行抽樣,這是最可靠的。

  4. 假設新抽樣的項目稍後將得到標籤,並且模型稍後將在對這些項目進行訓練後正確預測這些項目:將這些項目的標籤從「incorrect」更改為「correct」,然後重複步驟 2。

通過結合不確定性採樣和自適應代表性採樣的主動遷移學習技術,我們現在有了一個可以預測其未來狀態的模型。它不知道最初採樣的項目的標籤是什麼,但它知道它們會得到一個標籤,然後它可以根據預期的未來事件做出更明智的抽樣決策。

觀點 3:你可以假設模型將正確預測未標記項的標籤,這些項和稍後將獲得標籤的項一樣,即使你還不知道標籤是什麼。

此代碼與上述文件位於同一個免費 Pythorch 庫中的 advanced_active_learning.py 相同:https://github.com/rmunro/Pythorch_active_learning/blob/master/advanced_active_learning.py 

你可以使用以下命令行運行它:

python advanced_active_learning.py --atlas=10

主動遷移學習備忘單

這是一個單頁的備忘單,你可以在構建本文中的算法時參考它:

主動遷移學習備忘單

為了快速參考,你可以在這裡下載一個 PDF 版本的備忘單:http://www.robertmunro.com/Active_Transfer_Learning_cheatsheet.PDF

本文摘自我的書《Human-in-the-Loop Machine Learning》,網址:https://www.manning.com/books/human-in-the-loop-machine-learning#ref 。

如果你要開始學習這本書,以下有一些注意事項:

  1. 這本書中的方法在數學上相當於刪除最後一層並重新訓練一個新層(如上圖所示),或者取而代之的是從最後一個隱藏層獲取輸出並將其用作新模型的輸入(如代碼示例中所示)。我認為前者在視覺上更直觀,但後者不太容易出錯,因為它是純粹的加法,你不必擔心更改模型會對代碼的其他部分產生什麼影響。如果你更喜歡在自己的代碼中實現遷移學習,那就沒問題了。如果你想用新的數據/標籤來調整現有的層,而不是完全移除層,那麼這也是正確的。

  2. 注意,代表性採樣的示例使用所有隱藏層,並且還添加了額外的新層,而不確定性採樣和 ATLAS 示例是在最終隱藏層之後的簡單二進位預測。從設計上來說,這是架構的一個良好起點,但是你可以在所有情況下嘗試不同的架構。這背後的原因是,我們模型的最後一層沒有將數據中沒有很好表示的項與數據中很好表示的項區分開來,但是這些項具有與當前狀態下的模型基本無關的特徵。因此,代表性抽樣應該更好地利用早期層的信息。相比之下,不確定性採樣和 ATLAS 示例只使用最後一層,因為模型的最後一層已經最小化不確定性,因此在較早的層中不太可能找到更多的信息,如果包含較早的層,則更容易過度擬合。

  3. 你可以考慮通過 Monte-Carlo 採樣從單個模型進行多個模型變量預測。這些示例依賴於與你的訓練域來自同一發行版的驗證數據,並且你可以輕鬆地對該驗證集中的特定項進行過擬合。如果要將訓練數據 90:10 拆分為 training:validation,就像這裡的代碼示例一樣,那麼一個簡單的方法是對所有 90:10 組合重複此操作。注意,對於不確定性採樣和 ATLAS 示例,你只創建了一個新的二進位預測器,因此不需要太多的數據就可以得到穩健的結果。這是這些模型的一個很好的特性:一個額外的二進位預測很容易用相對較少的數據進行訓練,而且通常不需要手動調整。

  4. 主動遷移學習可以用於更複雜的任務,如目標檢測、語義分割、序列標記和文本生成。幾乎任何類型的神經模型都可以添加一個新的層來預測「correct/Incorrect」標籤或「training/application」標籤,因此這是一種非常通用的技術。

via:https://medium.com/pytorch/active-transfer-learning-with-pytorch-71ed889f08c1

雷鋒網(公眾號:雷鋒網)雷鋒網雷鋒網

雷鋒網版權文章,未經授權禁止轉載。詳情見轉載須知。

相關焦點

  • Deep CARs:使用Pytorch學習框架實現遷移學習
    本模型將通過神經網絡來實現目標。更準確地說,是使用一個深度神經網絡,因此得名Deep CARs(深度計算機自動額定值系統)。想要實現這一目標,需要完成兩部分的學習,第1部分:構建汽車分類器;第2部分:部署分類器。本文將著重論述第1部分內容。我們將使用一種叫做遷移學習的方法來訓練分類器。什麼是遷移學習?
  • 還不會使用PyTorch框架進行深度學習的小夥伴,看過來
    選自heartbeat.fritz.ai作者:Derrick Mwiti機器之心編譯參與:Geek AI、王淑婷這是一篇關於使用 PyTorch 框架進行深度學習的教程,讀完以後你可以輕鬆地將該框架應用於深度學習模型。
  • 初學者怎樣使用Keras進行遷移學習
    訓練數據必須以特定格式存儲,以便饋送到網絡中進行訓練。我們將使用Keras中提供的ImageDataGenerator來訓練我們的可用數據模型。這樣,就代碼而言,該過程變得更加簡單。 必須有一個主數據文件夾,在該數據文件夾中,每個包含相應圖像的數據類必須有一個文件夾。文件夾的名稱必須是其各自類的名稱。
  • 使用PyTorch進行情侶幸福度測試指南
    在數據集收集方面,我們使用這個Python腳本[2]進行網頁數據抽取(webscraping)來獲取幸福和不幸福的情侶數據。最後,我們整理出了大約包含1000張圖像的訓練集。這並不是特別多,所以我們使用數據增強與遷移學習來增強我們模型在數據集上的表現。數據增強--圖像方向的微小變化,色調和色彩強度以及許多其他因素都會增強模型的泛化能力,從而避免學習一些不相關信息。
  • PyTorch中使用DistributedDataParallel進行多GPU分布式模型訓練
    先進的深度學習模型參數正以指數級速度增長:去年的GPT-2有大約7.5億個參數,今年的GPT-3有1750億個參數。雖然GPT是一個比較極端的例子但是各種SOTA模型正在推動越來越大的模型進入生產應用程式,這裡的最大挑戰是使用GPU卡在合理的時間內完成模型訓練工作的能力。為了解決這些問題,從業者越來越多地轉向分布式訓練。
  • PyTorch實現TPU版本CNN模型
    隨著深度學習模型在各種應用中的成功實施,現在是時候獲得不僅準確而且速度更快的結果。為了得到更準確的結果,數據的大小是非常重要的,但是當這個大小影響到機器學習模型的訓練時間時,這一直是一個值得關注的問題。為了克服訓練時間的問題,我們使用TPU運行時環境來加速訓練。為此,PyTorch一直在通過提供最先進的硬體加速器來支持機器學習的實現。
  • 深度學習新應用:在PyTorch中用單個2D圖像創建3D模型
    在 2D 深度學習中,卷積自編碼器是一種學習輸入圖像壓縮表徵的有效方法。將該架構拓展到學習緊湊形狀知識是將深度學習應用於 3D 數據的最有前景方法。它們各有優缺點,所以數據表徵的選擇直接影響了使用它們的方法。柵格化形式(體素網格):可以直接應用 CNN每個藍色的盒子表示單個體素,大部分體素都是空的。體素是體積像素(volumetric pixel)的簡稱,它直接將空間網格像素拓展為體積網格體素。
  • NLP領域中的遷移學習現狀
    在當前的自然語言處理領域中,普遍存在著不同類型的遷移學習。它們可以按照三個維度進行分類:1、源設定和目標設定是否處理相同的任務;2、源域和目標域的性質;3、學習任務的順序。這樣就可以把各種遷移學習分為圖中的幾類。
  • 重磅| Torch7團隊開源PyTorch:Python優先的深度學習框架
    PyTorch 介紹在粒度層面(granular level)上,PyTorch 庫包含了以下組件:使用 PyTorch 的原因通常有二:作為 numpy 的替代,以便使用強大的 GPU;將其作為一個能提供最大的靈活性和速度的深度學習研究平臺。
  • 福利,PyTorch中文版官方教程來了
    PyTorch 是近年來較為火爆的深度學習框架,然而其中文版官方教程久久不來。近日,一款完整的 PyTorch 中文版官方教程出爐,讀者朋友可以更好的學習了解 PyTorch 的相關細節了。教程作者來自 pytorchchina.com。
  • 聯邦學習 OR 遷移學習?No,我們需要聯邦遷移學習
    從數學角度描述遷移學習,給定一個源域 Ds 和學習任務 Ts,目標域為 Dt 和學習任務 Tt,遷移學習的目的是利用 Ds 和 Ts 中的知識來改進對 Dt 中目標預測函數 f_T(·)的學習,其中 Ds ≠ Dt,或 Ts ≠ Tt。在上面的定義中,域是一對 D=。因此,條件 Ds ≠ Dt 意味著 Xs ≠ Xt 或 Ps(X) ≠ Pt(X)。
  • 雲計算學習:用PyTorch實現一個簡單的分類器
    回想了一下自己關於 pytorch 的學習路線,一開始找的各種資料,寫下來都能跑,但是卻沒有給自己體會到學習的過程。有的教程一上來就是寫一個 cnn,雖然其實內容很簡單,但是直接上手容易讓人找不到重點,學的雲裡霧裡。有的教程又淺嘗輒止,師傅領到了門檻跟前,總感覺自己還沒有進門,教程就結束了。
  • 如何使用XGBoost模型進行時間序列預測
    XGBoost也可以被用於時間序列預測,儘管它需要將時間序列數據集先轉換成監督學習問題。它需要用到一種被稱為前進式驗證的特殊方法來評估模型,因為使用k折驗證來評估模型容易導致偏向樂觀的結果。本教程中,你將探索如何為時間序列預測開發一個XGBoost模型。
  • 使用PyTorch 檢測眼部疾病
    我們要利用這些數據對圖像進行normalize操作。 現在我們使用 pytorch 加載數據。每幅圖像都是中心像素,大小為490x490像素(為了在每幅圖像之間保持統一大小) ,然後轉換為張量,再進行規範化。
  • 自監督學習知識遷移
    自監督學習是一個非常有趣的研究領域,其目標是在沒有任何人工標註的情況下,從未標註的數據中學習豐富的表示。我們可以通過創造性地提出一個問題來實現,這樣你就可以使用數據本身的一部分作為標籤並嘗試進行預測。這樣的表述被稱為前置任務例如,你可以設置一個前置任務,給定灰度圖情況下來預測圖像的彩色版本。
  • Keras vs PyTorch:誰是第一深度學習框架?
    兩大框架的連結:  Keras:https://github.com/keras-team/keras (https://keras.io/)  PyTorch:https://github.com/pytorch/pytorch  你想學習深度學習嗎?
  • 當模型預測控制遇見機器人學習
    本文將不使用任何讓人敬而遠之的公式,試圖通過自然語言深入淺出的討論,當模型預測控制遇見機器學習,它們會擦出怎樣的思想火花。無監督學習:與監督學習相比,訓練集沒有人為標註的結果。常見的無監督學習算法有生成對抗網絡(GAN)、聚類。遷移學習:專注於存儲已有問題的解決模型,並將其利用在其他不同但相關問題上。
  • 60分鐘入門深度學習工具PyTorch
    net.parameters返回模型需要學習的參數。在測試集上測試網絡我們在整個訓練集上訓練了兩次網絡,但是我們還需要檢查網絡是否從數據集中學習到東西。我們通過預測神經網絡輸出的類別標籤並根據實際情況進行檢測,如果預測正確,我們把該樣本添加到正確預測列表。第一步,顯示測試集中的圖片一遍熟悉圖片內容。
  • 使用LSTM深度學習模型進行溫度的時間序列單步和多步預測
    本文的目的是提供代碼示例,並解釋使用python和TensorFlow建模時間序列數據的思路。本文展示了如何進行多步預測並在模型中使用多個特徵。本文的簡單版本是,使用過去48小時的數據和對未來1小時的預測(一步),我獲得了溫度誤差的平均絕對誤差0.48(中值0.34)度。
  • PyTorch模型訓練特徵圖可視化(TensorboardX)
    大家都知道Tensorflow有一款非常優秀的可視化工具Tensorboard,而PyTorch自身沒有可視化功能,但是我們可以尋找替代品,即TensorBoardX。安裝過程不多介紹,詳見下面的參考連結,裡面相應有比較豐富的介紹。