雲腦科技-實習僧文本匹配模型及基於百度PaddlePaddle的應用

1. 上下文理解理論基礎

在語言模型中,當前句子段落裡的語義,語法,在很大程度上決定了下一個詞是什麼,如何表達。對一個由 n 個詞組成的語句

雲腦科技-實習僧文本匹配模型及基於百度PaddlePaddle的應用

,傳統語言模型通過對條件概率

雲腦科技-實習僧文本匹配模型及基於百度PaddlePaddle的應用

進行建模,來估計整個語句的概率分佈:

雲腦科技-實習僧文本匹配模型及基於百度PaddlePaddle的應用

然而很多時候稀疏的數據,對上下文長度有限的覆蓋,離散的概率分佈空間侷限了傳統語言模型的效果。在深度學習中,基於詞向量和循環神經網絡 (RNN) 的語言模型很好的解決了這些問題。但普通的 RNN,受限於梯度消失和梯度飽和,在訓練時更新信息可能傳播不到序列所有的位置上。因此對於較長的語句,RNN 並不能很好的整合上文信息。GRU 和 LSTM 這兩種特殊的 RNN,在每一個循環單元內引入了「門」的結構,如輸入門,輸出門,遺忘門,等等。這些特殊的結構避免了梯度在循環單元之間傳播時,必須通過非線性激活函數的現象。從而能夠保證信息在長距離上的更新,進而使得當前的詞能很好的承接上文。普通 RNN 的語言模型在訓練時速度較慢,GRU/LSTM 在普通 RNN 的基礎上,由於其複雜的循環單元結構,更加降低了執行速度。在自然語言處理的很多問題,比如句法分析,命名實體識別中,需要考慮一個詞在上下文中的含義和作用。因此,這些問題在隱藏層往往需要正向傳播,反向傳播的兩條 GRU/LSTM 鏈。在工業級生產上,由於大數據集的普遍性,以及對速度的需求,侷限了 GRU/LSTM 的實際應用。

卷積神經網絡 (CNN) 一直以來的主要應用都是在基於圖像的深度學習算法上。近些年 CNN 在自然語言處理上的應用證明,CNN 系列的算法可以高效的對語言進行建模,在更快的執行速度下,達到或超過 GRU/LSTM 的效果。以短文本分類為例,CNN 在這一問題上的應用如下圖所示:

雲腦科技-實習僧文本匹配模型及基於百度PaddlePaddle的應用

輸入層語句可以看作是一個文本長度為 7,詞向量維度為 5 的文本「矩陣」。對於 3 組長度分別為 {2, 3, 4} 的上下文,每組有 2 個卷積核。在圖像的應用中,卷積核的長寬一般均小於圖像矩陣,而在文本的應用中,卷積核長度雖然小於文本矩陣的長度,但其寬度一定等於文本矩陣寬度,即詞向量的維度。於是卷積核只在長度的方向上做卷積。以上下文長度為 2 的一個卷積核 K 為例,在如上圖所示的沒有填充的文本矩陣下,K 分別作用於「I like」,「like this」,「this movie」,「movie very」,「very much」,「much !」,6 個子矩陣。K 將每個映射為一個實數後,得到一個 6 維向量 U,U 可以看作一個局部上下文特徵向量。之後將最大池化層作用於 U 上,過濾掉該局部上下文裡不重要的特徵,只保留最重要的一個。對於上面 6 個卷積內核,都完成這樣的操作後,構成可以代表整個文本的全局上下文特徵向量 V。最後,對於文本分類問題,將 softmax 函數作用於 V 上,作為整個網絡的輸出層。

對於較長的文本,單個卷積-最大池化層也許不能夠完全覆蓋整個文本,因此對於全局上下文特徵的提取,就需要多個卷積層的疊加。對於 RNN 來說,當前的循環單元在很大程度上決定於之前的循環單元。而 CNN 的卷積核獨立作用於子文本窗,因此可以並行同步處理,進而大大地提高了算法的執行速度。

2. 文本匹配模型理論基礎

文本匹配顧名思義,就是對給定的文本,在文本庫中找到與其最為相似的匹配文本。文本匹配較為廣泛的一個應用實例是搜索引擎。很多搜索引擎對查詢文本進行關鍵詞抽取,通過關鍵詞來找到文本庫中最為相似的文本進行返回。然而很多時候,同一個意思在不同的環境下有很多不同的表達方式,所以這種基於詞法的匹配在廣義的文本匹配應用中也就很可能出現不準確的現象。從這個角度出發,便有了基於語義的模型,比如 Latent Semantic Analysis (LSA),Latent Dirichlet Allocation (LDA),Semantic Hashing,等等。然而這些語義模型有著非監督性學習的性質。比如 LSA 是對詞條-文本共生矩陣做 SVD 降維,在低維空間中用聚類或餘弦相似度尋找文本間的相似性,但並沒有特別明確具體的目標函數以及匹配度評測標準;Semantic Hashing 是基於 Restricted Boltzman Machine,將文本轉化為形同內存地址的 0-1 形式,它的參數估計過程不是以區分相關文本和不相關文本來進行最優化。

Deep Structured Semantic Model(DSSM) 是語義層面上的監督性學習文本匹配模型。DSSM 通過深度神經網絡單元 (DNN Unit),將查詢文本 Q 和匹配文本 D 映射為同一語義空間下的語義向量對

雲腦科技-實習僧文本匹配模型及基於百度PaddlePaddle的應用

,並用

雲腦科技-實習僧文本匹配模型及基於百度PaddlePaddle的應用

的餘弦相似度來表達 Q 與 D 的匹配度。因此對於給定的 Q,以及潛在匹配候選文本

雲腦科技-實習僧文本匹配模型及基於百度PaddlePaddle的應用

,可通過得到的餘弦相似度來進行匹配度排序。DSSM 的結構如下圖所示:

雲腦科技-實習僧文本匹配模型及基於百度PaddlePaddle的應用

x 為輸入向量,y 為語義向量,

雲腦科技-實習僧文本匹配模型及基於百度PaddlePaddle的應用

為 DNN Unit 的 隱藏層,

雲腦科技-實習僧文本匹配模型及基於百度PaddlePaddle的應用

為對應隱藏層的權重參數與偏差參數。具體地,

雲腦科技-實習僧文本匹配模型及基於百度PaddlePaddle的應用

其中,g 為激活函數。一對 Q,D 文本的相似度定義為:

雲腦科技-實習僧文本匹配模型及基於百度PaddlePaddle的應用

訓練數據集中,對於每一個 Q,都有對應的候選匹配文本集 D,以及在 D 中被實際選取的單個匹配文本

雲腦科技-實習僧文本匹配模型及基於百度PaddlePaddle的應用

。對於每一個

雲腦科技-實習僧文本匹配模型及基於百度PaddlePaddle的應用

,有匹配條件概率

雲腦科技-實習僧文本匹配模型及基於百度PaddlePaddle的應用

其中平滑因子γ是可調試的 hyper parameter. 在訓練的時候,我們的目標函數為:

雲腦科技-實習僧文本匹配模型及基於百度PaddlePaddle的應用

,即交叉熵損失函數,其中

雲腦科技-實習僧文本匹配模型及基於百度PaddlePaddle的應用

。之後便可用基於梯度下降的優化算法來得到參數的估計。

一些時候,在訓練數據集中,對於每一個 Q,對應的候選匹配文本集 D 中的文本是根據匹配程度排好序的。這種情況下,對於任意兩個候選文本

雲腦科技-實習僧文本匹配模型及基於百度PaddlePaddle的應用

,有

雲腦科技-實習僧文本匹配模型及基於百度PaddlePaddle的應用

如果真實的排序

雲腦科技-實習僧文本匹配模型及基於百度PaddlePaddle的應用

,那麼真實概率

雲腦科技-實習僧文本匹配模型及基於百度PaddlePaddle的應用

,這個時候的損失函數為:

雲腦科技-實習僧文本匹配模型及基於百度PaddlePaddle的應用

可以看出是上述全局單一匹配下的一種特殊情況。

雖然 DSSM 相比較於之前的匹配模型有著顯著的效果提升,但是 DSSM 的輸入是普通的詞哈希向量,並且其 DNN Unit 是疊加的全連接層,並沒有考慮文本的上下文聯繫。

Convolutional DSSM(CDSSM) 在 DSSM 的詞哈希向量的基礎上,引入了卷積層和最大池化層,進行上下文顯著特徵提取,並將提取的特徵通過非線性映射得到語義向量 (semantic feature),C-DSSM 的 DNN Unit 的結構如下圖所示:

雲腦科技-實習僧文本匹配模型及基於百度PaddlePaddle的應用

同第一部分所描述的 CNN 作用原理,卷積層會考慮每一個上下文窗口中的詞哈希向量,再將此向量映射為較低維的局部上下文向量。對於一系列相關的局部上下文向量,最大池化層可以過濾掉不重要的文本特徵,只保留最顯著的,形成全局上下文向量。進而在 DSSM 的基礎上,更進一步的考慮並聯繫了上下文的語義特徵,達到更好的文本匹配效果。

PaddlePaddle 於 2016 年開源,對自己的定義是「easy-to-use, efficient, flexible, scalable」. PaddlePaddle 封裝了許多經典的神經網絡算法,因此,用 PaddlePaddle 實現一些基於經典結構,較為複雜但效果很好的神經網絡時,就十分方便。比如在機器翻譯中,一個比較流行的模型是帶有注意力機制的編碼-解碼器。在編碼器中,輸入為詞向量或獨熱向量,隱藏層為正向傳播的循環神經網絡 (F-RNN),以及反向傳播的 B-RNN,循環單元可以是 GRU 或者 LSTM。對每一個輸入詞向量,對應位置上正向反向兩個循環單元的輸出結合起來,得到對應詞向量的隱含狀態。在解碼器中,隱藏層由一個正向傳播的 F-RNN 構成,其每一個循環單元 的輸入取決於 的輸出,以及 所對應的位於編碼器中的上下文 。而, 即注意力機制是通過對編碼器中各時刻的隱含狀態 進行加權平均實現的。

在注意力模型的思想中,任意兩個目標語言和源語言詞間均存在一定的關聯,且這個關聯強度是由模型計算得到的實數。在 PaddlePaddle 裡,對這些重要的組成部分,都有對應的 Python API 可以調用。比如「paddle.layer」的「paddle.layer.data」,「paddle.layer.embedding」,「paddle.layer.fc」;「paddle.networks」下的「paddle.networks.gru_unit」,「paddle.networks.simple_attention」,等等。通過這些組成部分來實現上面所描述的機器翻譯模型只需要簡單的 100 行 python 代碼。在模型訓練的過程中,PaddlePaddle 同樣封裝了豐富的 API 比如各種 optimizer,以及實現 callback,early stopping 機制的方法,等等。

雖然 PaddlePaddle 的 Python API 覆蓋了大部分的主流神經網絡結構,但在模型開發中,對應於實際的問題,仍然需要自己實現神經網絡組成部分。在 TensorFlow 中,這些新的構架可以直接在 Python 裡通過 TensorFlow 的基礎單元進行實現。在 PaddlePaddle 裡,新的 layer,operator,必須通過較為底層的 C++來實現,而這些單元中對於梯度計算的 forward/backward 結構設計和 Caffe 又比較類似。新的單元實現之後,需要封裝相應的 Python 接口,通過 make,編譯,組件測試,才能在自己的網絡結構中使用這個新的 layer/operator. 這樣的好處是更快的執行速度。

在數據讀取方面,PaddlePaddle 需要開發者實現 dataprovider,並在 config 文件中調用這個 dataprovider。在 TensorFlow 裡,並沒有這樣比較直接的讀取機制。TensorFlow 中普遍使用的 feed_dict/placeholder 是單線程運行,讀取速度較慢。如果要實現多線程快速的數據輸入,數據的批量讀取,數據讀取順序重洗等功能,開發者必須預先將原始數據序列化成 tfrecords 格式,再從序列化的數據讀取到定義的 TensorFlow 模型圖中。而在 PaddlePaddle 中,實現如同 tfrecords 的讀取功能並不需要預先的序列化,只用在 dataprovider 裡實現 reader 和相應的 reader decorator 即可。

總體上而言,PaddlePaddle 可以很好的適用於實際生產線而不單單是研發模型原型。PaddlePaddle 支持模型並行,數據並行,多機多卡,多種集群方式,即使在缺少 GPU 的情況下也可以在較大的數據集上進行深度模型訓練。在雲腦科技與合作伙伴的眾多項目中,既有來自於傳統行業的大數據集,也有對實時行為的預測,智能推薦,等多種需求。PaddlePaddle 幫助雲腦科技的工程師有效的利用計算資源,實現模型研發,迭代以及實際應用。


分享到:


相關文章: