淺談意圖識別各種實現&數學原理
\]
目前的智慧客服會話的難點是進行用戶意圖匹配,只有明確了意圖,才能給出針對性的回答。如果匹配不了意圖,再進入傳統問答機器人到語料庫,所有或者其他各種方式匹配得分最高預料答案進行回答。
所以下面將針對意圖識別的一般性原理進行講解和分析。
意圖識別
對於在線機器人而言,就是判斷用戶此次諮詢的問題分類。
例如,這張票不要了
->退票
,我的訂單出票了沒
->催出票
,我要預訂明天的機票
->幫下單
等等。一般會使用下面幾種方式進行提取。
基於命名實體提取和詞庫
例如我的訂單出票了沒
,使用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
函數。
=\frac{1}{1+e^{-z}}=\frac{1}{1+e^{-(b+\sum\limits_k w_k x_k)}}=f(w,b)=\sigma(z)
\]
對於數據量較少的分類,可以使用生成模型(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\),使得
\]
為了計算方便,將公式取對數
-ln(L(w,b))=-ln(f_{w,b}(x_1))-ln(f_{w,b}(x_2))-….-ln(f_{w,b}(x_n)
\]
由於C1和C2的概率表達式不統一,上面的式子無法寫成統一的形式,為了統一格式,這裡將所有Training data都打上0和1的標籤, y = 1代表 \(C_1\), y= 0代表\(C_2\),於是上式進一步改寫成:
-[y_2*ln(f_{w,b}(x_2)) – (1-y^2)*ln(1-f_{w,b}(x_2)]
-….\\
= \sum_{n=0}^m-[y^nlnf_{w,b}(x_n)-(1-y)^nln(1-f_{w,b}(x_n))]
\]
這個形式其實就是兩個分布的交叉熵
\]
表示個概率分布有多接近。
下面就是對這個loss函數使用梯度下降求解最小值,對w,b微分最終得到每次更新的梯度,
b_i = b_{i-1} – \eta \sum_{n}-(y_n-f_{w,b}(x_n)) \\
\]
最終得到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
計算方式如下:
sum = \sum_{j=1}^3 e^{z_j} \\
y^1 = \frac {e^{z_1}}{sum} 、y^2 = \frac {e^{z_2}}{sum} 、y^3 = \frac {e^{z_3}}{sum}
\]
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[答案返回]
總結
上面是自己在機器學習中的一些總結,歡迎大家多多交流。