用機器學習打造聊天機器人(六) 原理篇

本文是用機器學習打造聊天機器人系列的第六篇,主要介紹代碼中用到的相關算法的原理。瞭解算法原理,可讓咱們知道程序背後都作了些什麼,爲何有時候會出現錯誤以及什麼場景下選擇哪一種算法會更合適。html

  • word2vec
    咱們使用的詞向量模型就是基於word2vec訓練的,word2vec 是 Google 在 2013 年推出的一個 NLP 工具,它的特色 是將全部的詞向量化,這樣詞與詞之間就能夠定量的去度量他們之間 的關係,挖掘詞之間的聯繫。

    word2vec 基於分佈式表徵(Dristributed Representation)的 思想,相比於 One hot 能夠用更低維數的向量表示詞彙。 有一個有趣的研究代表,用詞向量表示咱們的詞時,咱們能夠發 現:King - Man + Woman = Queen。
    word2vec 實現了 CBOW 和 Skip-Gram 兩個神經網絡 模型,SkyAAE 在訓練詞向量的時候就是使用的 CBOW 模型。

    CBOW(Continuous Bag-of-Words,連續詞袋)的核心思想是可 以用一個詞的周圍的詞來預測這個詞。該模型的訓練輸入是某一個特 徵詞的上下文相關的詞對應的詞向量,而輸出就是這特定的一個詞的 詞向量。 好比這段話:「...an efficient method for 【learning】 high quality distributed vector...」,咱們要預測 learning,則 能夠選取上下文大小爲 4,也就是咱們須要輸出的詞向量,上下文對 應的詞有 8 個,先後各 4 個,這 8 個詞是咱們模型的輸入。因爲 CBOW 使用的是詞袋模型,所以這 8 個詞都是平等的,也就是不考慮他們和 咱們關注的詞之間的距離大小,只要在咱們上下文以內便可。與 CBOW 相對應的是 Skip-Gram 模型,核心思想是能夠用當前詞去預測該詞的 周圍的詞。
    能夠看出,當word2vec模型訓練好了以後,詞的向量表徵也就肯定了,之後再次使用的時候,輸入一個詞,模型就給你那個肯定的向量。因此咱們表示一個句子的時候,須要先分詞,而後分別取出詞的向量,而後經過一些方式將這些向量融合在一塊兒來表示整個句子,好比累加後除以分詞列表的長度。
  • 餘弦類似度
    咱們在語義匹配階段使用的算法就是餘弦類似度。餘弦類似度是指經過測量兩個向量的夾角的餘弦值來度量它們 之間的類似性。咱們知道,0 度角的餘弦值是 1,而其餘任何角度的 餘弦值都不大於 1;而且其最小值是-1,可是餘弦類似度一般用於 正空間,所以給出的值爲 0 到 1 之間。兩個向量有相同的指向時, 餘弦類似度的值爲 1;兩個向量夾角爲 90°時,餘弦類似度的值爲 0,因此兩個向量之間的角度的餘弦值能夠肯定兩個向量是否大體指 向相同的方向。具體公式以下:
  • 樸素貝葉斯
    咱們在乎圖分類階段使用了多項式樸素貝葉斯算法來將輸入的問題分到對應的意圖類別下,讓咱們先來看看什麼式樸素貝葉斯。樸素貝葉斯算法是基於貝葉斯定理與特徵條件獨立假設的分類 方法。 貝葉斯公式推導過程:

    c
    隨機事件的其中一種狀況,好比電影領域問答中的意圖分類可能包括:閒聊,評分,上映時間,演員等,把用戶問問題當作是隨機事件,則用戶問評分的問題就是隨機事件的其中一種狀況。
    x
    泛指與隨機事件相關的因素,這裏作爲機率的條件。
    P(c|x)
    條件 x 下,c 出現的機率。好比 P(「評分」|「功夫這部電影評分怎麼樣?」)就是表示問題「功夫這部電影評分怎麼樣?」的意圖是「評分」的機率。
    P(x|c)
    知出現 c 狀況的條件下,條件 x 出現的機率,後驗機率,能夠根據歷史數據計算得出。
    P(c)
    不考慮相關因素,c 出現的機率。
    P(x)
    不考慮相關因素,x 出現的機率。
    由推導過程能夠獲得
    P(c|x) = P(c)P(x|c)/P(x)
    假設咱們有電影領域問題和所屬意圖分類的數據集,那麼P(c(i))=c(i)出現的次數/全部狀況出現的總次數,(例如:c(i)多是‘評分’意圖或者‘上映時間’意圖);
    根據特徵條件獨立假設的樸素思想能夠得出以下式子:
    p(x|c) = Πp(xi|c) (1<=i<=d),d 爲屬性的個數
    至此獲得樸素貝葉斯的具體公式:(這裏的 c 就是 c(i))

    利用該公式進行分類的思想就是計算全部的 p(c(i)|x),而後取值(機率)最大的 c(i)作爲所屬分類。用公式表達以下:

    h 是基於樸素貝葉斯算法訓練出來的 hypothesis(假設),它的值就是貝葉斯分類器對於給定的 x 因素下,最可能出現的狀況c。y 是 c 的取值集合。這裏去掉了 P(x)是由於它和 c 的機率沒有關係,不影響取最大的 c。
    樸素貝葉斯直觀上理解,就是和樣本屬性以及樣本類別的出現頻率有關,利用已有的樣本屬性和樣本類別計算出的各個機率,來代入新的樣本的算式中算出屬於各種別的機率,取出機率最大的作爲新樣本的類別。
    因此爲了計算準確,要知足以下幾個條件:
    • 各種別下的訓練樣本數量儘量均衡
    • 各訓練樣本的屬性取值要覆蓋全部可能的屬性的值
    • 引入拉普拉斯修正進行平滑處理。
  • 多項式樸素貝葉斯
    再選擇樸素貝葉斯分類的時候,咱們使用了one-hot的思想來構建句向量,其中的值都是0或1的離散型特徵,因此使用多項式模型來計算 p(xi|c)會更合適(對於連續性的值,選用高斯模型更合適):

    Dc 表示訓練集 D 中第 c 類樣本組成的集合,外加兩條豎線 表示集合的元素數量;
    Dc,xi 表示 Dc 中第 i 個特徵上取值爲 xi 的樣本組成的集 合。
    爲避免出現某一維特徵的值 xi 沒在訓練樣本中與 c 類別同時出 現過,致使後驗機率爲 0 的狀況,會作一些平滑處理:

    K表示總的類別數;
    Ni表示第 i 個特徵可能的取值的數量。
  • 萊文斯坦距離
    chatterbot的默認語義匹配算法採用的就是萊文斯坦距離,該算法又稱Levenshtein距離,是編輯距離的一種。指兩個字串之間,由一個轉成另外一個所需的最少編輯操做次數。容許的編輯操做包括將一個字符替換成另外一個字符,插入一個字符,刪除一個字符。例如將kitten轉成sitting:
    kitten(k→s)sitten (e→i)sittin  (→g)sitting
    該算法的邏輯清晰簡潔,但作爲聊天機器人的語義匹配算法仍是太簡單了,因此咱們並無選擇使用,具體緣由在《手把手教你打造聊天機器人(三) 設計篇》中已經詳細介紹,這裏再也不贅述。

本文是"手把手教你打造聊天機器人"系列的最後一篇,介紹了咱們打造的聊天機器人的相關算法原理,下一篇會對本系列作一個總結。算法

ok,本篇就這麼多內容啦~,感謝閱讀O(∩_∩)O。網絡

相關文章
相關標籤/搜索