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

摘要: 還在爲搜索引擎的工做原理感到困惑嗎?看完本篇就能夠本身動手構建搜圖服務了。

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

爲何是類似搜索?

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

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

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

clipboard.png

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

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

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

根據咱們多年語義理解項目的技術經驗,但願編寫一個教程,介紹如何構建本身的特徵表示,包括圖像和文本數據,以及如何有效地進行類似性搜索。但願看完本文,讀者可以對任意大小的數據不管數據集的大小如何,都可以從頭開始構建出一個快速語義搜索模型。優化

計劃

聊聊優化網站

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

下面讓咱們思考一些方法:spa

方法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

clipboard.png

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

文本

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

圖像-->圖像

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

VGG網絡

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

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

一旦使用該模型生成圖像特徵,就能夠將其存儲到磁盤中,從新使用時無需再次進行推理!這也是嵌入在實際應用中如此受歡迎的緣由之一,由於能夠大幅提高效率。除了將它們存儲到磁盤以外,還將使用Annoy構建嵌入的快速索引,這將容許咱們很是快速地找到任何給定嵌入的最近嵌入。

如下是本文獲得的嵌入。如今每一個圖像都由一個大小爲4096的稀疏向量表示。注意:向量稀疏的緣由是在激活函數以後將負數歸零。

圖像嵌入

使用嵌入來搜索圖像

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

貓或瓶子?

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

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

clipboard.png

結果出人意料的好,搜索獲得不少貓的圖像,而不是瓶子的圖像,這看起來很合理!因爲預訓練網絡的訓練集中包含各種圖像,這樣包括貓,所以它可以準確地找到類似的圖像,即便它以前從未接受過本文選定數據集的訓練。

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

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

本文做者:【方向】

閱讀原文

本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索