一份問答系統的小結

Part I:基於知識圖譜的QA

Part II:基於閱讀理解的QA

Part III:基於多輪交互的對話系統


前言

問答系統是非常熱門也是很有前景的一個領域,學術界有很多人在研究,工業界也在積極尋求落地,因此本文對問答系統的發展現狀和做法做了一個綜述整理。模型非常多,這裡不會一一展開介紹,而是把這些方法的特點進行歸類。

Part I:基於知識圖譜的QA

以知識圖譜構建事實性問答系統,也稱之為KB-QA,在業界是一種比較靠譜的做法,從知識圖譜中尋找答案。對事實性問答任務而言,這種做法依賴於知識圖譜,準確率比較高,同時也要求我們的知識圖譜是比較大規模的,因為KB-QA無法給出在知識圖譜之外的答案。KB-QA又可以分成兩類:基於符號表示的KB-QA,基於向量表示的KB-QA。

知識圖譜並不是我的領域,但我實驗室有人在做知識圖譜,所以我也有一些大概了解。

基於符號表示的KB-QA

這種做法主要是利用語義解析的方法對問題進行解析,把問題轉換成邏輯表達式,再加上一些規則,得到一個結構化的SQL查詢語句,用來查詢知識庫得到答案。

語義解析的傳統做法是:問題->短語檢測->資源映射->語義組合->邏輯表達式

短語檢測:詞性標註、實體識別

資源映射: 實體鏈接、實體消岐、關係抽取

語義組合:將映射得到的資源進行組合,得到邏輯形式。

訓練分類器:計算每一種語義解析結果的概率,再對於問答對計算損失函數。

現在的做法一般是:

首先是建圖:包含知識庫實體(圓角矩形,比如family guy),聚合函數(棱形,比如argmin),中間變數 y 和答案變數 x

對問題進行信息抽取:提取問題特徵(問題詞,問題焦點,問題主題詞和問題中心動詞),識別命名實體,進行詞性標註來刪除限定詞和介詞。

確定核心推導鏈:將自然語言問題,映射為一個謂語序列

增加約束和聚合:增加約束和聚合函數相當於擴展查詢圖,縮小答案範圍

構建查詢圖特徵:主題詞鏈接特徵,核心推導鏈特徵,約束聚合特徵,總體特徵

分類器:對查詢圖做二分類,只有正確的查詢圖才是正樣本。

基於向量表示的KB-QA

知識表示是近幾年很火的方向,就像詞向量剛出來那會也發了很多論文,不過現在熱度轉向知識推理了。基於向量表示的KB-QA主要是對問題和答案學習到一個向量表示,然後進行向量匹配,歸根到底就是個匹配問題。這種方法就是我當時差點要入的坑,後來因為項目比較繁瑣 時間也不夠,選擇了基於文本的QA。

我們先把問題和候選答案都映射成向量,

如何學習問題向量:把問題用LSTM進行建模(因為問題本來就是自然語言)

如何學習答案向量:答案不能簡單映射成詞向量,一般是利用到答案實體,答案類型,答案路徑(從問題主題詞到答案的知識庫路徑),答案關係(從主題詞到答案之間的知識庫關係),答案上下文信息(與答案在一定範圍內有連接的知識庫實體),然後把這些特徵分別映射成不同的向量,作為答案的其中一個向量(而不是直接拼接起來),最後用這些特徵向量依次和問題做匹配,把score加起來作為總的score。

接下來我們要對問題和答案進行向量匹配,計算問題-答案score,常見的有,

最簡單的方法:直接進行向量點乘,可以用CNN對這種方式做改進

Attention匹配法:計算答案對問題每一步的Attention

我們的訓練目標是:一般用Margin Loss,極大化問題對正確答案的score,同時極小化問題對錯誤答案的score。

當模型訓練完成後,通過score進行篩選,取最高分的作為最終答案

另外,有一些論文加入了Multi-Task Learning,同時使用TranE去訓練知識庫。

也可以使用記憶網路來做,首先通過Input模塊來處理問題,加入知識庫信息,將三元組通過輸入模塊變換為一條一條的記憶向量,再通過匹配主語獲得候選記憶,進行cos匹配來獲取最終記憶,將最終記憶中的賓語輸出作為答案。

現在來比較一下基於符號和向量的方法:

1)基於符號的方法,缺點是需要大量的人工規則,構建難度相對較大。優點是通過規則可以回答更加複雜的問題,有較強的可解釋性。

2)基於向量的方法,缺點是目前只能回答簡單問題,可解釋性差。優點是不需要人工規則,構建難度相對較小。

因此目前可以改進的地方有:

1)複雜問句,目前End2End的模型只能解決簡單問答。

2)多源異構知識庫問答,對於開放域問答,單一的知識庫不能完全回答所有問題。

3)訓練語料,知識庫中有實體和關係,除此之外還可能有描述實體的文本信息,或許可以結合結構化知識和非結構化文本,也就是Part II要介紹的方法。

Part II:基於閱讀理解的QA

這個就是我所研究過的領域了,對非結構化文章進行閱讀理解得到答案,又可以分成匹配式QA,抽取式QA和生成式QA,目前絕大部分是抽取式QA。但是我有一段時間沒有follow了,不知道能不能跟上時代的步伐,因為閱讀理解花樣很多,但是基本框架應該差不多的。

匹配式QA

給定文章,問題,和一個候選答案集(一般是實體或者單詞),從候選答案中選一個score最高的作為答案。這種形式比較像選擇題型,已經基本上沒人做了。

具體的問題可以定義為多分類問題:

p(a|d,q)sim exp(W(a) g(d, q)), s.t. a in V

其中d是document,q是query,a是answer,求概率最大的候選答案。注意:辭彙表V 可以定義為 document 和 query 中的所有詞,也可以定義為所有的 entity,或者定義為這篇document裡面的詞,而有的會直接提供包括正確答案在內的 N個候選答案。

重點在於求解g(d, q),g是對document和question建模得到的向量,把這個向量變化到詞表空間再進行歸一化可以得到所有候選score。求解g的方式比如:

1)LSTM Reader:直接把query跟document拼接起來,輸入到雙向LSTM中,最終得到一個向量g,這種做法非常粗糙,只是提供一個簡單的baseline。

2)Attentive Reader:先對query用LSTM進行建模得到問題向量u,然後也對document建模,接下來用u 給document分配attention,去算文章向量r,再結合u和r得到g。相當於每讀完一個問題,然後帶著這個問題去讀文檔。

3)Impatient Reader:這裡考慮到了query的每一個token,每個token都去算一個r。相當於每讀問題的一個字,都要讀一遍文檔。(增加計算量)

4)Gated-Attention Reader:相當於帶著一個問題,反覆讀文檔,讀k遍。

抽取式QA

目前認同度最高的應該是斯坦福的SQuAD數據集,數據形式是給定一篇文章,圍繞這個文章提出一些問題,直接從文章中扣答案出來。這個數據集是基於維基百科爬取的真實文章,

目前難度比較高的應該是 TriviaQA數據集,在語義各方面難度都要超過squad。

常見的模型框架基本上是這樣:

Embedder:對詞進行embedding

Encoder:分別對問題和文章用LSTM進行建模。

Interaction Layer:各種Attention機制花式結合問題和文章,對問題和文章進行交互,在原文上得到query-aware的文章表示。(差別主要在這一部分)

Answer Layer:用query-aware的文章表示來預測答案,一般是用兩個網路分別預測答案起止位置,或者直接對文章進行答案標註。

這裡簡單介紹一下,

最簡單的就是Match-LSTM:Interaction 層用的是中規中矩的Attention,用到兩種預測答案的模式,其中Boundary Model 比較簡單好用。

BiDAF 也比較出名:Interaction 層中引入了雙向注意力機制,使用Query2Context 和 Context2Query 兩種注意力機制,去計算 query-aware 的原文表示。另外在Embedder 層用到詞級 embedding 和字元級 embedding,這倒不是什麼新奇的做法,我記得很早就看過這種embedding了,比較適合英文。

FastQAExt 主打輕量級:在Interaction 層用了兩種輕量級的信息 fusion 策略;Embedder 層加入了一些額外特徵(這個確實有用);確定答案範圍的時候用到了Beam Search(這個一般用在機器翻譯的Decode測試階段)

R-NET 也是曾經佔領過leaderboard第一的模型:雙 Interaction 層架構,分別捕捉原文和問題之間的關係(類似於match-lstm),原文內部各詞之間的關係(self match);先預測答案開始概率,更新RNN狀態,再預測答案截止位置。

其實......看得多了.......感覺都是在堆模型........

生成式QA

目前只有MSRA的MS MARCO數據集,答案形式是這樣的:

1)答案完全在某篇原文

2)答案分別出現在多篇文章中

3)答案一部分出現在原文,一部分出現在問題中

4)答案的一部分出現在原文,另一部分是生成的新詞

5)答案完全不在原文出現(Yes / No 類型)

MSRA發布這個數據集後,也發布了S-Net,在R-Net基礎上使用Multi task Learning,先抽取出答案後,利用這個特徵再對文章生成答案。

抽取部分:

這個模型同時做了兩個任務,預測答案ID,還有對文檔進行排序。左下角是對問題建模,右下角是對文章建模,左上角是預測答案ID,右上角是對文章進行排序,對問題跟答案去算一個score,去做排序。

但是我總覺得右下角畫得不夠嚴謹,這裡其實是用到所有passages去預測ID,再對單個passage計算score,圖中應該是只畫了一個passage的多個詞。

生成部分:

前面花這麼大力氣標註出答案後,其實.....這裡只是作為一個特徵信息疊加到文章向量中,對這段文章和問題,重新通過Encoder建模(其實我覺得這裡問題所用的LSTM,可以和前面抽取模型中的問題LSTM共享,不需要重新搞一下問題LSTM),得到一個綜合的語義向量,再輸入到Decoder中生成答案。就是一個簡單的seq2seq模型。

這個論文我本來打算follow的,但是數據集處理實在麻煩,而且感覺模型也各種複雜(並不是說他難,而是說他模型龐大,我感覺我可能跑不動)。

然後我剛剛查了一下這個論文的應用,現在漸漸有人去follow這個工作了,比如加上強化學習,同時修正問題和生成答案。OK,這個坑,就留給別人填吧。

然而......有點尷尬的是,自家的數據集,被百度和猿題庫刷到前面了,可能MSRA最近也在憋大招,畢竟是長期佔領SQuAD排行榜第一的人。

Part III:基於多輪交互的對話系統

我對這個領域了解不多,正在觀望。

未完待續


推薦閱讀:

關於語音交互的不得不知的技術知識
數據集大全:25個深度學習的開放數據集
從Kaggle賽題: Quora Question Pairs 看文本相似性/相關性
Distant Supervision for Relation Extraction with Sentence-Level Attention and Entity Descriptions
Deliberation Networks 閱讀筆記

TAG:自然語言處理 |