論文動機
當前 Visual dialog 模型儘管已經取得了令人印象深刻的表現,但當問題涉及到影象的特定區域或者比較細節的對話片段時,模型就很難給出準確的答案。究其原因,單步的分析需要同時關於太多的資訊,當需要特定的位置或者說需要對問題和影象,對話歷史進行反覆理解時,單步理解就收到了很大的限制。
因此多步推理,從粗粒度到細粒度就顯得十分必要的,這樣模型才能關注到具體的細節,從而給出準確的答案,例如下圖:
單步分析時,需要知道 He 指代的是歷史對話中的 young boy,還需要在影象資訊中關注到young boy,然後才能具體知道他是否穿了短褲,但如果使用多步的話,第一步會從歷史對話和影象中選出來和問題有關的部分,捨棄到並沒有太大關聯的地方,第二步就可以在這些相關的地方進行精細化的分析,從而準確得到答案。基於這樣的一個想法,本文提出了一種多步的雙重注意力模型,用於 visual dialog。
模型
還是先上整個模型框架圖:
模型框架圖加個外框感覺就好看很多,可以學習學習。從框架中可以看出模型主要包含三個模組:1)memory generation:生成一套文字和影象的 memory,用於下一步的 reasoning;2)Multi-step Reasoning:使用迴圈雙重注意力去聯合編碼問題,影象和對話歷史,用於接下來的解碼;3)Answer Decoding:使用上一步得到的聯合編碼向量去推斷答案。
Memory Generation Module
首先是對資料的處理,對影象,使用Faster-RCNN抽取影象特徵:
I 表示的影象資訊,這樣就得到了影象中的 object 的向量表示,在這裡 n_f = 36, M=2048,也就是抽取了 36 個影象特徵,同時使用一個非線性變換得到將這些特徵對映到和問題相同的特徵空間去。
對於文字的話,本文是直接將影象描述和歷史對話完全拼接起來,這樣就得到了一個長句子,表示第 i 個詞,L 表示最大的句子長度,然後使用預訓練的 embedding 進行編碼,雙向 LSTM 進行處理,最終就得到了文字的特徵表示,具體實現如下:
Multi-step Reasoning Module
該模組的整體框架是一個 RNN,每一步的隱狀態表示的問題的當前表示,並會作為 query 去檢索文字和影象資訊,具體流程可以表示為,這個可以看作 one-step reasoning,通過這樣的一個迴圈方式,從而實現對細節的把握,從而最終給出正確的答案。
首先還是會利用一個雙向 LSTM 對問題進行編碼,得到問題的隱狀態表示,接下來是首先利用 self-attention 對問題進行處理,從而得到問題的語義表示,而這些權重表明了問題中哪些詞是非常重要的,並且過濾了那些不重要的詞。
同時該狀態會作為 multi-step reasoning rnn 的隱層初始狀態(因為 RNN 的隱層狀態都是對問題的語義表示),接下來就是不斷使用注意力機制關注影象和歷史對話中的重要資訊,並用這些重要資訊更新對問題的表示,從而一步步推進,最終得到正確的答案。
1.
該步驟利用問題的隱狀態表示和上一步的歷史資訊表示,得到影象上那些地方需要被關注,從而更新影象的需要關注表示,這裡的公式應該是寫錯了,第一個公式的應該是的。
2.
相同的操作,利用一直的資訊更新歷史對話中需要被關注的地方,得到歷史對話的新的表示。
3.
到這一步,已經得到了更新之後的影象特徵表示和歷史對話特徵表示,一般情況下可以簡單使用相同的注意力計算方法直接得到問題的更新表示,但這一步的意圖和之前的是不同的。
在之前的兩步,是為了獲取更多的有用的資訊,因此使用注意力機制不斷更新需要關注的地方,而這一步應該是將這些選擇出來的資訊進行融合,為回答問題提供輔助,也即這一步需要的是通過融合,得到送給 RNN 的輸入,通過 RNN 的隱層狀態更新,從而得到問題的新的表示。因此這裡使用了 MFB 的方式來進行更新。
Zt 表示的是 t 時刻 RNN 的輸入,得到輸入之後,利用 RNN 進行更新,這裡使用的是 GRU,即:
經過 T 輪之後,就得到了一系列的,本文對這些內容再次進行融合,從而得到最後的語義表示向量。
Answer Decoding Module
本文首先還是利用雙向 LSTM 和 self-attention 對問題進行編碼,得到每個問題的表示,然後在問題和語義表示向量之間做點乘,得到一個相似度矩陣 S,。
在此基礎上,需要使用不同的策略獲取最後的答案,在這裡作者使用了三種不同的策略:1)直接使用最後一個表示進行預測,; 2)使用所有步的平均表示;3)使用隨機 dropout:在訓練的時候以一定概率隨機丟棄某些步的結果,用剩下的結果的平均進行組後預測,在測試的時候使用所有步的平均進行預測(這個不能算是單獨的一個步驟吧,感覺就是訓練時加了 dropout)。
在訓練時,本文考慮了兩種損失函式,交叉熵和 n-pair 損失,交叉熵好理解,將 o 送個一個分類層,n-pair 損失的計算方式如下:假設第 g 個是正確答案,則損失定義為:
以上就是整個模型的技術細節。
實驗結果
本文使用的資料集是 visual dialog V1.0 (https://visualdialog.org/),評價指標是NDGC (Normalized Discounted Cumulative Gain),相關實驗結果如下:
可以看出模型的實驗結果是明顯好於 baseline 的,而且隨著 reasoning 的步數增加,模型的效果是在不斷變好的,但這部分感覺可以測試更多的步驟,看看是否效果有明顯的提升。
接下來是一些 case study:
可以看出來模型是逐步從粗粒度到細粒度,慢慢關注到具體的細節,從而最終給出正確的答案,這部分感覺還是十分有意思的,而且在問題的生成模型中,可以看出模型不僅可以給出正確的答案,同時給出具體的細節內容,使回答更豐富,更具有說服力,如下圖:
總結
本文針對當前模型無法回答細節問題,設計了一個 multi-step reasoning 的方法,從粗粒度到細粒度不斷去更新需要關注的資訊,從而使得模型能夠根據已掌握的資訊不斷更新需要關注的內容,從而最終取得了正確的答案。這個思路感覺和人的一些習慣非常類似,我們並不是一步就得出了答案,而是根據已有知識不斷更新自己的關注點以及對問題的理解,從而最終得到正確的答案,羅馬不是一天建成的,這個思路非常值得關注。