中篇 | 多轮对话机器之话题意图识别
引言
回顧一下自己參與的智能客服系統項目,從技術調研到游戲領域的對話文本數據分析和任務細分定義,再到建模調優以及最后的運營優化等整體流程的學習,收獲良多。一般的智能客服系統包括三大模塊,具體系統結構圖如下:
對話系統整體結構圖
對于多輪任務型對話,首先需要理解用戶主要說了啥,怎么說的以及對話的邏輯流程,并借助于對業務的理解以及對話文本的數據分析,抽象出對用戶發言的語義理解定義,也即是語義理解模塊。本篇主要是講述意圖識別的技術知識。在我們的業務場景中,意圖細分成了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 |
0.986 | 0.982 | 0.984 |
?
話題熱詞分析
對于抽取每個topic下的熱詞,可以使用傳統的TF-IDF、詞性、Text Rank、句子語法和語義結構等方法做熱詞抽取、過濾和重排等操作。也可以使用基于注意力機制的神經網絡模型,或者兩者做結合。我們是基于話題意圖語料,利用RNN Attention模型在做分類預測的時候,得到每個詞的注意力權重,然后根據權重值提取熱詞,具體做法如下:
?訓練基于RNN-Attention結構的分類模型,流程同上。
?基于小天部分線上經典發言,利用注意力機制的分類模型做預測,然后取出網絡結構中的權重層,最后累加各個詞語的權重,排序得到各個topic下有顯著特性的關鍵詞。
?基于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話題中熱詞出現了“制裁”,主要是問“游戲信用分話題“的發言中,存在一些“多少信用分能夠解制裁”,“賬號被制裁,多少信用分能解”之類的問題。后續可以根據業務需求增加后過濾處理操作。
話題意圖模型的運營優化
在運營優化方面,主要基于badcase來作分析:
Badcase的分類錯誤原因一般有:
發言中含有部分常見詞,在其他Topic中出現,本質是句子中存在片段的 交集,而且交集片段在不同topic中的統計分布 差異大。
訓練集中的label標錯了。
訓練樣本中沒有出現過類似的樣本。
Badcase的修正
1. ??數據層(樣本的整理):
2. ??模型層(時間性能和效果平衡):
3. ??規則層(規則粒度的大小(靈活性+維護成本)):
主要是解決模型很難識別的特殊樣本,為每個分類話題分別配置正則過濾規則
構建更大量樣本數據集方法介紹
基于集成模型的方法更快地構造更好、更多的標簽樣本集
在樣本標簽數據的擴展部分,除了可以使用自動化模塊擴展外,還可以基于集成模型的方法來做而二次標簽樣本的擴展,下面是使用一份情感數據做的嘗試。
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等。
總結
以上是生活随笔為你收集整理的中篇 | 多轮对话机器之话题意图识别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 上篇 | 如何设计一个多轮对话机器人
- 下一篇: 当一个美术生开始在腾讯撸代码… |「递归