深度学习表征的不合理有效性——从头开始构建图像搜索服务(一)
為什么是相似搜索?
一張圖片勝過千言萬語,甚至N行代碼。網(wǎng)友們經(jīng)常使用的一句留言是,no picture, you say nothing。隨著生活節(jié)奏的加快,人們越來越?jīng)]有耐心和時間去看大段的文字,更喜歡具有視覺沖擊性的內(nèi)容,比如,圖片,視頻等,因?yàn)槠渌膬?nèi)容更加生動直觀。
許多產(chǎn)品是在外觀上吸引到我們的目光,比如在瀏覽購物網(wǎng)站上的商品、尋找民宿上的房間租賃等,看起來怎么樣往往是我們決定購買的重要因素。感知事物的方式能強(qiáng)有力預(yù)測出我們想要的東西是什么,因此,這對于評測而言是一個有價值的因素。
然而,讓計算機(jī)以人類的方式理解圖像已經(jīng)成為計算機(jī)科學(xué)的挑戰(zhàn),且已持續(xù)一段時間了。自2012年以來,深度學(xué)習(xí)在圖像分類或物體檢測等感知任務(wù)中的效果慢慢開始超越或碾壓經(jīng)典方法,如直方梯度圖(HOG)。導(dǎo)致這種轉(zhuǎn)變的主要原因之一是,深度學(xué)習(xí)在足夠大的數(shù)據(jù)集上訓(xùn)練時,能夠自動地提取有意義的特征表示。
這就是為什么許多團(tuán)隊(duì),比如Pinterest、StitchFix和Flickr都開始使用深度學(xué)習(xí)來學(xué)習(xí)圖像特征,并基于用戶認(rèn)為視覺上令人愉悅的內(nèi)容提供推薦。同樣,Insight的研究員也使用深度學(xué)習(xí)為應(yīng)用程序建立模型,例如推薦購買太陽鏡以及尋找藝術(shù)風(fēng)格等。
目前,許多的推薦系統(tǒng)都是基于協(xié)同過濾(collaboratiove filtering):利用用戶關(guān)聯(lián)來提出建議(即,假設(shè)喜歡你喜歡的東西的用戶也會喜歡”)。但是,這些基于協(xié)同過濾的模型需要大量數(shù)據(jù),其效果才能準(zhǔn)確,并且難以處理尚未被任何人查看過的新內(nèi)容。如果將內(nèi)容表示應(yīng)用于基于內(nèi)容的推薦系統(tǒng)中,那么該系統(tǒng)不會遇到上述問題。
此外,這些表示還允許消費(fèi)者高效地搜索照片庫,以尋找到與他們剛剛拍攝的自拍(通過圖像查詢)相似的圖像,或者用于特定物品(通過文本查詢)的照片,這方面的常見示例包括關(guān)鍵字搜圖以及以圖搜圖功能。
根據(jù)我們多年語義理解項(xiàng)目的技術(shù)經(jīng)驗(yàn),希望編寫一個教程,介紹如何構(gòu)建自己的特征表示,包括圖像和文本數(shù)據(jù),以及如何有效地進(jìn)行相似性搜索。希望看完本文,讀者能夠?qū)θ我獯笮〉臄?shù)據(jù)無論數(shù)據(jù)集的大小如何,都能夠從頭開始構(gòu)建出一個快速語義搜索模型。
計劃
聊聊優(yōu)化
在機(jī)器學(xué)習(xí)中,就像在軟件工程中一樣,有很多方法可以解決同一個問題,但每種方法都有不同的權(quán)衡及側(cè)重點(diǎn)。如果是正在進(jìn)行研究或本地原型設(shè)計,就可以擺脫效率非常低的解決方案。但是,如果是要構(gòu)建一個需要可維護(hù)和可擴(kuò)展的圖像相似性搜索引擎,則必須考慮如何適應(yīng)數(shù)據(jù)演變以及模型運(yùn)行的速度。
下面讓我們思考一些方法:
在方法1中,我們構(gòu)建了一個端到端模型,該模型在所有的圖像上進(jìn)行訓(xùn)練,將圖像作為輸入,并輸出所有圖像的相似度得分。預(yù)測過程耗時很短(一次前向傳播過程即可),但是,當(dāng)每次添加新圖像時,我們都需要重新訓(xùn)練得到一個新模型。此外,當(dāng)類別多的時候,也會很難正確地優(yōu)化它。這種方法雖然看起來很簡單且預(yù)測過程很快,但是不能夠擴(kuò)展到大型的數(shù)據(jù)集。此外,我們還必須手動標(biāo)記數(shù)據(jù)集與圖像的相似性,這個過程可能非常耗時。
在方法2中,構(gòu)建一個接收兩個圖像的模型,并輸出0到1之間的成對相似得分(例如,孿生網(wǎng)絡(luò)Siamese Networks)。這些模型對于大型數(shù)據(jù)集是準(zhǔn)確的,但會另外導(dǎo)致一個可伸縮性問題。我們通常希望通過查看大量圖像來查找相似的圖像,因此我們必須為數(shù)據(jù)集中的每個圖像對都運(yùn)行一次相似度模型。如果模型采用的是CNN網(wǎng)絡(luò),并且有十幾個圖像時,那么這個過程就非常慢了。此外,這個方法僅適用于圖像相似性搜索,而不適用于文本搜索。雖然此方法可擴(kuò)展到大型數(shù)據(jù)集,但運(yùn)行速度很慢。
方法3是一種更簡單的方法,類似于字嵌入。如果找到一個富有表現(xiàn)力的矢量表示或嵌入圖像,就可以通過觀察矢量彼此之間的距離來計算相似性。這種類型的搜索是深入研究的常見問題,許多庫都實(shí)現(xiàn)了快速解決方案(本文使用Annoy)。此外,提前計算出數(shù)據(jù)庫中所有圖像的矢量,這種方法既快速(一次正向傳遞就是一種有效的相似性搜索),又可以進(jìn)行擴(kuò)展。最后,如果我們設(shè)法為圖像和單詞找到常見的嵌入,就可以使用它們來進(jìn)行文本到圖像的搜索!由于其簡單性和高效性,第三種方法作為本文的實(shí)現(xiàn)方法。
如何做到?
那么,如何實(shí)際使用深度學(xué)習(xí)表示來創(chuàng)建搜索引擎呢?我們的最終目標(biāo)是擁有一個搜索引擎,可以接收圖像并輸出相似的圖像或標(biāo)簽,還能接收文本并輸出類似的單詞或圖像。為了實(shí)現(xiàn)這一目標(biāo),將經(jīng)歷三個連續(xù)的步驟:
- 根據(jù)輸入圖像搜索類似圖像(圖像→圖像)
- 根據(jù)輸入詞搜索類似的單詞(文本→文本)
- 為圖像生成標(biāo)簽,并使用文本搜索圖像(圖像?文本)
為此,將使用嵌入、圖像和文本的矢量表示。一旦有了嵌入,搜索過程就轉(zhuǎn)變?yōu)橹恍枵业娇拷斎胧噶康氖噶俊N覀儾捎玫姆椒ㄊ怯嬎銏D像嵌入和其他圖像嵌入之間的余弦相似度。類似的圖像將具有類似的嵌入,意味著嵌入之間具有高余弦相似性。
下面從數(shù)據(jù)集開始實(shí)驗(yàn)。
數(shù)據(jù)集
圖像
圖像數(shù)據(jù)集由1000張圖像組成,分為20個類別,每類圖像包含50個圖像。該數(shù)據(jù)集可在此處找到,此數(shù)據(jù)集包含每個圖像的類別和一組說明。為了使這個問題的難度更高,并且為了表明本方法的概括性,本文只使用了類別,而忽略說明。總共有20個類別,如下所示:
aeroplane?bicycle?bird?boat?bottle?bus?car?cat?chair?cow?dining_table?doghorse?motorbike?person?potted_plant?sheep?sofa?train?tv_monitor
從上圖中可以看到,標(biāo)簽非常嘈雜:許多圖像都包含多個類別,圖像的標(biāo)簽并不總是來自最突出的內(nèi)容。例如,在右下方,圖像被標(biāo)記為chair(椅子)而不是person(人),而該圖的中心是有3個人,且?guī)缀蹩床灰娨巫印?/p>
文本
此外,加載已在Wikipedia上預(yù)訓(xùn)練的單詞嵌入(本文使用GloVe模型中的單詞嵌入),使用這些向量將文本合并到語義搜索中。
圖像-->圖像
現(xiàn)在要加載一個在大型數(shù)據(jù)集(Imagenet)上預(yù)先訓(xùn)練過的模型,并且可以在線免費(fèi)獲取。本文使用VGG16網(wǎng)絡(luò)為圖像生成嵌入,注意,這里本文采用的方法適用于任何最新的CNN架構(gòu)(不局限于VGG16)。
生成嵌入是什么意思?我們將使用預(yù)先訓(xùn)練模型倒數(shù)第二層前的網(wǎng)絡(luò)結(jié)構(gòu),并存儲對應(yīng)的權(quán)重值。在下圖中,用綠色突出顯示表示嵌入層,該嵌入層位于最終分類層之前。
一旦使用該模型生成圖像特征,就可以將其存儲到磁盤中,重新使用時無需再次進(jìn)行推理!這也是嵌入在實(shí)際應(yīng)用中如此受歡迎的原因之一,因?yàn)榭梢源蠓嵘省3藢⑺鼈兇鎯Φ酱疟P之外,還將使用Annoy構(gòu)建嵌入的快速索引,這將允許我們非常快速地找到任何給定嵌入的最近嵌入。
以下是本文得到的嵌入。現(xiàn)在每個圖像都由一個大小為4096的稀疏向量表示。注意:向量稀疏的原因是在激活函數(shù)之后將負(fù)數(shù)歸零。
使用嵌入來搜索圖像
現(xiàn)在可以簡單地接收圖像,獲得其嵌入后,并查看快速索引以查找類似的嵌入,從而找到類似的圖像。這是特別有用的,因?yàn)閳D像標(biāo)簽通常很嘈雜,且圖像比標(biāo)簽更多。例如,在數(shù)據(jù)集中,有一個類別cat(貓)和一個類別bottle(瓶子)。您認(rèn)為下面這張圖片會被標(biāo)記為哪個類別?
正確的答案是瓶子,這是一個經(jīng)常在真實(shí)數(shù)據(jù)集中出現(xiàn)的實(shí)際問題。將圖像標(biāo)記為唯一類別是非常受限的,這就是為什么希望使用更細(xì)粒的表示。幸運(yùn)的是,這也正是深度學(xué)習(xí)所擅長的!下面看看使用嵌入的圖像搜索是否比通過人為標(biāo)記的更好。
搜索相似的圖片todataset / bottle / 2008_000112.jpg,可以看見該圖像位于bottle(瓶子)類別。
結(jié)果出人意料的好,搜索得到很多貓的圖像,而不是瓶子的圖像,這看起來很合理!由于預(yù)訓(xùn)練網(wǎng)絡(luò)的訓(xùn)練集中包含各類圖像,這樣包括貓,因此它能夠準(zhǔn)確地找到相似的圖像,即使它之前從未接受過本文選定數(shù)據(jù)集的訓(xùn)練。
但是,最下面一行中間的一幅圖像顯示了一個瓶架。一般而言,這種方法執(zhí)行后找到類似的圖像,但有時我們只對圖像的一部分感興趣。
例如,給定一張包含貓和瓶子的圖像,我們可能只對和貓類似的圖像感興趣,而不是瓶子。
這類問題解決方法看下一篇博客《深度學(xué)習(xí)表征的不合理有效性——從頭開始構(gòu)建圖像搜索服務(wù)》。
以上為譯文,由阿里云云棲社區(qū)組織翻譯。
譯文鏈接
文章原標(biāo)題《The unreasonable effectiveness of Deep Learning Representations》
譯者:海棠,審校:Uncle_LLD。
文章為簡譯,更為詳細(xì)的內(nèi)容,請查看原文。
總結(jié)
以上是生活随笔為你收集整理的深度学习表征的不合理有效性——从头开始构建图像搜索服务(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode-python-优先级队
- 下一篇: 深度学习表征的不合理有效性——从头开始构