目前的智慧客服會話的難點是進行使用者意圖匹配,只有明確了意圖,才能給出針對性的回答。如果匹配不了意圖,再進入傳統問答機器人到語料庫,所有或者其他各種方式匹配得分最高預料答案進行回答。
所以下面將針對意圖識別的一般性原理進行講解和分析。
意圖識別
對於線上機器人而言,就是判斷使用者此次諮詢的問題分類。
例如,這張票不要了
->退票
,我的訂單出票了沒
->催出票
,我要預訂明天的機票
->幫下單
等等。一般會使用下面幾種方式進行提取。
基於命名實體提取和詞庫
例如我的訂單出票了沒
,使用HanLp
自然語言處理工具包, 會抽取以下2個詞語
訂單
、出票
,根據停用詞詞典去除掉訂單
,然後根據出票
到詞庫中進行匹配對應的分類,找到對應意圖催出票
。對於複雜的句子,可以統計詞頻,根據頻率最高的找到對應的分類意圖。
使用這種方式優點是操作方便,用搜尋的方式很快找出對應的意圖。但缺點也很明顯,比如 這個訂單還沒出票,沒出票不要了
,意圖是退票,很明顯提取出來的是錯誤。準確率很難做到較高。
所以此種方式一般作為機器學習意圖槽位資料提取。
基於模板的匹配
查詢非常符合規則的類別,通過規則解析的方式來獲取查詢的意圖。
幫我預訂明天的蘇州到北京的機票,可以使用規則模板,進行如下提取
[蘇州]到[北京][明天][機票]。
這種方使用需要藉助命名實體提取,詞性標準,語義分析才能完成,對於規則性比較強的諮詢有較好的準確率。但此種方式對於研發和訓練師需要做大量的工作,較難進行擴充套件。
基於機器學習
邏輯迴歸
意圖識別在機器學習中的分類問題,也就是使用邏輯迴歸進行分類。
在使用邏輯迴歸之前,首先要對詞語進行分詞,向量化。 分詞可以比較各個分詞的效果,最常用是jieba
分詞。支援配置專業名詞及停用詞。
分詞完成後,需要將詞與進行向量化。
一般有2種方式,一種是使用One-Hot編碼,這種方式一般針對專業性比較強的領域使用,另一種是word2vec,這種編碼方式可以很好的標識詞之間的關係。
one-hot編碼一半般將所有詞行列進行排列,相同的地方記做1,比如分詞完成後,按照詞頻排序結果如下:
- | 訂單 | 出票 | 取消 |
---|---|---|---|
訂單 | 1 | 0 | 0 |
出票 | 0 | 1 | 0 |
取消 | 0 | 0 | 1 |
那麼[訂單,出票,取消]得到的詞向量為[[1,0,0],[0,1,0],[0,0,1]]
假如一個句子是這個訂單還沒出票,沒出票不要了
,訂單出現一次,出票出現2次,這個句子最終的向量為
使用word2vec得到的結果類似。
針對意圖識別,一般是多類分類。但多分類問題是從二分類問題進行擴充套件。
二元分類
對於二分問題,在對於未知概率分佈條件下,一般假設為正態分佈(高斯分佈),多維高斯分佈如下,也是多個高斯分佈相乘得到的結果。
帶入貝葉斯公式,最終得到是關於w,b的函式,也是sigmoid
函式。
對於資料量較少的分類,可以使用生成模型(Generative Model),計算\(P(C_1),P(C_2)\)和各個分類樣本資料的均值 \(u\) 和共用協方差矩陣\(\Sigma\),即可得到w,b,對於任意輸入x
代表資料分類屬於\(C_1\),否則屬於\(C_2\)。由於是二元分類,不必單獨計算\(P(C_2|x)\)。
但針對資料量較多的情況,一般使用判別模型(Discriminative Model),
針對二分類問題,根據最大擬然估算,Loss函式為
所有就是要找到\(w,b\),使得
為了計算方便,將公式取對數
由於C1和C2的概率表示式不統一,上面的式子無法寫成統一的形式,為了統一格式,這裡將所有Training data都打上0和1的標籤, y = 1代表 \(C_1\), y= 0代表\(C_2\),於是上式進一步改寫成:
這個形式其實就是兩個分佈的交叉熵
表示個概率分佈有多接近。
下面就是對這個loss函式使用梯度下降求解最小值,對w,b微分最終得到每次更新的梯度,
最終得到w,b,帶入sigmoid
函式即可得到結果。
另外,一般情況下判別模型比生成模型要高。
以上二元分類的情況,對於多元分類問題,其原理的推導過程與二元分類基本一致。
多分類
假設我們用的是高斯分佈,共用協方差矩陣,經過一般推導,也就是各種變換後,可以得到一個softmax函式。
假設有三個分類:\(C_1,C_2,C_3\),每一個\(C_i\)都有自己的\(w_i\)和\(b_i\),\(w_1,w_2,w_3\)分佈代表三個向量,\(b_1,b_2,b_3\)分別代表三個常量,輸入 x也是一個向量。
用softmax
進行輸出正則化。softmax
計算方式如下:
z可以是任何值,但是做完softmax之後,輸出 的值一定是介於0~1之間,並且它們的和一定是1。
多分類任務中輸出的是目標屬於每個類別的概率,所有類別概率的和為1,其中概率最大的類別就是目標所屬的分類。
即二分類使用sigmoid
函式輸出得到結果,而多分類使用softmax得到結果。
如下圖所示,input x經過三個式子分別生成,經過softmax轉化成output ,它們分別是這三個 分類的概率,由於sum=1,因此做完softmax之後就可以把y的分佈當做是一個概率分佈。
我們在訓練的時候還需要有一個輸出,因為是三個分類,輸出是三維的,對應的輸出也是三維的,為了滿足交叉熵的條件,輸出也必須是概率分佈,這裡我們不能使用1,2,3作為分類的區分,為了保證所有分類之間的關係是一樣的,這裡使用類似於one-hot編碼的方式。
和二元分類求解一樣,利用交叉熵,最終通過微分得到最優\(w_1,w_2,w_3\),\(b_1,b_2,b_3\)。
神經網路
對於輸入引數比較複雜,比如對於word2vec,輸入的可能是一個100*100的矩陣,這個時候就需要對資料進行處理。或者輸入的特徵無法在資料來源上進行資料處理。這個時候就需要在邏輯迴歸之前再接上一個邏輯迴歸,對資料來源做處理。
多個邏輯迴歸就構成了一個類神經網路,也就是深度學習,如(CNN,LTSM)。
對於分類問題,深度學習的最後輸出函式也就是sigmoid
或者softmax
函式。
對話管理
通過上一次的語義抽取和意圖識別,對話會進入後續對話樹模組。
根據前一模組抽取資料和使用者本身資料,將資料填充到對話樹的對應部分,對話數節點也可以根據條件拉取其他資料,最終這些資料最終都會在當前會話中儲存。
可以根據使用者問題,如果條件滿足,通過NLG模組生成對應話術返回。
最終一次使用者會話的完整的流程
graph LR
A[使用者提問]-->B[語義分析&實體抽取]
B--> C[意圖識別]
C-->D[對話樹資料填充]
D-->E[NL生成]
E-->F[資料處理]
F-->G[答案返回]
總結
上面是自己在機器學習中的一些總結,歡迎大家多多交流。