1. 程式人生 > >策略產品經理--NLP技術基礎與演算法模型

策略產品經理--NLP技術基礎與演算法模型

前言:BERT模型的出現,使NLP技術進入新的時代。由此機會窺探NLP技術全貌,學習瞭解NLP相關技術與演算法模型。

一、基本概念

詞向量(Word Embedding):

  詞向量主要用於將自然語言中的詞符號數學化,這樣才能作為機器學習問題的輸入。

  數學化表示詞的方式很多,最簡單的有獨熱編碼,即“足球”=[0,0,1,0,0,0,0,…],“籃球”=[0,0,0,0,0,1,0,…],向量的長度為總詞數。顯然,獨熱編碼有以下缺點:1.可能導致維數過大,對深度學習來說複雜度過高。2.兩個詞的相似程度無法表示。

  詞向量與獨熱編碼不同,一般是以下形式:[0.2333,0.4324,0.6666,-0.9527,….],維數以50維和100維比較常見。詞向量解決了維度過大的問題,且兩個詞的相似度可以用歐幾里得距離,餘弦相似度等方法求得。

語言模型:

  語言模型形式化的描述就是,給定一個字串,看它是自然語言的概率P(w1,w2,…,wt),其中wi表示這句話中的各個詞。有個很簡單的推論,(語言模型就是用來計算一個句子的概率的模型):

   P(w1,w2,…,wt)=P(w1)×P(w2|w1)×P(w3|w1,w2)×…×P(wt|w1,w2,…,wt−1)(條件概率公式)

  而事實上,常用的語言模型都是在近似地求P(wt|w1,w2,…,wt-1),語言模型後續介紹,谷歌的BERT模型也屬於語言模型(預訓練類)。

分類衡量指標:

以資訊檢索為例,總共50篇文獻,其中20篇是我感興趣的目標文獻。輸入特定檢索條件返回10篇文獻,其中5篇是我要的文獻。則

  精確率(Precision) = 查出的文章中有多少是正確目標 = 5/10

  召回率(Recall) = 總共正確的文章中有多少被正確查出 = 5/20

  兩種值都是我們想要提高的,但不能兩全其美:想要精確率為1,最好的結果就是一篇文獻也沒搜到,返回的結果肯定沒有分類錯誤,但這樣也沒有意義;想要召回率為1,最好的情況就是50篇 返回,這樣搜尋本身也失去了意義。

  定義F1分數為精確率與召回率的調和平均數:

                                                             F1=\frac{2}{1/precision+1/recall}

  這樣可以避免出現精確率和召回率一個為1一個為0的極端情況出現
  還可以根據對精確率/召回率的不同偏好設定F_beta分數

                                                             F_{\beta }=\frac{1+\beta ^{2}}{\frac{1}{precision}+\frac{1}{recall}}
  另一個角度來看這個問題。假設我們現在要判斷一個使用者是好人還是壞人,定義:TP(True Positive)為預測正確的好人的個數,FP(False Positive)為預測錯誤的好人的個數,FN(False Negative)為預測錯誤的壞人的個數,TN(True Negative)為預測正確的壞人的個數。可以寫出混淆矩陣(Confusion matrix)如下:
                                          

precision=\frac{TP}{TP+FP}(返回的預測正確的與預測錯誤的目標的總數)

recall = \frac{TP}{TP+FN}(召回率的分母是總的正確的符合目標的數目,TP是返回的正確的符合目標的,FN是未返回的符合目標    的數目,即未返回的預測正確的好人的數目,也即預測錯誤的壞人的個數的另一種解釋),注意與準確率和錯誤率(包含了預測正確的負向的那部分)相區別開。

(參考原文:https://blog.csdn.net/qq547276542/article/details/78274459?utm_source=copy 

二、NLP的兩個關鍵問題

       選擇什麼樣的語言模型?   不同語言模型的區別,也就是對文字提取特徵的不同。

       選擇什麼樣的分類演算法?   後續介紹

 2.1 常用的語言模型及演算法介紹

語言模型的演化圖

這裡只講幾個簡單的模型原理,LSA等都是對基於BOW,利用TF,IDF等

A、Bag-of-words模型(BOW,詞袋模型)類

1,BOW模型

        最初應用於文字處理領域,用來對文件進行分類和識別。BoW 模型因為其簡單有效的優點而得到了廣泛的                 用。其基本原理可以用以下例子來給予描述。給定兩句簡單的文件:

文件 1:“我喜歡跳舞,小明也喜歡。”

文件 2:“我也喜歡唱歌。”

基於以上這兩個文件,便可以構造一個由文件中的關鍵片語成的詞典:

詞典={1:“我”,2:“喜歡”,3:“跳舞”,4:“小明”,5:“也”,6:“唱歌”}

這個詞典一共包含6個不同的詞語,利用詞典的索引號,上面兩個文件每一個都可以用一個6維向量表示(用整數數字0~n(n為正整數)表示某個單詞在文件中出現的次數。這樣,根據各個文件中關鍵詞出現的次數,便可以將上述兩個文件分別表示成詞向量的形式:

文件 1:[1, 2, 1, 1, 1, 0]

文件 2:[1, 1, 0, 0, 1, 1]

從上述的表示中,可以很清楚地看出來,在文件表示過程中並沒有考慮關鍵詞的順序,而是僅僅將文件看成是一些關鍵詞出現的概率的集合(這是Bag-of-words模型的缺點之一),每個關鍵詞之間是相互獨立的,這樣每個文件可以表示成關鍵詞出現頻率的統計集合。

2、基於Term frequency(TF) , Inverse document frequency(IDF), 以及TF-IDF的統計特徵的模型

        這種語言模型主要是用詞彙的統計特徵來作為特徵集,每個特徵都能夠說得出物理意義,看起來會比bag-of-words效果好,但實際效果也差不多。其實也屬於基於BOW模型的一種。

詞頻 (term frequency, TF)  指的是某一個給定的詞語在該檔案中出現的次數。這個數字通常會被歸一化(一般是詞頻除以文章總詞數), 以防止它偏向長的檔案。

                                                    TF{_{w}}=\frac{N1}{N}   (N1為在某一類中詞條w出現的次數,N為該類中所有的詞條數目)

逆向檔案頻率 (inverse document frequency, IDF)  IDF的主要思想是:如果包含詞條t的文件越少, IDF越大,則說明詞條具有很好的類別區分能力。某一特定詞語的IDF,可以由總檔案數目除以包含該詞語之檔案的數目,再將得到的商取對數得到。

                                                   IDF{_{w}}=log(\frac{N_{3}}{N_{w}+1})(N3為語料庫的文件總數,NW為相應的包含詞條w的文件總數,+1是是為了防止分母為0,即一種最原始的平滑演算法,拉普拉斯平滑)

                                                  TF-IDF= TF*IDF

                                     

(參考:http://www.ruanyifeng.com/blog/2013/03/tf-idf.html

3. LSA潛在語義分析–文字稀疏表示–>文字相似度度量、主題模型

        瞭解了TF-IDF模型,我們得到了文字的基本向量化表示,即得到了文字的(特徵)向量,向量具有一定語義表達的能力。LSA正是在此基礎上挖掘文字的潛在語義,建構主題模型等。 

        遍歷語料庫,得到全部文字-單詞的權重矩陣,權重即上文所求TF-IDF值。建立文字-單詞權重矩陣X後,可以通過SVD奇異值矩陣分解的方式將矩陣X轉換為它的低秩逼近矩陣。可以去前k維作為主要特徵,實現資料降維(原矩陣X維度為N*M,M為語料詞彙總數)

       其他BOW模型演算法如PLSA,可以參考https://blog.csdn.net/tiffanyrabbit/article/details/72650606

B、N-gram模型類

           一種考慮了詞彙順序的模型,每個樣本轉移成了轉移概率矩陣。用來根據前(n-1)個item來預測第n個item。在應用層面,這些item可以是音素(語音識別應用)、字元(輸入法應用)、詞(分詞應用)或鹼基對(基因資訊)。一般來講,可以從大規模文字或音訊語料庫生成n-gram模型。 習慣上,1-gram叫unigram,2-gram稱為bigram,3-gram是trigram。還有four-gram、five-gram等,不過大於n>5的應用很少見。
        理論依據例子:給定一串字母,如”for ex”,下一個最大可能性出現的字母是什麼。從訓練語料資料中,我們可以通過極大似然估計的方法,得到N個概率分佈:是a的概率是0.4,是b的概率是0.0001,是c的概率是。。。。

        n-gram模型概率公式推導,根據條件概率和乘法公式:

                                                                         P(AB)=P(A)P(B|A)
 得到 
                                                         P(A_{1}A_{2}A_{3}....A_{n})=P(A_{1})P(A_{2}|A_{1})...P(A_{n}|A_{1}..A_{n-1})
拿一個應用來講,假設T是由詞序列A1,A2,A3,…An組成的,那麼P(T)=P(A1A2A3…An)=P(A1)P(A2|A1)P(A3|A1A2)…P(An|A1A2…An-1) 如果直接這麼計算,是有很大困難的,需要引用馬爾科夫鏈的假設,即當前這個詞僅僅跟前面幾個有限的詞相關,因此也就不必追溯到最開始的那個詞,這樣便可以大幅縮減上訴算式的長度,即:一個item的出現概率,只與其前m個items有關,當m=0時,就是unigram,m=1時,是bigram模型(n元表示相鄰的n個詞之間是有關係的)。
            因此,P(T)可以求得,例如,當利用bigram模型時,P(T)=P(A1)P(A2|A1)P(A3|A2)…P(An|An-1) 而P(An|An-1)條件概率可以通過極大似然估計求得,等於Count(An-1,An)/Count(An-1)。
          n-gram的應用:文化研究(不瞭解)、分詞演算法、語音識別、輸入法、垃圾郵件識別。輸入法中例如搜狗輸入法如下,根據拼音判斷合理的句子,其實底層原理是根據概率算出最優的一些演算法。其實這個思想可以用在一些推薦策略上,根據概率算出。

                                               

N-gram計算原理:根據已有的(歷史)語料庫的詞句統計的概率或者次數來預測新的語句的概率,然後輸出概率最高的語句結果。

其應用例如搜尋引擎的提示答案(輸入一個關鍵詞,自動輸出幾個結果提示)。

NNLM等都是對N-gram模型進行訓練後延伸出的一些神經網路模型。

C、word embeding、Word2vec、 GloVe 、CBOW、skip-gram,one-hot,N-gram關係

word embedding 是一個將詞向量化的概念,詞嵌入。

Word2vec、 GloVe是 執行word embedding的具體演算法,是一種訓練演算法。

CBOW、skip-gram是Word2vec訓練演算法中用到的語言模型(通過神經網路訓練得到最後的詞向量矩陣)

one-hot是最初的得到詞向量的方法,n-gram是語言模型,這種語言模型和word2vec演算法中模型是並列的關係,只不過n-gram自己可以利用概率計算得到相關的應用結果,我認為也可以說n-gram是一種演算法。

上述這些都是圍繞著“詞向量”的概念的NLP演算法模型技術,都屬於淺層的方法,“效率換表達力”。            

D、語言模型的遷移學習預訓練語言模型

       預訓練的語言表徵經過精調後可以在眾多NLP任務中達到更好的表現,所以新出的這些預訓練演算法與模型是最新的技術發展概念,以及最新的BERT預訓練模型。通過遷移學習與特定的任務相結合的方式有2種

feature-based:訓練出的representation作為feature用於任務,也就是利用預訓練的語言模型獲得特徵向量,將其用於具體任務。新的ELMo也屬於這類,但遷移後需要重新計算出輸入的表徵。

fine-tuning:在預訓練的語言模型基礎上稍作改變,根據具體任務引入新的結構和引數,再次進行訓練。通過與預訓練語言模型的結合,許多原有的模型在任務上的效果進步提升。以閱讀理解為例,人類在做道閱讀理解題目時,並不僅僅從這篇文章,以及類似的閱讀理解任務(訓練集)中學習,而是會使用在此之前積累的各項知識。大規模語料預訓練的語言模型正是這種知識的積累。這個主要借鑑於CV,就是在預訓練好的模型上加些針對任務的層,再對後幾層進行精調。新的ULMFit和OpenAI GPT屬於這一類。

關於谷歌最新推出的BERT,全稱是Bidirectional Encoder Representation from Transformers,即雙向Transformer的Encoder,因為decoder是不能獲要預測的資訊的。模型的主要創新點都在pre-train方法上,即用了Masked LM和Next Sentence Prediction兩種方法分別捕捉詞語和句子級別的representation。關於BERT的模型介紹可參考:https://zhuanlan.zhihu.com/p/46652512