模型結構與原理
1. 基於CNN的句子建模
這篇論文主要針對的是句子匹配(Sentence Matching)的問題,但是基礎問題仍然是句子建模。首先,文中提出了一種基於CNN的句子建模網絡,如下圖:
圖中灰色的部分表示對於長度較短的句子,其后面不足的部分填充的全是0值(Zero Padding)。可以看出,模型解決不同長度句子輸入的方法是規定一個最大的可輸入句子長度,然后長度不夠的部分進行0值的填充;圖中的卷積計算和傳統的CNN卷積計算無異,而池化則是使用Max-Pooling。
- 卷積結構的分析
下圖示意性地說明了卷積結構的作用,作者認為卷積的作用是從句子中提取出局部的語義組合信息,而多張Feature Map
則是從多種角度進行提取,也就是保證提取的語義組合的多樣性;而池化的作用是對多種語義組合進行選擇,過濾掉一些置信度低的組合(可能這樣的組合語義上並無意義)。
2. 基於CNN的句子匹配模型
下面是基於之前的句子模型,建立的兩種用於兩個句子的匹配模型。
2.1 結構I
模型結構如下圖:
簡單來說,首先分別單獨地對兩個句子進行建模(使用上文中的句子模型),從而得到兩個相同且固定長度的向量,向量表示句子經過建模后抽象得來的特征信息;然后,將這兩個向量作為一個多層感知機(MLP)的輸入,最后計算匹配的分數。
這個模型比較簡單,但是有一個較大的缺點:兩個句子在建模過程中是完全獨立的,沒有任何交互行為,一直到最后生成抽象的向量表示后才有交互行為(一起作為下一個模型的輸入),這樣做使得句子在抽象建模的過程中會喪失很多語義細節,同時過早地失去了句子間語義交互計算的機會。因此,推出了第二種模型結構。
2.2 結構II
模型結構如下圖:
圖中可以看出,這種結構提前了兩個句子間的交互行為。
- 第一層卷積層
首先從Sentence x中任取一個向量xa,再從Sentence y中將每一個向量和xa進行卷積操作
同理以上操作,將兩個句子中所有的向量兩兩組合,構成2D向量,構成Layer-2。下面給出數學形式化表述:
- 第一層卷積層后的Max-Pooling層
從而得到Layer-2,然后進行2×2的Max-pooling:
- 后續的卷積層
后續的卷積層均是傳統的二維卷積操作,形式化表述如下:
- 二維卷積結果后的Pooling層
與第一層卷積層后的簡單Max-Pooling方式不同,后續的卷積層的Pooling是一種動態Pooling方法,這種方法來源於參考文獻[1]。
- 結構II的性質
- 保留了詞序信息;
- 更具一般性,實際上結構I是結構II的一種特殊情況(取消指定的權值參數);
實驗部分
1. 模型訓練及參數
- 使用基於排序的自定義損失函數(Ranking-based Loss)
- BP反向傳播+隨機梯度下降;
- mini-batch為100-200,並行化;
- 為了防止過擬合,對於中型和大型數據集,會提前停止模型訓練;而對於小型數據集,還會使用Dropout策略;
- Word2Vector:50維;英文語料為Wikipedia(~1B words),中文語料為微博數據(~300M words);
- 使用ReLu函數作為激活函數;
- 卷積窗口為3-word window;
- 使用Fine tuning;
2. 實驗結果
一共做了三個實驗,分別是(1)句子自動填充任務,(2)推文與評論的匹配,以及(3)同義句識別;結果如下面的圖示:
其實結構I和結構II的結果相差不大,結構II稍好一些;而相比於其他的模型而言,結構I和結構II的優勢還是較大的。