現(xiàn)在一提到聊天機器人,大家就會想起各種算法模型,端到端、生成式、深度增強學習。有一種給我足夠多足夠好的數(shù)據(jù),我就能用算法突破圖靈測試的風范。可恨的是,就是沒夠多夠好的數(shù)據(jù)。相對于英文,中文可用的公開數(shù)據(jù)集少之又少。
在聊天機器人里,可用的公開對話數(shù)據(jù)就更少了,比如閑聊類的也就小黃雞、華為微博數(shù)據(jù),而且這些數(shù)據(jù)也都還不夠好。不論是公開數(shù)據(jù)還是自己抓的各種數(shù)據(jù),使用前的清洗都是必須的。清洗數(shù)據(jù)是個苦活,數(shù)據(jù)量大時就算投入大量人力也未必有好的產(chǎn)出。本文介紹愛因互動正在使用的一種數(shù)據(jù)清洗方法,我們稱之為Data Purification Framework(簡稱DPF)。DPF是無監(jiān)督的,所以基本不需要人力投入,但終清洗效果還不錯。雖然本文名為對話數(shù)據(jù)清洗,但此方法其實可以用在很多其他場景。
DPF的理念很簡單,利用不靠譜的數(shù)據(jù)訓練一個模型,這個模型在訓練集上準確度通常都很低(如果訓練集上已經(jīng)完美擬合,那這個方法就不能直接用了)。用訓練好的模型把不靠譜的那些數(shù)據(jù)(預測與實際差的遠)刪掉,然后利用剩下的數(shù)據(jù)訓練新的模型,之后再用新模型把剩下數(shù)據(jù)里不靠譜的一些數(shù)據(jù)刪掉,如此重復,直到模型在訓練集上達到較高的準確度。這時候被篩完剩下的數(shù)據(jù)可能比較少了。
為了召回一些被早期模型誤過濾掉的樣本,我們把新的模型應(yīng)用到原始的全量數(shù)據(jù)上,這樣去除不靠譜的數(shù)據(jù)后會留下更多的數(shù)據(jù)用于接下來的迭代。之后的迭代邏輯和前面的相同,利用模型清除不靠譜的數(shù)據(jù),再用清洗后的新數(shù)據(jù)訓練新模型。類似此方法的思想在很多地方都出現(xiàn)過,比如一些半監(jiān)督擴充數(shù)據(jù)的場景。DPF框架圖如下:
這個方法有效的一個關(guān)鍵是用于識別數(shù)據(jù)靠譜性的匹配模型(圖中的Matcher),需要找到合適的匹配模型來統(tǒng)一衡量每個樣本點的靠譜性。這個匹配模型不一定和數(shù)據(jù)清洗后終被使用的模型一致。
對DPF框架圖中的主要組件(下圖)做個簡單說明。
小黃雞數(shù)據(jù)
小黃雞數(shù)據(jù)是小黃雞與用戶的聊天qa對,包括了35w+ qa對。除了很多黃暴的樣例,還有很多答案與問題壓根不匹配的樣例。一些樣例見下圖,每行中左邊是問題,右邊是答案。我們的初衷是使用小黃雞數(shù)據(jù)來訓練seq2seq閑聊模型,但直接使用效果很差,而且還容易生成罵人的答復。
選擇Matcher模型
在具體清洗流程開始前,還需要確定使用什么模型作為DPF中的Matcher模型。 對于qa對話數(shù)據(jù),我們發(fā)現(xiàn)dual encoder模型是一個好的選擇。dual encoder首先利用RNN把問題和答案都向量化,然后以這兩個向量的匹配程度來說明這個問答對的匹配程度。
接下來說明清洗小黃雞對話數(shù)據(jù)的具體流程。
清洗流程
在訓練Match1.0時,我們把所有的小黃雞qa對作為正樣本,然后隨機抽取一些q和其他的a生成相同數(shù)量的負樣本。從預測準確度來看,Match1.0在訓練集上只能到0.75左右,在測試集上大概0.65,很差。
把訓練好的Match1.0用于預測其訓練集中的所有正樣本(也即原始的小黃雞qa對),并按照預測的匹配概率對qa對進行排序。然后把匹配概率低于某個閾值的qa對全部刪掉(如果刪除過多,可以設(shè)置一個刪除的高比例)。比如在這里我們設(shè)置了0.5的匹配閾值。
以上一步清洗后的數(shù)據(jù)作為正樣本,隨機產(chǎn)生等量的負樣本。利用這些正負樣本訓練Matcher1.1。把訓練好的Match1.1用于預測其訓練集中的所有正樣本,并按照預測的匹配概率對qa對進行排序。然后把匹配概率低于某個閾值的qa對全部刪掉(如果刪除過多,可以設(shè)置一個刪除的高比例)。這個流程跟上面一樣,但這里的匹配閾值可以設(shè)置得更高,比如0.6,因為此時訓練數(shù)據(jù)和模型都比Matcher1.0更好了。Match1.1在訓練集上的準確度能到0.82左右,在測試集上大概0.7。
和上面的流程一致,對上面清洗好的數(shù)據(jù)做進一步的清洗。此時的匹配閾值可以再高點,比如0.7。Match1.2在訓練集上的準確度能到0.89左右,在測試集上大概0.76。
這個循環(huán)繼續(xù),直到Matcher1.x在訓練集上的準確度達到預設(shè)值(比如0.98),或者被清除的數(shù)據(jù)量低于預設(shè)數(shù)量,或者迭代次數(shù)達到預設(shè)值(比如10次)。在這個過程中,匹配閾值可以設(shè)置得越來越高,高可以到0.9甚至0.95。因為后面模型的精度逐漸變高,所以閾值更高也不會刪除很多數(shù)據(jù)(應(yīng)該讓被清除的數(shù)據(jù)量逐漸降低)。在小黃雞數(shù)據(jù)上,Matcher1.8在訓練集上的準確度超過了0.98。它的訓練集里的正樣本只有清洗后剩下的7w+條qa對。
迭代到這步,其實可以像之前的迭代那樣對訓練數(shù)據(jù)進行清洗,然后把剩下的數(shù)據(jù)作為我們終的數(shù)據(jù)結(jié)束整個清洗過程。但很多時候我們希望能從已被清洗的數(shù)據(jù)中再找回一些靠譜的數(shù)據(jù)。畢早期用于清洗的模型本身也并不是那么靠譜。 所以我們可以把Match1.8用于初的全量數(shù)據(jù)上,預測它們的匹配概率。這就是框架圖里列到第二列的連接線。和之前的步驟一樣,按匹配概率排序,把低于設(shè)定閾值的樣本去掉。小黃雞里如果我們設(shè)置閾值為0.9,清洗后可以剩下11w+的qa對。下圖中展示了一些匹配概率低(左上角紅框)和高(右下角藍框)的樣本。每行代表一個樣本,格式為問題||答案||匹配概率值。可以看出區(qū)分度還是很明顯的。
清洗后的結(jié)果數(shù)據(jù)可以作為終結(jié)果返回,也可以進一步進行提純,把它作為Matcher2.1的訓練集,繼續(xù)迭代……
實際運行時,我們在小黃雞數(shù)據(jù)上跑到Matcher1.8就結(jié)束了,在微博數(shù)據(jù)上我們跑到了Matcher3.5,訓練集上的準確度達到0.981。
DPF的清洗過程雖然無需人工干預,但每步迭代都需要重新訓練模型,在數(shù)據(jù)量大時整個過程還是很耗時的。一個降低訓練時間的方法是每次訓練新模型時,把其參數(shù)初始化為前一個模型的訓練結(jié)果。
我們把上面Matcher1.8清洗獲得的7.1w+小黃雞qa數(shù)據(jù)作為訓練集,以單字模式訓練seq2seq+attention對話生成模型。
下面是一些模型結(jié)果(我們對基本模型做了一些改進,具體請見我們之后的文章)。其中Q表示問題,A表示使用beam search產(chǎn)生的topN答案,A后面的數(shù)字表示序號,比如A2表示排名第二的結(jié)果。
注:有些候選結(jié)果被某些后處理步驟過濾掉了。
本站文章版權(quán)歸原作者及原出處所有 。內(nèi)容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構(gòu)成任何投資及應(yīng)用建議。本站是一個個人學習交流的平臺,網(wǎng)站上部分文章為轉(zhuǎn)載,并不用于任何商業(yè)目的,我們已經(jīng)盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯(lián)系我們,我們將根據(jù)著作權(quán)人的要求,立即更正或者刪除有關(guān)內(nèi)容。本站擁有對此聲明的最終解釋權(quán)。