本文構(gòu)建了一個(gè)能同時(shí)完成四個(gè)任務(wù)的的深度神經(jīng)網(wǎng)絡(luò): 生成圖像描述、生成相似單詞、以圖搜圖和根據(jù)描述搜圖。傳統(tǒng)上這些任務(wù)分別需要一個(gè)模型,但我們現(xiàn)在要用一個(gè)模型來完成所有這些任務(wù)。
眾所周知,神經(jīng)網(wǎng)絡(luò)十分擅長處理特定領(lǐng)域的任務(wù)(narrow task),但在處理多任務(wù)時(shí)結(jié)果并不是那么理想。
這與人類的大腦不同,人類的大腦能夠在多樣化任務(wù)中使用相同的概念。例如,假如你從來沒聽說過“分形”(fractal),請看下面這張圖:
數(shù)學(xué)之美:分形圖像
上圖是一個(gè)分形圖像。在看到一張分形圖像后,人能夠處理多個(gè)與之相關(guān)的任務(wù):
在一組圖像中,區(qū)分一只貓的圖像和分形圖像;
在一張紙上,粗略地畫一個(gè)分形圖像;
將分形圖像與非分形圖像進(jìn)行分類;
閉上眼睛,想象一下分形圖像是什么樣子的。
那么,你是如何完成這些任務(wù)的呢?大腦中有專門的神經(jīng)網(wǎng)絡(luò)來處理這些任務(wù)嗎?
現(xiàn)代神經(jīng)科學(xué)認(rèn)為,大腦中的信息是在不同的部位進(jìn)行分享和交流的。對于這種多任務(wù)性能是如何發(fā)生的,答案可能在于如何在神經(jīng)網(wǎng)絡(luò)中存儲和解釋數(shù)據(jù)。
“表示”的精彩世界
顧名思義,“表示”(representation)就是信息在網(wǎng)絡(luò)中編碼的方式。當(dāng)一個(gè)單詞、一個(gè)句子或一幅圖像(或其他任何東西)作為輸入提供給一個(gè)訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)時(shí),它就隨著權(quán)重乘以輸入和應(yīng)用激活在連續(xù)的層上進(jìn)行轉(zhuǎn)換。最后,在輸出層,我們得到一串?dāng)?shù)字,我們將其解釋為類的標(biāo)簽或股票價(jià)格,或網(wǎng)絡(luò)為之訓(xùn)練的任何其他任務(wù)。
輸入->輸出的神奇轉(zhuǎn)換是由連續(xù)層中發(fā)生的輸入轉(zhuǎn)換產(chǎn)生的。輸入數(shù)據(jù)的這些轉(zhuǎn)換即稱為“表示”(representations)。一個(gè)關(guān)鍵的想法是,每一層都讓下一層更容易地完成它的工作。使連續(xù)層的周期變得更容易的過程會導(dǎo)致激活(特定層上輸入數(shù)據(jù)的轉(zhuǎn)換)變得有意義。
有意義是指什么呢?讓我們看下面的示例,該示例展示了圖像分類器中不同層的激活。
圖像分類網(wǎng)絡(luò)的作用是將像素空間中的圖像轉(zhuǎn)化為更高級的概念空間。例如,一張汽車的圖像最初被表示為RGB值,在第一層開始被表示為邊緣空間,然后在第二層被表示為圓圈和基本形狀空間,在倒數(shù)第二層,它將開始表示為高級對象(如車輪、車門等)。
這種越來越豐富的表示(由于深度網(wǎng)絡(luò)的分層性質(zhì)而自動出現(xiàn))使得圖像分類的任務(wù)變得簡單。最后一層要做的就是斟酌,比如說,車輪和車門的概念更像汽車,耳朵和眼睛的概念更像人。
你能用這些表示做什么?
由于這些中間層存儲有意義的輸入數(shù)據(jù)編碼,所以可以對多個(gè)任務(wù)使用相同的信息。例如,你可以使用一個(gè)語言模型(一個(gè)經(jīng)過訓(xùn)練的、用于預(yù)測下一個(gè)單詞的遞歸神經(jīng)網(wǎng)絡(luò)),并解釋某個(gè)特定神經(jīng)元的激活,從而預(yù)測句子帶有的情緒。
一個(gè)令人驚訝的事實(shí)是,情感神經(jīng)元是在無監(jiān)督的語言建模任務(wù)中自然產(chǎn)生的。網(wǎng)絡(luò)被訓(xùn)練去預(yù)測下一個(gè)單詞,它的任務(wù)中并沒有被要求去預(yù)測情感。也許情感是一個(gè)非常有用的概念,以至于網(wǎng)絡(luò)為了更好地進(jìn)行語言建模而發(fā)明它。
一旦你理解了“表示”這個(gè)概念,你就會開始從完全不同的角度來理解深層神經(jīng)網(wǎng)絡(luò)。你會開始將感知表示(sensing representations)作為一種可轉(zhuǎn)換的語言,使不同的網(wǎng)絡(luò)(或同一網(wǎng)絡(luò)的不同部分)能夠彼此通信。
通過構(gòu)建一個(gè)四合一的網(wǎng)絡(luò)來探索表示
為了充分理解“表示”,讓我們來構(gòu)建一個(gè)能同時(shí)完成四個(gè)任務(wù)的的深度神經(jīng)網(wǎng)絡(luò):
圖像描述生成器:給定圖像,為其生成描述
相似單詞生成器:給定一個(gè)單詞,查找與之相似的其他單詞
視覺相似的圖像搜索:給定一幅圖像,找出與之最相似的圖像
通過描述圖像內(nèi)容進(jìn)行搜索:給出文本描述,搜索具有所描述的內(nèi)容的圖像
這里的每一個(gè)任務(wù)本身就是一個(gè)項(xiàng)目,傳統(tǒng)上分別需要一個(gè)模型。但我們現(xiàn)在要用一個(gè)模型來做所有這些任務(wù)。
Pytorch代碼:
https://github.com/paraschopra/one-network-many-uses
第一部分:看圖說話(Image Captioning)
在網(wǎng)上有很多實(shí)現(xiàn)Image Captioning的很好的教程,所以這里不打算深入講解。我的實(shí)現(xiàn)與這個(gè)教程中的完全相同:https://daniel.lasiman.com/post/image-captioning/。關(guān)鍵的區(qū)別在于,我的實(shí)現(xiàn)是在Pytorch中實(shí)現(xiàn)的,而這個(gè)教程使用的是Keras。
接下來,你需要下載Flickr8K數(shù)據(jù)集。你還需要下載圖像描述。提取“caption_datasets”文件夾中的文字描述。
模型
Image Captioning一般有兩個(gè)組成部分:
a)圖像編碼器(image encoder),它接收輸入圖像并以一種對圖像描述有意義的格式來表示圖像;
b)圖說解碼器(caption decoder),它接受圖像表示,并輸出文本描述。
image encoder是一個(gè)深度卷積網(wǎng)絡(luò),caption decoder則是傳統(tǒng)的LSTM/GRU遞歸神經(jīng)網(wǎng)絡(luò)。當(dāng)然,我們可以從頭開始訓(xùn)練它們。但這樣做需要比我們現(xiàn)有的(8k圖像)更多的數(shù)據(jù)和更長的訓(xùn)練時(shí)間。因此,我們不從頭開始訓(xùn)練圖像編碼器,而是使用一個(gè)預(yù)訓(xùn)練的圖像分類器,并使用它的pre-final層的激活。
這是一個(gè)示例。我使用PyTorch modelzoo中可用的Inception網(wǎng)絡(luò),該網(wǎng)絡(luò)在ImageNet上進(jìn)行了訓(xùn)練,可以對100個(gè)類別的圖像進(jìn)行分類,并使用它來提供一個(gè)可以輸入給遞歸神經(jīng)網(wǎng)絡(luò)中的表示。
請注意,Inception network從未針對圖說生成任務(wù)進(jìn)行過訓(xùn)練。然而,它的確有效!
我們也可以使用一個(gè)預(yù)訓(xùn)練的語言模型來作為caption decoder。但這一次,由于我重新實(shí)現(xiàn)了一個(gè)運(yùn)行良好的模型,所以可以從頭開始訓(xùn)練解碼器。
完整的模型架構(gòu)如下圖所示:
你可以從頭開始訓(xùn)練模型,但是需要在CPU上花費(fèi)幾天時(shí)間(我還沒有針對GPU進(jìn)行優(yōu)化)。但不用擔(dān)心,你也可以享受一個(gè)已經(jīng)訓(xùn)練完成的模型。(如果你是從頭開始訓(xùn)練,請注意,我在大約40 epochs時(shí)停止訓(xùn)練,當(dāng)時(shí)運(yùn)行的平均損失約為2.8)。
性能
我實(shí)現(xiàn)了性能良好的beam search方法。下面是網(wǎng)絡(luò)為測試集中的圖像生成的圖說示例(以前從未見過)。
用我自己的照片試試,讓我們看看網(wǎng)絡(luò)生成的圖說是什么:
效果不錯(cuò)!令人印象深刻的是,網(wǎng)絡(luò)知道這張照片里有一個(gè)穿著白色T恤的男人。但語法有點(diǎn)偏離(我相信通過更多的訓(xùn)練可以修正),但基本的要點(diǎn)抓住了。
如果輸入的圖像包含網(wǎng)絡(luò)從未見過的東西,它往往會失敗。例如,我很好奇網(wǎng)絡(luò)會給iPhone X的圖像貼上什么樣的標(biāo)簽。
效果不太好。但總的來說,我對它的表現(xiàn)非常滿意,這為我們使用網(wǎng)絡(luò)在學(xué)習(xí)給圖像生成圖說時(shí)開發(fā)的“表示”來構(gòu)建其他功能提供了良好的基礎(chǔ)。
第二部分:查找相似單詞
回想一下我們?nèi)绾螐膱D像表示中解碼圖說。我們將該表示提供給LSTM/GRU網(wǎng)絡(luò),生成一個(gè)輸出,將其解釋為第一個(gè)單詞,然后將第一個(gè)單詞返回到網(wǎng)絡(luò)以生成第二個(gè)單詞。這個(gè)過程一直持續(xù)到網(wǎng)絡(luò)生成一個(gè)表示句子結(jié)束的特殊標(biāo)記為止。
為了將單詞反饋到網(wǎng)絡(luò)中,我們需要將單詞轉(zhuǎn)換為表示,再輸入給網(wǎng)絡(luò)。這意味著,如果輸入層包含300個(gè)神經(jīng)元,那么對于所有圖說中的8000多個(gè)不同的單詞,我們需要有一個(gè)300個(gè)相關(guān)聯(lián)的數(shù)字,唯一地指定那個(gè)單詞。將單詞字典轉(zhuǎn)換成數(shù)字表示的過程稱為詞匯嵌入(或詞匯表示)。
我們可以下載和使用已經(jīng)存在的詞匯嵌入,如word2vec或GLoVE。但在這個(gè)示例中,我們從頭開始學(xué)習(xí)詞匯嵌入。我們從隨機(jī)生成的詞匯嵌入開始,探索在訓(xùn)練結(jié)束時(shí),網(wǎng)絡(luò)對單詞的了解。
由于我們無法想象100維的數(shù)字空間,我們將使用一種稱為t-SNE的奇妙技術(shù)來在2維中可視化學(xué)習(xí)的詞匯嵌入。t-SNE是一種降維技術(shù),它試圖使高維空間中的鄰域同時(shí)也是低維空間中的鄰域。
詞匯嵌入的可視化
讓我們來看看caption decoder學(xué)習(xí)到的詞匯嵌入空間(不像其他語言任務(wù)有數(shù)百萬單詞和句子,我們的解碼器在訓(xùn)練數(shù)據(jù)集中只有~30k的句子)。
因此,我們的網(wǎng)絡(luò)已經(jīng)了解到像“play”、“plays”和“playing”這樣的詞匯是非常相似的(它們具有相似的表示形式,如紅色箭頭所示的緊密聚類)。讓我們在這個(gè)二維空間中探索另一個(gè)區(qū)域:
這個(gè)區(qū)域似乎有一堆數(shù)字——“two”、“three”、“four”、“five”,等等。
上圖,它知道people和children兩個(gè)單詞相似。而且,它還隱式地推斷出了物體的形狀。
相似詞匯
我們可以使用100維表示(100-dimensional representation)來構(gòu)建一個(gè)函數(shù),該函數(shù)提出與輸入單詞最相似的單詞。它的工作原理很簡單:采用100維的表示,并找出它與數(shù)據(jù)庫中所有其他單詞的余弦相似度。
讓我們來看看與“boy”這個(gè)單詞最相似的單詞:
結(jié)果不錯(cuò)?!癛ider”除外,但“kids”、“kid”和“toddler”都是正確的。
這個(gè)網(wǎng)絡(luò)認(rèn)為與“chasing”相似的詞匯是:
“Chases”是可以的,但我不確定為什么它認(rèn)為“police”與“chasing”類似。
單詞類比(Word analogies)
關(guān)于詞匯嵌入的一個(gè)令人興奮的事實(shí)是,你可以對它們進(jìn)行微積分。你可以用兩個(gè)單詞(如“king”和“queen”)并減去它們的表示來得到一個(gè)方向。當(dāng)你把這個(gè)方向應(yīng)用到另一個(gè)詞的表示上(如“man”),你會得到一個(gè)與實(shí)際類似詞(比如“woman”)很接近的表示。這就是為什么word2vec一經(jīng)推出就如此受歡迎的原因:
我很好奇通過caption decoder學(xué)習(xí)到的表示是否具有類似的屬性。盡管我持懷疑態(tài)度,因?yàn)橛?xùn)練數(shù)據(jù)并不大(大約3萬個(gè)句子),我還是嘗試了一下。
網(wǎng)絡(luò)學(xué)習(xí)到的類比并不完美(有些單詞字面上出現(xiàn)的次數(shù)<10次,所以網(wǎng)絡(luò)沒有足夠的信息可供學(xué)習(xí))。但仍有一些類比。
如果riding對應(yīng)sitting,那么walking對應(yīng)什么呢?我的網(wǎng)絡(luò)認(rèn)為應(yīng)該是“l(fā)aying”(這個(gè)結(jié)果還不錯(cuò)!)
同樣,如果“man”的復(fù)數(shù)是“men”,那么“woman”的復(fù)數(shù)應(yīng)該是什么呢:
第二個(gè)結(jié)果是“women”,相當(dāng)不錯(cuò)了。
最后,如果grass對應(yīng)green,那么sky對應(yīng)什么呢:
網(wǎng)絡(luò)認(rèn)為sky對應(yīng)silver或grey的,雖然沒有出現(xiàn)blue,但它給的結(jié)果都是顏色詞。令人驚訝的是,這個(gè)網(wǎng)絡(luò)能夠推斷顏色的方向。
第三部分:查找相似圖像
如果單詞表示將類似的單詞聚在一起,那么圖像表示(Inception支持的圖像編碼器輸出)呢?我將相同的t-SNE技術(shù)應(yīng)用于圖像表示(在caption decoder的第一步中作為輸入的300-dimensional tensor)。
可視化
這些點(diǎn)是不同圖像的表示(不是全部8K圖像,大約是100張圖像的樣本)。紅色箭頭指向附近的一組表示的聚類。
賽車的圖像被聚類在一起。
孩子們在森林/草地玩耍的圖像也被聚類在一起。
籃球運(yùn)動員的圖像被聚類在一起。
查找與輸入圖像相似的圖像
對于查找相似單詞任務(wù),我們被限制在測試集詞匯表中尋找相似的單詞(如果測試集中不存在某個(gè)單詞,我們的caption decoder就不會學(xué)習(xí)它的嵌入)。然而,對于類似的圖像任務(wù),我們有一個(gè)圖像表示生成器(image representation generator),它可以接受任何輸入圖像并生成其編碼。
這意味著我們可以使用余弦相似度方法來構(gòu)建一個(gè)按圖像搜索的功能,如下所示:
步驟1:獲取數(shù)據(jù)庫或目標(biāo)文件夾中的所有圖像,并存儲它們的表示(由image encoder給出)
步驟2:當(dāng)用戶希望搜索與已有圖像最相似的圖像時(shí),使用新圖像的表示并在數(shù)據(jù)庫中找到最接近的圖像(由余弦相似度給出)
谷歌圖像可能正式使用這種(或類似的)方法來支持其反向圖像搜索功能。
讓我們看看這個(gè)網(wǎng)絡(luò)是如何工作的:
上面這張圖像是我自己的。我們使用的模型以前從未見過它。當(dāng)我查詢類似圖像時(shí),網(wǎng)絡(luò)從Flickr8K數(shù)據(jù)集輸出如下圖像:
是不是很像?我沒想到會有這么好的表現(xiàn),但我們確實(shí)做到了!
第四部分:通過描述查找圖像
在最后一部分中,我們將反向運(yùn)行caption generator。因此,我們不是獲取圖像并為其生成標(biāo)題,而是輸入標(biāo)題(文本描述)并找到與之最匹配的圖像。
過程如下:
步驟1:不是從來自編碼器的300維圖像表示開始,而是從一個(gè)完全隨機(jī)的300維輸入張量開始
步驟2:凍結(jié)整個(gè)網(wǎng)絡(luò)的所有層(即指示PyTorch不要計(jì)算梯度)
步驟3:假設(shè)隨機(jī)生成的輸入張量來自image encoder,將其輸入到caption decoder中
步驟4:獲取給定隨機(jī)輸入時(shí)網(wǎng)絡(luò)生成的標(biāo)題,并將其與用戶提供的標(biāo)題進(jìn)行比較
步驟5:計(jì)算比較生成的標(biāo)題和用戶提供的標(biāo)題的損失
步驟6:找到使損失最小的輸入張量的梯度
步驟7:根據(jù)梯度改變輸入張量的方向(根據(jù)學(xué)習(xí)率改變一小步)
繼續(xù)步驟4到步驟7,直到收斂或當(dāng)損失低于某個(gè)閾值時(shí)為止
最后一步:取最終的輸入張量,并利用它的值,通過余弦相似度找到離它最近的圖像
結(jié)果相當(dāng)神奇的:
我搜索了“a dog”,這是網(wǎng)絡(luò)找到的圖像:
搜索“a boy smiling”:
最后,搜索:
前兩個(gè)結(jié)果是:
以及
總結(jié)和挑戰(zhàn)
所有這些操作的代碼可以從github存儲庫下載執(zhí)行:
https://github.com/paraschopra/one-network-many-uses
這個(gè)存儲庫包括了用于數(shù)據(jù)預(yù)處理、模型描述、預(yù)訓(xùn)練的圖說生成網(wǎng)絡(luò)、可視化的代碼。但不包括Flickr8K數(shù)據(jù)集或標(biāo)題,需要單獨(dú)下載。
如果你想更進(jìn)一步,這里有一個(gè)挑戰(zhàn):從給定的描述生成圖像。
這比本文中處理的要難10倍,但我感覺這是可行的。如果一項(xiàng)服務(wù)不僅能夠搜索與文本對應(yīng)的圖像,而且能夠動態(tài)地生成圖像,那該多酷啊。
在未來,如果Google Images實(shí)現(xiàn)了這個(gè)功能,并能夠?yàn)椴淮嬖诘膱D像提供結(jié)果(比如“兩只獨(dú)角獸在披薩做成的地毯上飛翔”),我不會感到驚訝的。
就這樣。祝你能安全愉快地探索表示的世界。
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4813瀏覽量
103421 -
圖像
+關(guān)注
關(guān)注
2文章
1094瀏覽量
41197 -
生成器
+關(guān)注
關(guān)注
7文章
322瀏覽量
21845 -
圖像分類
+關(guān)注
關(guān)注
0文章
96瀏覽量
12155
原文標(biāo)題:一個(gè)神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)4大圖像任務(wù),GitHub已開源
文章出處:【微信號:AI_era,微信公眾號:新智元】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
評論