淺談意圖識別各種實現&數學原理

cgymy發表於2021-03-29

\[ J_\alpha(x) = \sum_{m=0}^\infty \frac{(-1)^m}{m! \Gamma (m + \alpha + 1)} {\left({ \frac{x}{2} }\right)}^{2m + \alpha} \text {} \]

目前的智慧客服會話的難點是進行使用者意圖匹配,只有明確了意圖,才能給出針對性的回答。如果匹配不了意圖,再進入傳統問答機器人到語料庫,所有或者其他各種方式匹配得分最高預料答案進行回答。

所以下面將針對意圖識別的一般性原理進行講解和分析。

意圖識別

對於線上機器人而言,就是判斷使用者此次諮詢的問題分類。
例如,這張票不要了->退票,我的訂單出票了沒->催出票我要預訂明天的機票->幫下單等等。一般會使用下面幾種方式進行提取。

基於命名實體提取和詞庫

例如我的訂單出票了沒,使用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次,這個句子最終的向量為

\[\begin{bmatrix}1 \\ 0 \\0\end{bmatrix} + \begin{bmatrix}0 \\ 1 \\0\end{bmatrix} + \begin{bmatrix}0 \\ 1 \\0\end{bmatrix} =\begin{bmatrix}1 \\ 2 \\0\end{bmatrix} \]

使用word2vec得到的結果類似。

針對意圖識別,一般是多類分類。但多分類問題是從二分類問題進行擴充套件。

二元分類

對於二分問題,在對於未知概率分佈條件下,一般假設為正態分佈(高斯分佈),多維高斯分佈如下,也是多個高斯分佈相乘得到的結果。

\[f_{u,\Sigma}(x)=\frac{1}{(2\pi)^{\frac{D}{2}}}\frac{1}{|\Sigma|^{\frac{1}{2}}}e^{-\frac{1}{2}(x-u)^T\Sigma^{-1}(x-u)} \]

帶入貝葉斯公式,最終得到是關於w,b的函式,也是sigmoid函式。

\[P(C_i|x)=\frac {P(C_i)P(x|C_i)}{\sum_{j=0}^n{P(C_i)P(x|C_i)}} =\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

\[P(C_1|x) = f_{w,b}(x)>0.5 \]

代表資料分類屬於\(C_1\),否則屬於\(C_2\)。由於是二元分類,不必單獨計算\(P(C_2|x)\)

但針對資料量較多的情況,一般使用判別模型(Discriminative Model),
針對二分類問題,根據最大擬然估算,Loss函式為

\[L(w,b) = f_{w,b}(x_1)f_{w,b}(x_2)...f{w,b}(x_n) \]

所有就是要找到\(w,b\),使得

\[w^*,b^* = argmaxL(w,b) \]

為了計算方便,將公式取對數

\[w^*,b^* = argmaxL(w,b)=argmin(-ln(L(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\),於是上式進一步改寫成:

\[-ln(L(w,b))=[y_1*ln(f_{w,b}(x_1)) - (1-y_1)*ln(1-f_{w,b}(x_1))]\\ -[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))] \]

這個形式其實就是兩個分佈的交叉熵

\[H(p,q) = -\sum_{x}p(x)ln(q(x)) \]

表示個概率分佈有多接近。
下面就是對這個loss函式使用梯度下降求解最小值,對w,b微分最終得到每次更新的梯度,

\[w_i = w_{i-1}-\eta\sum_{n}-(y_n-f_{w,b}(x_n))x_n \\ 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計算方式如下:

\[z_1=w_1 *x +b_1,z_2=w_2 *x +b_2,z_3=w_3 *x +b_3 \\ 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編碼的方式。

image

和二元分類求解一樣,利用交叉熵,最終通過微分得到最優\(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[答案返回]
總結

上面是自己在機器學習中的一些總結,歡迎大家多多交流。

相關文章