深度學習表徵的不合理有效性——從頭開始構建圖像搜索服務(一)

深度學習表徵的不合理有效性——從頭開始構建圖像搜索服務(一)

教會計算機以人的方式看圖

為什麼是相似搜索?

一張圖片勝過千言萬語,甚至N行代碼。網友們經常使用的一句留言是,no picture, you say nothing。隨著生活節奏的加快,人們越來越沒有耐心和時間去看大段的文字,更喜歡具有視覺衝擊性的內容,比如,圖片,視頻等,因為其所含的內容更加生動直觀。

許多產品是在外觀上吸引到我們的目光,比如在瀏覽購物網站上的商品、尋找民宿上的房間租賃等,看起來怎麼樣往往是我們決定購買的重要因素。感知事物的方式能強有力預測出我們想要的東西是什麼,因此,這對於評測而言是一個有價值的因素。

然而,讓計算機以人類的方式理解圖像已經成為計算機科學的挑戰,且已持續一段時間了。自2012年以來,深度學習在圖像分類或物體檢測等感知任務中的效果慢慢開始超越或碾壓經典方法,如直方梯度圖(HOG)。導致這種轉變的主要原因之一是,深度學習在足夠大的數據集上訓練時,能夠自動地提取有意義的特徵表示

深度學習表徵的不合理有效性——從頭開始構建圖像搜索服務(一)

這就是為什麼許多團隊,比如Pinterest、StitchFix和Flickr 都開始使用深度學習來學習圖像特徵,並基於用戶認為視覺上令人愉悅的內容提供推薦。同樣,Insight的研究員也使用深度學習為應用程序建立模型,例如推薦購買太陽鏡以及尋找藝術風格等。

目前,許多的推薦系統都是基於協同過濾(collaboratiove filtering):利用用戶關聯來提出建議(即,假設喜歡你喜歡的東西的用戶也會喜歡”)。但是,這些基於協同過濾的模型需要大量數據,其效果才能準確,並且難以處理尚未被任何人查看過的新內容。如果將內容表示應用於基於內容的推薦系統中,那麼該系統不會遇到上述問題。

此外,這些表示還允許消費者高效地搜索照片庫,以尋找到與他們剛剛拍攝的自拍(通過圖像查詢)相似的圖像,或者用於特定物品(通過文本查詢)的照片,這方面的常見示例包括關鍵字搜圖以及以圖搜圖功能。

根據我們多年語義理解項目的技術經驗,希望編寫一個教程,介紹如何構建自己的特徵表示,包括圖像和文本數據,以及如何有效地進行相似性搜索。希望看完本文,讀者能夠對任意大小的數據無論數據集的大小如何,都能夠從頭開始構建出一個快速語義搜索模型。

計劃

聊聊優化

在機器學習中,就像在軟件工程中一樣,有很多方法可以解決同一個問題,但每種方法都有不同的權衡及側重點。如果是正在進行研究或本地原型設計,就可以擺脫效率非常低的解決方案。但是,如果是要構建一個需要可維護和可擴展的圖像相似性搜索引擎,則必須考慮如何適應數據演變以及模型運行的速度。

下面讓我們思考一些方法:

深度學習表徵的不合理有效性——從頭開始構建圖像搜索服務(一)

方法1的工作流程

在方法1中,我們構建了一個端到端模型,該模型在所有的圖像上進行訓練,將圖像作為輸入,並輸出所有圖像的相似度得分。預測過程耗時很短(一次前向傳播過程即可),但是,當每次添加新圖像時,我們都需要重新訓練得到一個新模型。此外,當類別多的時候,也會很難正確地優化它。這種方法雖然看起來很簡單且預測過程很快,但是不能夠擴展到大型的數據集。此外,我們還必須手動標記數據集與圖像的相似性,這個過程可能非常耗時。

深度學習表徵的不合理有效性——從頭開始構建圖像搜索服務(一)

方法2的工作流程

在方法2中,構建一個接收兩個圖像的模型,並輸出0到1之間的成對相似得分(例如,孿生網絡Siamese Networks)。這些模型對於大型數據集是準確的,但會另外導致一個可伸縮性問題。我們通常希望通過查看大量圖像來查找相似的圖像,因此我們必須為數據集中的每個圖像對都運行一次相似度模型。如果模型採用的是CNN網絡,並且有十幾個圖像時,那麼這個過程就非常慢了。此外,這個方法僅適用於圖像相似性搜索,而不適用於文本搜索。雖然此方法可擴展到大型數據集,但運行速度很慢。

深度學習表徵的不合理有效性——從頭開始構建圖像搜索服務(一)

方法3的工作流程

方法3是一種更簡單的方法,類似於字嵌入。如果找到一個富有表現力的矢量表示或嵌入圖像,就可以通過觀察矢量彼此之間的距離來計算相似性。這種類型的搜索是深入研究的常見問題,許多庫都實現了快速解決方案(本文使用Annoy)。此外,提前計算出數據庫中所有圖像的矢量,這種方法既快速(一次正向傳遞就是一種有效的相似性搜索),又可以進行擴展。最後,如果我們設法為圖像和單詞找到常見的嵌入,就可以使用它們來進行文本到圖像的搜索!由於其簡單性和高效性,第三種方法作為本文的實現方法。

如何做到?

那麼,如何實際使用深度學習表示來創建搜索引擎呢?我們的最終目標是擁有一個搜索引擎,可以接收圖像並輸出相似的圖像或標籤,還能接收文本並輸出類似的單詞或圖像。為了實現這一目標,將經歷三個連續的步驟:

  • 根據輸入圖像搜索類似圖像(圖像→圖像)
  • 根據輸入詞搜索類似的單詞(文本→文本)
  • 為圖像生成標籤,並使用文本搜索圖像(圖像↔文本)
  • 為此,將使用嵌入、圖像和文本的矢量表示。一旦有了嵌入,搜索過程就轉變為只需找到靠近輸入矢量的矢量。我們採用的方法是計算圖像嵌入和其他圖像嵌入之間的餘弦相似度。類似的圖像將具有類似的嵌入,意味著嵌入之間具有高餘弦相似性。

下面從數據集開始實驗。

數據集

圖像

圖像數據集由1000張圖像組成,分為20個類別,每類圖像包含50個圖像。該數據集可在此處找到,此數據集包含每個圖像的類別和一組說明。為了使這個問題的難度更高,並且為了表明本方法的概括性,本文只使用了類別,而忽略說明。總共有20個類別,如下所示:

aeroplane bicycle bird boat bottle bus car cat chair cow dining_table dog horse motorbike person potted_plant sheep sofa train tv_monitor

深度學習表徵的不合理有效性——從頭開始構建圖像搜索服務(一)

圖像示例

從上圖中可以看到,標籤非常嘈雜:許多圖像都包含多個類別,圖像的標籤並不總是來自最突出的內容。例如,在右下方,圖像被標記為chair(椅子)而不是person(人),而該圖的中心是有3個人,且幾乎看不見椅子。

文本

此外,加載已在Wikipedia上預訓練的單詞嵌入(本文使用GloVe模型中的單詞嵌入),使用這些向量將文本合併到語義搜索中。

圖像-->圖像

現在要加載一個在大型數據集(Imagenet)上預先訓練過的模型,並且可以在線免費獲取。本文使用VGG16網絡為圖像生成嵌入,注意,這裡本文采用的方法適用於任何最新的CNN架構(不侷限於VGG16)。

深度學習表徵的不合理有效性——從頭開始構建圖像搜索服務(一)

VGG網絡

生成嵌入是什麼意思?我們將使用預先訓練模型倒數第二層前的網絡結構,並存儲對應的權重值。在下圖中,用綠色突出顯示錶示嵌入層,該嵌入層位於最終分類層之前。

深度學習表徵的不合理有效性——從頭開始構建圖像搜索服務(一)

嵌入層只在最終的決策層前使用

一旦使用該模型生成圖像特徵,就可以將其存儲到磁盤中,重新使用時無需再次進行推理!這也是嵌入在實際應用中如此受歡迎的原因之一,因為可以大幅提升效率。除了將它們存儲到磁盤之外,還將使用Annoy構建嵌入的快速索引,這將允許我們非常快速地找到任何給定嵌入的最近嵌入。

以下是本文得到的嵌入。現在每個圖像都由一個大小為4096的稀疏向量表示。注意:向量稀疏的原因是在激活函數之後將負數歸零。

深度學習表徵的不合理有效性——從頭開始構建圖像搜索服務(一)

圖像嵌入

使用嵌入來搜索圖像

現在可以簡單地接收圖像,獲得其嵌入後,並查看快速索引以查找類似的嵌入,從而找到類似的圖像。這是特別有用的,因為圖像標籤通常很嘈雜,且圖像比標籤更多。例如,在數據集中,有一個類別cat(貓)和一個類別bottle(瓶子)。您認為下面這張圖片會被標記為哪個類別?

深度學習表徵的不合理有效性——從頭開始構建圖像搜索服務(一)

貓或瓶子?

正確的答案是瓶子,這是一個經常在真實數據集中出現的實際問題。將圖像標記為唯一類別是非常受限的,這就是為什麼希望使用更細粒的表示。幸運的是,這也正是深度學習所擅長的!下面看看使用嵌入的圖像搜索是否比通過人為標記的更好。

搜索相似的圖片todataset / bottle / 2008_000112.jpg,可以看見該圖像位於bottle(瓶子)類別。

深度學習表徵的不合理有效性——從頭開始構建圖像搜索服務(一)

結果出人意料的好,搜索得到很多貓的圖像,而不是瓶子的圖像,這看起來很合理!由於預訓練網絡的訓練集中包含各類圖像,這樣包括貓,因此它能夠準確地找到相似的圖像,即使它之前從未接受過本文選定數據集的訓練。

但是,最下面一行中間的一幅圖像顯示了一個瓶架。一般而言,這種方法執行後找到類似的圖像,但有時我們只對圖像的一部分感興趣。

例如,給定一張包含貓和瓶子的圖像,我們可能只對和貓類似的圖像感興趣,而不是瓶子。

這類問題解決方法看下一篇博客《深度學習表徵的不合理有效性——從頭開始構建圖像搜索服務》。

作者信息

Emmanuel Ameisen,AI研究者

本文由阿里云云棲社區組織翻譯。

文章為簡譯,更為詳細的內容,請查看原文。


分享到:


相關文章: