0
本文作者: skura | 2020-01-15 10:41 |
機(jī)器學(xué)習(xí)模型可以用來預(yù)測自身的錯誤,因此相信在未來,未標(biāo)記的數(shù)據(jù)點(diǎn)以后會被正確地標(biāo)記,而不是被定為錯誤。本文詳細(xì)說明主動遷移學(xué)習(xí), 它是主動學(xué)習(xí)和遷移學(xué)習(xí)技術(shù)的結(jié)合,本文將實(shí)現(xiàn)書籍 Human-in-the-Loop Machine Learning 中的所有用到 PyTorch 的方法。
寫在開始之前
在我之前為 PyTorch 撰寫的文章《Active Learning with PyTorch》中,我介紹了主動學(xué)習(xí)的構(gòu)建模塊。如果你不熟悉主動學(xué)習(xí),你可以從這里開始了解,也可以看看我關(guān)于兩種主動學(xué)習(xí)——不確定性抽樣和多樣性抽樣的文章,以及相關(guān)的主動學(xué)習(xí)技術(shù)來將知識串聯(lián)起來:
文章網(wǎng)址:https://towardsdatascience.com/uncertainty-sampling-cheatsheet-ec57bc067c0b
文章網(wǎng)址:https://towardsdatascience.com/advanced-active-learning-cheatsheet-d6710cba7667
在我的免費(fèi) PyTorch 庫中,也有所有主動學(xué)習(xí)算法的相關(guān)例子,包括本文中介紹的新算法:
github 網(wǎng)址:https://github.com/rmunro/pytorch_active_learning
理想情況下,你應(yīng)該在接觸本文中更高級的方法之前,親自嘗試實(shí)現(xiàn)更簡單的主動學(xué)習(xí)策略。
什么是遷移學(xué)習(xí)?
遷移學(xué)習(xí)是將為一個(gè)特定任務(wù)建立的機(jī)器學(xué)習(xí)模型應(yīng)用于另一個(gè)任務(wù)的過程。
「我們要去的地方不需要道路」。機(jī)械遷移學(xué)習(xí):一輛車可以被改造成一臺時(shí)間機(jī)器,或者一艘船 (圖片來源:SF Chronicle)
將技術(shù)從一個(gè)用例調(diào)整到另一個(gè)用例是很有趣的。我永遠(yuǎn)不會忘記,有一天,當(dāng)我在 San Francisco 附近透過火車車窗看到一輛汽車在 Brisbane Lagoon 的水里與火車相撞時(shí)的激動心情。
每當(dāng)為一個(gè)特定目的而構(gòu)建的機(jī)器學(xué)習(xí)模型適應(yīng)于一個(gè)全新的用例時(shí),你都可以感受到同樣的喜悅。如果這個(gè)用例碰巧是主動學(xué)習(xí),那么我們將把機(jī)器學(xué)習(xí)中最有趣的部分應(yīng)用到解決機(jī)器學(xué)習(xí)中最重要的問題中:人類和人工智能如何一起解決問題?
在當(dāng)前的機(jī)器學(xué)習(xí)中,遷移學(xué)習(xí)通常是指獲取一個(gè)現(xiàn)有的神經(jīng)模型,然后對最后一層 (或最后幾層) 進(jìn)行再訓(xùn)練,以完成新的任務(wù),它可以表示為:
遷移學(xué)習(xí)的一個(gè)例子。模型預(yù)測標(biāo)簽為「a」、「B」、「C」或「D」,單獨(dú)的數(shù)據(jù)集標(biāo)簽為「W」、「X」、「Y」和「Z」。再訓(xùn)練模型的最后一層模型現(xiàn)在能夠預(yù)測標(biāo)簽「W」、「X」、「Y」和「Z」。
遷移學(xué)習(xí)的最大優(yōu)點(diǎn)是,與從頭開始訓(xùn)練一個(gè)模型相比,你需要更少的人工標(biāo)記的示例,這意味著你可以用更少的數(shù)據(jù)獲得更高精度的模型。如果你有計(jì)算機(jī)視覺背景,你可能已經(jīng)用遷移學(xué)習(xí)來適應(yīng)一個(gè)來自 ImageNet 分類任務(wù)的模型;如果你有自然語言處理背景,你可能已經(jīng)用遷移學(xué)習(xí)來適應(yīng)一個(gè)像 BERT 這樣的預(yù)先訓(xùn)練過的模型。
讓你的模型預(yù)測它自己的錯誤
遷移學(xué)習(xí)的新標(biāo)簽可以是任何你想要的類別,這包括任務(wù)本身的信息!這是主動遷移學(xué)習(xí)三個(gè)核心觀點(diǎn)中的第一個(gè):
觀點(diǎn) 1:你可以使用遷移學(xué)習(xí),通過讓你的模型預(yù)測自己的錯誤,來發(fā)現(xiàn)模型哪里被混淆了。
這篇文章涵蓋了三種主動遷移學(xué)習(xí)的變體,最簡單的一種是二進(jìn)制的「correct/incorrect」任務(wù),用來預(yù)測模型可能在哪里出錯:
不確定性抽樣的主動遷移學(xué)習(xí)。驗(yàn)證項(xiàng)由模型預(yù)測,并根據(jù)分類是否正確將其劃分為「incorrect」或「incorrect」。然后對模型的最后一層進(jìn)行重新訓(xùn)練,以預(yù)測項(xiàng)目是「correct」還是「incorrect」,從而有效地將兩個(gè) bucket 轉(zhuǎn)換為新的標(biāo)簽。
這個(gè)過程有三個(gè)步驟:
將模型應(yīng)用于驗(yàn)證數(shù)據(jù)集,并捕獲哪些驗(yàn)證項(xiàng)被正確分類了,哪些被錯誤分類了。這是你的新的訓(xùn)練數(shù)據(jù):你的驗(yàn)證項(xiàng)現(xiàn)在有一個(gè)附加的「correct」或「incorrect」標(biāo)簽。
為模型創(chuàng)建一個(gè)新的輸出層,并在新的訓(xùn)練數(shù)據(jù)上訓(xùn)練這個(gè)新層,預(yù)測新的「correct」/「incorrect」標(biāo)簽。
在新模型中運(yùn)行未標(biāo)記的數(shù)據(jù)項(xiàng),并對預(yù)測為「不正確」的數(shù)據(jù)項(xiàng)進(jìn)行抽樣,這是最可靠的。
PyTorch 使這一過程變得非常簡單,它能夠?qū)⒚總€(gè)神經(jīng)元的激活傳遞回其他進(jìn)程,從而使我們能夠在原有模型的基礎(chǔ)上構(gòu)建我們的主動遷移學(xué)習(xí)模型。假設(shè)我們有一個(gè)簡單的網(wǎng)絡(luò),有一個(gè)隱含層,使用這個(gè) forward() 函數(shù):
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
然后我們可以迭代我們的驗(yàn)證數(shù)據(jù),并為每個(gè)驗(yàn)證項(xiàng)分配一個(gè)值,即它是「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)
然后我們可以訓(xùn)練一個(gè)新的模型來預(yù)測「correct」或「incorrect」,使用隱藏層作為新的輸入 (特征) 向量。假設(shè)我們在代碼中調(diào)用了新模型 correct_model。
在這個(gè)新模型被訓(xùn)練之后,唯一棘手的部分是,我們需要從兩個(gè)模型中得到未標(biāo)記數(shù)據(jù)的預(yù)測:第一個(gè)預(yù)測從第一個(gè)模型中得到隱含層,然后第二個(gè)預(yù)測新的「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)
此時(shí),在代碼 correct_log_probs 中有未標(biāo)記項(xiàng)被正確預(yù)測的概率。通過對被正確預(yù)測的置信度最低的項(xiàng)進(jìn)行抽樣,就是對那些本應(yīng)由人類檢查的應(yīng)用標(biāo)簽的項(xiàng)目進(jìn)行抽樣。
這段代碼是免費(fèi) PyTorch 庫中的 advanced_active_learning.py 文件中的代碼的一個(gè)稍微簡化的版本:https://github.com/rmunro/pytorch_active_learning/blob/master/advanced_active_learning.py
你可以使用以下命令立即在用例——識別與災(zāi)難相關(guān)的消息上運(yùn)行它:
python advanced_active_learning.py——transfer_learned_uncertainty = 10
這將運(yùn)行整個(gè)過程,然后給你提供 10 個(gè)最不確定的項(xiàng)目,以便你提供正確的標(biāo)簽。
此時(shí),該模型可能并不比簡單的不確定性抽樣算法更好,因此,首先實(shí)現(xiàn)簡單的方法作為基線也是一個(gè)好主意。但不要放棄:這是構(gòu)建更強(qiáng)大的算法的第一步。
比起簡單的方法,我們從遷移學(xué)習(xí)中獲得的最大優(yōu)勢是,它使我們的主動學(xué)習(xí)策略更容易適應(yīng)。主動學(xué)習(xí)策略的一個(gè)常見問題是,它們會對未標(biāo)記的項(xiàng)目進(jìn)行抽樣,這些項(xiàng)目都來自特征空間的一部分,因此缺乏多樣性,因此需要使用像聚類這樣的多樣性抽樣方法來避免這個(gè)問題。有一些先進(jìn)的主動學(xué)習(xí)技術(shù)將不確定性抽樣和多樣性抽樣單獨(dú)地結(jié)合起來,但是本文中的以下方法具有將這兩者結(jié)合成單一架構(gòu)的優(yōu)點(diǎn)。
通常情況下,實(shí)時(shí)的人類標(biāo)簽很難獲得,更實(shí)際的做法是采樣大量未標(biāo)記的物品,并將其標(biāo)記為一批。所以在這些情況下,自適應(yīng)代表性抽樣的主動遷移學(xué)習(xí)在抽樣過程中是合適的,即使我們還不知道標(biāo)簽是什么。
代表性抽樣的主動遷移學(xué)習(xí)
對于許多實(shí)際的用例,你的數(shù)據(jù)會隨著時(shí)間而變化。例如,在自動駕駛汽車用例中,總是會遇到新類型的對象,并且對象的范圍可能會擴(kuò)大,比如在道路之外的開闊水域駕駛。
代表性抽樣是多樣性抽樣的一種形式,其目的是對與當(dāng)前機(jī)器學(xué)習(xí)模型的應(yīng)用領(lǐng)域最相似的未標(biāo)記項(xiàng)進(jìn)行抽樣。
因?yàn)槲覀儾蓸拥捻?xiàng)目將獲得一個(gè)人工標(biāo)簽,我們可以假設(shè)它們是訓(xùn)練數(shù)據(jù)的一部分,而不需要知道標(biāo)簽是什么。
自適應(yīng)代表性抽樣的主動遷移學(xué)習(xí)
步驟如下:
從與訓(xùn)練數(shù)據(jù)相同的分布中獲取驗(yàn)證數(shù)據(jù),并給它一個(gè)「Training」標(biāo)簽。從我們的目標(biāo)域獲取未標(biāo)記的數(shù)據(jù),并給它一個(gè)「Application」標(biāo)簽。
訓(xùn)練一個(gè)新的輸出層來預(yù)測訓(xùn)練/應(yīng)用程序標(biāo)簽,讓它訪問模型的所有層。
將新模型應(yīng)用于未標(biāo)記的數(shù)據(jù),并對最有可能被預(yù)測為「應(yīng)用程序」的項(xiàng)目進(jìn)行抽樣。
假設(shè)新抽樣的項(xiàng)目稍后將獲得標(biāo)簽并成為訓(xùn)練數(shù)據(jù)的一部分:將這些項(xiàng)目的標(biāo)簽從「Application」更改為「training」,然后重復(fù)步驟 2。
這是一個(gè)非常強(qiáng)大的算法,因?yàn)樗苊饬酥粚μ卣骺臻g的一部分進(jìn)行采樣,在任何人為標(biāo)記之前對一組不同的項(xiàng)目進(jìn)行采樣。
觀點(diǎn) 2:即使你還不知道標(biāo)簽是什么,你也可以假設(shè)一個(gè)未標(biāo)記的項(xiàng)目以后會得到一個(gè)標(biāo)簽。
自適應(yīng)采樣的主動轉(zhuǎn)遷移學(xué)習(xí) (ATLAS)
主動遷移學(xué)習(xí)最復(fù)雜的應(yīng)用是自適應(yīng)采樣 (ATLAS) 的主動學(xué)習(xí)。它綜合了本文中前面兩個(gè)模型的原則:在添加任何人工標(biāo)記之前預(yù)測不確定性并適應(yīng)數(shù)據(jù)。
我們用時(shí)間旅行來對此進(jìn)行類比。想象一下,你把你的車變成了一臺時(shí)間機(jī)器,但你必須以每小時(shí) 88 英里的速度行駛,才能進(jìn)行時(shí)空旅行。即使你還不知道未來的路會是什么樣子,你也可以把車開到未來。然后,即使沒有充分的知識背景,你也可以考慮汽車將會在哪里,開始制定未來的計(jì)劃。
我們可以對我們的模型做同樣的事情,假設(shè)我們有數(shù)據(jù)知識,我們將在以后標(biāo)記并使用這些知識來采樣更多的數(shù)據(jù)供人類檢查:
用于自適應(yīng)采樣的主動遷移學(xué)習(xí)
步驟如下:
將模型應(yīng)用于驗(yàn)證數(shù)據(jù)集,并捕獲哪些驗(yàn)證項(xiàng)被正確分類了,哪些被錯誤分類了。這是你的新訓(xùn)練數(shù)據(jù):你的驗(yàn)證項(xiàng)現(xiàn)在有一個(gè)附加的「correct」或「incorrect」標(biāo)簽。
為模型創(chuàng)建一個(gè)新的輸出層,并在新的訓(xùn)練數(shù)據(jù)上訓(xùn)練這個(gè)新層,預(yù)測新的「correct」/「incorrect」標(biāo)簽。
在新模型中運(yùn)行未標(biāo)記的數(shù)據(jù)項(xiàng),并對預(yù)測為「incorrect」的數(shù)據(jù)項(xiàng)進(jìn)行抽樣,這是最可靠的。
假設(shè)新抽樣的項(xiàng)目稍后將得到標(biāo)簽,并且模型稍后將在對這些項(xiàng)目進(jìn)行訓(xùn)練后正確預(yù)測這些項(xiàng)目:將這些項(xiàng)目的標(biāo)簽從「incorrect」更改為「correct」,然后重復(fù)步驟 2。
通過結(jié)合不確定性采樣和自適應(yīng)代表性采樣的主動遷移學(xué)習(xí)技術(shù),我們現(xiàn)在有了一個(gè)可以預(yù)測其未來狀態(tài)的模型。它不知道最初采樣的項(xiàng)目的標(biāo)簽是什么,但它知道它們會得到一個(gè)標(biāo)簽,然后它可以根據(jù)預(yù)期的未來事件做出更明智的抽樣決策。
觀點(diǎn) 3:你可以假設(shè)模型將正確預(yù)測未標(biāo)記項(xiàng)的標(biāo)簽,這些項(xiàng)和稍后將獲得標(biāo)簽的項(xiàng)一樣,即使你還不知道標(biāo)簽是什么。
此代碼與上述文件位于同一個(gè)免費(fèi) Pythorch 庫中的 advanced_active_learning.py 相同:https://github.com/rmunro/Pythorch_active_learning/blob/master/advanced_active_learning.py
你可以使用以下命令行運(yùn)行它:
python advanced_active_learning.py --atlas=10
主動遷移學(xué)習(xí)備忘單
這是一個(gè)單頁的備忘單,你可以在構(gòu)建本文中的算法時(shí)參考它:
主動遷移學(xué)習(xí)備忘單
為了快速參考,你可以在這里下載一個(gè) PDF 版本的備忘單:http://www.robertmunro.com/Active_Transfer_Learning_cheatsheet.PDF
本文摘自我的書《Human-in-the-Loop Machine Learning》,網(wǎng)址:https://www.manning.com/books/human-in-the-loop-machine-learning#ref 。
如果你要開始學(xué)習(xí)這本書,以下有一些注意事項(xiàng):
這本書中的方法在數(shù)學(xué)上相當(dāng)于刪除最后一層并重新訓(xùn)練一個(gè)新層(如上圖所示),或者取而代之的是從最后一個(gè)隱藏層獲取輸出并將其用作新模型的輸入(如代碼示例中所示)。我認(rèn)為前者在視覺上更直觀,但后者不太容易出錯,因?yàn)樗羌兇獾募臃?,你不必?fù)?dān)心更改模型會對代碼的其他部分產(chǎn)生什么影響。如果你更喜歡在自己的代碼中實(shí)現(xiàn)遷移學(xué)習(xí),那就沒問題了。如果你想用新的數(shù)據(jù)/標(biāo)簽來調(diào)整現(xiàn)有的層,而不是完全移除層,那么這也是正確的。
注意,代表性采樣的示例使用所有隱藏層,并且還添加了額外的新層,而不確定性采樣和 ATLAS 示例是在最終隱藏層之后的簡單二進(jìn)制預(yù)測。從設(shè)計(jì)上來說,這是架構(gòu)的一個(gè)良好起點(diǎn),但是你可以在所有情況下嘗試不同的架構(gòu)。這背后的原因是,我們模型的最后一層沒有將數(shù)據(jù)中沒有很好表示的項(xiàng)與數(shù)據(jù)中很好表示的項(xiàng)區(qū)分開來,但是這些項(xiàng)具有與當(dāng)前狀態(tài)下的模型基本無關(guān)的特征。因此,代表性抽樣應(yīng)該更好地利用早期層的信息。相比之下,不確定性采樣和 ATLAS 示例只使用最后一層,因?yàn)槟P偷淖詈笠粚右呀?jīng)最小化不確定性,因此在較早的層中不太可能找到更多的信息,如果包含較早的層,則更容易過度擬合。
你可以考慮通過 Monte-Carlo 采樣從單個(gè)模型進(jìn)行多個(gè)模型變量預(yù)測。這些示例依賴于與你的訓(xùn)練域來自同一發(fā)行版的驗(yàn)證數(shù)據(jù),并且你可以輕松地對該驗(yàn)證集中的特定項(xiàng)進(jìn)行過擬合。如果要將訓(xùn)練數(shù)據(jù) 90:10 拆分為 training:validation,就像這里的代碼示例一樣,那么一個(gè)簡單的方法是對所有 90:10 組合重復(fù)此操作。注意,對于不確定性采樣和 ATLAS 示例,你只創(chuàng)建了一個(gè)新的二進(jìn)制預(yù)測器,因此不需要太多的數(shù)據(jù)就可以得到穩(wěn)健的結(jié)果。這是這些模型的一個(gè)很好的特性:一個(gè)額外的二進(jìn)制預(yù)測很容易用相對較少的數(shù)據(jù)進(jìn)行訓(xùn)練,而且通常不需要手動調(diào)整。
主動遷移學(xué)習(xí)可以用于更復(fù)雜的任務(wù),如目標(biāo)檢測、語義分割、序列標(biāo)記和文本生成。幾乎任何類型的神經(jīng)模型都可以添加一個(gè)新的層來預(yù)測「correct/Incorrect」標(biāo)簽或「training/application」標(biāo)簽,因此這是一種非常通用的技術(shù)。
via:https://medium.com/pytorch/active-transfer-learning-with-pytorch-71ed889f08c1
雷鋒網(wǎng)雷鋒網(wǎng)雷鋒網(wǎng)
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。