Multimodal —— 看圖說話(Image Caption)任務的論文筆記(一)評價指標和NIC模型


      看圖說話(Image Caption)任務是結合CV和NLP兩個領域的一種比較綜合的任務,Image Caption模型的輸入是一幅圖像,輸出是對該幅圖像進行描述的一段文字。這項任務要求模型可以識別圖片中的物體、理解物體間的關系,並用一句自然語言表達出來。

      應用場景:比如說用戶在拍了一張照片后,利用Image Caption技術可以為其匹配合適的文字,方便以后檢索或省去用戶手動配字;此外它還可以幫助視覺障礙者去理解圖像內容。類似的任務還有Video Caption,輸入是一段視頻,輸出是對視頻的描述。

(一)任務描述

      目前來說,Image Caption任務主要集中在英文上,數據集包括微軟的COCO(CodaLab組織了一個排行榜;本地評測在這里)、Flickr8k、Flickr30k和SBU等。下圖是 [1] 給出的統計信息,其中除了SBU外,每個圖片都有5個人工參考描述,並且SBU來自用戶上傳時所配,噪聲較大。

此外,今年ACL上出現了日文的數據集

      根據 [1] ,將理解圖片和生成描述這兩個子任務統一到一起的話,那么Image Caption任務的訓練過程可以描述為這個形式:對於訓練集的一張圖片 $I$ ,其對應的描述為序列 $S=\{S_1,S_2,...\}$(其中 $S_i$ 代表句子中的詞)。對於模型 $\theta$ ,給定輸入圖片$I$ ,模型生成序列 $S$ 的概率為

$$P(S|I;\theta)=\prod_{t=0}^NP(S_t|S_0,S_1,...,S_{t-1},I;\theta)$$

      拆解成連乘的形式后,問題就變成了建模條件概率 $P(S_t|S_0,S_1,...,S_{t-1},I;\theta)$ 。通常來說,RNN是當仁不讓的第一選擇,因為理論上它可以保留全部上文信息(對於“長時依賴”問題,使用LSTM來緩解),而不像 n-gram 或者 CNN 那樣只能取一個窗口。

      將似然函數取對數,得到對數似然函數:

$$\log P(S|I;\theta)=\sum_{t=0}^N\log P(S_t|S_0,S_1,...,S_{t-1},I;\theta)$$

模型的訓練目標就是最大化全部訓練樣本的對數似然之和:

$$\theta^*=\arg\max_{\theta}\sum_{(I,S)}\log P(S|I;\theta)$$

式中 $(I,S)$ 為訓練樣本。這種極大似然估計的方式等價於使用對數損失函數的經驗風險最小化。

      訓練好模型后,對於生成過程,則是根據輸入的一張圖片 $I$ ,推斷出最可能的序列來輸出:

$$\arg\max_{S}P(S|I;\theta^*)$$

當然,計算全部序列的概率然后選出概率最大的序列當然是不可行的,因為每個位置都有詞表規模的詞作為候選,搜索規模會隨序列的長度而指數級增長,所以需要用beam search來縮小搜索空間。

      看到這,想到了什么?是不是機器翻譯,自動摘要,encoder-decoder……

(二)評價指標

      ok,下面說一下自動評價方法的評價指標。在2015年COCO比賽的排行榜上(C40的意思是每張測試集的圖片有40個人工給出的參考caption),可以看到常用的指標是BLEUMeteorROUGECIDErSPICE。前兩個是評測機器翻譯的,第三個是評測自動摘要的,最后兩個應該是為caption定制的。下面簡單介紹一下前四個。

      對於英文來說,模型生成的caption和人工給出的參考caption都經過了預處理:詞條化(tokenization),去除標點。一般來說,評價生成的序列與參考序列的差異時,都是基於 n-gram 的,進而考察局部性質而非只考察單個詞。另外,COCO官方提到 n-gram 中的詞沒有經過詞干還原(stemming,啟發式地去掉單詞兩端詞綴)這個步驟。

      1. BLEU(BiLingual Evaluation Understudy

      BLEU是事實上的機器翻譯評測標准,n 常取1到4,基於准確率(precision)的評測。我們首先看一下它在機器翻譯里是怎么做的。以下內容參考自 [6] :

      需要明確,在機器翻譯中,翻譯的評測是以句子為單位的

      (1) 首先來看一個最簡單的思路:對於一個源語言句子,計算模型生成的譯文中的 n-gram 的個數,然后再計算這些 n-gram 中有多少是同時出現在了參考譯文(不止一句)中,從而計算出一個百分比來作為 precision 。

      但這樣的做法存在一些問題:比如說參考句子1是“the cat is on the mat”,參考句子2是“there is a cat on the mat”,而模型生成的句子是“the the the the the the the”,那么按照上述定義,考察 n=1 的情況,也就是unigram,模型生成的句子包含7個 unigram ,這7個 unigram 全部出現在了參考句子集合中,所以將得到 7/7 這樣的滿分,但是這樣的譯文顯然沒有意義。為了獲得較高的指標,模型完全可以在任何位置都去生成一個“百搭”的詞,使得分子隨着分母的增長而增長。

      (2) 為了解決“百搭”詞的問題,需要修正 precision 的計算方式。考慮模型生成的句子 $c$ 的全部 n-gram ,考察其中的任一 n-gram :首先計算其在 $c$ 中出現的次數 $Count(n\text{-gram})$ ;然后統計其在各參考句子中分別出現的次數的最大值,將該值與 $Count(n\text{-gram})$ 的較小者記作該 n-gram 的匹配次數 $Count_{\text{clip}}(n\text{-gram})$ 。之后,再把每個 n-gram 的計算結果累加起來,得到句子的結果。所以precision可以用如下方式計算:

$$p_n=\frac{\displaystyle\sum_{c\in\{\text{Candidates}\}}\sum_{n\text{-gram}\in c}Count_{\text{clip}}(n\text{-gram})}{\displaystyle\sum_{c\in\{\text{Candidates}\}}\sum_{n\text{-gram}\in c}Count(n\text{-gram})}$$

式中 $\{\text{Candidates}\}$ 代表需要評測的多句譯文的集合。當n取1時,$\displaystyle\sum_{n\text{-gram}\in c}Count(n\text{-gram})$ 就是句子 $c$ 的長度。

      回過頭來看上面那個例子,譯文句子的 unigram 只有“the”,它在譯文中出現了7次,故 $Count(\text{the})=7$;在參考句子1中出現2次,參考句子2中出現1次,最大值為2,所以“the”的匹配次數為  $Count_{\text{clip}}(\text{the})=\min\{7, 2\}=2$ ,因此precision為 2/7 。

      (3) 但是這樣的計算方式仍然存在問題:比如模型生成的句子是“the cat is on”,那么從 n 不論取1、2、3還是4,得分都是1,滿分。換言之,由於評價的是precision,所以會傾向於短句子,如果模型只翻譯最有把握的片段,那么就可以得到高分,因此要對短句子進行懲罰

      懲罰的方式就是在原先的評價指標值上乘一個懲罰因子(brevity penalty factor):當模型給出的譯文句子 $c$ 的長度 $l_c$ 要比參考句子的長度 $l_s$ 長時,就不進行懲罰,即懲罰因子為1,比如說有三個參考句子的長度分別為12、15、17,模型給出的譯文句子長度為12,那么就不進行懲罰,比較的是各參考句子長度里最接近的那個;否則就懲罰:

$$BP=\begin{cases}1, & l_C>l_S;\\\exp(1-\dfrac{l_S}{l_C}), & l_C\leq l_S\end{cases}$$

式中的 $l_C$ 代表模型給出的測試集全部句子譯文的長度總和,$l_S$ 代表與模型給出譯文句子長度最接近的參考譯文的長度(語料級別)。

      綜合起來,BLEU的評分公式采用的是對數加權平均值(這是因為當n增大時評分會指數級減小),再乘上懲罰因子:

$$BLEU@N=BP\cdot \exp(\sum_{n=1}^Nw_n\log p_n)$$

式中的 N 通常取4,權重 $w_n$ 通常取 $\dfrac1N$(幾何平均)。最終評分在0到1之間,1表示完全與人工翻譯一致。

      BLEU的優點是它考慮的粒度是 n-gram 而不是詞,考慮了更長的匹配信息;BLEU的缺點是不管什么樣的 n-gram 被匹配上了,都會被同等對待。比如說動詞匹配上的重要性從直覺上講應該是大於冠詞的。

      (4) 在caption任務中,處理方式和機器翻譯是一樣的:多張圖片就相當於翻譯里的多個源語言句子。為了描述清楚還是給一下公式:

      對於測試集的一張圖片 $I_i$ ,模型生成的caption記為 $c_i\in C$( $C$ 是全部 $c_i$ 構成的集合),且將任一 n-gram 記作 $\omega_k$ ;人工給出的參考caption的集合為 $S_i=\{s_{i1},s_{i2},...,s_{im}\}\in S$( $S$ 是全部 $S_i$ 構成的集合),$s_{ij}$ 為句子,$m$ 為參考caption的數量(數據集里的一張圖片通常會有多個參考caption,比如Flickr、COCO數據集上每張圖片都有5個參考caption)。將某個 n-gram $\omega_k$ 出現在句子 $c_i$ 中的次數記作 $h_k(c_i)$ ,類似地,可定義 $h_k(s_{ij})$ 。

      在整個測試集上,precision值為

$$p_n(C,S)=\frac{\displaystyle\sum_i\sum_k\min\{h_k(c_i),\max_{j\leq m}h_k(s_{ij})\}}{\displaystyle\sum_i\sum_kh_k(c_i)}$$

懲罰因子的值為

$$BP(C,S)=\begin{cases}1, & l_C>l_S;\\\exp(1-\dfrac{l_S}{l_C}), & l_C\leq l_S\end{cases}$$

所以BLEU@N的值為

$$BLEU@N(C,S)=BP(C,S)\cdot \exp(\sum_{n=1}^Nw_n\log p_n(C,S))$$

      2. ROUGE

      ROUGE是出於召回率來計算,所以是自動摘要任務的評價標准。詳情可見之前寫過的一篇關於摘要的博客

      3. Meteor

      以下內容參考自 [6] :

      Meteor也是來評測機器翻譯的,對模型給出的譯文與參考譯文進行詞對齊,計算詞匯完全匹配、詞干匹配和同義詞匹配等各種情況的准確率、召回率和F值。

      首先計算 unigram 情況下的准確率 P 和召回率 R(計算方式與BLEU、ROUGE類似),得到調和均值(F值)

$$F=\frac{(\alpha^2+1)P}{R+\alpha P}$$

如果 $\alpha>1$ 就說明 R 的權重高。看到這可能還沒有什么特別的。

      Meteor的特別之處在於,它不希望生成很“碎”的譯文比如參考譯文是“A B C D”,模型給出的譯文是“B A D C”,雖然每個 unigram 都對應上了,但是會受到很嚴重的懲罰。懲罰因子的計算方式為

$$Penalty=\gamma (\frac{\#chunks}{\#unigrams\_matched})^{\theta}$$

式中的 $\#chunks$ 表示匹配上的語塊個數,如果模型生成的譯文很碎的話,語塊個數會非常多;$\#unigrams\_matched$ 表示匹配上的 unigram 個數。所以最終的評分為

$$Meteor=(1-Penalty)\cdot F$$

用於機器翻譯評測時,通常取 $\alpha=3$ 、$\gamma=0.5$ 和 $\theta=3$ 。

      4. CIDEr(Consensus-based image description evaluation)

      這個指標將每個句子都看作“文檔”,將其表示成 tf-idf 向量的形式,然后計算參考caption與模型生成的caption的余弦相似度,作為打分。換句話講,就是向量空間模型。考慮一張圖片 $I_i\in I$( $I$ 是全部測試集圖片的集合):

      對於一個 n-gram $\omega_k$ 和參考caption $s_{ij}$ ,tf-idf 計算方式為

$$g_k(s_{ij})=\frac{h_k(s_{ij})}{\displaystyle\sum_{\omega_l\in\Omega} h_l(s_{ij})}\log\biggl(\frac{|I|}{\displaystyle\sum_{I_p\in I}\min\{1,\sum_qh_k(s_{pq})\}}\biggr)$$

式中的 $\Omega$ 是全部 n-gram 構成的詞表。可以看出 idf 的分母部分代表的是 $\omega_k$ 出現於參考caption的圖片個數。

      那么,CIDEr的值可以用余弦相似度的平均值來計算:

$$CIDEr_n(c_i,S_i)=\frac1m\sum_j\frac{\boldsymbol{g^n}(c_i)^{\top}\boldsymbol{g^n}(s_{ij})}{||\boldsymbol{g^n}(c_i)||\cdot ||\boldsymbol{g^n}(s_{ij})||}$$

類似於BLEU的做法:

$$CIDEr(c_i,S_i)=\sum_{n=1}^Nw_nCIDEr_n(c_i,S_i)$$

      這個指標的motivation之一是剛才提到的BLEU的一個缺點,就是對所有匹配上的詞都同等對待,而實際上有些詞應該更加重要。

(三)NIC(Neural Image Caption)模型論文筆記

      泛讀了幾篇論文,這是第一篇,也是很簡單的一篇:

      [1] NICv2模型:Show and Tell: Lessons learned from the 2015 MSCOCO Image Captioning Challenge

      這篇文章的原版是2015年CVPR的那篇show and tell,NIC模型。這篇增加了一些內容,講了相比於原先的模型都做了哪些改進,進而取得了2015年COCO比賽的第一名。

      0. 模型結構

      NIC模型的結構非常“簡單”:就是利用encoder-decoder框架,首先利用CNN(這里是GoogLeNet)作為encoder,將 Softmax 之前的那一層固定維數的向量作為圖像特征;再使用LSTM作為decoder,其中圖像特征輸入decoder(圖像特征僅在開始時刻輸入,后面就沒用了)。模型的訓練就是和任務描述那里介紹的一樣,使用最大化對數似然來訓練,然后在測試階段采用beam search來減小搜索空間。

      需要注意的是,這個結構與傳統的encoder-decoder有點區別。引用我在 seq2seq 做自動摘要的那篇博客的一張slides:

      可以看出,NIC 模型僅在decoder的開始時刻輸入了圖像特征,而不是在每個解碼時刻都輸入了圖像特征。作者給出的理由是,如果在每個時刻都輸入圖像特征,那么模型會把圖像的噪聲放大,並且容易過擬合。實際上,后面的一些文章在基於attention來做caption,那么就必然要每個時刻都輸入。因此本文的模型是非常簡單的。

      另外多提一點,文章中提到了一個baseline:Multimodal Recurrent Neural Networks (m-RNN),這個是 Baidu Research 在14年10月的一個工作(發表在NIPS的workshop,也就是 [2] ),后來還有一個版本(15年ICLR的版本,也就是 [3] ),是比較早期的用深度學習架構來做 Image Caption 任務的工作。

      從這兩大類序列to序列的任務上不難發現encoder-decoder的優點:非常靈活,不限制輸入和輸出的模態,也不限制兩個網絡的類型;encoder-decoder的缺點:當輸入端是文本時,將變長序列表達為固定維數向量,存在信息損失,並且目前還不能處理太長的文本。

      1. 訓練細節

      在訓練過程中,固定學習率且不加動量(momentum);詞條化后去掉了詞頻小於5的詞;在ImageNet上預訓練GoogLeNet,並且在訓練caption模型時這部分的參數保持不變;在大型新聞語料上預訓練詞向量,但是效果並沒有明顯提升;使用dropout和模型ensemble,並權衡模型的容量:隱層單元個數與網絡深度;512維詞向量;使用困惑度(perplexity)來指導調參。

      個人覺得,這種簡單粗暴的模型結構,參數的設置真的太重要了。

      2. 自動評價與人工評價

      作者在論文中多次強調,需要更好的自動評價計算方式。因為以自動評價指標來評測的話,模型的評測結果在很多時候要比人寫的caption的評測結果還要好,但人工評價的結果顯示,實際上模型的caption相比於人寫的caption還有很大差距。

      3. 遷移學習與數據標注的質量

      一個很容易想到的問題是,是否可以把在某個數據集下訓練的模型遷移到另一數據集?高質量的標注數據和更多的數據可以補償多少領域錯配問題?

      首先來看遷移學習的問題,作者首先指出,在Flickr8k和Flick30k這兩個數據集上,如果用Flickr30k來訓練,效果會提升4個BLEU,更大量的數據帶來了更好的效果,凸顯data-driven的價值。但是如果用COCO做訓練,盡管數據量五倍於Flickr30k,但由於收集過程不統一,帶來了詞表的差別以及較大的領域錯配,效果下降了10個BLEU。PASCAL數據集沒有提供訓練集,使用COCO訓練的效果要比使用Flickr30k的效果要好。

      然后再看標注質量的問題。此前已經提到過,SBU數據集的噪聲較大,所以可以看作是“弱標注”的(weak labeling),但盡管如此,如果使用COCO來訓練,效果依舊會下降。

      4. 生成的caption是否具備多樣性

      作者探討了模型生成的描述是否有新穎性,是否同時具備多樣性和高質量。

      首先來看多樣性(diversity)。作者挑了測試集里的三個圖片的caption,每張圖片都有模型生成的3-best描述(加粗的是沒在訓練集中出現過的),可以看出這些描述可以展現圖像的不同方面,因此作者認為該模型生成的caption具備多樣性。

      再來看質量。如果只考慮模型生成的最佳候選caption,那么它們中的80%在訓練集中出現過;如果考慮top15,則有一半是完全新的描述,但仍然具備相似的BLEU分,因此作者認為該模型生成的caption兼具了多樣性和高質量。

      5. NIC模型的改進:NICv2

      作者列舉了使他們成為2015COCO比賽第一名的幾點重要改進。

      (1)Batch Normalization:在encoder的GoogLeNet中引入了Batch Normalization

      (2)encoder端的fine-tuning

      剛才提到,encoder端的CNN在預訓練后,是不參與caption模型的訓練的,其參數值是保持不變的。而這里他們進行了微調:首先固定encoder的參數,訓練500k步decoder,以得到一個不錯的LSTM;然后encoder和decoder聯合訓練100k步。作者特別強調,CNN不能陪着LSTM一起從頭開始就聯合訓練,而必須在LSTM已經不錯的情況下再進行聯合訓練,否則預訓練的CNN也會被“帶跑”。另外,作者說使用K20單機訓練了超過三周,而並行訓練時會使效果變差。

      CNN的fine-tuning帶來的效果是,一些例子可以正確描述顏色。作者認為,在ImageNet預訓練的過程,使得“顏色”這樣的和分類無關的特征被拋棄了。

      (3)RNN的訓練使用Scheduled Sampling:對應於2015NIPS的文章,RNN的訓練trick

      對於 Image Caption 和 Machine Translation 等一系列生成變長序列的任務,RNN的訓練和測試過程其實存在不統一的地方:訓練時,對於輸入 I 和目標序列 S 構成的樣本 (I, S) ,目標是最大化似然函數 P(S|I) ,進而 train 出來模型的參數。我們知道,似然函數是被拆解成條件概率的連乘形式,而每個詞的條件概率求解過程中,RNN接受的輸入信息包括上一時刻的隱狀態、encoder的編碼向量以及上一時刻的詞。

      問題就出在,“上一時刻的詞”在訓練過程中是被指定為目標序列 S 中的詞的,也就是說它是“正確的”;而在測試時,“正確的”上一時刻目標詞是不知道的,取而代之的是由模型生成的詞(雖然仍然是Softmax計算出詞表中概率最大的那個詞,但是訓練過程會使模型去彌合Softmax計算的詞與正確的詞之間的loss;而測試過程就真的只是生成一個詞之后就不管了,因為沒有監督信號),這就帶來了訓練和測試的不統一(discrepancy)。如果測試過程中的某個時刻生成了錯誤的詞,那么這個錯誤會被快速放大,因為生成的這段序列很有可能沒在訓練過程中出現過。

      在我看來,測試過程中使用softmax來取概率最大的詞(並結合 beam search )已經是很“正確”的做法了。作者在RNN的訓練過程中做一些變化:Scheduled Sampling就是指RNN在訓練時會隨機使用模型真實輸出來作為下一個時刻的輸入,而不像原先那樣只會使用目標詞來作為下一時刻的輸入。作者認為,這種方式可以強迫模型在訓練過程中“學會”如何處理錯誤。

      我認為這和 negative sampling 策略(如 word2vec 等模型所采用的加速訓練策略,NCE 的簡化版本)正好相反,因為在負采樣中,訓練過程中構造的負樣本的似然是要最小化的,而在這里卻作為了強迫模型在訓練過程中學習到新知識的一種方式,但是從“錯誤”的樣本里能學出來什么呢?

      關於各種改進的RNN訓練方法的比較,可以參考這篇文章

      (4)模型ensemble:改變一些訓練條件,訓練出多個模型。作者訓練了5個Scheduled Sampling模型和10個fine-tuning CNN模型。

      (5)減小beam search的候選結果個數(k)

      在NIC模型中,作者只取了1和20兩個值。在改進過程中,發現k取3是最好的搜索規模。按道理說,k越大應該越好,但實際上是較小的k取得了最好的結果,說明目標函數與人工的標准不匹配,或者模型過擬合;作者同時發現,減少k可以提升新穎性(生成的caption出現在訓練集的比例從80%降到了60%),所以認為模型是過擬合了。這樣的話,減少k可以視作一種正則化。

      6. 展望

      作者提到,一個方向是希望模型能夠給出有針對性的描述,例如根據用戶提問來給出caption,這就成了一種VQA任務;另外一個就是需要更好的自動評價指標。

      最后給出例子欣賞一下~~

 

      

 

參考:

[1] Show and Tell: Lessons learned from the 2015 MSCOCO Image Captioning Challenge(前一個版本在2015CVPR)

[2] Explain Images with Multimodal Recurrent Neural Networks 

[3] Deep Captioning with Multimodal Recurrent Neural Networks (m-RNN)

[4] Deep Visual-Semantic Alignments for Generating Image Descriptions

[5] 深度學習之Neural Image Caption

[6] 統計自然語言處理

[7] 由RNN的Discrepancy現象聯想到深度學習與GAN

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM