用神經網路訓練一個文字分類器

Anne90發表於2017-08-10

理解聊天機器人的工作原理是非常重要的。聊天機器人內部一個非常重要的元件就是文字分類器。我們看一下文字分類器的神經網路(ANN)的內部工作原理。

1-DpMaU1p85ZSgamwYDkzL-A

多層神經網路

我們將會使用2層網路(1個隱層)和一個“詞包”的方法來組織我們的訓練資料。文字分類有3個特點:模式匹配、演算法、神經網路。雖然使用多項樸素貝葉斯演算法的方法非常有效,但是它有3個致命的缺陷:

  • 這個演算法輸出一個分數而不是一個概率。我們可以使用概率來忽略特定閾值以下的預測結果。這類似於忽略收音機中的噪聲。
  • 這個演算法從一個樣本中學習一個分類中包含什麼,而不是一個分類中不包含什麼。一個分類中不包含什麼的的學習模式往往也很重要。
  • 不成比例的大訓練集的分類將會導致扭曲的分類分數,迫使演算法相對於分類規模來調整輸出分數,這並不理想。

和它“天真”的對手一樣,這種分類器並不試圖去理解句子的含義,而僅僅對它進行分類。事實上,所謂的“人工智慧聊天機器人”並不理解語言,但那是另一個故事

如果你剛接觸人工神經網路,這是它的工作原理

理解分類演算法,請看這裡

我們來逐個分析文字分類器的每個部分。我們將按照以下順序:

  1. 引用需要的庫
  2. 提供訓練集
  3. 整理資料
  4. 迭代:編寫程式碼+測試預測結果+調整模型
  5. 抽象

程式碼在這裡,我們使用ipython notebook這個在資料科學專案上非常高效的工具。程式碼語法是python。

我們首先匯入自然語言工具包。我們需要一個可靠的方法將句子切分成詞並且將單詞詞幹化處理。

下面是我們的訓練集,12個句子屬於3個類別(“意圖”)。

現在我們可以將資料結構組織為:documentsclasses 和words.

注意每個單詞都是詞根並且小寫。詞根有助於機器將“have”和“having”等同起來。同時我們也不關心大小寫。1-eUedufAl7_sI_QWSEIstZg

我們將訓練集中的每個句子轉換為詞包。

上面的步驟是文字分類中的一個經典步驟:每個訓練句子被轉化為一個包含0和1的陣列,而不是語料庫中包含獨特單詞的陣列。

被詞幹化為:

然後轉換為輸入詞包的形式:1代表單詞存在於詞包中(忽略問號?)

輸出:第一類

注意:一個句子可以有多個分類,也可以沒有。確保理解上面的內容,仔細閱讀程式碼直到你理解它。

機器學習的第一步是要有乾淨的資料

1-CcQPggEbLgej32mVF2lalg

接下來我們的學習2層神經網路的核心功能。

如果你是人工神經網路新手,這裡是它的工作原理

我們使用numpy,原因是它可以提供快速的矩陣乘法運算。

1-8SJcWjxz8j7YtY6K-DWxKw

我們使用sigmoid函式對值進行歸一化,用其導數來衡量錯誤率。通過不斷迭代和調整,直到錯誤率低到一個可以接受的值。

下面我們也實現了bag-of-words函式,將輸入的一個句子轉化為一個包含0和1的陣列。這就是轉換訓練資料,得到正確的轉換資料至關重要。

現在我們對神經網路訓練函式進行編碼,創造連線權重。別太激動,這主要是矩陣乘法——來自中學數學課堂。

2017-06-03_151025

我們現在準備去構建我們的神經網路模型,我們將連線權重儲存為json檔案。

你應該嘗試不同的“α”(梯度下降引數),看看它是如何影響錯誤率。此引數有助於錯誤調整,並找到最低錯誤率:

synapse_0 += alpha * synapse_0_weight_update

1-HZ-YQpdBM4hDbh4Q5FcsMA

我們在隱藏層使用了20個神經元,你可以很容易地調整。這些引數將隨著於您的訓練資料規模的不同而不同,將錯誤率調整到低於10 ^ – 3是比較合理的。

synapse.json檔案中包含了全部的連線權重,這就是我們的模型

1-qYkCgPE3DD26VD-qDwsicA

一旦連線權重已經計算完成,對於分類來說只需要classify()函式了:大約15行程式碼

備註:如果訓練集有變化,我們的模型需要重新計算。對於非常大的資料集,這需要較長的時間。

現在我們可以生成一個句子屬於一個或者多個分類的概率了。它的速度非常快,這是因為我們之前定義的think()函式中的點積運算。

你可以用其它語句、不同概率來試驗幾次,也可以新增訓練資料來改進/擴充套件當前的模型。尤其注意用很少的訓練資料就得到穩定的預測結果。

有一些句子將會產生多個預測結果(高於閾值)。你需要給你的程式設定一個合適的閾值。並非所有的文字分類方案都是相同的:一些預測情況比其他預測需要更高的置信水平

最後這個分類結果展示了一些內部的細節:

從這個句子的詞包中可以看到,有兩個單詞和我們的詞庫是匹配的。同時我們的神經網路從這些 0 代表的非匹配詞語中學習了。

如果提供一個僅僅有一個常用單詞 ‘a’ 被匹配的句子,那我們會得到一個低概率的分類結果A:

現在你已經掌握了構建聊天機器人的一些基礎知識結構,它能處理大量不同的意圖,並且對於有限或者海量的訓練資料都能很好的適配。想要為某個意圖新增一個或者多個響應實在輕而易舉,就不必多講了。

Enjoy!

打賞支援我翻譯更多好文章,謝謝!

打賞譯者

打賞支援我翻譯更多好文章,謝謝!

任選一種支付方式

用神經網路訓練一個文字分類器 用神經網路訓練一個文字分類器

相關文章