深度学习表征的不合理有效性——从头开始构建图像搜索服务(二)
接著上篇《深度學習表征的不合理有效性——從頭開始構建圖像搜索服務(一)》的內容,上次遇到的問題是搜索相似圖的時候還是會出現瑕疵,因此本文介紹相關的處理辦法。
半監督搜索
解決上文問題的常用方法是,首先使用目標檢測模型,檢測貓圖像,然后對原始圖像裁剪之后再進行圖像搜索,這樣做會很大程度地增加計算開銷,如果可能的話,希望能夠避免這種開銷。?
有一種更簡單的“hacky”方法,包括重新權衡激活值,這可以通過加載最初丟棄的最后一層權重來完成,并且僅使用與正在尋找的類索引相關聯的權重來重新加權嵌入。例如,在下圖中,使用Siamese cat類的權重來重新權衡數據集上的激活(用綠色突出顯示)。
根據Imagenet,Siamese cat中的284類權衡激活,來研究它是如何工作的。
正在搜索類似的圖像todataset / bottle / 2008_000112.jpg使用加權特征:
圖像13可以看到,搜索一直偏向于尋找Siamese cat的照片,而不再展示任何的瓶子圖像,此外,可能會注意到最后一張照片是一只羊!這就非常有趣了,此時的模型又導致了另外一種不同類型的錯誤,但模型更適合目前的任務需求。
從上面的結果可以看出,通過寬泛方式搜索類似的圖像,或者通過調整模型所訓練的特定類別,使得模型向前邁出的了一大步,但由于使用的是在Imagenet上預訓練的模型,因此僅限于1000個Imagenet類別。這些類別不能包羅萬象,所以希望找到更加靈活的東西。另外,如果我們只是在不提供輸入圖像的情況下搜索貓呢?
為了做到這一點,使用的不僅僅是簡單的技巧,還需利用一個能夠理解單詞語義能力的模型。
文本-->文本
嵌入文本
下面進入自然語言處理(NLP)世界,可以使用類似的方法來索引和搜索單詞。
從GloVe加載了一組預先訓練的矢量,這些矢量是通過從維基百科上爬蟲并學習該數據集中單詞之間的語義關系而獲得的。
像之前一樣創建一個索引,這次包含所有GloVe向量。之后就可以在嵌入中搜索類似的單詞。
例如,搜索said,返回[word,distance]列表:
- ['said', 0.0]
- ['told', 0.688713550567627]
- ['spokesman', 0.7859575152397156]
- ['asked', 0.872875452041626]
- ['noting', 0.9151610732078552]
- ['warned', 0.915908694267273]
- ['referring', 0.9276227951049805]
- ['reporters', 0.9325974583625793]
- ['stressed', 0.9445104002952576]
- ['tuesday', 0.9446316957473755]
這似乎非常合理,大多數單詞在含義上與我們的原始單詞非常相似,或代表一個合適的概念。最后的結果(tuesday)也表明這個模型存在一些瑕疵,但它會讓我們這種方法會讓我們開始起步。現在,讓我們嘗試在模型中既包含單詞,又包含圖像。
一個大問題
使用嵌入之間的距離作為搜索方法似乎看起來非常合理,大多數單詞在含義上與原始單詞非常相似,但對單詞和圖像的表示似乎并不兼容。圖像的嵌入大小為4096,而單詞的嵌入大小為300,如何使用一個來搜索另一個?此外,即使兩個嵌入大小都相同,它們也會以完全不同的方式進行訓練,因此圖像和相關單詞很可能不會發生有隨機相同的嵌入。因此,需要訓練一個聯合模型。
圖像<-->文本
現在創建一個混合模型,可以從單詞到圖像,反之亦然。?
在本教程中,將第一次實踐自己的模型,模型是從一篇名為DeViSE的優秀論文中汲取靈感。我們的想法是通過重新訓練圖像模型,并改變其標簽的類型來結合這兩種表示。
通常,圖像分類器被訓練為從許多類中選擇一個類別(Imagenet為1000類)。以Imagenet為例,轉化最后一層為大小1000的一維向量來表示每個類的概率。這意味著模型沒有語義理解哪些類與其他類相似,即將貓的圖像分類為狗導致與將其分類為飛機的錯誤是一樣的。?
對于混合模型,用我們的類別單詞向量替換模型的最后一層,這允許模型學習到將圖像語義映射到單詞語義,這也意味著類似的類將彼此更接近(因為cat的單詞向量比airplane更靠近dog)。我們將預測一個大小為300的語義豐富的單詞向量,而不是大小為1000的單詞向量,通過添加兩個全連接層來實現此目的:
- 一個大小為2000的中間層
- 一個大小為300的輸出層(GloVe單詞向量的大小)
以下是在Imagenet上訓練模型時的樣子:
這是修改后模型的樣子:
訓練模型
在數據集的訓練集上重新訓練我們的模型,以學習預測與圖像標簽相關聯的單詞向量。例如,對于具有類別cat的圖像,嘗試預測與cat相關聯的300長度向量。訓練需要一些時間,但這仍然要比Imagenet訓練快得多。
與通常的數據集相比,本文使用的訓練數據(數據集的80%作為訓練集,即800個圖像)是微不足道的(Imagenet有一百萬張圖像)。如果使用傳統的類別訓練技術,我們不會指望模型在測試集上表現得非常好,并且也不會期望它在全新的例子上有不錯的效果。
一旦模型被訓練好,就可以從上面獲得GloVe單詞索引,并通過運行數據集中的所有圖像,將其保存到磁盤,構建圖像特征的新快速索引。
標注
現在可以輕松地從任何圖像中提取標簽,只需將我們的圖像提供給訓練有素的網絡,保存出來的大小為300的矢量,并從GloVe中找到英語單詞索引中最接近的單詞。讓我們試試下面這張圖片——它的類別標簽是瓶子,雖然它包含各種各樣的物品。
圖像16
以下是生成的標簽:
- [6676, 'bottle', 0.3879561722278595]
- [7494, 'bottles', 0.7513495683670044]
- [12780, 'cans', 0.9817070364952087]
- [16883, 'vodka', 0.9828150272369385]
- [16720, 'jar', 1.0084964036941528]
- [12714, 'soda', 1.0182772874832153]
- [23279, 'jars', 1.0454961061477661]
- [3754, 'plastic', 1.0530102252960205]
- [19045, 'whiskey', 1.061428427696228]
- [4769, 'bag', 1.0815287828445435]
是一個非常好的結果,因為大多數標簽非常相關。這種方法仍然有提升空間,但它可以很好地掌握圖像中的大多數元素。該模型學習提取許多相關標簽,甚至從未經過訓練的類別中提取到的!
使用文本搜索圖像
最重要的是,可以使用聯合嵌入,輸入任何單詞都可以搜索圖像數據庫。只需要從GloVe獲取預先訓練好的單詞嵌入,并找到具有最相似嵌入的圖像即可。
使用最少數據進行廣義圖像搜索。
首先從搜索dog這個詞開始:
結果相當不錯,但是我們可以從標簽上訓練的任何分類器中都得到這個!
搜索ocean術語的結果。
模型了解ocean與water類似,并從boat類中返回許多物品。
搜索街道又會發生什么呢?
從圖中可以看到,返回的圖像來自各種類別(car,dog,bicycle,bus,person),但大多數圖像都包含或靠近街道,盡管我們在訓練模型時從未使用過這個概念。因為通過預先訓練的單詞向量,利用外部知識來學習比簡單類別在語義上更豐富的圖像向量映射,所以模型可以很好地概括為外部概念。
無以言表
英語雖然已經發展了很久,但還不足以為一切都有對應的詞。例如,沒有英文單詞表示“躺在沙發上的貓”,但這是一個對輸入搜索引擎完全有效的查詢。如果想要同時搜索多個單詞,就可以使用一種非常簡單的方法,即利用單詞向量的算術屬性。事實證明,總結兩個單詞向量通常是非常有效的。因此,如果只是通過使用貓和沙發的平均單詞矢量來搜索我們的圖像,就可以希望獲得非常像貓、像沙發一樣的圖像、或者在沙發上有貓的圖像。
下面使用混合嵌入搜索
從圖中可以看到,結果不錯。因為大多數圖像都包含一些毛茸茸的動物和一個沙發。我們的模型只訓練單個單詞,也可以處理兩個單詞的組合,但還沒有構建Google Image Search,但對于相對簡單的架構來說,本文絕對是有用的。
這種方法實際上可以很自然地擴展到各種域,感興趣的讀者可以應用于各自的領域之中。
結論
希望讀者能夠發現這篇文章內容的豐富,它揭開了一些基于內容的推薦和語義搜索世界的神秘面紗,感興趣的讀者快上手試試吧。
以上為譯文,由阿里云云棲社區組織翻譯。
譯文鏈接
文章原標題《The unreasonable effectiveness of Deep Learning Representations》
譯者:海棠,審校:Uncle_LLD。
文章為簡譯,更為詳細的內容,請查看原文。
總結
以上是生活随笔為你收集整理的深度学习表征的不合理有效性——从头开始构建图像搜索服务(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习表征的不合理有效性——从头开始构
- 下一篇: 深度学习笔记:利用numpy从零搭建一个