「Show and Tell」——圖像標註(Image Caption)任務技術綜述

所謂Image Caption,就是從圖片中自動生成一段描述性文字,有點類似於我們小時候做過的「看圖說話」,十分有趣。對於人來說,Image Caption是簡單而自然的一件事,但對於機器來說,這項任務卻充滿了挑戰性。原因在於機器不僅要能檢測出圖像中的物體,而且要理解物體之間的相互關係,最後還要用合理的語言表達出來。

隨著深度學習技術的發展和COCO等圖像標註數據集的出現,Image Caption相關的技術得到了快速的發展。本文就在這個領域中,選擇了最具代表性的幾篇論文進行講解。在講解的過程中會盡量注意論文間的發展和聯繫。

1. 從Encoder-Decoder結構談起

在介紹Image Caption相關的技術前,有必要先來複習一下RNN的Encoder-Decoder結構。我們知道,在最原始的RNN結構中,輸入序列和輸出序列必須是嚴格等長的。但在機器翻譯等任務中,源語言句子的長度和目標語言句子的長度往往不同,因此我們需要將原始序列映射為一個不同長度的序列。Encoder-Decoder模型就解決了這樣一個長度不一致的映射問題,它的結構如下圖所示:

w_{1},w_{2},w_{3}	ext{...}w_{n} 是輸入的單詞序列,而 y_{1},y_{2},...y_{m} 為輸出的單詞序列,每個 w_{i}y_{i} 都是已經經過獨熱編碼的單詞,因此它們都是1xD的向量,其中D為程序中使用的單詞表的長度。RNN的隱層狀態(hidden state)用 h_{1},h_{2},h_{3}	ext{...}h_{n} 表示。在實際應用中,我們往往不是把獨熱編碼的 w_{1},w_{2},w_{3}	ext{...}w_{n} 輸入RNN,而是將其轉換為對應的word embedding的形式,即圖中的 x_{1},x_{2},x_{3}	ext{...}x_{n} ,再輸入RNN網路。在Encoder部分,RNN將所有的輸入「編碼」成一個固定的向量表示,即最後一個隱層狀態 h_{n} , 我們就認為這個h_{n} 包含了原始輸入中所有有效的信息,,Decoder在每一步都會利用 h_{n} 這個信息,進行「解碼」,並輸出合適的單詞序列 y_{1},y_{2},...y_{m} 。這樣,我們就完成了不同長度序列之間的轉換工作。

Encoder-Decoder結構最初是在論文《Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation》中提出並應用到機器翻譯系統中的。有興趣的同學可以參考原始論文了解其細節,這裡我們還是回到Image Caption任務中來,看看如何把Encoder-Decoder結構用到Image Caption上。

2. Show and Tell: A Neural Image Caption Generator

在機器翻譯任務中,輸入輸出都是單詞序列,現在換一下,在Image Caption任務中,輸入是圖像,輸出是單詞序列,應該怎麼建模呢?其實很簡單,我們只需要將原來的Encoder RNN換成圖像中使用的CNN結構,為圖像提取一個「視覺特徵」I,然後還是使用Decoder將這個I解碼為輸出序列就可以了,這就是論文《Show and Tell: A Neural Image Caption Generator》中的想法。

這篇論文算是做Image Caption任務早期的開山之作,它只把Encoder-Decoder結構做了簡單修改,就在Image Caption任務上取得了較好的結果,下圖是這篇論文中網路的具體結構。先看提取圖像特徵的CNN部分,由於這篇論文是谷歌出品的,因此這部分就使用了自家的Inception模型。再看Decoder部分,將RNN換成了性能更好的LSTM,輸入還是word embedding,每步的輸出是單詞表中所有單詞的概率,這些都是標準做法了,就不再贅述。

這篇論文為Image Caption任務提供了一種統一的思路,下面我們會連著介紹三篇論文,都是在這篇論文基礎上的改進。

3. Show, Attend and Tell: Neural Image Caption Generation with Visual Attention

在Encoder-Decoder結構中,Encoder把所有的輸入序列都編碼成一個統一的語義特徵 h_{n} 再解碼,因此, h_{n} 中必須包含原始句子中的所有信息,它的長度就成了限制模型性能的瓶頸。對於短句來說還好,但當句子較長時,一個 h_{n} 可能存不下那麼多信息,就會造成翻譯精度的下降。對此,論文《Neural machine translation by jointly learning to align and translate》提出了一種Attention機制,不再使用統一的語義特徵,而讓Decoder在輸入序列中自由選取需要的特徵,大大提高了Encoder-Decoder的模型性能。

在Image Caption任務中,我們同樣可以利用Attention機制對原來的Encoder-Decoder機制進行改進,對應的論文就是這篇《Show, Attend and Tell: Neural Image Caption Generation with Visual Attention》了。顯然這篇文章的標題山寨了我們之前提到的「Show and Tell」,將之改為「Show, Attend and Tell」,意即加入了Attention機制。

具體怎麼來做呢?之前是用CNN提取了固定長度的向量特徵I,實際上,我們可以利用CNN的空間特性,使用卷積層的feature map,給圖片的不同位置都提取一個特徵。舉例來說,用 a = { a_{1},a_{2},...,a_{L}},a_{i} in R^{D} 表示我們提取的圖片特徵,一共 L 個位置,每個位置的特徵為一個 D 維的向量,對於一個高、寬為14,通道數為256的feature map,對應的 L = 14 	imes 14 = 196 , D=256

有了這些位置的特徵,我們再讓Decoder在解碼時擁有在這196個位置特徵中選擇的能力,這就是Attention機制。設在第t階段(通俗的講,就是生成第t個單詞時)傳入Decoder RNN的上下文向量為 z_{t} ,RNN前一階段的隱層狀態為 h_{t - 1} 。這個上下文向量 z_{t} 就是 a = { a_{1},a_{2},...,a_{L}} 的一個加權平均,具體地, z_{t}a = { a_{1},a_{2},...,a_{L}} 的關係用下面的式子表達:

z_{t} = sum_{i = 1}^{L}{alpha_{t,i}a_{i}}

alpha_{t,i} 就是衡量生成第t個單詞時,第i個位置的圖像特徵所佔的權重。這個權重實際是前一個隱層狀態 h_{t - 1} 和第i個位置圖像特徵 a_{i} 的函數。具體的表達式為:

e_{	ext{ti}} = f_{	ext{att}}(a_{i},h_{t - 1})

alpha_{t,i} = frac{exp(e_{	ext{ti}})}{sum_{k = 1}^{L}exp(e_{	ext{tk}})}

由於 alpha_{t,i} 只和已有的信息 h_{t - 1}, a_{i} 有關,因此這些參數也是可以從數據中進行端到端的自動學習的。

值得一提的是,這個論文實際介紹了兩種Attention機制,一種叫HardAttention,一種叫Soft Attention,我們這裡只講了標準的Soft Attention,Hard Attention比Soft Attention更有難度,限於篇幅原因不再展開介紹。實驗證明,無論是使用Hard Attention還是Soft Attention,都提高了原始模型的性能。

另外,由於使用了Attention機制,我們可以根據權重係數 alpha_{t,i} 的大小,得知在生成每個詞時模型關注到了圖片的哪個區域。下圖展示了一些例子,每個句子都是模型自動生成的,在圖片中用白色高亮標註了生成下劃線單詞時模型關注的區域:

4. What Value Do Explicit High Level Concepts Have in Vision to Language Problems?

除了使用Attention的機制改善Encoder-Decoder結構外,這篇文章又提供了另外一種改進原始模型的方式,即使用高層語義特徵。

在前兩篇論文中,都是使用CNN在做最終分類之前的卷積特徵作為「圖像語義」,但這篇文章認為,CNN在最終的分類層包含了大量諸如「圖中有無人」、「圖中有無桌子」這樣的高層信息。這種高層語義與最終生成的語句非常相關,不能輕易捨棄。

實際做法中,作者把這個高層語義理解為一個多標籤分類問題。在Image Caption任務中,需要知道圖片裡面有哪些物體,由於一張圖片中的物體數目會有很多,因此圖片和物體標籤就是一個一對多的關係,而不是通常的一對一的關係。為此,我們需要對原先的CNN結構做出適當調整。在通常的一對一關係中,我們在卷積特徵後使用一個softmax即可,而在一對多關係中,假設我們要找出c類物體,那麼就分別使用c個softmax層。設第i張圖片的標籤 y_{i} = { y_{i1},y_{i2},...,y_{	ext{ic}}} 。其中每個 y_{	ext{ij}} 要麼是0,要麼是1,1表示該圖片具有標籤j(如圖中有人),0表示該圖片不具有標籤j。又設c個softmax層的輸出各個標籤的概率 p_{i} = { p_{i1},p_{i2},...,p_{	ext{ic}}} ,那麼最終的損失就是:

J = frac{1}{N}sum_{i = 1}^{N}{sum_{j = 1}^{c}l}og(1 + exp( - y_{	ext{ij}}p_{	ext{ij}}))

在訓練時,首先在所有描述中提取出現最頻繁的c個單詞作為總標籤數,每個圖像的訓練數據直接從其描述單詞中取得。訓練完成後,就可以針對每張圖片提取高層的語義表達向量 V_{	ext{att}}(I) (如下圖所示)。簡單來說,這個高層語義向量 V_{	ext{att}}(I) 實際就表示圖像中出現了哪些物體。

得到 V_{	ext{att}}(I) 後,就直接將其送入Decoder進行解碼。Decoder的結構和最初的那篇論文中的結構完全一致。如在下圖中,藍色的線就是之前直接使用的卷積特徵 CNN(I) ,而紅色線就是這篇文章提出的 V_{	ext{att}}(I)實驗證明,使用 V_{	ext{att}}(I) 代替 CNN(I) 可以大幅提高模型效果。

5. Mind』s Eye: A Recurrent Visual Representation for Image Caption Generation

之前的兩篇論文,《Show, Attend and Tell: Neural Image Caption Generation with Visual Attention》以及《What Value Do Explicit High Level Concepts Have in Vision to Language Problems?》,一個是給RNN加上了Attention結構,一個是改進了CNN提取的特徵,都是比較好理解的。而這篇文章比較fancy,較多地改動了Decoder部分RNN的本身的結構,使得RNN網路不僅能將圖像特徵翻譯為文字,還能反過來從文字得到圖像特徵,此外還順帶提高了性能,我們一起來看下是怎麼做的。

下圖就是這篇文章中使用的Decoder RNN。 v 表示圖像特徵, s_{t} 表示第t階段RNN的隱層狀態,而 w_{t} 是第t階段生成的單詞。 v,s_{t},w_{t} 這三個量都是之前的模型中存在的,而作者又再這些量的基礎上加入了 u_{t}	ilde{v} 。其中 u_{t} 表示的是「已經生成的文字」的隱變數,作用是記住已經生成單詞中包含的信息。這個量在每次生成 w_{t} 時都會使用到,作為給模型的提示。此外,作者還要求在每個階段都可以使用 u_{t} 去還原視覺信息 v ,通過 u_{t} 計算的視覺信息就是 	ilde{v} ,在訓練儘可能要求 	ilde{v} approx v換句話說,我們已經生成的文字都要儘可能地去表達視覺信息,才能做到這樣的還原。

W_{t} = { w_{1},w_{2},...,w_{t}} ,表示在第t階段已經生成的所有t個單詞。 U_{t} = { u_{1},u_{2},...,u_{t}} 是已經生成的單詞表達信息的隱變數。這篇文章的核心就是,我們之前建模的都是 P(w_{t}|v,W_{t - 1},U_{t - 1}) ,即在圖像信息和已經生成單詞的條件下找尋下一個單詞的概率,而這篇文章建模的是 P(w_{t},v|W_{t - 1},U_{t - 1}) ,由於這是 w_{t},v 的聯合分布,因此我們不僅可以生成文字,還可以反過來利用文字生成圖像特徵。

如下圖,我們在生成文字的時候,不需要用到 	ilde{v} ,因此將其去掉即可:

在利用文字生成圖像特徵時,沒有下面的 vs_{t} ,同樣將之去除:

6. From Captions to Visual Concepts and Back

最後還有一篇不得不提到的《From Captions to Visual Concepts and Back》。這篇為微軟出品,是和第一篇谷歌的論文同時期的文章,它們都去參加了微軟的Image Caption比賽(MS COCO caption challenge),總的結果是並列第一(如下圖),在具體的小指標上各有上下,都是屬於開創性的工作。之所以放到最後講是因為它並不屬於Encoder-Decoder架構,而是採用傳統的語言建模方式。

在圖像特徵提取方面,這篇文章和《What Value Do Explicit High Level Concepts Have in Vision to Language Problems?》類似,都是從圖像中提取可能存在的單詞,再對語言進行建模。不同點在於,之前那篇文章採用的是多標籤學習的方式,而這篇文章採用的是多示例學習(Multiple Instance Learning)的方法,不僅可以從圖像中提取可能的單詞,而且可以把單詞對應到具體的圖像區域。

首先來簡單介紹下多示例學習。多示例學習實際是一種半監督演算法。考慮這樣一種訓練數據:我們有很多個數據包(bag),每個數據包中有很多個示例(instance)。我們只有對bag的正負類標記,而沒有對instance的正負例標記。當一個bag被標記為正時,這個包里一定有一個instance是正類,但也有可能其他instance是負類,當一個bag被標記為負類時,它裡面的所有instance一定是負類。我們的目標是訓練一個分類器,可以對instance的正負進行判別。

多示例學習在現實中其實很常見。如一篇文章違禁時通常是因為該文章具有某些違禁詞,但我們可能無法知道具體是哪個詞違禁。在這個例子中,bag就是文章,instance就是單詞。又如在醫學圖像領域,CT圖被標定為有無病症,而一個人有病症是因為在CT圖的某個區域被檢測為病灶區域。我們往往只有CT圖的標註,但沒有CT圖中每個區域的標註。這時,bag就是CT圖像,而instance就是CT圖中的小區域。

在這篇論文中,就是使用多示例學習來處理從圖片出提取單詞這一問題。對每一個單詞來說,標註中含有該單詞的圖片就是正例的bag,圖中的區域就是instance。由此,我們使用多示例學習方法進行兩步迭代,第一步是利用當前演算法,選出正例bag中最有可能是正例的instance、以及負例bag的instance,第二步是利用選出的instance進行訓練,更新訓練。這樣迭代下去,就可以對圖片的區域進行分類了。這樣我們就可以從圖片的區域中提取所需要的單詞(如下圖)。在實際操作的時候,使用的是一種針對目標檢測改進版的多示例學習方法Noisy-OR MIL,細節可以參考論文《Multiple instance boosting for object detection》。

在圖像中提取好單詞後,這篇文章就採用一種傳統的方法來進行語言建模。設在圖片中提取的單詞都放在一個集合 	ilde{V} 中,自動生成的圖片標註為 { w_{1},w_{2},w_{3}....} ,我們的目標就是去建模 P(w_{l}|w_{1},w_{2},w_{3},....w_{l - 1},	ilde{V_{l}}) ,其中 	ilde{V_{l}} subset 	ilde{V} ,表示生成第l個單詞時,還沒有使用的單詞。

建模 P(w_{l}|w_{1},w_{2},w_{3},....w_{l - 1},	ilde{V_{l}}) 的方法是使用一些特徵提取函數從 w_{l},w_{1},w_{2},w_{3},....w_{l - 1},	ilde{V_{l}} 這些單詞中提取一些特徵,如文中使用了 w_{i} 是否屬於 	ilde{V_{l}} 、n-Gram關係等特徵,每個特徵提取函數設為 f_{k} ,對每個要生成的單詞,就可以得到一個打分 sum_{k}^{}{lambda_{k}f_{k}(w_{l},w_{1},w_{2},w_{3},....w_{l - 1},	ilde{V_{l}})} ,最後使用softmax函數將這些打分轉換為概率即可。

7. 總結

本文選取了Image Caption領域中比較重要的5篇文章進行了介紹。第一篇論文首先使用了Encoder-Decoder結構對此問題進行建模,接下來三篇文章分別從不同的角度對第一篇論文做出了改進。最後介紹的論文並沒有採用Encoder-Decoder結構,而是採用傳統的方式對語言進行建模,也具有一定啟發意義。


推薦閱讀:

【專知薈萃16】主題模型Topic Model知識資料全集(基礎/進階/論文/綜述/代碼/專家,附PDF下載)
5分鐘教你如何布局人工智慧
美日巨型機器人已經運達決戰現場!希望誰贏呢?
AI晶元四大流派論劍,中國能否彎道超車?|半導體行業觀察
大家來預測一下吳恩達三個新項目之一deeplearning.ai之後,接下來的兩個項目將會是什麼項目?

TAG:人工智能 | 机器学习 | 深度学习DeepLearning |