0
本文作者: 木子 | 2019-05-29 15:15 |
機(jī)器閱讀理解是當(dāng)前智能問答領(lǐng)域中的熱門研究問題,它的目標(biāo)是根據(jù)給定的問題和文章(段落),在文章(段落)中抽取或改寫文字片段作為問題的答案。舉例來說,當(dāng)前多數(shù)的搜索引擎,當(dāng)用戶輸入的搜索關(guān)鍵字是一個(gè)問題時(shí),就會(huì)嘗試從搜索結(jié)果的網(wǎng)頁中尋找答案并以最高優(yōu)先級(jí)呈現(xiàn)給用戶。例如搜索“搜狗的吉祥物是什么”,搜索引擎就會(huì)反饋如下:
這其中所利用到的技術(shù)便是“機(jī)器閱讀理解”。
近年來,由于神經(jīng)網(wǎng)絡(luò)的復(fù)興和大規(guī)模數(shù)據(jù)集的可訪問,閱讀理解的研究取得了很大的進(jìn)展,相繼涌現(xiàn)出許多優(yōu)秀的機(jī)器閱讀理解模型。例如,在SQuAD 1.0的排行榜中就已經(jīng)有80多個(gè)提交的模型,其中有相當(dāng)一部分模型的性能已經(jīng)超越了人類的表現(xiàn)。
這里存在一個(gè)問題。作為一個(gè)研究人員或開發(fā)者,為了比較這些模型的優(yōu)缺點(diǎn)并加以利用,重現(xiàn)這些模型是非常必要的。但在已有的模型中,很多模型并沒有提供官方的實(shí)現(xiàn);而目前已開源的部分模型,由于其所使用的深度學(xué)習(xí)框架和實(shí)現(xiàn)思路存在差異,對(duì)許多人來說,理解、比較、改進(jìn)和重現(xiàn)這些模型又存在著較大困難。
搜狗搜索針對(duì)這樣問題,近期提出并開源了“搜狗閱讀理解工具集合”((Sogou Machine Reading Comprehension,以下簡稱“SMRC”)。SMRC 主要針對(duì)抽取式機(jī)器閱讀理解任務(wù),提供了包含數(shù)據(jù)集讀取、預(yù)處理、神經(jīng)網(wǎng)絡(luò)模型基件、訓(xùn)練和評(píng)估的完整框架,同時(shí)對(duì)已發(fā)表的數(shù)十種機(jī)器閱讀理解模型進(jìn)行了復(fù)現(xiàn)和整合,用以幫助使用者快速、高效地重現(xiàn)已有模型或開發(fā)自己的閱讀理解模型。
該工具集合也是目前業(yè)內(nèi)最全的TensorFlow版本的閱讀理解工具集合。目前與SMRC類似的工具集有 Allen AI的AllenNLP和UCL機(jī)器閱讀理解組的Jack The Reader等。但AllenNLP和Jack The Reader更多的是提供適用于多個(gè)自然語言處理任務(wù)的框架,其中僅包含少量閱讀理解模型(例如AllenNLP中針對(duì)SQuAD數(shù)據(jù)集的模型只有BiDAF和QANet)。SMRC則更多地深挖閱讀理解任務(wù),在建立一套模型構(gòu)建和訓(xùn)練框架的同時(shí),提供了10+ 個(gè)模型的實(shí)現(xiàn)。
項(xiàng)目鏈接:(請(qǐng)戳此處)
論文鏈接:(請(qǐng)戳此處)
下面我們來看,SMRC具體有哪些內(nèi)容——
如上圖所示,工具集合根據(jù)機(jī)器閱讀理解的流程,將工具包分為四個(gè)模塊:數(shù)據(jù)集讀取器,數(shù)據(jù)預(yù)處理,模型構(gòu)建和模型訓(xùn)練。 這四個(gè)模塊的設(shè)計(jì)為管道流程,可用于大多數(shù)機(jī)器閱讀理解任務(wù)。
數(shù)據(jù)集讀取器 機(jī)器閱讀理解取得快速進(jìn)展,一個(gè)重要的原因就是各種大規(guī)模、高質(zhì)量問答數(shù)據(jù)集的發(fā)布。為了避免重復(fù)開發(fā)讀取數(shù)據(jù)集的代碼,SMRC提供了一些典型的數(shù)據(jù)集如SQuAD1.0、SQuAD2.0、CoQA的讀取模塊;同時(shí),為了增強(qiáng)語言多樣性,SMRC還提供了支持中文數(shù)據(jù)集CMRC2018的模塊。另一方面,用戶也可以通過繼承 base_dataset,針對(duì)其他數(shù)據(jù)集開發(fā)自定義的讀取器。
數(shù)據(jù)處理 為了準(zhǔn)備訓(xùn)練模型的數(shù)據(jù),我們需要建立一個(gè)詞匯表、提取語言特征,并將離散特征映射到索引中。該工具包提供了滿足這些要求的模塊:Vocabulary Builder 、Feature Extractor、Batch Generator。
模型構(gòu)建 機(jī)器閱讀理解任務(wù)的核心部分就是構(gòu)建一個(gè)有效且高效的模型。SMRC除了提供內(nèi)置的模型(我們將在后面介紹)外,還提供了機(jī)器閱讀理解任務(wù)中常用的神經(jīng)網(wǎng)絡(luò)組件,以便于用戶構(gòu)建自定義的模型。遵循 “功能 API” 的思想,SMRC 將它們包裝為 Tensorflow 層的 MRC 特定補(bǔ)充:
Embedding:包括Vanilla Embedding,PartiallyTrainableEmbedding、CoVeEmbedding,ElmoEmbedding和BertEmbedding等。
Recurrent:BiSTM和BiGRU是基本的循環(huán)層,此外SMRC還提供了它們的CUDNN版本——CudnnBiSTM 和 CudnnBiGRU。
相似度函數(shù):SMRC提供了一系列用于計(jì)算文本之間的詞級(jí)相似度的函數(shù),例如DotProduct、TriLinear和MLP等。
Attendtion:注意力層通常與相似性函數(shù)一起使用,例如BiAttention,UniAttention和SelfAttention。
基本層:一些基本層用于機(jī)器閱讀理解模型,例如VaritionDropout和Highway,ReduceSequence。
基本操作:這些主要是屏蔽操作,例如,masked softmax, mask logits 。
通過繼承基礎(chǔ)模型類并組合上述組件,開發(fā)人員基本可以快速地構(gòu)建大多數(shù)主流機(jī)器閱讀理解模型。
模型訓(xùn)練 在訓(xùn)練模型時(shí),我們通常關(guān)心指標(biāo)如何隨著 train/dev 集而變化,何時(shí)執(zhí)行early stopping,模型收斂需要多少時(shí)期等等。由于大多數(shù)模型都采用類似的訓(xùn)練策略,所以SMRC提供了一個(gè)訓(xùn)練模塊,主要功能包括保持訓(xùn)練、評(píng)估和推理處理、保存最佳權(quán)重、與指數(shù)移動(dòng)平均值協(xié)作以及記錄訓(xùn)練摘要。每個(gè)模型還提供了用于保存和加載模型權(quán)重的界面。
提供豐富的內(nèi)置模型是SMRC的一大特色,這些內(nèi)置模型都是對(duì)已有的優(yōu)秀模型的復(fù)現(xiàn)。其中包括:
BiDAF:與之前工作中的注意機(jī)制不同,BiDAF的核心思想是雙向注意力,它模擬了query-to-context 和 context-to-query 的注意力。(Bidirectional Attention Flow for Machine Comprehension (ICLR 2017))
DrQA:旨在解決開放域問題解答。 DrQA 使用文字嵌入、基本語言特征和簡單的注意機(jī)制,證明了沒有復(fù)雜結(jié)構(gòu)設(shè)計(jì)的簡單模型也可以在機(jī)器閱讀理解中獲得好的結(jié)果。(Reading Wikipedia to Answer Open-Domain Questions (ACL 2017))
FusionNet:基于對(duì)以往工作中注意力方法的分析,Huang 等人提出了FusionNet,從三個(gè)方面擴(kuò)展了注意力。他們提出使用詞的歷史和 fully aware attention,這使得模型結(jié)合了來自不同語義層的信息流。此外,這個(gè)想法也適用于自然語言推理。(Fusing via Fully-aware Attention with Application to Machine Comprehension (ICLR 2018))
R-Net:R-Net的主要貢獻(xiàn)是自我匹配的注意機(jī)制。在上下文和問題的門控匹配之后,引入了段落自匹配來匯總整個(gè)段落的證據(jù)并改進(jìn)段落表示。(Gated Self-Matching Networks for Reading Comprehension and Question Answering (ACL 2017))
QANet: QANet的體系結(jié)構(gòu)改編自Transformer,它僅包含卷積和自注意力(self-attention)。由于不使用循環(huán)層,QANet在訓(xùn)練時(shí)間內(nèi)提高了313倍的速度,在推理時(shí)間內(nèi)提高了49倍的速度。(Combining Local Convolution with Global Self-Attention for Reading Comprehension (ICLR 2018))
IARNN:SMRC中實(shí)現(xiàn)了兩種基于內(nèi)部注意力的RNN(IARNNs),這有利于句子表示并且在答案選擇任務(wù)中有效。 IARNN-word 在輸入RNN模型之前對(duì)問題上下文的單詞表示進(jìn)行加權(quán)。與僅實(shí)現(xiàn)輸入字嵌入的IARNN-word不同,IARNN-hidden可以通過向計(jì)算注意力權(quán)重添加附加上下文信息來捕獲多個(gè)單詞之間的關(guān)系。(Inner Attention based Recurrent Neural Networks for Answer Selection (ACL 2017))
BiDAF ++:在BiDAF基礎(chǔ)上,引入了多段機(jī)器閱讀理解的模型?;贐iDAF,BiDAF ++增加了自我注意力層以增加模型容量。(Simple and Effective Multi-Paragraph Reading Comprehension (ACL 2018))
BERT&ELMo:預(yù)訓(xùn)練模型如BERT和ELMo在許多自然語言處理任務(wù)中都表現(xiàn)極好。在SMRC中,使用BERT、ELMo 和Cove作為嵌入層來提供強(qiáng)大的上下文表示。同時(shí),SMRC還包括用于機(jī)器閱讀理解的BERT模型,以及修改版本。
SMRC提供了簡單的接口,對(duì)于用戶來說簡單易用,且具有可擴(kuò)展性。對(duì)于主流閱讀理解模型,只需要十多行的代碼便可完成訓(xùn)練和測試。下面以SquAD1.0為例,快速構(gòu)建并訓(xùn)練一個(gè)內(nèi)置模型(DrQA):
1、下載數(shù)據(jù)集
$ 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、準(zhǔn)備數(shù)據(jù)集閱讀器和鑒別器
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、構(gòu)建詞匯表并加載預(yù)訓(xùn)練嵌入
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、用特征提取器。特征提取器只是在使用語言特征時(shí)才需要:
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、構(gòu)建用于訓(xùn)練和評(píng)估的批處理生成器,其中在使用語言特征時(shí)需要附加特征和特征詞匯表。
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、導(dǎo)入內(nèi)置模型并編譯訓(xùn)練操作,調(diào)用train_and_evaluate等函數(shù)進(jìn)行訓(xùn)練和評(píng)估。
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)
以上這些代碼適用于所有內(nèi)置模型,以及示例中的所有數(shù)據(jù)集上。你可以按照上面的代碼在不同的數(shù)據(jù)集上分別嘗試不同的模型,看看效果如何。
SMRC在Github中提供的對(duì)比結(jié)果如下:
在Table 1中是針對(duì)SQuAD1.0的模型結(jié)果,可以看出復(fù)現(xiàn)模型與原模型的性能基本一致。而另一方面,當(dāng)模型加入了BERT或ELMo這樣的預(yù)訓(xùn)練后,其結(jié)果往往會(huì)有極大的提升,因此它們也是NLP的一個(gè)新趨勢。
SQuAD 2.0和CoQA的任務(wù)與SQuAD1.0并不相同,因此有些模型不能直接應(yīng)用到這兩個(gè)數(shù)據(jù)集上?;贐iDAF、BiADF++等模型的測試,可以看出內(nèi)置模型有時(shí)候甚至比原模型更好。此外,也可以將BiDAF應(yīng)用在CMRC數(shù)據(jù)集上,搜狗搜索提供的測試結(jié)果F1/EM 為57.01/35.0,這提供了一個(gè)新的基線。
搜狗搜索開源的“搜狗閱讀理解工具集合”,提供了TensorFlow版本的數(shù)據(jù)集讀取、預(yù)處理、神經(jīng)網(wǎng)絡(luò)模型基件、訓(xùn)練和評(píng)估等完整的閱讀理解任務(wù)框架,使開發(fā)人員能夠快速構(gòu)建自定義的機(jī)器閱讀模型。此外,SMRC還以統(tǒng)一的框架提供了十多種機(jī)器閱讀理解模型,方便了開發(fā)人員復(fù)現(xiàn)和檢驗(yàn)已有的模型。這些工作將大大地加速相關(guān)的學(xué)術(shù)研究。同時(shí),SMRC也給所有想要評(píng)估和嘗試落地機(jī)器閱讀理解技術(shù)的算法從業(yè)人員提供了上手的捷徑和產(chǎn)品化的初動(dòng)力。
據(jù)了解,目前搜狗搜索已經(jīng)將相關(guān)技術(shù)應(yīng)用于產(chǎn)品及業(yè)務(wù)中。在法律領(lǐng)域,搜狗律師的問答機(jī)器人具備邏輯分析和推理能力,在遞進(jìn)式問詢過程中,挖掘判決書中的結(jié)構(gòu)化數(shù)據(jù),幫助用戶理清已發(fā)生的事實(shí),并在充分、準(zhǔn)確理解用戶法律訴求的基礎(chǔ)上,給出可能的判決結(jié)果、法律建議或相似案例;在醫(yī)療領(lǐng)域,搜狗搜索的智能分診功能,首創(chuàng)引入了基于人工智能技術(shù)的智能診斷助手,模擬醫(yī)生與病人對(duì)話的模式與用戶進(jìn)行病情溝通,根據(jù)用戶實(shí)際癥狀幫助判斷用戶可能患有的疾病。
參考資料:
[1] SMRCToolkit
[2] Sogou Machine Reading Comprehension Toolkit
[4] 搜狗奪國際頂級(jí)挑戰(zhàn)賽CoQA第一名
[5] CoQA: A Conversational Question Answering Challenge
[6] SQuAD2.0: The Stanford Question Answering Dataset
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。