我用一下午時(shí)間標(biāo)注了十萬張沒有標(biāo)簽的圖片,為老板節(jié)約了3W美金
原創(chuàng)【51CTO.com原創(chuàng)稿件】想象一下你的老板給了你 10 萬張無標(biāo)簽的圖片,并要求你將它們分類為涼鞋、褲子、靴子等等。
現(xiàn)在你有一大堆沒有標(biāo)簽的數(shù)據(jù),你需要為這些數(shù)據(jù)打上標(biāo)簽。你該怎么辦呢?
這個(gè)問題是司空見慣的。許多公司都在數(shù)據(jù)的大海里遨游,不論是交易數(shù)據(jù)、物聯(lián)網(wǎng)傳感器產(chǎn)生的海量數(shù)據(jù)、安全日志,還是圖像、語音數(shù)據(jù)等等,這些都是未標(biāo)注的數(shù)據(jù)。
用這么少的標(biāo)注數(shù)據(jù),對(duì)于所有企業(yè)中的數(shù)據(jù)科學(xué)家來說,建立機(jī)器學(xué)習(xí)模型都是一個(gè)單調(diào)乏味的過程。
以 Google 的街景數(shù)據(jù)為例,Gebru 不得不弄清楚如何用很少的帶有標(biāo)簽的數(shù)據(jù)為五千萬張圖片貼上汽車標(biāo)簽。
在 Facebook,工程師們使用算法來標(biāo)注 50 萬個(gè)視頻,這個(gè)任務(wù)使用其他的方法需要花費(fèi) 16 年的時(shí)間。
這篇文章將向您展示如何用一個(gè)下午的時(shí)間標(biāo)注數(shù)十萬張圖片。無論是標(biāo)注圖像還是標(biāo)注傳統(tǒng)表格數(shù)據(jù)(例如,識(shí)別網(wǎng)絡(luò)安全攻擊或可能的部件故障),都可以使用同樣的方法。
手工標(biāo)注的方法
對(duì)大多數(shù)數(shù)據(jù)科學(xué)家來說,如果他們被要求去做某件事,他們首先會(huì)想一想有沒有其他可以替代的人去做這件事。
但是 10 萬張圖片可能會(huì)讓您在 Mechanical Turk 或類似的其他競爭平臺(tái)上花費(fèi)至少 30,000 美元。
你的老板期望以較低的代價(jià)來做這件事,因?yàn)楫吘?,他們聘?qǐng)了你?,F(xiàn)在,除了你的工資以外,她沒有其他任何的預(yù)算(如果你不相信我,請(qǐng)去 pydata)。
你深吸了一口氣,想了一下你可以在一個(gè)小時(shí)內(nèi)標(biāo)完 200 張圖片。所以這意味著在三個(gè)星期內(nèi)不停地工作,你就可以標(biāo)完所有的數(shù)據(jù)!哎呀!
建立一個(gè)簡單的模型
第一個(gè)想法是標(biāo)記一部分圖片,用它們訓(xùn)練一個(gè)機(jī)器學(xué)習(xí)模型,然后用來預(yù)測剩下的圖片的標(biāo)簽。
對(duì)于這個(gè)練習(xí),我使用的是 Fashion-MNIST 數(shù)據(jù)集(你也可以用 quickdraw 來制作自己的數(shù)據(jù)集)。
有十個(gè)類別的圖像要我們?nèi)プ鲎R(shí)別,下面是它們的樣子:
看到這個(gè)數(shù)據(jù)集我很高興,因?yàn)槊糠鶊D片都是由 28×28 像素組成的,這意味著它包含 784 個(gè)獨(dú)特的特征/變量。
對(duì)于我要寫一篇博客文章來說,這些特征很好,但是在現(xiàn)實(shí)世界中你是絕對(duì)看不到這樣的數(shù)據(jù)集的,它們往往要么窄得多(傳統(tǒng)的表格業(yè)務(wù)問題數(shù)據(jù)集),要么寬得多(真實(shí)圖像要大得多,而且由不同的顏色組成)。
我使用最常見的數(shù)據(jù)科學(xué)算法來建立模型,包括:邏輯回歸,支持向量機(jī)(SVM),隨機(jī)森林和 Gradient Boosted Machines(GBM) 。
我根據(jù)它們?cè)?100、200、500、1000 和 2000 張圖片上的標(biāo)注效果來評(píng)測它們的性能。
如果你看到這個(gè)地方了,那么你應(yīng)該放慢速度,仔細(xì)研究一下這張圖。這張圖里有很多好東西。
哪個(gè)算法最好呢?(如果你是一個(gè)數(shù)據(jù)科學(xué)家,你不應(yīng)該為這個(gè)問題而困惑。)問題的答案其實(shí)取決于需求環(huán)境。
如果你想要快速可靠地開箱即用,你可以選擇邏輯回歸算法。隨機(jī)森林算法從開始時(shí)就一直遙遙領(lǐng)先,SVM 雖然起點(diǎn)較低,但以極快的速度追趕上來。隨著我們的標(biāo)注數(shù)據(jù)越來越多,SVM 的性能將超過隨機(jī)森林。
GBM 工作的很好,但要達(dá)到最好的性能還需要做一些額外的工作。這里每種算法的分?jǐn)?shù)都是使用了 R 中已經(jīng)實(shí)現(xiàn)好的庫評(píng)測出的(e1071,randomForest,gbm,nnet)。
如果我們的 benchmark 是對(duì)十個(gè)類別的圖像分類任務(wù)達(dá)到 80% 的準(zhǔn)確率,那么我們可以通過建立一個(gè)包含 1000 個(gè)圖像的隨機(jī)森林模型來達(dá)到目標(biāo)。
但是 1000 張圖像的標(biāo)注工作量依舊是很大的,我估計(jì)需要 5 個(gè)小時(shí)。所以讓我們想想還有什么可以改進(jìn)的方法。
Let’s Think About Data
經(jīng)過短暫思考后,你想起來你經(jīng)常告訴別人的一句話:數(shù)據(jù)不是隨機(jī)的,而是有模式的(The data isn’t random,but has patterns)。利用好這些模式,我們可以更深入地理解我們的數(shù)據(jù)。
讓我們從一個(gè)自動(dòng)編碼器(autoencoder,AE)開始。自動(dòng)編碼器是用來壓縮你的數(shù)據(jù)的,就像把湯變成 一個(gè)肉湯塊一樣。自動(dòng)編碼器使用了很時(shí)髦的主成分分析(PCA),它們支持非線性變換。
實(shí)際上,這意味著我們正在將我們的寬廣的數(shù)據(jù)(784 個(gè)特征/變量)減少到 128 個(gè)特征。然后我們利用新的壓縮后的數(shù)據(jù)來訓(xùn)練我們的機(jī)器學(xué)習(xí)算法(此例中我們使用 SVM)。
下面的圖表顯示了用自動(dòng)編碼器(AE_SVM)壓縮的數(shù)據(jù)訓(xùn)練的 SVM 與使用原始數(shù)據(jù)訓(xùn)練的 SVM 之間的性能差異。
通過將信息壓縮到 128 個(gè)特征,我們實(shí)際上能夠改善底端 SVM 算法的性能。
在 100 個(gè)標(biāo)簽上,準(zhǔn)確率從 44% 上升到 59%;在 1000 個(gè)標(biāo)簽上,自動(dòng)編碼器仍然可以起作用,我們看到準(zhǔn)確率從 74% 提高到 78%。
所以我們離目標(biāo)更近了一步,我們只需要更進(jìn)一步地思考可以利用的數(shù)據(jù)的分布和模式。
Thinking Deeper About Your Data
我們的數(shù)據(jù)是圖像,而我們知道,自 2012 年以來,圖像處理的利器是卷積神經(jīng)網(wǎng)絡(luò)(CNN)。
使用 CNN 有好幾種方法,可以從一個(gè)預(yù)訓(xùn)練的網(wǎng)絡(luò)或簡單的模型來預(yù)處理圖像。
這篇文章中,我參照 Kingma 等人的一篇論文,使用卷積變分自動(dòng)編碼器(Convolutional Variational Autoencoder)來實(shí)現(xiàn)目標(biāo)。
因此,我們來建立一個(gè)卷積變分自動(dòng)編碼器(CVAE)。這里的技術(shù)相比之前有兩層“飛躍”。
首先,“變分”(variational)是指自動(dòng)編碼器將信息壓縮成概率分布。其次是增加了卷積神經(jīng)網(wǎng)絡(luò)作為編碼器。
這里使用了一點(diǎn)深度學(xué)習(xí)的技術(shù),但我要強(qiáng)調(diào)的是我們的重點(diǎn)不是為了賣弄最新的最潮的技術(shù),而是如何恰當(dāng)?shù)厝ソ鉀Q問題。
為了編碼我的 CVAE,我使用了 examples over at RStudio’s Keras Page 這個(gè)列表中的示例 CVAE。
像之前的自動(dòng)編碼器一樣,我們?cè)O(shè)計(jì)了潛在的空間來將數(shù)據(jù)減少到 128 個(gè)特征。然后,我們使用這些新的數(shù)據(jù)來訓(xùn)練 SVM 模型。
以下是 CVAE_SVM 與在原始數(shù)據(jù)上訓(xùn)練的 SVM 和 Random Forest 的性能比較圖。
哇!新模型更加準(zhǔn)確。只用 500 個(gè)標(biāo)簽,我們就可以達(dá)到 80% 以上的準(zhǔn)確率。
通過使用這些技術(shù),我們獲得了更好的性能,并且只需要更少的標(biāo)注圖像。在高端,這種方法也可以比 Random Forest 或 SVM 模型做得更好。
Next Steps
通過對(duì)自動(dòng)編碼器使用一些非常簡單的半監(jiān)督技術(shù),就可以快速準(zhǔn)確地標(biāo)注數(shù)據(jù)。但是重點(diǎn)并不是使用深度學(xué)習(xí)編碼器!
相反,我希望你理解了這里的方法后,從很簡單的方法開始嘗試,然后逐漸嘗試更復(fù)雜的解決方案。
不要沉迷于使用那些最新的技術(shù)—實(shí)際的數(shù)據(jù)科學(xué)并不是使用 arXiv 中的最新方法。
這種半監(jiān)督學(xué)習(xí)的方法一定可以給你帶來啟發(fā)。這篇文章相當(dāng)于半監(jiān)督學(xué)習(xí)中的邏輯回歸算法。
如果你想進(jìn)一步深入半監(jiān)督學(xué)習(xí)和領(lǐng)域適應(yīng)性(Domain Adaptation)相關(guān)的內(nèi)容,請(qǐng)參考 BrianKeng 的 great walkthrough of using variational autoencoders。
他的工作超出了我們?cè)谶@里所說的,或者 Curious AI 的工作 ,他們的工作使用深度學(xué)習(xí)來改進(jìn)半監(jiān)督學(xué)習(xí),并且開放了代碼。
最后,我希望你至少要明白的一點(diǎn)是,不要認(rèn)為你所有的數(shù)據(jù)都要貼上標(biāo)簽。
【51CTO原創(chuàng)稿件,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文作者和出處為51CTO.com】