當前位置:
首頁 > 科技 > 多輪對話機器人打造:話題意圖識別

多輪對話機器人打造:話題意圖識別

引言

回顧一下自己參與的智能客服系統項目,從技術調研到遊戲領域的對話文本數據分析和任務細分定義,再到建模調優以及最後的運營優化等整體流程的學習,收穫良多。一般的智能客服系統包括三大模塊,具體系統結構圖如下:

對話系統整體結構圖

對於多輪任務型對話,首先需要理解用戶主要說了啥,怎麼說的以及對話的邏輯流程,並藉助於對業務的理解以及對話文本的數據分析,抽象出對用戶發言的語義理解定義,也即是語義理解模塊。本篇主要是講述意圖識別的技術知識。在我們的業務場景中,意圖細分成了2層的層級意圖結構,也即話題意圖以及在每個話題下的用戶行為意圖,也可以理解為每種話題意圖相當於一個Chatbot。所以,話題意圖的識別效果對後續流程影響較大。

話題意圖識別屬於文本分類任務,在我們的遊戲安全場景中,定義了7種話題類別,包括安全模式、被盜、失誤、封號、信用、舉報,以及常用性發言。對於常用的文本分類任務,我們抽象出了一個通用的處理流程,從文本預處理,到尋找經典話術,也即是能覆蓋到大部分用戶發言的話術;然後基於經典話術人工打標,並根據文本相似性的方法來自動化擴展標籤數據集,構成訓練集合。這一構建監督訓練數據集的方法,較適用於缺乏人力,又想更好地覆蓋原始數據的分布的情況。最後,基於各種特徵抽取器構建模型並調優。其具體流程結構如下圖,其中虛線部分是從數據和模型兩個層面不斷優化分類效果,其中圖中紅色的2、3點是從數據層面來修正部分樣本的標籤以及獲取更多的標籤樣本,紅色的 1點是從模型結構來優化性能。

常見文本處理任務通用流程圖

上圖中的抽取經典句子模塊的目的是使得經典發言集合能夠覆蓋更多的用戶發言集合,做到以經典話術代表絕大部分的語義。主要做法是基於主題模型、基於句子向量的無監督聚類、基於文本向量相似性構建的圖數據並結合PageRank和圖連通分量等方法的集成,能夠從上百萬的用戶發言中共同找出少量的代表性發言,其數量在幾千到1萬多。

上圖中的標籤樣本的自動化擴展模塊主要是通過文本向量的相似性技術來做擴展,主要是基於編輯距離、基於關鍵詞權重的加權詞向量、Seq2Seq-AutoEncoder和BERT的句子向量相似性並結合閾值的方式來擴展標籤樣本。然後通過過濾操作棄掉一些badcase,主要是基於否定詞和關鍵詞(主要是針對短句,相似對中差集中含有一些表達話題語義的關鍵詞)做過濾,最後按照每條種子樣本自動化標記的情況分層抽樣一部分自動標記的數據,通過人工簡單審核,視情況修正。對於沒有標記上的發言樣本,可以重複抽取經典發言然後再自動化標籤擴展的步驟來不斷迭代得到更加大量和多樣化表達的標籤語料集合。

上圖中的編碼器和特定任務部分,就是基於特定任務構建學習模型,對於神經網路來講,是各種可以抽取文本語義表示的神經網路編碼器。下面將從樣本處理、模型構建、模型效果優化等方面詳細介紹下話題意圖分類模塊。首先,本話題意圖原始數據是基於遊戲中一段對話的場景來打標籤的,訓練集樣本的標籤準確度不高,因此需要對樣本做標籤修正的預處理來提純樣本標籤。

話題意圖分類模塊構建

1. 分類模塊的具體構建流程

數據預處理:通過基於關鍵詞和短語結構的正則表達式、自動化標籤擴展模塊這2種方法,清理不純樣本和修正錯誤樣本標籤最終得到7 種topic類別(一般、安全模式、被盜、失誤、封號、信用、舉報)的數據, 約92w左右。

通過新詞發現模塊把遊戲名、裝備名、地區名等名詞加入到Jieba詞表中;然後做帶詞性的切詞,同時把句子切詞後含有的遊戲專有名詞和遊戲地區名替換為GameName、AreaName等通配符。這個Trick是為了減弱無關詞對分類的影響,因為這些專有名詞會在被盜、封號等類別中經常出現,影響分類效果。

基於全量數據使用Word2vec演算法來預訓練詞向量、詞性向量。

輸入詞編號和詞性編號,載入預訓練好的Embedding向量參數,訓練基於兩層CNN Highway結構的文本分類模型,保存驗證集合中準確率最好的模型。

模型多標籤分類預測時,取預測概率值最高的類別,但當所有類別的預測概率都小於0.3時,判定為common。經測試,此策略比單獨取預測概率最高的類別返回,效果更好。因為話題模型是一個入口模型,決定著後續任務將交給哪一個類別的Chatbot處理,其中common類別是不觸發具體的任務型Chatbot;所以採用寧可放過也不願意錯判的策略。

註:各個topic單獨設計基於正則表達式的前置過濾規則,可配置過濾badcase,便於安全運營,待積累一段時間的錯判語料後,再更新線上的話題分類模型

2. 模型結構介紹

我們嘗試了4、5種不同RNN、CNN以及Attention等組合結構的深度學習文本分類結構。從我們的應用場景出發,用戶發言一般是短文本,長度大多在幾十個字內,關鍵詞和短語對分類顯著的作用,同時基於處理效率和性能的考慮,最終採用CNN的模型結構。CNN結構具有位置平移不變和局部特徵組合的特性,多層CNN能夠擴大感受野,組合更長的局部短句,然後經過池化層獲取需要的顯著特徵。我們的模型是兩層CNN結合Highway網路的結構。在卷積層中,採用了1,2,3,4四種不同寬度的一維卷積核,同種卷積核操作會操作兩次,也即兩層CNN。池化層後再接一個Highway層。Highway層可以更大程度地池化後的重要特徵。Highwigh網路層的公式如下:

基於CNN分類模型的具體結構圖如下:

基於CNN的Topic分類模型

效果評估:

我們對比了是否使用Highway層以及1,2,3不同層CNN結構的效果差別,最終是上圖的結構效果最好。由於是上年做的項目,不同模型的效果對比找不到了。下面只給最終的模型評估。從訓練集合隨機抽取的測試集合(27521條數據),模型預測並結合線上規則的預測結果, 採用微平均(micro-average)的整體評估指標值如下:

Accuracy

Recall

F1_score

話題熱詞分析:

對於抽取每個topic下的熱詞,可以使用傳統的TF-IDF、詞性、Text Rank、句子語法和語義結構等方法做熱詞抽取、過濾和重排等操作。也可以使用基於注意力機制的神經網路模型,或者兩者做結合。我們是基於話題意圖語料,利用RNN Attention模型在做分類預測的時候,得到每個詞的注意力權重,然後根據權重值提取熱詞,具體做法如下:

(1)訓練基於RNN-Attention結構的分類模型,流程同上。

(2)基於小天部分線上經典發言,利用注意力機制的分類模型做預測,然後取出網路結構中的權重層,最後累加各個詞語的權重,排序得到各個topic下有顯著特性的關鍵詞。

(3)基於RNN-Attention模型結構圖如下:

基於Multi-head自注意力機制的意圖分類模型

由於注意力機制層,採用了多重的Self-Attention,本模型中是設置了5個不同矩陣參數,所以學習到5種不同的表達特徵,然後對發言中同一個詞語的5種權重值做求和取平均操作,得到發言中各個詞語的最終權重,這樣既考慮了詞語的出現次數和在句子中的重要性。單頭Self-Attention是沿用早期翻譯中的注意力機制原理,單頭自注意力機制的公式如下, 其中H是輸入向量:

(4)各個話題抽取的熱詞效果如下:

common(3777句):什麼, 你們, 沒有, 為什麼, 遊戲, 人工, 承諾, 問題, 不是

aqmode(782句):安全, 模式, 解除, 凍結, 解凍, 微信, 失敗,異常, 綁定, 密碼

beidao(134句):被盜, 找回, 異地, 裝備, 申訴, 登錄, 被盜號, 賬號, 安全, 密碼, 角色, 盜號者,盜號

shiwu(21句):錯誤,失誤, 賽利亞, 了解, 恢復, 跨錯, 找回,回來, 誤操作, 裝備, 分解,看清楚,商店, 優先,小心

fenghao(4062 句):制裁, 解封, 減刑, 封號, 開掛, 申訴, 外掛, 處罰, 禁賽, 賬號, 作弊

xinyong(152句):信用分, 信用, 信譽, 星級, 制裁, 積分, 信用等級, 查下, 幫忙, 為什麼, 一下, 賬號, 多少, 滿星, 四顆星

jubao(134句):舉報, 外掛, 舉報人, 有人, 惡意, 辱罵, 開掛, 炸團, 人頭, 封號, 掛機, 詐騙

可以看到,完全數據驅動的方法得到的效果還可以,但是也有一些badcase,例如xinyong話題中熱詞出現了「制裁」,主要是問「遊戲信用分話題「的發言中,存在一些「多少信用分能夠解制裁」,「賬號被制裁,多少信用分能解」之類的問題。後續可以根據業務需求增加後過濾處理操作。

話題意圖模型的運營優化

1. 在運營優化方面,主要基於badcase來作分析

2. Badcase的分類錯誤原因

發言中含有部分常見詞,在其他Topic中出現,本質是句子中存在片段的 交集,而且交集片段在不同topic中的統計分布 差異大。

訓練集中的label標錯了。

訓練樣本中沒有出現過類似的樣本。

3. Badcase的修正

(1)數據層(樣本的整理):

(2)模型層(時間性能和效果平衡):

(3)規則層(規則粒度的大小(靈活性 維護成本)):

主要是解決模型很難識別的特殊樣本,為每個分類話題分別配置正則過濾規則

4. 構建更大量樣本數據集方法介紹

基於集成模型的方法更快地構造更好、更多的標籤樣本集

在樣本標籤數據的擴展部分,除了可以使用自動化模塊擴展外,還可以基於集成模型的方法來做而二次標籤樣本的擴展,下面是使用一份情感數據做的嘗試:

(1)對9千多樣本數據作為種子, 使用自動化標籤擴展模塊來進行樣本標籤的擴展並經過後過濾處理,一共構造訓練數據7w多條, 分布如下:

(2)對訓練數據, 構建並訓練了4種不同結構的神經網路分類模型,每種模型的準確率如下:

然後對未標記90萬左右數據做做二次樣本擴展。具體做法是:取出4個模型預測標籤相同並且概率大於0.9的樣本作為額外的新增標籤樣本和原訓練樣本合併並去重(避免出現不一致的樣本標籤),同時由於DIRTY和WHITE樣本量過大,做了下採樣操作, 其餘類別做了重複採樣操作。一共得到了24w左右的訓練樣本, 分布如下:

(3)基於全量的訓練數據,最後使用效果最好的第四個分類模型,也即完全基於注意力機制的網路結構(SelfAttention-multiAttention-Highway),訓練最終的分類模型。整體準確率是98.7%(為了樣本平衡,部分類別的樣本複製了多遍,所以評測有所偏差)

(4)同時,對集成模型擴展後數據做進一步提純過濾,也可以採用K折交叉驗證的方法來找到並處理badcase。具體是利用模型的差異性,使用投票等策略規則來更快找出可疑標籤樣本,然後抽取不同的數據做訓練和預測,從而達到找到整個樣本中的可疑標籤樣。對於可疑標籤樣本的處理可以人工或者規則自動處理,不斷迭代優化模型的數據。其流程圖如下:

經驗總結和展望

1. 訓練集量少時,預訓練全量數據word2vec或者使用字詞結合的方式,減少未登錄詞。訓練模型時,微調Word2vec,效果一般會更好 。

2. CNN作為baseline會更快,多層使用batch-norm,以及結合highway層做嘗試。

3. 考慮樣本分布,樣本不平衡處理方法:

(1)對於少數樣本重複採樣(基於batch數據)、多數樣本負採樣

(2)調整閾值(抽樣人工比較或者看PR曲線來設置)

(3)對於二分類修改Loss(代價敏感),例如同時考慮難分樣本和樣本類別平衡性的focalloss。

(4)數據增強(隨機打亂語序、同義詞替換(同義詞表)、模板修改、數據生成的方法(GAN)

4. 樣本是否絕對互斥,否則用基於sigmoid的多標籤損失函數,一般會收斂更快。

5. 模型的效果進行多次迭代修正後,會導致數據更符合當前模型(即是使用複雜模型也不一定更好),所以要先選擇好模型,再做迭代優化。

6. 當只有小量數據集時,可以使用基於BERT的分類模型。隨機取了訓練集合中的2w數據作為訓練和隨機抽取2000條樣本作為測試集。在同一CPU伺服器上做測試,基於多層CNN分類模型,測試時間:18s,預測F1值:92.1% 。基於BERT的分類模型,測試時間:400s,差一個數量級,是5個樣本1s,預測F1值:93.8%。對於BERT的性能優化,可以只利用前幾層的結構做Finetune,或者借鑒google出品的Learn2Compress中的方法進行模型壓縮優化等。

7. 對於一些話題類別數據量少的識別冷啟動問題,除了上面介紹擴展樣本量的方法,還可以從一些小樣本學習方法來考慮,例如Few-shot learning,具體有Induction Network等。

---------END----------

關注云加社區,回復3加讀者群

在看,讓更多人看到!

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 雲加社區 的精彩文章:

音視頻及融合通信技術乾貨等你來撩
音視頻融合通信技術的最佳實踐,全在這裡了

TAG:雲加社區 |