當前位置:
首頁 > 新聞 > 四個任務就要四個模型?現在單個神經網路模型就夠了!

四個任務就要四個模型?現在單個神經網路模型就夠了!

雷鋒網 AI 科技評論按:顧名思義,「表示」(representation)就是指在網路中對信息進行編碼的方式。為了讓大家充分理解「表示」,本文作者嘗試構建一個能同時完成圖像描述,相似詞、相似圖像搜索以及通過描述圖像描述搜索圖像四項任務的深度神經網路,從實操中讓大家感受「表示」的奇妙世界。雷鋒網 AI 科技評論編譯如下。

眾所周知,神經網路十分擅長處理特定領域的任務,但在處理多任務時結果並不是那麼理想。這與人類大腦不同,人類大腦能夠在多樣化任務中使用相同的概念。例如,假如你從來沒聽說過「分形」(fractal),不妨看一下下面這張圖:

四個任務就要四個模型?現在單個神經網路模型就夠了!

打開今日頭條,查看更多圖片數學之美:分形圖像(via https://fractalfoundation.org/)

在看到一張分形圖像後,人類能夠處理多個與之相關的任務:

  • 在一組圖像中,區分出分形圖像和一隻貓的圖像;

  • 在一張紙上,粗略地畫出分形圖的樣子(它不會很完美,但也不會是隨意的塗鴉);

  • 將類似分形的圖像與非分形圖像進行分類(你會毫不猶豫地將圖像按最相似到最不相似的方式進行分類);

  • 閉上眼睛,想像一下分形圖像是什麼樣子的(即使現在不給你一張現成的分形圖象,你也可以在看過它一次之後,就想像出它的樣子,是不是很棒!)

那麼,你是如何完成這些任務的呢?你的大腦中是否有專門負責處理這些任務的神經網路?

現代神經科學對此給出了答案:大腦中的信息是跨不同的部位進行分享和交流的。大腦究竟怎樣完成這些任務只是研究的一個領域,而對於這種執行多任務的能力是怎樣產生的,我們也有一些線索——答案可能就存在於如何在神經網路中存儲和解釋數據。

「表示」的奇妙世界

顧名思義,「表示」(representation)就是指在網路中對信息進行編碼的方式。當一個單詞、一個句子或一幅圖像(或其他任何東西)被輸入到一個訓練好的神經網路時,隨著權重與輸入相乘並進行激活操作時,它就能在連續的層上實現轉換。最後,我們在輸出層中得到一串數字,我們將其解釋為類標籤或股價,或網路為之訓練的任何其他任務。

這種神奇的輸入->輸出轉換因連續層中發生的輸入轉換得以實現。輸入數據的這些轉換即稱為「表示」。它的一個重要思想是,每一層都讓下一層更容易地執行任務。這個過程讓連續層的存在變得更容易,進而也使得激活(特定層上輸入數據的轉換)變得有意義。

我所說的有意義是指什麼呢?讓我們看下面的示例,其展示了圖像分類器中不同層的激活:

四個任務就要四個模型?現在單個神經網路模型就夠了!

圖像分類網路的作用是將像素空間中的圖像轉化為更高級的概念空間。例如,一張最初用 RGB 值表示的汽車圖像,首先在第一層用邊緣空間表示,然後在第二層被表示為圓圈和基本形狀空間,在倒數第二層則開始使用高級對象(如車輪、車門等)表示。

隨著表示(由於深度網路的層次性而自動出現)日益豐富,圖像分類的任務也變得微不足道。最後一層要做的就是權衡車輪和車門的概念更像汽車以及耳朵、眼睛的概念更像人。

表示能夠運用在哪些方面?

由於這些中間層存儲有意義的輸入數據編碼,所以可以對多個任務使用相同的信息。例如,你可以使用一個語言模型(一個經過訓練、用於預測下一個單詞的循環神經網路),並解釋某個特定神經元的激活以預測句子的情緒。

四個任務就要四個模型?現在單個神經網路模型就夠了!

(via Unsupervised Sentiment Neuron)

一個令人驚訝的事實是,情感神經元是在無監督的語言建模任務中自然出現的。(相關文章請參閱:https://rakeshchada.github.io/Sentiment-Neuron.html)。網路經過訓練來預測下一個單詞,然而在任務中我們沒有要求網路預測情緒。也許情感是一個非常有用的概念,以至於網路為了更好地進行語言建模而創造了它。

一旦你理解了「表示」這個概念,你就會開始從完全不同的角度來理解深層神經網路。你會開始將表示(sensing representations)視作一種能夠讓不同網路(或同一網路的不同部分)之間實現通信的可轉換的語言。

通過構建一個「四合一」的網路來探索表示

為了充分理解「表示」,讓我們來構建一個能同時完成四個任務的的深度神經網路:

  • 圖像描述生成器:給定圖像,為其生成標題

  • 相似單詞生成器:給定一個單詞,查找與之相似的其他單詞

  • 視覺相似的圖像搜索:給定一幅圖像,找出與之最相似的圖像

  • 通過描述圖像描述搜索圖像:給出文本描述,搜索具有所描述的內容的圖像

這三個任務中的每一個本身都是一個項目,一般來說需要三個模型。但我們現在要用一個模型來完成所有這些任務。

該代碼將採用 Pytorch 在 Jupyter Notebook 中編寫,大家可以前往這個存儲庫進行下載:


https://github.com/paraschopra/one-network-many-uses

第一部分:圖像描述(Image Captioning)

在網上有很多實現圖像描述的好教程,所以這裡就不深入講解。我的實現與這個教程中所使用的方法完全相同:構建一個自動化的圖像標題應用程序(教程鏈接:https://daniel.lasiman.com/post/image-captioning/)。關鍵的區別在於,我的實現是使用 Pytorch 實現的,而教程使用的是 Keras。

要繼續學習,你需要下載 Flickr8K 數據集(1GB Flickr8K 數據集的下載鏈接:https://github.com/jbrownlee/Datasets/releases/download/Flickr8k/Flickr8k_Dataset.zip,不過我不確定這個鏈接的有效期多長)。填好這張表格(https://forms.illinois.edu/sec/1713398)後,你的電子郵件會收到一個下載鏈接。將 zip 文件解壓到與筆記本目錄相同的「Flicker8k_Dataset」文件夾中。您還需要從這裡(http://cs.stanford.edu/people/karpathy/deepimagesent/caption_datasets.zip)下載描述,並提取「caption_datasets」文件夾中的描述。

模型

圖像描述一般由兩個組成部分:

a)圖像編碼器(image encoder),它接收輸入圖像並以一種對圖像描述有意義的格式來表示圖像;

b)圖說解碼器(caption decoder),它接受圖像表示,並輸出文本描述。

圖像編碼器是一個深度卷積網路,而圖說解碼器則是傳統的 LSTM/GRU 循環神經網路。當然,我們可以從頭開始訓練它們。但這樣做的話,就需要比我們現有的(8k 張圖像)更多的數據和更長的訓練時間。因此,我們不從頭開始訓練圖像編碼器,而是使用一個預訓練的圖像分類器,並使用它倒數第二層的激活。

你將在本文中看到許多神奇的表示示例,下面這個示例是第一個。我使用在 ImageNet 上進行了訓練的 PyTorch modelzoo中可用的 Inception 網路來對 100 個類別的圖像進行分類,並使用該網路來提供一個可以輸入給循環神經網路中的表示。

四個任務就要四個模型?現在單個神經網路模型就夠了!

via https://daniel.lasiman.com/post/image-captioning/

值得一提的是,雖然 Inception 網路從未對圖說生成任務進行過訓練,但是它的確有效!

如我在通過機器學習形成機器學習思路一文中所做的那樣,我們使用了一個預訓練的語言模型來作為圖說解碼器。但這一次,由於我重新實現了在教程中運行良好的模型,僅按照教程的步驟便從頭開始訓練了一個解碼器。

完整的模型架構如下圖所示:

四個任務就要四個模型?現在單個神經網路模型就夠了!

Image via https://daniel.lasiman.com/post/image-captioning/

你可以從頭開始訓練模型,但是在 CPU 上就要花費幾天時間(我沒有對 GPU 進行優化)。但不用擔心,我的筆記本電腦度過了幾個不眠之夜訓練出來的模型成果,可供大家使用。(如果你是從頭開始訓練,需要注意的是,當運行的平均損失約為 2.8 時,我在大概 40 epochs 時停止了訓練。)

性能

我採用的集束搜索(beam search)方法實現了良好的性能。下面是網路為測試集中的圖像所生成的圖說示例(網路此前從未見過這種圖像)。

四個任務就要四個模型?現在單個神經網路模型就夠了!

四個任務就要四個模型?現在單個神經網路模型就夠了!

用我自己的照片試試,看看網路生成的圖說是什麼:

四個任務就要四個模型?現在單個神經網路模型就夠了!

效果不錯!令人印象深刻的是,網路知道這張照片中有一個穿著白色 T 恤的男人。另外雖然圖說的句子語法有些錯誤(我相信通過更多的訓練可以修正這些錯誤),但基本的要點都抓住了。

如果輸入的圖像包含網路從未見過的東西,它往往會失敗。例如,我很好奇網路會給 iPhone X 的圖像貼上什麼樣的標籤。

四個任務就要四個模型?現在單個神經網路模型就夠了!

效果不太好。但總的來說,我對其性能非常滿意,這為我們在學習生成圖說時,使用網路所開發的「表示」構建其他功能提供了良好的基礎。

第二部分:相似詞

回想一下我們如何對由圖像表示得到的圖說進行解碼。我們將該表示提供給 LSTM/GRU 網路,生成一個輸出,將輸出解釋為第一個單詞,然後將第一個單詞返回給網路以生成第二個單詞。這個過程一直持續到網路生成一個表示句子結束的特殊標記為止。

為了將單詞反饋到網路中,我們需要將單詞轉換為表示,再輸入給網路。這意味著,如果輸入層包含 300 個神經元,那麼對於所有圖說中的 8000 多個不同的單詞,我們需要有一個唯一指定那個單詞的「300」數字。將單詞字典轉換成數字表示的過程,就稱為詞嵌入(或詞表示)。

我們可以下載和使用已經存在的詞嵌入,如 word2vec 或 GLoVE。但在本例中,我們從零開始學習一個詞嵌入。我們從隨機生成的詞嵌入開始,並探索我們的網路在完成訓練時從單詞中學到了什麼。

由於無法想像 100 維的數字空間,我們將使用一種稱為 t-SNE 的神奇技術將學到的詞嵌入在二維空間可視化。t-SNE 是一種降維技術,它試圖使高維空間中的鄰域不變地投射為低維空間中的鄰域。

詞嵌入的可視化

讓我們來看看圖說解碼器所學習到的詞嵌入空間(不像其他語言任務中有數百萬個單詞和句子,我們的解碼器在訓練數據集中只看到了大約 3 萬個句子)。

四個任務就要四個模型?現在單個神經網路模型就夠了!

因此,我們的網路已經了解到像「play」、「plays」和「playing」這樣的辭彙是非常相似的(它們具有相似的表示,如紅色箭頭所示的密集聚類)。讓我們看看這個二維空間中的另一個區域:

四個任務就要四個模型?現在單個神經網路模型就夠了!

這個區域似乎有一堆數字——「two」、「three」、「four」、「five」等等。再看另一個:

四個任務就要四個模型?現在單個神經網路模型就夠了!

上圖,它知道「people」和「children」這兩個單詞相似。而且,它還隱晦地推斷出了物體的形狀。

四個任務就要四個模型?現在單個神經網路模型就夠了!

相似詞

我們可以使用 100 維表示來構建一個函數,該函數可找出與輸入單詞最相似的單詞。它的工作原理很簡單:採用 100 維的表示,並找出它與資料庫中所有其他單詞的餘弦相似度。

讓我們來看看與「boy」最相似的單詞:

四個任務就要四個模型?現在單個神經網路模型就夠了!

結果不錯。除「Rider」外,但「kids」、「kid」和「toddler」都是正確的。

這個網路認為與「chasing」相似的辭彙是:

四個任務就要四個模型?現在單個神經網路模型就夠了!

「Chases」是可以理解的,但我疑惑的是為什麼它認為「police」與「chasing」類似。

單詞類比(Word analogies)

關於詞嵌入的一個振奮人心的事實是,你可以對它們進行微積分計算。你可以用兩個單詞(如「king」和「queen」)減去它們的表示來得到一個方向。當你把這個方嚮應用到另一個詞的表示上(如「man」),你會得到一個與實際的類比詞(比如「woman」)很接近的表示。這就是為什麼 word2vec 一經推出就如此受歡迎:

四個任務就要四個模型?現在單個神經網路模型就夠了!

via https://www.tensorflow.org/images/linear-relationships.png

我很好奇通過圖說解碼器學習到的表示是否具有類似的屬性。儘管由於訓練數據並不大(大約 3 萬個句子)我對結果持懷疑態度,但我還是嘗試了一下。

網路學到的類比並不完美(由於有些單詞書面上出現的次數<10次,因此網路沒有足夠的信息可供學習),這種情況下我不得不仔細去看,但是發現仍有一些類比。

四個任務就要四個模型?現在單個神經網路模型就夠了!

如果「riding」對應「sitting」,那麼「walking」對應什麼呢?網路認為應該是「laying」(這個結果還不錯!)

同樣,如果「man」的複數是「men」,那麼「woman」的複數應該是什麼呢:

四個任務就要四個模型?現在單個神經網路模型就夠了!

第二個結果是「women」,相當不錯了。

最後,如果「grass」對應「green」,那麼「sky」對應什麼呢:

四個任務就要四個模型?現在單個神經網路模型就夠了!

網路認為「sky」對應「silver」或「grey」的,雖然結果中沒有出現「blue」,但它給的結果都是顏色詞。令人驚訝的是,這個網路還能夠推斷顏色的方向。

第三部分:相似圖像

如果詞表示將類似的單詞聚類在一起,那麼圖像表示(Inception支持的圖像編碼器輸出)呢?我將相同的 t-SNE 技術應用於圖像表示(在圖說解碼器的第一步中作為輸入的 300 維度的張量)。

可視化

這些點是不同圖像的表示(我沒有使用全部的 8K 圖像,只使用了大約 100 張圖像樣本)。紅色箭頭指向附近一組表示的聚類。

四個任務就要四個模型?現在單個神經網路模型就夠了!

賽車的圖像被聚類在一起。

四個任務就要四個模型?現在單個神經網路模型就夠了!

孩子們在森林/草地玩耍的圖像也被聚類在一起。

四個任務就要四個模型?現在單個神經網路模型就夠了!

籃球運動員的圖像也被聚類在一起。

查找與輸入圖像相似的圖像

對於查找相似單詞的任務,我們受限於在測試集辭彙表中尋找相似的單詞(如果測試集中不存在某個單詞,我們的圖說解碼器就不會學習該單詞的嵌入)。然而,對於類似的圖像任務,我們有一個圖像表示生成器,它可以接收任何輸入圖像並生成其編碼。

這意味著我們可以使用餘弦相似度的方法來構建一個按圖像搜索的功能,如下所示:

步驟 1:獲取資料庫或目標文件夾中的所有圖像,並存儲它們的表示(表示由圖像解碼器給出);

步驟 2:當用戶希望搜索與已有圖像最相似的圖像時,可以輸入新圖像的表示,並在資料庫中找到與之最接近的圖像(資料庫由余弦相似度給出)。

谷歌圖像就可能會正式使用這種(或類似的)方法來支持其反向圖像搜索功能。

讓我們看看這個網路是如何工作的。我點擊了下面這張我在 Goa 度假時拍的照片。(PS:我愛 Goa!)

四個任務就要四個模型?現在單個神經網路模型就夠了!

注意,這張圖片是我自己的,而我們使用的模型此前從未見過這張圖片。當我查詢類似的圖像時,網路從Flickr8K 數據集中輸出如下圖像:

四個任務就要四個模型?現在單個神經網路模型就夠了!

是不是很像?我沒想到該模型會有這麼好的表現,但它確實做到了!深度神經網路簡直太棒了!(https://www.youtube.com/watch?v=Y-WgVcWQYs4)

第四部分:通過描述來搜索圖片

在最後一部分中,我們將反向運行圖說生成器。因此,我們不是獲取圖像並為其生成圖說,而是輸入圖說(文本描述)來找到與之最匹配的圖像。

聽起來好得令人難以置信?當然可以相信!我們是這樣做的:

  • 步驟 1:首先輸入的是一個完全隨機的 300 維張量,而不是一個來自編碼器的 300 維圖像表示;

  • 步驟 2:凍結整個網路的所有層(例如引導 PyTorch 不要對梯度進行計算);

  • 步驟 3:假設隨機生成的輸入張量來自圖像編碼器,將其輸入到圖說解碼器中;

  • 步驟 4:獲取給定隨機輸入時網路生成的圖說,並將其與用戶提供的圖說進行比較;

  • 步驟 5:比較生成的圖說和用戶提供的圖說,並對二者存在損失進行計算;

  • 步驟 6:為輸入張量找到梯度,使損失最小化(例如,在哪個方向以及 300 維數中的每個數值應該改變多少,從而使得在將張量輸入到圖說解碼器時,圖說與用戶提供的圖說接近);

  • 步驟 7:根據梯度改變輸入張量的方向(學習率所給定的一小步);

  • 繼續步驟 4 到步驟 7,直到收斂或當損失低於某個閾值時為止

  • 最後一步:取最終的輸入張量,並利用它的值,通過餘弦相似度找到離它最近的圖像(以 300 維表示的步速);

通過這樣做,我們得到的結果相當神奇:

我搜索了「一隻狗」,這是網路找到的圖像:

四個任務就要四個模型?現在單個神經網路模型就夠了!

搜索「一個微笑的男孩」:

四個任務就要四個模型?現在單個神經網路模型就夠了!

最後,當我搜索:

前兩個結果是:

四個任務就要四個模型?現在單個神經網路模型就夠了!

以及

四個任務就要四個模型?現在單個神經網路模型就夠了!

這可真是讓人大開眼界,不是嗎?

總結和挑戰

提醒一下,大家可以從我的 Github 存儲庫(https://github.com/paraschopra/one-network-many-uses)中下載完成所有這些操作的代碼。這個存儲庫包括了用於數據預處理、模型描述、預訓練的圖說生成網路、可視化的代碼,但不包括 Flickr8K 數據集或圖說——這些需要單獨下載(https://forms.illinois.edu/sec/1713398)。

希望你喜歡這篇文章。如果你想進行更深入的實操,這裡有一個挑戰:基於給定的描述生成圖像。這就好比是由一個隨機的起點來生成一個與用戶提供的圖說匹配的 300 維圖像表示一樣,但是你可以更進一步,從零開始為用戶提供的圖說生成一個圖像嗎?

這比本文中的操作要難 10 倍,但我感覺這是可行的。如果有這樣一個服務,它不僅可以搜索與文本對應的圖像,而且能夠動態生成圖像,那該有多酷啊!

在未來,如果谷歌圖像實現了這個功能,並能夠為不存在的圖像提供結果(比如「兩隻獨角獸在披薩做成的地毯上飛翔」),我都不會感到驚訝。

就這樣。我希望你能夠在「表示」的世界安然而快樂地遨遊。

via :https://towardsdatascience.com/one-neural-network-many-uses-image-captioning-image-search-similar-image-and-words-in-one-model-1e22080ce73d雷鋒網 AI 科技評論 編譯

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 雷鋒網 的精彩文章:

專訪普渡科技:深耕餐飲業務,充分發掘送餐機器人的商業價值
小米9來了,雷軍:這是最後一次定3000以內!

TAG:雷鋒網 |