NLP獲取詞向量的方法(Glove、n-gram、word2vec、fastText、ELMo 對比分析)
阿新 • • 發佈:2021-11-29
自然語言處理的第一步就是獲取詞向量,獲取詞向量的方法總體可以分為兩種兩種,一個是基於統計方法的,一種是基於語言模型的。
大家可以通過下邊這個例子來更直觀的理解共生矩陣:
1 Glove - 基於統計方法
Glove是一個典型的基於統計的獲取詞向量的方法,基本思想是:用一個詞語周邊其他詞語出現的次數(或者說兩個詞共同出現的次數)來表示每一個詞語,此時每個詞向量的維度等於詞庫容量,每一維儲存著詞庫對應序號的詞語出現在當前詞語周圍的次數,所有這些詞向量組成的矩陣就是共現矩陣。 我們也可以換一個角度來理解共現矩陣,共現矩陣就是兩個詞同時出現的次數,共現矩陣的i行j列的數值表示詞庫中第i個詞和第j個詞同時出現的次數,同時共現矩陣是對角線為零的斜對稱矩陣。1.1 實現步驟
- 統計所有語料當中任意兩個單詞出現在同一個視窗中的頻率,結果表現為共現矩陣 X
- 直接統計得到的共現矩陣 X,大小為 |V| x |V|(V=詞庫容量)
- 實踐當中通常對原始統計矩陣施加 SVD(Singular Value Decomposition)來降低矩陣維度,同時降低矩陣的稀疏性
1.2 優點
- 訓練速度快
- 充分利用了全域性的統計資訊
1.3 存在的問題
- 對於單一詞語,只有少部分詞與其同時出現,導致矩陣極其稀疏,因此需要對詞頻做額外處理來達到好的矩陣分解效果
- 矩陣非常大,維度太高
- 需要手動去掉停用詞(如although, a,...),不然這些頻繁出現的詞也會影響矩陣分解的效果
2 基於語言模型的方法
按照語言模型的演進歷史,大體可分為三類:文法型語言模型、統計語言模型、神經概率語言模型;文法型語言模型是人工撰寫的語言規則,這裡不做贅述2.1 基於 n-gram 的語言模型
基於 n-gram 的語言模型是基於統計的語言模型,在NLP任務中,我們往往要計算一個句子出現的概率,通常的做法是: 1. 對於句中的每個詞,計算在給定前邊所有詞的條件下每個詞出現的條件概率: 2. 將每個詞出現的條件概率連乘,從而得到當前句子出現的概率(當前句子對應詞語組合出現的概率)公式如下: 但是上述方法有兩個缺陷:- 引數空間過大,概率的引數有 O(n)O(n)O(n) 個。
- 資料稀疏嚴重,有些詞同時出現的情況可能沒有,組合階數高時尤其明顯。
- 簡單來說,n階馬爾可夫假設的意思就是:符合馬爾科夫過程的隨機變數,當前狀態只和前n-1個狀態有關,即N階馬爾可夫假設認為,當前詞出現的概率只依賴於前 n-1 個詞
- 1階馬爾科夫假設當前狀態只和當前狀態有關,1階馬爾科夫假設不會考慮上下和當前次的關係,因此 n 一般大於1
這裡插一嘴,筆者認為 雖然 n-gram 只用到了前 n-1 個數據,但是這前 n-1 個數據也是由前邊資料得出的,因此 n-gram 也間接用到了前邊的資料
2.2 基於神經網路的語言模型
基於神經網路的語言模型根據學習方法不同大體可以分為兩大類,分別是 Feature-based 和 Fine-tune,其中 Feature-based 學習方法就是通過神經網路獲取詞向量 ,ELMO、fastText、word2vec、NNLM都是 Feature-based 模型的例子 詳細瞭解Feature-based 和 Fine-tune 的區別請參考如下文章:#深入理解# NLP 中的 Feature-based 和 Fine-tune 兩種學習方法blog.csdn.net/lch551218/article/details/115318811?spm=1001.2014.3001.5501 雖然 ELMO、FastText、Word2vec等都是獲取詞向量的模型,但是fastText、word2vec、NNLM 得到的是靜態詞向量,靜態詞向量不考慮上下文(對於不同語境下的同一單詞給出的詞向量是相同的),因此不能夠解決一次多義的問題。 而 ELMO 等語言模型會根據詞語的上下文的不同對同一詞語給出不同的詞向量,從而解決的一詞多義的問題。2.2.1 word2vec
word2vec 思想是訓練一個神經網路,然後提取神經網路中的引數作為詞語的詞向量;訓練網路的方式有兩種,一種是cbow 一種是 skip-gram,前者是通過上下文詞語預測中間詞,後者是通過中間詞預測周圍詞;哪種訓練方法並不重要,我們也不會用這個模型去做預測,訓練的目的是提取最終網路中的引數作為詞語的詞向量2.2.2 fastText
fastText 設計之初是為了解決文字分類問題的,只不過在解決分類問題的同時 fastText 也能產生詞向量,因此後來也被用來生成詞向量。 fastText 和 word2vec 類似,也是通過訓練一個神經網路,然後提取神經網路中的引數作為詞語的詞向量,只不過 fastText 訓練網路的方法是對文字進行分類;此外 word2vec 的輸入是多個詞語的 noe-hot 編碼,fastText的輸入是多個單詞及其n-gram特徵;同時fastText為了解決類別過多導致的softmax函式計算量過大的問題,使用了層次softmax代替標準的softmax。 fastText 和 word2vec 最主要的區別如下:- 輸入增加了n-gram特徵
- 使用 層次softmax做多分類
- 通過文字分類的方式來訓練模型
2.2.3 ELMO
ELMO 模型是一個雙向的動態語言模型,在給出詞語的詞向量時會考慮詞語的上文和下文,從而解決word2vec所遇到的一詞多義問題; 1、 ELMO得到詞向量的過程- 用通用語言模型(如word2vec、fastText、glove等)去訓練一個靜態詞向量,ELMO內部使用 CNN-BIG-LSTM 語言模型得到的詞向量,得到詞向量的維度為 512
- 使用得到的靜態詞向量去訓練ELMO網路
- 下游任務中使用詞向量時,載入預訓練的ELMO網路引數,根據當前上下文去動態調整詞向量,從而得到一個動態的詞向量。
上圖展示的就是ELMO的網路結構,ELMO由兩層網路組成,每層網路用於提取不同層級的特徵;其中每層由兩個方向相反的RNN網路構成(雙向LSTM,簡稱BiLSTM),分別記錄上文資訊和下文資訊
同時,為了保證網路的穩定,ELMO從最底層詞嵌入層到第一層biLSTM輸出層之間還有一個殘差連結。 3. 得到ELMO的詞向量 對於輸入的第 i 個靜態詞向量(因為靜態詞向量通過 CNN-BIG-LSTM 得到,因此維度為512),ELMO最終會出輸出1個靜態詞向量和兩個動態詞向量,分別是:- $h(i,0)$:將兩個輸入的靜態詞(複製一份)向量拼接在一起,維度是512+512=1024,拼接的目的是為了和後邊兩個詞向量的維度統一。
- $h(i,1)$:將ELMO第1層兩個反向LSTM的輸出拼接,維度是512+512=1024。
- $h(i,2)$:將ELMO第2層兩個反向LSTM的輸出拼接,維度是512+512=1024。
- 是直接使用最後一層 biLSTM 的輸出作為詞向量,即$h(i,2)$。
- 更加通用的做法,將$h(i,0)$、$h(i,1)$、$h(i,2)$三個輸出加權融合在一起,公式如下。其中γ 是一個與任務相關的係數,允許不同的 NLP 任務縮放 ELMO 的向量,可以增加模型的靈活性。$s_{j}^{task}$是使用 softmax 歸一化的權重係數;此方法得到的elmo詞向量可以看成是各層向量與初始靜態詞向量的ensemble
4. ELMO優點
- ELMO的各層引數實際上就是為各種有監督的下游任務準備的,因此ELMO可以被認為是一種遷移學習(transfer learning)。
- 通過這樣的遷移策略,那些對詞義消歧有需求的任務就更容易通過訓練給第二隱層一個很大的權重,而對詞性、句法有明顯需求的任務則可能對第一隱層的引數學習到比較大的值(實驗結論)。總之,這樣便得到了一份”可以被下游任務定製“的特徵更為豐富的詞向量。
5. ELMO缺點
- lstm是序列機制,訓練時間長,從這一點來看ELMO註定成為不了大哥,
- 相比於Transformer,lstm提取特徵的能力還是不夠的,我覺得未來lstm可能會被淘汰,畢竟屁股決定腦袋,時間為上!
- ELMO 的兩個RNN網路是分別計算的,導致計算時上下文的資訊不會相互通訊,進而導致ELMO得到的詞向量有一定的侷限性
- 輸出的結果只是講兩個RNN網路得到的結果拼接在一起,上下文資訊並不會相互影響
轉載於:https://blog.csdn.net/lch551218/article/details/114836207