NLP自然語言處理:文本表示總結 - 上篇word embedding(基於降維、基於聚類、CBOW 、Skip-gram、 NNLM 、TF-ID、GloVe )

文本表示分類(基於表示方法)

  • 離散表示
    • one-hot表示
    • 詞袋模型與TF-ID 
  • 分佈式表示
    • 基於矩陣的表示方法
      • 降維的方法
      • 聚類的方法
    • 基於神經網絡的表示方法
      • NNLM
      • CBOW
      • Skip-gram
      • GloVe
      • ELMo
      • GPT
      • BERT

目錄

一、文本離散表示

1.1 文本離散表示:one-hot

1.2 文本離散表示:詞袋模型與TF-IDF

1.2.1 詞袋模型(bag of words)

1.2.2 對詞袋模型的改進:TF-IDF

二、文本分佈式表示

2.1 基於矩陣

2.1.1 基於矩陣的SVD降維

2.1.1 基於矩陣的聚類方法

2.2 基於神經網絡的表示方法

2.2.1 神經網絡語言模型(NNLM)

2.2.2 word2vec:CBOW(連續詞袋模型)

2.2.2  CBOW:層次Softmax和負例採樣

2.2.3  Word2Vec: Skip-Gram模型

2.2.3 word2vec(CBOW和Skip-Gram)存在的問題

2.2.3 GloVe

 


本博客總結到2014年GloVe,全部都是對於word embedding的總結,近寫年的文本表示總結會在下篇呈現。

下篇:https://blog.csdn.net/qq_35883464/article/details/100173045


一、文本離散表示

1.1 文本離散表示:one-hot

單獨講one-hot挺簡單的,我就把One-Hot Encoder獨熱編碼、Label Encoder標籤編碼、Binary Encoder二進制編碼,合起來寫了一篇博客:https://blog.csdn.net/qq_35883464/article/details/90573416

 

 

1.2 文本離散表示:詞袋模型與TF-IDF

 

1.2.1 詞袋模型(bag of words)

這個很簡單就少用些筆墨

詞袋模型是一種非常經典的文本表示。顧名思義,它就是將字符串視爲一個 “裝滿字符(詞)的袋子” ,袋子裏的 詞語是隨便擺放的。而兩個詞袋子的相似程度就以它們重合的詞及其相關分佈進行判斷。

 

詞袋模型的優點

  1. 簡單,方便,快速
  2. 在語料充足的前提下,對於簡單的自然語言處理任務效果不錯。如文本分類。

詞袋子模型的缺點

  1. 其準確率往往比較低。凡是出現在文本中的詞一視同仁,不能體現不同詞在一句話中的不同的重要性。
  2. 無法關注詞語之間的順序關係,這是詞袋子模型最大的缺點如“武松打老虎”跟“老虎打武松”在詞袋子模型中是認爲一樣的。

 

1.2.2 對詞袋模型的改進:TF-IDF

  • 不僅考慮詞語是否出現,還考慮其出現的次數或者頻率(TF)

“的”這個次佔了詞頻的很大的比重,而它對確定文本信息幾乎沒什麼用。所以我們應該忽略掉這些詞,取消掉它們的影響。一種方法是維護一個停用詞表。但這種方式太粗暴。

改進方式:一個詞預測主題的能力越強(與主題的關聯程度),權重越大,反之,權重越小。

在網頁中看到“原子能”這個詞,或多或少能夠了解網頁的主題,而看到“應用”一詞,則對主題基本上還是一無所知。因此,“原子能”的權重應該比應用大。

容易發現,如果一個關鍵詞只在很少的網頁出現,通過它就容易鎖定搜索目標,它的權重也就應該比較大。反正,如果一個詞在大量的網頁中出現,看到它仍然不清楚要找什麼內容,因此它的權重應該小。

 

  • 統計逆文檔頻率(IDF)

不僅考慮這個詞在當下文本的出現的概率,還考慮出現該詞語的文檔佔總文檔出現的頻率(DF)。

其基本假設是如果一個詞語在不同的文檔中反覆出現,那麼它對於識別該文本並不重要。如高頻詞“我們”、“那麼”之類。

嚴格來說,逆文檔頻率的公式爲-log(出現該詞語的文檔佔總文檔出現的頻率)

這裏具體不做TF-IDF的公式講解。

 

二、文本分佈式表示

我們剛剛講了詞向量的one-hot表示,包括詞向量的其他表示新式,主要目的就是讓計算機認識這些詞。

究其根本你會發現,這些詞向量的表示是開了一個極高維度的空間,然後每個詞語都會佔據一個維度,因此沒有辦法在空間中關聯起來。

因此我們可能可以把詞向量的維度降低一些,在這樣一個子空間中,可能原本沒有關聯的詞就關聯起來了。

所以基於矩陣方法的目標就是:把詞向量的維度降低

2.1 基於矩陣

 

2.1.1 基於矩陣的SVD降維

這是一種詞向量的方法,我們首先會遍歷所有的文本數據集,然後統計詞出現的次數,接着用一個矩陣X來表示所有的次數情況,緊接着對X進行奇異值分解得到一個USV^{T}的分解。然後用U的行(rows)作爲所有詞表中詞的詞向量。

  • 基於窗口的共現矩陣X:

把矩陣?X記錄的詞頻變成一個相關性矩陣。我們先規定一個固定大小的窗口,然後統計每個詞出現在窗口中次數,這個計數是針對整個語料集做的。可能說得有點含糊,咱們一起來看個例子,假定我們有如下的3個句子,同時我們的窗口大小設定爲1(把原始的句子分拆成一個一個的詞):

  1. I enjoy flying.
  2. I like NLP.
  3. I like deep learning.

由此產生的計數矩陣如下:

然後我們對X做奇異值分解,觀察觀察奇異值(矩陣的對角元素),並根據我們期待保留的百分比來進行截斷(只保留前k個維度)

對X採用奇異值分解,再通過選擇前K個奇異向量來進行降維:

基於矩陣的SVD降維能夠充分地編碼語義和句法的信息,但同時也帶來了其他的問題:

  • 矩陣的維度會經常變化(新的詞語經常會增加,語料庫的大小也會隨時變化)。
  • 矩陣是非常稀疏的,因爲大多數詞並不同時出現。
  • 矩陣的維度通常非常高(≈10的6次方)
  • 訓練需要?(?平方)的複雜度(比如SVD)
  • 需要專門對矩陣X進行特殊處理,以應對詞組頻率的極度不平衡的狀況

當然,有一些辦法可以緩解一下上述提到的問題:

  • 忽視諸如“he”、“the” 、“has”等功能詞。
  • 應用“傾斜窗口”(ramp window),即:根據文件中詞組之間的距離給它們的共現次數增加相應的權重。
  • 使用皮爾森的相關性(Pearson correlation),將0記爲負數,而不是它原來的數值。

不過緩解終歸只是緩解,不能根本的解決這些問題,這也就是我們馬上要提到的基於神經網絡的方法。

 

2.1.1 基於矩陣的聚類方法

因爲基於矩陣的聚類方法,現在基本不用了,我就不總結了,上個圖,大家瞭解下降維。

 

2.2 基於神經網絡的表示方法

現在我們退後一步,來嘗試一種新的方法。在這裏我們並不計算和存儲全局信息,因爲這會包含太多大型數據集和數十億句子。我們嘗試創建一個模型,它能夠一步步迭代地進行學習,並最終得出每個單詞基於其上下文的條件概率。

 

2.2.1 神經網絡語言模型(NNLM)

具體介紹:https://blog.csdn.net/qq_35883464/article/details/99692610

這種方法能讓我們有非常顯著的進步。考慮到前面 “詞-詞”矩陣的情況,我們至少可以算出兩個詞語共同出現的概率。但是,舊話重提,這仍然要求儲存和計算一個非常的大數據集裏面的全部信息。 現在我們理解了“分詞序列”的概率(其實就是N-gram語言模型啦),讓我們觀察一些能夠學習到這些概率的例子。

 

2.2.2 word2vec:CBOW(連續詞袋模型)

Word2Vec模型中,主要有Skip-Gram和CBOW兩種模型。

從直觀上理解,Skip-Gram是給定input word(中間的詞)來預測上下文。CBOW是給定上下文,來預測input word(中間的詞)

圖形理解CBOW:

我們把整個過程拆分成以下幾步:

總結下特點:

 

2.2.2  CBOW:層次Softmax和負例採樣

我們再次觀察一下步驟,特別是步驟5,注意到對整個單詞表|V|求softmax的計算量是非常巨大的,任何一個對目標函數的更新和求值操作都會有O(|V|)的時間複雜度。我們需要一個思路去簡化一下,我們想辦法去求它的近似。

 

  • CBOW:層次Softmax

在機器學習中,如果要輸出特徵的預測結果中的重要性,會用到樹模型,因爲樹在選擇分裂的時候,就是選擇包含的信息量大的特徵進行分裂的。這裏運用了HUffman Tree.

使用Huffman Tree ,原本我們計算的是10^8的概率向量,但是現在就可以轉換爲一個二分類問題,二分類中最簡單的直接的就是LR模型的,假設Xw就是一個詞向量表示,在每個非葉子節點處(途中黃色的圓點)還會有一個參數θwi,那我們的在LR中可以用一個sigmoid函數來映射,最後變成一個最小化損失函數的優化問題。

特點:

  1. 使用Huffman tree 來編碼輸出層的詞典
  2. 只需要計算路徑上所有非葉子節點的詞向量的貢獻
  3. 計算量爲樹的深度 log2V

 

  • CBOW:負例採樣

核心思想:一個正樣本,V-1個負樣本,對負樣本做採樣,使得正負樣本相當。

在我們的例子中,預測“我喜歡觀看巴西足球世界盃“這句話中的“巴西“這個詞爲我們的標準答案,(假設詞庫中有10**8個詞)其他的10**8個就都不是標準答案.既然這樣,乾脆就在這10**8個負樣本中抽取負樣本來計算。

意思就是每個詞一段距離。

 

2.2.3  Word2Vec: Skip-Gram模型

Skip-Gram模型實際上分爲了兩個部分,第一部分爲建立模型,第二部分是通過模型獲取嵌入詞向量。Skip-Gram模型的整個建模過程實際上與自編碼器(auto-encoder)的思想很相似,即先基於訓練數據構建一個神經網絡,當這個模型訓練好以後,我們並不會用這個訓練好的模型處理新的任務,我們真正需要的是這個模型通過訓練數據所學得的參數。

Skip-Gram模型圖示:

特點:

舉個例子理解:

假如我們有一個句子“The dog barked at the mailman”

  • 首先我們選句子中間的一個詞作爲我們的輸入詞,例如我們選取“dog”作爲input word;

  • 有了input word以後,我們再定義一個叫做skip_window的參數,它代表着我們從當前input word的一側(左邊或右邊)選取詞的數量。如果我們設置skip_window=2,那麼我們最終獲得窗口中的詞(包括input word在內)就是['The', 'dog','barked', 'at']。skip_window=2代表着選取左input word左側2個詞和右側2個詞進入我們的窗口,所以整個窗口大小span=2x2=4。另一個參數叫num_skips,它代表着我們從整個窗口中選取多少個不同的詞作爲我們的output word,當skip_window=2,num_skips=2時,我們將會得到兩組 (input word, output word) 形式的訓練數據,即 ('dog', 'barked')('dog', 'the')

  • 神經網絡基於這些訓練數據將會輸出一個概率分佈,這個概率代表着我們的詞典中的每個詞是output word的可能性。這句話有點繞,我們來看個栗子。第二步中我們在設置skip_window和num_skips=2的情況下獲得了兩組訓練數據。假如我們先拿一組數據 ('dog', 'barked') 來訓練神經網絡,那麼模型通過學習這個訓練樣本,會告訴我們詞彙表中每個單詞是“barked”的概率大小。

模型的輸出概率代表着到我們詞典中每個詞有多大可能性跟input word同時出現。

我們選定句子“The quick brown fox jumps over lazy dog”,設定我們的窗口大小爲2(window_size=2),也就是說我們僅選輸入詞前後各兩個詞和輸入詞進行組合。下圖中,藍色代表input word,方框內代表位於窗口內的單詞。

以上就是Skip-Gram模型的例子,應該有個大致的瞭解。

 

2.2.3 word2vec(CBOW和Skip-Gram)存在的問題

 

2.2.3 GloVe

在2013年,word2vec如日中天的時候,斯坦福nlp組發表於2014年的一篇論文(引用量直破5k)。該論文提出的Glove詞向量也是自Word2vec推出後另一個比較有影響力的詞向量生成方法。

這裏不講GloVe的數學公式,只講結果和自己的認識。

Cbow/Skip-Gram 是一個local context window的方法,缺乏了整體的詞和詞的關係,負樣本採用sample的方式會缺失詞的關係信息。
另外,直接訓練Skip-Gram類型的算法,很容易使得高曝光詞彙得到過多的權重。

Global Vector融合了 矩陣分解(LSA)的全局統計信息 和 local context window(局部窗口)優勢。融入全局的先驗統計信息,可以加快模型的訓練速度,又可以控制詞的相對權重。

我的理解是skip-gram、CBOW每次都是用一個窗口中的信息更新出詞向量,但是Glove則是用了全局的信息(共線矩陣),也就是多個窗口進行更新

 

 

 

到目前爲止,文本表示總結已經總結到2014年了,近寫年的文本表示總結會在下篇呈現。

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章