初次接觸Captioning的問題,第一印象就是Andrej Karpathy好聰明。主要從他的兩篇文章開始入門,《Deep Fragment Embeddings for Bidirectional Image Sentence Mapping》和《Deep Visual-Semantic Alignments for Generating Image Descriptions》。基本上,第一篇文章看明白了,第二篇就容易了,研究思路其實是一樣的。但確實,第二個模型的功能更強大一些,因為可以生成description了。
Deep Fragment Embeddings for Bidirectional Image Sentence Mapping:
這篇論文發表在14年的NIPS上,主要解決的問題集中在retrieval的問題,沒有生成description。還是先介紹一下模型吧,以下這張圖其實可以完全概括了
輸入的數據集每一個樣例由一張圖片,五個manual句子描述。
對於句子的處理,主要是處理單詞之間的關系。類似於上圖右邊,解析出單詞之間的依賴關系,叫做triplet ,R就是關系,而w1,w2就是單詞的representation,是1-of-k的,通過以下的關系把triplet映射到一個非線性的空間,
s是h維的向量特征向量,f是一個激活函數,是對應的關系的矩陣,但它是需要學習的參數。
是通過訓練得到的固定的參數矩陣,至於怎么得到的,我沒有看過索引的論文,而源代碼讀入的數據直接使用了
,我就沒有仔細研究。激活函數論文里使用了ReLU,而公開的源代碼里提供了很多其他類型的函數,然而並沒有試跑過。那為什么需要激活函數呢?我猜想大概是(未探究過正確與否)非線性的特征會有更好的擬合效果吧,聯想到了深度學習里的激活函數。
對於圖片的處理。使用RCNN,提取top 19個Region和一張全圖作為特征。這里主要是提取最后一層的4096維的向量作為特征表示,經過以下式子映射到h維的特征空間中。RCNN網絡結構可以進行微調,也可以不微調。在這里,需要學習的參數是
。
計算Image Fragment 和 sentence Fragment的相似度主要對兩個特征向量進行內積運算。這就很粗暴了。這樣計算相似度,看起來似乎不太妥當,因為每一個圖片Region的向量貌似並不能找到一個標准,至少相似度作為一種距離,這里好像並沒有單位吧。但是,假如認為v和s在同一個特征空間的話,那么,一切都很順其自然了,因為內積不就是夾角嗎?還記得怎么定義希爾伯特空間的嗎?
恩,對於兩個模態的學習,找到一種方法把他們映射到同一特征空間非常重要。
最后一步就是定義損失函數了,這里加了一個正則化項,我看了代碼對正則化怎么搞的理解又加深了,。
現在,怎么使得語義上使對應的fragment的變得相似很重要,這自然是通過學習參數了。AK首先用一種簡單的方法,定義alignment目標函數為
當兩種fragment出現在同一image-sentence pair中時,注意是image-sentence pair,就把y置為1,否則為 -1。是一個normalize項,具體可以看代碼怎么實現的。通過這樣簡單的設置,不就使得當兩種fragment出現在同一image-sentence pair中時,相似度朝着大於1的方向發展,否則朝着小於-1的方向發展了嗎?因為式子前面有1減去,而且是一個max和0比較的。
但是,兩種fragment出現在同一image-sentence pair中不代表他們就是相對應啊。注意,以下相當於提升性能吧,因為即便沒有以下的multiple instance learning也是可以有結果的。因為,AK想到了一種方法,通過有約束的不等式求解,目標函數自然還是最小化了,得到
這稱為mi-SVM。太厲害了,他是怎么知道有這種方法的呢?限制條件要求參數y至少有一個值為+1。論文中使用了一種啟發式求解的方法,畢竟直接優化看起來還是很難的,具體的求解過程是對於y的值設置為,如果沒有+1,就把內積最大的對應的y設為+1。
另外定義了一個global目標函數。首先計算整張圖片和sentence的相似度,n是一個平滑項
Global目標函數主要與image和sentence對應的相似度作為比較。通過與所在的行和列比較,使得目標函數朝着令匹配的
比不匹配的
大
的方向優化。
最后優化時,使用的求導的鏈式法則。整個優化的過程使用SGD的方法。總的來說,是參數的學習使得兩種模態的信息可以對應起來。
實驗評估的方法,實驗數據集是隨機選出句子與對應的圖片。通過計算,並在每一個句子對
進行排序,看最匹配圖片的
出現在序列的位置,定義一個R@K,K代表位置,即在位置K以前出現最匹配圖片的百分比,通過對此比較評估Retrieval的性能。
作者Andrej Karpathy的代碼,我看的時候自己加了注釋,放在這里共享吧,希望對你有點幫助吧。http://pan.baidu.com/s/1i5M8xk5
Deep Visual-Semantic Alignments for Generating Image Descriptions:
這篇論文相對於上一篇Deep Fragment Embeddings for Bidirectional Image Sentence Mapping,是可以生成description了,而且retrieval也得到了提升。這里,句子中提取的不再是dependency,而是首先對於每一個單詞都生成一個特征向量,這是通過雙向的RNN(BRNN)生成的,因為RNN它其實包含了上下文的信息,所以認為是與整個句子的語義相關。是1-of-k的向量。RNN的函數如下
對於圖片,依然使用的是RCNN的模型。而且,對於image和sentence對應的相似度計算方法也有所改變,,整個模型變成如下
以上模型通過訓練之后,學習到的只是word與image的region的對應關系,這可能會使得鄰近的單詞(它們可能相關)被對應到不同的label中。這里作者通過使用馬爾科夫隨機場來輸出最佳的每個word對應的region的序列。馬爾科夫隨機場對應的勢函數為。而
是能量函數,注意前面是負值,要使得最后序列的概率最大,則能量函數應該盡量小。所以,這里定義的能量函數的條件為,使用的是鏈式條件隨機場的形式
對於后面一項,當兩個前后的word分配同一個標注的時候,希望能量函數為0(即盡量小),否則為。但是對於第一項……暫時還沒想明白,可能認為是固有的屬性,所以直接加入。當
越大,意味着如果希望能量函數越小,分配到同一個box的連續的word會趨向於更多。
以上其實解決的是latent alignment的問題。
之后,通過使用generator的RNN的生成captioning,這個比較容易理解,模型為
具體的計算過程為
其中輸入的單詞是,而不是
。其實這里我的疑問是,不輸入
第一部分生成correspondence的意義在哪里呢?僅僅是為了alignment?感覺挺奇怪的……