0
| 本文作者: 木子 | 2019-05-29 15:15 |
機器閱讀理解是當前智能問答領域中的熱門研究問題,它的目標是根據給定的問題和文章(段落),在文章(段落)中抽取或改寫文字片段作為問題的答案。舉例來說,當前多數的搜索引擎,當用戶輸入的搜索關鍵字是一個問題時,就會嘗試從搜索結果的網頁中尋找答案并以最高優先級呈現給用戶。例如搜索“搜狗的吉祥物是什么”,搜索引擎就會反饋如下:

這其中所利用到的技術便是“機器閱讀理解”。
近年來,由于神經網絡的復興和大規模數據集的可訪問,閱讀理解的研究取得了很大的進展,相繼涌現出許多優秀的機器閱讀理解模型。例如,在SQuAD 1.0的排行榜中就已經有80多個提交的模型,其中有相當一部分模型的性能已經超越了人類的表現。
這里存在一個問題。作為一個研究人員或開發者,為了比較這些模型的優缺點并加以利用,重現這些模型是非常必要的。但在已有的模型中,很多模型并沒有提供官方的實現;而目前已開源的部分模型,由于其所使用的深度學習框架和實現思路存在差異,對許多人來說,理解、比較、改進和重現這些模型又存在著較大困難。
搜狗搜索針對這樣問題,近期提出并開源了“搜狗閱讀理解工具集合”((Sogou Machine Reading Comprehension,以下簡稱“SMRC”)。SMRC 主要針對抽取式機器閱讀理解任務,提供了包含數據集讀取、預處理、神經網絡模型基件、訓練和評估的完整框架,同時對已發表的數十種機器閱讀理解模型進行了復現和整合,用以幫助使用者快速、高效地重現已有模型或開發自己的閱讀理解模型。
該工具集合也是目前業內最全的TensorFlow版本的閱讀理解工具集合。目前與SMRC類似的工具集有 Allen AI的AllenNLP和UCL機器閱讀理解組的Jack The Reader等。但AllenNLP和Jack The Reader更多的是提供適用于多個自然語言處理任務的框架,其中僅包含少量閱讀理解模型(例如AllenNLP中針對SQuAD數據集的模型只有BiDAF和QANet)。SMRC則更多地深挖閱讀理解任務,在建立一套模型構建和訓練框架的同時,提供了10+ 個模型的實現。
項目鏈接:(請戳此處)
論文鏈接:(請戳此處)
下面我們來看,SMRC具體有哪些內容——

如上圖所示,工具集合根據機器閱讀理解的流程,將工具包分為四個模塊:數據集讀取器,數據預處理,模型構建和模型訓練。 這四個模塊的設計為管道流程,可用于大多數機器閱讀理解任務。
數據集讀取器 機器閱讀理解取得快速進展,一個重要的原因就是各種大規模、高質量問答數據集的發布。為了避免重復開發讀取數據集的代碼,SMRC提供了一些典型的數據集如SQuAD1.0、SQuAD2.0、CoQA的讀取模塊;同時,為了增強語言多樣性,SMRC還提供了支持中文數據集CMRC2018的模塊。另一方面,用戶也可以通過繼承 base_dataset,針對其他數據集開發自定義的讀取器。
數據處理 為了準備訓練模型的數據,我們需要建立一個詞匯表、提取語言特征,并將離散特征映射到索引中。該工具包提供了滿足這些要求的模塊:Vocabulary Builder 、Feature Extractor、Batch Generator。
模型構建 機器閱讀理解任務的核心部分就是構建一個有效且高效的模型。SMRC除了提供內置的模型(我們將在后面介紹)外,還提供了機器閱讀理解任務中常用的神經網絡組件,以便于用戶構建自定義的模型。遵循 “功能 API” 的思想,SMRC 將它們包裝為 Tensorflow 層的 MRC 特定補充:
Embedding:包括Vanilla Embedding,PartiallyTrainableEmbedding、CoVeEmbedding,ElmoEmbedding和BertEmbedding等。
Recurrent:BiSTM和BiGRU是基本的循環層,此外SMRC還提供了它們的CUDNN版本——CudnnBiSTM 和 CudnnBiGRU。
相似度函數:SMRC提供了一系列用于計算文本之間的詞級相似度的函數,例如DotProduct、TriLinear和MLP等。
Attendtion:注意力層通常與相似性函數一起使用,例如BiAttention,UniAttention和SelfAttention。
基本層:一些基本層用于機器閱讀理解模型,例如VaritionDropout和Highway,ReduceSequence。
基本操作:這些主要是屏蔽操作,例如,masked softmax, mask logits 。
通過繼承基礎模型類并組合上述組件,開發人員基本可以快速地構建大多數主流機器閱讀理解模型。
模型訓練 在訓練模型時,我們通常關心指標如何隨著 train/dev 集而變化,何時執行early stopping,模型收斂需要多少時期等等。由于大多數模型都采用類似的訓練策略,所以SMRC提供了一個訓練模塊,主要功能包括保持訓練、評估和推理處理、保存最佳權重、與指數移動平均值協作以及記錄訓練摘要。每個模型還提供了用于保存和加載模型權重的界面。
提供豐富的內置模型是SMRC的一大特色,這些內置模型都是對已有的優秀模型的復現。其中包括:
BiDAF:與之前工作中的注意機制不同,BiDAF的核心思想是雙向注意力,它模擬了query-to-context 和 context-to-query 的注意力。(Bidirectional Attention Flow for Machine Comprehension (ICLR 2017))
DrQA:旨在解決開放域問題解答。 DrQA 使用文字嵌入、基本語言特征和簡單的注意機制,證明了沒有復雜結構設計的簡單模型也可以在機器閱讀理解中獲得好的結果。(Reading Wikipedia to Answer Open-Domain Questions (ACL 2017))
FusionNet:基于對以往工作中注意力方法的分析,Huang 等人提出了FusionNet,從三個方面擴展了注意力。他們提出使用詞的歷史和 fully aware attention,這使得模型結合了來自不同語義層的信息流。此外,這個想法也適用于自然語言推理。(Fusing via Fully-aware Attention with Application to Machine Comprehension (ICLR 2018))
R-Net:R-Net的主要貢獻是自我匹配的注意機制。在上下文和問題的門控匹配之后,引入了段落自匹配來匯總整個段落的證據并改進段落表示。(Gated Self-Matching Networks for Reading Comprehension and Question Answering (ACL 2017))
QANet: QANet的體系結構改編自Transformer,它僅包含卷積和自注意力(self-attention)。由于不使用循環層,QANet在訓練時間內提高了313倍的速度,在推理時間內提高了49倍的速度。(Combining Local Convolution with Global Self-Attention for Reading Comprehension (ICLR 2018))
IARNN:SMRC中實現了兩種基于內部注意力的RNN(IARNNs),這有利于句子表示并且在答案選擇任務中有效。 IARNN-word 在輸入RNN模型之前對問題上下文的單詞表示進行加權。與僅實現輸入字嵌入的IARNN-word不同,IARNN-hidden可以通過向計算注意力權重添加附加上下文信息來捕獲多個單詞之間的關系。(Inner Attention based Recurrent Neural Networks for Answer Selection (ACL 2017))
BiDAF ++:在BiDAF基礎上,引入了多段機器閱讀理解的模型。基于BiDAF,BiDAF ++增加了自我注意力層以增加模型容量。(Simple and Effective Multi-Paragraph Reading Comprehension (ACL 2018))
BERT&ELMo:預訓練模型如BERT和ELMo在許多自然語言處理任務中都表現極好。在SMRC中,使用BERT、ELMo 和Cove作為嵌入層來提供強大的上下文表示。同時,SMRC還包括用于機器閱讀理解的BERT模型,以及修改版本。
SMRC提供了簡單的接口,對于用戶來說簡單易用,且具有可擴展性。對于主流閱讀理解模型,只需要十多行的代碼便可完成訓練和測試。下面以SquAD1.0為例,快速構建并訓練一個內置模型(DrQA):
1、下載數據集
$ wget https://rajpurkar.github.io/SQuAD-explorer/dataset/train-v1.1.json
$ wget https://rajpurkar.github.io/SQuAD-explorer/dataset/dev-v1.1.json
$ wget https://nlp.stanford.edu/data/glove.840B.300d.zip #used in DrQA
$ unzip glove.840B.300d.zip
2、準備數據集閱讀器和鑒別器
train_file = data_folder + "train-v1.1.json"
dev_file = data_folder + "dev-v1.1.json"
reader = SquadReader()
train_data = reader.read(train_file)
eval_data = reader.read(dev_file)
evaluator = SquadEvaluator(dev_file)
3、構建詞匯表并加載預訓練嵌入
vocab = Vocabulary(do_lowercase=False)
vocab.build_vocab(train_data + eval_data, min_word_count=3,
min_char_count=10)
word_embedding =
vocab.make_word_embedding(embedding_folder+"glove.840B.300d.txt")
4、用特征提取器。特征提取器只是在使用語言特征時才需要:
feature_transformer =
FeatureExtractor(features=['match_lemma','match_lower','pos','ner','context_tf'],
build_vocab_feature_names=set(['pos','ner']),word_counter=vocab.get_word_counter())
train_data = feature_transformer.fit_transform(dataset=train_data)
eval_data = feature_transformer.transform(dataset=eval_data)
5、構建用于訓練和評估的批處理生成器,其中在使用語言特征時需要附加特征和特征詞匯表。
train_batch_generator = BatchGenerator(vocab,train_data, training=True, batch_size=32, \
additional_fields =
feature_transformer.features,feature_vocab=feature_transformer.vocab)eval_batch_generator = BatchGenerator(vocab,eval_data, batch_size=32, \
additional_fields = feature_transformer.features,
feature_vocab=feature_transformer.vocab)
6、導入內置模型并編譯訓練操作,調用train_and_evaluate等函數進行訓練和評估。
model = DrQA(vocab, word_embedding, features=feature_transformer.features,\
feature_vocab=feature_transformer.vocab)
model.compile()
model.train_and_evaluate(train_batch_generator, eval_batch_generator, evaluator, epochs=40, eposides=2)
以上這些代碼適用于所有內置模型,以及示例中的所有數據集上。你可以按照上面的代碼在不同的數據集上分別嘗試不同的模型,看看效果如何。
SMRC在Github中提供的對比結果如下:

在Table 1中是針對SQuAD1.0的模型結果,可以看出復現模型與原模型的性能基本一致。而另一方面,當模型加入了BERT或ELMo這樣的預訓練后,其結果往往會有極大的提升,因此它們也是NLP的一個新趨勢。


SQuAD 2.0和CoQA的任務與SQuAD1.0并不相同,因此有些模型不能直接應用到這兩個數據集上。基于BiDAF、BiADF++等模型的測試,可以看出內置模型有時候甚至比原模型更好。此外,也可以將BiDAF應用在CMRC數據集上,搜狗搜索提供的測試結果F1/EM 為57.01/35.0,這提供了一個新的基線。
搜狗搜索開源的“搜狗閱讀理解工具集合”,提供了TensorFlow版本的數據集讀取、預處理、神經網絡模型基件、訓練和評估等完整的閱讀理解任務框架,使開發人員能夠快速構建自定義的機器閱讀模型。此外,SMRC還以統一的框架提供了十多種機器閱讀理解模型,方便了開發人員復現和檢驗已有的模型。這些工作將大大地加速相關的學術研究。同時,SMRC也給所有想要評估和嘗試落地機器閱讀理解技術的算法從業人員提供了上手的捷徑和產品化的初動力。
據了解,目前搜狗搜索已經將相關技術應用于產品及業務中。在法律領域,搜狗律師的問答機器人具備邏輯分析和推理能力,在遞進式問詢過程中,挖掘判決書中的結構化數據,幫助用戶理清已發生的事實,并在充分、準確理解用戶法律訴求的基礎上,給出可能的判決結果、法律建議或相似案例;在醫療領域,搜狗搜索的智能分診功能,首創引入了基于人工智能技術的智能診斷助手,模擬醫生與病人對話的模式與用戶進行病情溝通,根據用戶實際癥狀幫助判斷用戶可能患有的疾病。
參考資料:
[1] SMRCToolkit
[2] Sogou Machine Reading Comprehension Toolkit
[5] CoQA: A Conversational Question Answering Challenge
[6] SQuAD2.0: The Stanford Question Answering Dataset
雷峰網版權文章,未經授權禁止轉載。詳情見轉載須知。