author: 張俊林 微信
關於社區問答系統的問題背景,咱們在以前的「利用卷積神經網絡構造社區問答系統」一文裏已經說明得很是清楚,本文就再也不贅述,不清楚背景的讀者可自行參照上文。咱們這些相關的研發工做主要是爲了開發暢捷通「會計家園」交流社區的相關功能。爲了保持行文完整。簡明敘述形式化描寫敘述的問題例如如下:網絡
假設咱們已知問答庫例如如下:函數
當中,Qi是問答社區中的歷史問題,Ai是Qi問題的精華答案;post
現有社區用戶提出的新問題:Qnew 學習
咱們需要學習映射函數:spa
意即對於新問題Qnew,咱們但願經過學習系統找到社區中已經出現過的語義一樣問題Qi。而後將相應的答案Ai推薦給用戶。開發
這樣就達到了社區信息複用的目的。這個問題事實上對於問答社區比方百度知道、知乎等都是存在的。解決這個問題的思路也全然可以複用到此類問答社區中。深度學習
除了上篇文章講述的利用CNN來構造ML系統外,咱們還嘗試了使用RNN及其改進模型LSTM。本文主體內容即爲使用深度雙向LSTM構造社區問答系統的思路及效果。it
|深度雙向LSTM模型社區
圖1 深度雙向LSTM
深度雙向LSTM模型的結構如圖1所看到的。
首先強調一下,這個結構也是一個解決對照兩個句子相似性的通用RNN解決方式,不僅可以使用在問答社區。凡是涉及到對照兩個句子或者實體關係的場合全然可以套用這個模型來解決。這點但願讀者注意。
首先。因爲咱們面臨的問題是對照兩個問題Qi和Qj是否語義一樣,那麼對於RNN來講存在一個神經網絡的輸入層怎樣構造的難題。CNN解決這類問題就比較直觀。通常一個輸入套上一個CNN來抽取出句子特徵。而後再套上MLP神經網絡來表達二者之間的關係就能夠。RNN表達單個輸入句子是很是直觀的,但是直接表達兩個句子之間的關係相對而言就沒那麼直觀。通常可以如圖1這麼作。就是把兩個問題Qi和Qj拼接起來,中間用一個特殊分隔符EOS切割,這裏EOS不表明一個句子的結束,而是表明兩個句子的分隔符號,這個也請讀者注意。如此就構造出了RNN的輸入層。
有了輸入層,上面就優勢理了。
首先咱們在輸入層之上。套上一層雙向LSTM層。LSTM是RNN的改進模型。相比RNN,可以更有效地處理句子中單詞間的長距離影響。而雙向LSTM就是在隱層同一時候有一個正向LSTM和反向LSTM,正向LSTM捕獲了上文的特徵信息,而反向LSTM捕獲了下文的特徵信息,這樣相對單向LSTM來講可以捕獲不少其它的特徵信息。因此一般狀況下雙向LSTM表現比單向LSTM或者單向RNN要好。
圖1中輸入層之上的那個BLSTM層就是這個第一層雙向LSTM層神經網絡。
咱們可以把神經網絡的深度不斷拓展,就是在第一層BLSTM基礎上。再疊加一層BLSTM,疊加方法就是把每個輸入相應的BLSTM層的輸出做爲下一層BLSTM神經網絡層相應節點的輸入,因爲二者全然是一一相應的,因此很是好疊加這兩層神經網絡。假設你以爲有必要,全然可以如此不斷疊加更深一層的BLSTM來構造多層深度的BLSTM神經網絡。
在最後一層BLSTM神經網絡之上。可以使用Mean Pooling機制來融合BLSTM各個節點的結果信息。
所謂Mean Pooling。詳細作法就是把BLSTM各個節點的輸出結果求等權平均,首先把BLSTM各個輸出內容疊加,這是pooling的含義,而後除以輸入節點個數。這是mean的含義,Mean Pooling就是這個意思。
怎樣從物理意義上來理解Mean Pooling呢?這事實上可以理解爲在這一層,兩個句子中每個單詞都對終於分類結果進行投票,因爲每個BLSTM的輸出可以理解爲這個輸入單詞看到了所有上文和所有下文(包括兩個句子)後做出的二者是否語義一樣的推斷,而經過Mean Pooling層投出本身寶貴的一票。
因此RNN場景下的Mean Pooling可以看做一種深度學習裏的「民主黨」投票機制。
在Mean Pooling之上,咱們還可以套上一層SoftMax層,這樣就可以實現終於的分類目的。
經過以上方式,咱們就經過輸入層、多層BLSTM層、Mean Pooling層和輸出層構造出一個通用的推斷兩個句子語義是否一樣的深度學習系統。
事實上這個結構是很是通用的,除了推斷兩個句子關係,對於單句子分類明顯也是可以套用這個結構的。
模型結構已經講完。後面咱們將進入實驗部分,因爲但願和CNN結果進行效果對照。咱們先簡單說明下兩個一樣可以用來解決社區問答問題的CNN結構,這兩個結構在以前的「利用卷積神經網絡構造社區問答系統」文中都有詳細描寫敘述,這裏不展開講。不過列出結構圖,以方便理解和對照模型。
|兩個CNN模型結構
兩個CNN模型結構參考圖2和圖3,圖2這樣的結構是利用CNN推斷多個輸入句子關係的簡單直接的結構,含義是先各自抽取每個句子的特徵而後比較二者的關係。而圖3這樣的結構的含義是先把兩個句子之間的關係明白表達出來做爲輸入。而後再套上一個CNN模型來進行分類預測。
圖2 CNN模型1
圖3 CNN模型2
|實驗結果及與兩個CNN模型對照
在以前的文章「利用卷積神經網絡構造社區問答系統」中咱們使用本身構造的實驗數據驗證了CNN模型2的效果。
以後,咱們添加了訓練數據的數量,以及加大了負例的難度。事實上在這個社區問答問題中,負例的難度對於實驗效果指標影響是比較大的。所謂難度,是指負例中兩個句子間語義相關程度究竟有多強,假設負例中兩個句子語義相關程度越強,則分類難度越高。
至於模型。咱們補充了CNN模型1,在新數據集合下測試了CNN模型2的效果,對於BLSTM來講,則作了雙層BLSTM和單層BLSTM的實驗。因此可以以爲有四個模型參與效果對照。
通過參數調優,這四個模型在這個新的訓練集和測試集下,詳細實驗結果例如如下:
CNN模型1 分類精度:89.47%
CNN模型2 分類精度:80.08%
雙層BLSTM模型 分類精度:84.96%
單層BLSTM模型 分類精度:89.10%
可以看出,在這個問答社區問題裏,CNN模型1和單層BLSTM效果接近,而雙層BLSTM模型效果有降低。這或許跟實驗數據規模不夠大有必定關係。因此複雜模型的優點發揮不出來,而CNN模型2則效果相對差些,這或許說明了CNN模型2沒有將兩個句子的原始信息輸入到模型裏,而是直接將其關係做爲輸入,這樣的狀況下存在信息損失的可能。
致謝:感謝暢捷通智能平臺的沈磊、薛會萍、黃通文、桑海巖等同事在模型訓練及訓練數據的收集整理方面的工做。
掃一掃關注微信號:「布洛卡區」 。深度學習在天然語言處理等智能應用的技術研討與科普公衆號。