猿輔導MSMARCO冠軍團隊:用MARS模型解決機器閱讀任務
主講人:柳景明 | 猿輔導NLP團隊負責人
整理:陳銘林
量子位 出品 | 公眾號 QbitAI
4月12日晚,量子位·吃瓜社邀請到猿輔導MSMARCO冠軍團隊,為大家詳細講解了RACE,SQUAD,MSMARCO等主要閱讀理解任務,重點拆解MARS網路模型,簡明扼要地教大家動手用MARS網路模型解決MSMARCO機器閱讀任務。
本期主講人為猿輔導NLP團隊負責人柳景明,同時也是MSMARCO參賽團隊的主要團隊成員之一。2011年碩士畢業於北京大學;2014年加入猿輔導,主要負責搜索及NLP相關技術。多次單人獲得KDD-CUP(國際知識發現和數據挖掘競賽)競賽獎金。
猿輔導是國內領先的K-12在線教育公司,目前公司估值超過10億美元,擁有「猿輔導」、「猿題庫」、「小猿搜題」、「斑馬英語」、「小猿口算」等多款核心在線教育APP應用,提供包括自適應題庫、拍照搜題、在線輔導在內的眾多在線教育功能和產品,服務全國超過1.7億中小學生用戶。
本次分享反應熱烈,量子位應讀者要求,將詳細文字筆記整理如下:
典型的機器閱讀任務
第一部分是典型的機器閱讀任務。
問答系統是自然語言處理里的一個非常重要的方向,目前已經積累了二、三十種語料,我將這些語料分成三類:
第一類是開放式問答系統,這部分的語料的特徵:它有問題和相應的答案,類似一站到底或者沖頂大會的題目;
第二是填空式問答系統,一般是從段落中挑選出一個詞或者一句話,再加入候選項。要求系統能夠填入正確的選項。這種語料類似英語考試中的叫完形填空,只是完型填空會更加難。這些填空式問答系統語料相對而言比較簡單。比如CNN這個問答語料,去年有人發表過一篇論文,作者用一個非常簡單的模型就獲得大概75%的準確率。
第三類是複雜問答系統,後面會提到RACE、SQuAD、MS-MARCO等語料。百度去年發布了一個閱讀理解的語料DuReader,它的格式和MS-MARCO相似,只是MS-MARCO是英文,而百度DuReader是中文。最近科大訊飛也發布了一個類似SQuAD的,基於維基百科的中文問答式語料數據集。
RACE數據集
我們來看下由CMU大學去年發布的RACE數據集,它是英語考試中的閱讀理解。這個語料包含一個材料,然後有幾個問題,每個問題有一個題干以及四個選項,要求系統能夠將四個選項正確地填入。
在CMU的論文裡面,他們發布了一個baseline模型,這個模型準確率大概在45%左右,這個準確率實際上是比較低的,因為這個語料的難度非常大。
SQuAD數據集
SQuAD是由Stanford大學發布的,這個語料由一個材料、一些問題以及一些答案組成。
這些答案來自於高頻的維基詞條,Stanford團隊挖掘了這些高頻維基詞條,將每個段落作為材料,然後通過眾包的方式讓一批人針對這個材料寫自己感興趣的問題,然後根據這些問題讓另外一批人去材料裡面去圈答案,他們要求答案必須是材料里一個完整的片段。
有什麼好處呢?一方面可以使數據生成更加方便,因為可以儘可能地減少人主觀上的一些影響;另外一方面也會使模型的評估更直接、更容易理解。
Stanford在學術界有很強的號召力,所以有很多團隊也在追逐這個數據集。在早期的時候是一些學術團隊在上面提交模型,而最近半年內,更多的是一些企業界在提交一些更加強的模型,比如國內的科大訊飛、阿里巴巴、騰訊,以及國外的Google。猿輔導在今年3月6號提交了一個單模型,當時的單模型排名是第三,總體排名是第六。
MS-MARCO數據集
接下來看MS-MARCO這個語料,MS-MARCO語料實際上是有一個更加豐富的場景:當我們遇到一個問題之後,我們會將這個問題放到搜索引擎裡面去檢索,搜索引擎會給我們返回Top 10的結果,我們人會根據Top 10結果去瀏覽網頁,然後去尋找到我們需要的答案。這個過程就分為兩步:第一步是檢索,第二步是人查找答案的過程。
微軟發布這個語料的目的非常簡單:能不能夠用機器的方式在摘要裡面去查找到問題的答案,這樣就省去了人查找答案的過程。
這個數據集格式包含了第一部分是query,query是用戶的真實查詢,大部分是疑問句,還有小部分名詞短語;第二部分是材料,實際上是Top 10結果的摘要,這裡寫的是passages,但是它在文章中並不是一個連續的段落,它更多的是通過摘要演算法從文章中摘取的幾段話然後拼接而成。
MS-MARCO語料與SQuAD語料
簡單地比較一下MS-MARCO語料和SQuAD語料之間的區別。
首先是段落的數目:在SQuAD里,每個query只有一個段落;而在MS-MARCO裡面每個query有多個段落。
平常我們在搜索的時候有一些經驗,其實有些問題它可能在多個文章中出現,這就涉及到了答案融合。還有可能同樣的答案在多個passage里出現,這個時候可以通過結合多個passage的預測結果做一些結果後處理(post-processing),這樣能夠幫我們提高模型的效果。
第二部分是關於answer,在stanford的這個語料裡面,它要求答案必須是材料的一個子片。大多數模型都會選擇一個指針網路去預測答案的起始位置和終止位置,但是MS-MARCO語料不是這樣,它並沒有對答案做約束,這個答案是由人工編輯的。
從直觀上來講,我們在選擇模型的時候要選擇一個端到端的生成式模型,我們輸入的是query和passage,輸出的是答案。但是這個語料的大小比較有限,在MS-MARCO的第一版本里訓練的語料只有80k,我們覺得80k的語料很難支撐一個端到端的生成式模型。
另外我們分析了大量的case發現:雖然這些答案是由人自己去編輯的,但是它和文章之間有非常大的還原度,所以最後選擇了和SQuAD類似任務的方式,將問題做了一個簡化:還是去預測答案在文章中的位置,在訓練的時候我們的訓練label是每個passage中和答案最相似的片段。
接下來簡單分析一下MS-MARCO。
首先是關於數據集,第一版有100K的數據並且按8:1:1劃分,其中10K左右的數據作為評估數據。和SQuAD不一樣的是,微軟這個數據集是開放的,所以模型可以在本地上進行測試,只需要最後提交模型輸出結果。
而SQuAD實際上是一個黑盒子,需要提交我們的模型,模型有大量需要預處理的詞典,規模非常大,這樣提交就不是很方便,並且codalab平台也不是非常穩定,我們3月6號在SQuAD提交的結果其實是2月5號做出來的,只不過在提交過程中有各種各樣的問題,最後和stanford那邊溝通過很多次才跑出結果。
上面這兩張圖是關於數據的簡單分析,左邊是關於query的,這裡用了一些特殊疑問詞統計query的分布,主要的query是what,就是說查詢什麼是什麼;第二多的詞是how,一般是how many、how much或者怎麼做等這三種類型,這兩個佔了60%左右。所有的特殊英文句一共佔了70%左右,還有5%是屬於一般疑問句,對一般疑問句的回答要不是yes要不是no,剩下的25%的是名詞短語。
答案和材料
現在我們來看下答案和材料之間的對比,這裡將答案和材料的關係分為五類:
第一類是答案完全在材料里,是材料的一個片段。這部分可能和SQuAD是一樣的,這部分語料佔比是非常大的,大概佔60%,如果我們再加上一些微小的差異的話這個比例就可以到80%;
第二類是答案中所有的詞都在材料里,但是分布在不同的位置。這部分對我們模型而言是比較難的,它們的case也比較少;
第三部分是答案的詞有一部分在材料里,一部分在問題里,因為有時候在回到問題的時候,為了讓我們的回答更加完整,我們會去引用問題里的詞;
第四部分是答案中有些詞既不在材料里也不在問題里,這是因為眾包的人有各自的語言習慣,有時候他們回去自己組織語言,用一些同義詞去描述這個答案。
相對而言,下面三種語料在我們的case里佔比非常小。最後一類是答案中所有的詞都不在材料或者問題里,這裡主要是一般疑問句,因為對一般疑問句的回答一般是yes或者no,根據我們搜索的經驗,這些詞肯定不會在材料里出現。
評估指標
接下來看一下評估指標,在這個任務裡面有兩個評估指標:ROUGE和BLEU。
首先看一下ROUGE,它的依據實際上也是一個最長的公共子序列,然後它通過計算出來的最長的公共子序列來計算召回率和準確率,然後通過一個平滑函數得到一個評估值。
第二種是BLEU,BLEU實際上是在機器翻譯裡面用得非常多的一個評估指標。因為在機器翻譯裡面我們也需要去評估不同的翻譯系統的好壞和翻譯出來的文本是否是一句話,也需要去計算兩句話之間的一個相似度,一個模糊的匹配度。
BLEU演算法有兩部分:首先看後面的這一部分,它實際上是我們預測結果的一個準確率,我們看下面的公式,這個的分母實際上就是你的預測結果裡面有多少個詞,這個詞可以是1-gram、2-gram、3-gram、4-gram。
分子是說我們預測出來的詞有多少是在答案裡面,然後整個公式實際上就是計算我們預測結果的準確率,如果說只有最後面一部分的話,那麼我們的系統就會傾向於提供一些比較短的答案。所以為了懲罰這種情況,我們認為如果預測的答案和真實的答案之間的長度存在差異,那麼就可能存在信息的缺失,然後就會對長度做一個懲罰。如果預測的結果沒有真實的答案長的話,那麼就會用一個指數公式去做懲罰。
開放式問答系統
接下來看一篇關於開放式問答系統的論文。
這個論文實際上是為了解決開放式的問題,論文里有兩部分:第一部分是檢索系統,第二部分是閱讀理解。
檢索系統會在Wiki語料中建一份索引,任何一個問題來之後,首先去檢索這個索引得到Top N query相關的一些材料,再用一個閱讀理解的模塊,然後去從這個材料裡面去找到答案所在的位置。
總體來講這個系統的準確率比較低,大概是35%。從現在看的話,可能這個系統對於開放式的問題而言,是一種比較現實的解決方案。而我們今天要講的MARS(Multi-Attention ReaderS)其實也是試圖去解決第二部分,然後提高第二部分的準確率。
整個網路的基本結構
接下來介紹整個網路的基本結構,將網路分成了三層:輸入層、多輪交互層、預測層。
在輸入層之前介紹下Transfer Learning。對於深度學習來說,一般認為在這個深度學習的網路裡面,淺層的網路一般是在挖掘一些泛化的特徵;與任務層相關的網路,更多的是挖掘與任務相關的特徵。
淺層的網路挖掘出來的可泛化的特徵,是不是可以在其他的任務上使用呢?如果通過Transfer Learning,新的任務就可以在淺層的網路藉助已經訓練好的參數,而我們在做模型訓練的時候,只用關注與新任務相關的特徵,就能提高模型的學習效果。
通過機器翻譯的方式做Transfer Learning
首先通過機器翻譯的方式去做Transfer Learning。這個圖上是一個簡單的機器翻譯框架,輸入英語,輸出中文。
一般的機器翻譯的模型會有兩部分:Encoder,是一個雙向的RNN;然後是Decoder,將Encoder得到的信息,通過Decoder翻譯成目標語言。這個Encoder的隱藏層除了包含這個詞的輸入信息以外,還包含這個詞的上下文的信息,它的信息實際上比我們以前用到的詞向量更加豐富。
這是去年McCann團隊發布的一個開源的預訓練網路cove,用於機器翻譯的雙向RNN網路,左邊是訓練框架,輸入是詞向量,選擇的是Stanford的300維的詞向量,然後經過Encoder層和Decoder層做最終的預測,這樣通過翻譯的語料就可以得到一個已經訓練好的Encoder層。
解決一個新任務的時候,可以將Encoder層和詞向量一起作為這個任務的輸入,輸入信息就會更加的豐富。
現在應該有非常多機器翻譯的語料,所以Encoder層的信息實際上是會非常豐富的,它也會非常大地提升新任務的效果。
通過語言模型做Transfer Learning
第二種是通過語言模型做Transfer Learning,上面這張圖是一個RNN的語言模型,輸入是一個詞,然後輸出的是下一個詞。輸入的這個詞首先經過詞向量,再經過一個RNN隱含層做softmax之後去預測下一個詞。
同時也可以看到隱層的信息,它包含詞的一個輸入信息,同時還有從詞的前端傳過來的一些文本信息。一般情況下會去訓練一個前向的RNN的語言模型和一個反向的RNN的語言模型,這樣可以得到一個上下文的文本信息。因為語言模型它的數據成本更小,所以說我們可以用更多的數據來訓練語言模型,實際上效果也很好。
網路結構
接下來看一下網路結構,一共分為三層:輸入層、多輪交互層、預測層。從下往上看,在輸入層會將所有抽取出來的特徵過一個雙向的RNN網路,然後對Question和Passage都做同樣的操作。這裡要注意,每一個Question實際上有多個Passage,對每一個Passage都會做相同的操作。
首先是輸入層,裡面有比較常見的詞向量信息,還有通過Transfer Learning得到的一個機器翻譯的RNN隱藏層信息,和語言模型得到的RNN隱藏層信息。
後面有關於詞性和命名實體識別的一個Embedding,是因為我們語料相對而言比較少,所以說有大量的詞出現的次數非常少,所以說會有一些泛化的pos或者NER去做一個Embedding,這樣可以解決一部分這些詞學習不夠的問題。
最後是一個手工的feature,叫做word match,也就是去標識Passage裡面的這個詞是否在Question中出現。答案出現的位置一般都是在Query詞的附近,然後將所有的輸入信息一起經過一個雙向RNN。
介紹一個非常有用的操作:word dropout。對輸入的Passage的詞用大概5%的概率將它們置成unknown,這樣可以進一步地防止模型的過擬合。
接下來是多輪交互層。在多輪交互層裡面,首先去計算這個Question裡面每個詞和Passage裡面每個詞的一個相似度,再將相似度做一個softmax的歸一化。得到Passage的Attention信息之後,將這個信息和原始Passage的信息一起交給雙向的LSTM,得到新的Passage編碼。
對Question也會做一個雙向的LSTM去得到新的一個編碼,將這個Attention的過程重複迭代T次,得到多輪的關於Question和Passage的編碼信息,再經過一個雙向的LSTM得到最終Question的表示和Passage的表示。
接下來是預測層。在預測層里我們會去計算每個Passage包含答案的可能性。如何計算呢?
首先,已經有了Question裡面每一個詞的表示,然後根據Question的每一個詞表示得到Question整體表示。
我們用的是Self-Attention方式,首先去計算Question裡面每一個詞的權重,然後將所有隱層信息加權得到Question的表示,對Passage也是一樣,用相同的公式去得到這個Passage的一個表示,再將Question信息和Passage信息做一個卷積,然後做softmax就可以得到每個Passage包含答案的概率。
在這裡要講的就是關於Passage的信息,除了通過下面Self-Attention得到Passage的隱層信息以外,還有我們自己提取的一個特徵:Site Embedding。
為什麼會用到Site的信息呢?因為我們考慮到不同的站點包含答案的可能性不一樣。我們計算出每個Passage的這個權重之後,將Passage的權重分發給裡面每一個詞的隱層信息,那麼裡面每一個隱層信息都會分享相同的權重,然後對權重做加權,得到最終我們Passage里每一個詞的表示。
得到Passage里每一個詞的表示之後,通過指針網路去預測答案的起始位置和終止位置,然後計算Question裡面每個詞和Passage裡面每一個詞的相似度,再做softmax,得到start和end的概率。
加入的其他功能
為了使系統的效果更好,我們還加入了一些其他的功能。
首先是多任務學習,多任務學習就是在輸出層除了主要任務以外,還會加入其他的一些預測任務來幫助訓練模型。
加入更多的預測信息,能夠幫助模型得到更強的學習能力。而且有時候這些輔助任務的預測信息還可以幫助最終模型的輸出。
首先看一下多任務,我們主要的任務是去預測答案所在的位置,然後在Passage裡面去計算和答案最相似的一個片段,我們會將這個片段作預測目標。在這個預測目標下面,Golden Span實際上是對整個問題的簡化。
為了使任務和真實的目的一致,又加入了其他的一些輔助任務,比如說在這裡面我們會去描述一個詞,看它是否是在答案裡面,因為在Golden Span里,實際上有些詞不在答案里。
第二個是預測Passage是否包含了Golden Span,這個地方在之前的模型裡面也提到過,我們會去計算Passage包含答案的概率。他們的計算方式相似,但是作用不同,這裡的passage的任務會給模型輸出一個Loss,然後去幫助模型的訓練。而在之前的模型裡面,是通過修正模型的隱層信息,使其更加合理。
最後是關於這句話是否包含了Golden Span,為什麼會有這樣一個任務?因為Golden Span計算有一些天然的缺陷,重新來審視Golden Span,它要求和答案最相似的一個片段,那麼有兩部分,第一部分就是一個最長公共子序列,要求包含的最長公共秩序的這個子序列最長。
第二部分是希望計算出來的最長公共子序列的Golden Span儘可能短。那麼會有一個問題:Golden Span的第一個詞和最後一個詞都在答案裡面,也就是說Golden Span很有可能只是答案里的一個子串,它的長度是要比真實的答案短,它並不是一個真正意義上的答案的起始位置和終止位置。所以我們加入了檢測Sentence是否包含Golden Span這一部分,試圖減少主任務的影響,幫助模型學習。
這些任務可以幫助原始任務的學習,主要的任務是對原始任務的簡化,我們加入輔助任務之後,使模型更加的合理,也可以給模型一些依據,以便於評估最好的答案。
EMA
接下來是EMA(Exponential Moving Average)。EMA實際上是在股票裡面用得非常多的名詞,每天股價都在波動,而我們為了看股票價格的走勢,會畫一個相對而言比較平滑的曲線,這個曲線一般會用EMA的曲線。
下面這個圖裡波動非常劇烈的這條線,可以看作是股價在每天的波動,而這裡邊有兩條線:一條是紅色的線,一條是藍色的線。紅色的線是一個簡單的SMA(Single Moving Average),是一個簡單的平均曲線,它的計算方式是將前七天的數據做一個平均,得到一個平滑的點。
這樣計算的壞處是什麼?就是在對待前七天數據的時候,每一天的權重是一樣的。在看股票走勢的時候,可能我們更關注的是它當前的價格,距離當前信息越遠的信息應該權重越小。
EMA就是來解決這個問題,它加入了一個指數的衰減,會對當前的價格取一個權重,然後越往前的權重越小,呈指數地衰減。所以EMA比SMA能更好地去描述股票的價格。
模型提升
那怎麼樣去幫助模型提升呢?在模型訓練的時候有一些假設,比如說是按照一個batch、一個batch去訓練模型,假設每一個batch的分布和真實樣本的分布是比較一致的,那麼通過一個batch、一個batch去更新參數,就具有合理性。
但在模型裡面,因為數據非常大,在batch的設置的時候會非常的小,導致數據的分布差異很大。如果每一個batch的數據差異非常大,最終模型的輸出就可能和每個batch之間的順序相關。為了弱化這種影響,我們會在模型的訓練中間,計算EMA的狀態,然後更新,再用最終的EMA的信息去預測待評估的數據。在一般情況下EMA的模型會比原始模型更加穩定,效果也會好一點。
多文檔投票
指針網路是可以計算出來全局最優的答案文本,那為什麼會有多文檔的投票?我們都會有一些經驗:在搜索的時候,發現搜索答案好像在每一個Top10的網頁裡面都有。每一個網頁的Passage都可能會有一個候選的答案,這些候選的答案,實際上是可以幫助我們做結果糅合。
在這裡面,假設有N個候選結果,怎麼樣根據N個候選結果去挑選一個最終結果呢?
有一個評估的公式,公式里有兩部分:
第一部分是原始的指針網路得到的分數,第二部分是其他的結果對當前結果的支撐度。這個指針網路的分數,實際上就是這個答案在文本中start概率和end概率相乘。
投票的信息怎麼理解?假設其他的結果如果是真實的答案,當前的這個結果期望得多少分?我們希望系統去選擇一個期望得分最高的文本,這樣我們的模型在評估的時候會效果更好。
ROUGE的公式裡面左邊是預測結果,而右邊是我們假設的真實答案,考慮到每個Passage產生的結果的概率不一樣,那麼用到他們在指針網路裡面得到的分數作為概率。
這裡面有一些平滑公式,首先要求評估分數儘可能考慮兩邊的因素,我們會加一個非常大的平滑,使Span分數的影響會儘可能小。
這種方法和簡單的計數有什麼區別?我們在做簡單計數的時候,會去算每條結果出現的次數,然後選擇一個次數最高的。但是對於一個文本而言,越短的文本在多個文檔中出現的可能性越高,越長的文本很難在多個文本中出現。
通過一個簡單的計數器,預測出來結果就會偏短。BLEU演算法實際上會對答案的長度做一個非常大的懲罰,如果用簡單的計數器的話,模型BLEU的值就會非常的低。
再就是Ensemble,我們的Ensemble非常簡單:大概訓練了12個單模型,每個單模型的種子不同,其他都是一樣,再通過簡單的投票,選擇了一個最好的結果。Ensemble的ROUGE比單模型的效果好大概一個點。
Q&A
語言的Transfer Learning裡面兩個RNN隱層的貢獻,ELMO的貢獻實際上是COVE的貢獻比較大嗎?
其實我們公司主要是在做SQuAD的,3月6號我們的SQuAD得到一個排名之後,花了大概半個月的時間做MS-MRACO的語料,所以在MS-MRACO這個語料上沒有做非常細的一些結果分析。
在SQuAD上,COVE這個語料,通過機器翻譯預訓練RNN的隱層大概可以提升1.5%左右,就是F1的值可以提高1.5%,語言模型可以提高2%左右,也就是提高兩個點的F1。
你們有這麼多的任務,每個任務選擇一個什麼樣的權重?關於這個任務的Loss函數是怎麼設計的?
這個Loss函數,實際上也是用Softmax,去計算Loss。關於每個任務的權重,我們主要的任務是1,然後輔助的任務的話一般是0.1或者0.2。
關於平滑函數的選擇
我們在平滑函數裡面,因為Span的得分是依據指針網路的結果,我們通過Softmax算出來start概率和end概率之後,每一個候選答案的差異實際上就會非常大,所以我們大概是開了四次方。
多任務怎樣調每個task?
多任務應該是調task的權重,主要任務是1的權重,其他的任務就是0.1和0.2,沒有做過多的調整。
訓練時間有多長?機器是怎樣的?
訓練大概是花了三天的時間。因為語言模型是最慢的,算ELMO語言模型的時候非常慢,大概是要花三天,大概有20個epoch左右。
相關學習資源
以上就是此次猿輔導柳景明帶來分享的全部內容,在量子位公眾號(QbitAI)界面回復「180419」可獲得完整版PPT以及視頻回放鏈接。
P.S. 量子位·吃瓜社將持續帶來線上的技術分享,歡迎大家關注~
—完—
誠摯招聘
量子位正在招募編輯/記者,工作地點在北京中關村。期待有才氣、有熱情的同學加入我們!相關細節,請在量子位公眾號(QbitAI)對話界面,回復「招聘」兩個字。
TAG:量子位 |