自然語言處理是一個歷史悠久的方向,個人目前研究不深,所以本文以我個人的思路展開,具體內容大部分摘抄自其他大佬們的博客,其中主要摘抄自
NLP的基本問題
自然語言處理中的一個基本問題:如何計算一段文本序列在某種語言下出現的概率?之所為稱其為一個基本問題,是因為它在很多NLP任務中都扮演着重要的角色。例如,在機器翻譯的問題中,如果我們知道了目標語言中每句話的概率,就可以從候選集合中挑選出最合理的句子做為翻譯結果返回。
統計語言模型(Statistical Language Model)給出了這一類問題的一個基本解決框架。對於一段文本序列
它的概率可以表示為:
即將序列的聯合概率轉化為一系列條件概率的乘積。問題變成了如何去預測這些給定previous words下的條件概率:
由於其巨大的參數空間,這樣一個原始的模型在實際中並沒有什么用。我們更多的是采用其簡化版本——Ngram模型:
NGram
NGram,2Gram,3Gram
N-Gram是基於一個假設:第n個詞出現與前n-1個詞相關,而與其他任何詞不相關。(這也是隱馬爾可夫當中的假設。)整個句子出現的概率就等於各個詞出現的概率乘積。各個詞的概率可以通過語料中統計計算得到。假設句子T是有詞序列w1,w2,w3...wn組成,用公式表示N-Gram語言模型如下:
常見的如bigram模型(N=2)和trigram模型(N=3)。事實上,由於模型復雜度和預測精度的限制,我們很少會考慮N>3的模型。
我們可以用最大似然法去求解Ngram模型的參數——等價於去統計每個Ngram的條件詞頻。
BiGram: \(p(S)=\prod_{t=1}^T p(w_t|w_{t-1})\)
TriGram: \(p(S)=\prod_{t=1}^T p(w_t|w_{t-1},w_{t-2})\)
因為我們是基於統計獲得每個條件詞頻的,所以有可能出現0,此時需要一些類似拉普拉斯平滑的操作。
NGram距離
Ngram的應用方向之一就是模糊匹配,即判斷句子s和句子t是否相似。
那么這就需要使用Ngram距離:
|GN(s)|+|GN(t)|−2×|GN(s)∩GN(t)|
此處,|GN(s)|是字符串 s的 N-Gram集合,N 值一般取2或者3。以 N = 2 為例對字符串Gorbachev和Gorbechyov進行分段,可得如下結果(我們用下畫線標出了其中的公共子串)。
結合上面的公式,即可算得兩個字符串之間的距離是8 + 9 − 2 × 4 = 9。顯然,字符串之間的距離越小,它們就越接近。當兩個字符串完全相等的時候,它們之間的距離就是0。
NGram應用
1.模糊匹配,就像上面說的,另外一個常見的模糊匹配的場景就是搜索引擎。我們在搜索“我是”的時候,搜索引擎就會自動給我們推薦:
2.作家或語料庫風格文本的生成。比如類似莎士比亞的詩賦的生成。
詞向量
NGram是將詞作為一個個獨立的個體來對待的,這種處理方式等價於one-hot編碼和詞袋(Bag Of Words)模型,我們有N個詞,我們的詞向量就有N維,且是獨熱的形態。
比如我們的詞庫來自"I love you"。那么這三個詞的詞向量就分別是[1,0,0],[0,1,0],[0,0,1]。
但是這樣做無法考慮到詞內部的關聯,只能通過統計的概率來進行判斷,而且實際場景中我們的詞袋會非常的大(N非常大),於是還會面臨維度災難問題(The Curse of Dimensionality)。
於是出現了詞嵌入(word embedding)。即將巨大且稀疏的one hot vector映射到一個維度更小的稠密向量中去。
其實現方法可以理解為,將原始的one hot vector x (1V)與embedding參數W (VD) 做矩陣乘法,由於x中只有一個元素為1,即可取出W中一行,得到稠密向量表示e (1*D),這個稠密向量叫做Distributed Representation。
也可以理解為,把參數矩陣看作一張表,知道了單詞編號,去查表(lookup)。
這個概念在信息檢索(Information Retrieval)領域叫做向量空間模型(Vector Space Model,以下簡稱VSM)。
神經網絡語言模型(Neural Network Language Model,NNLM)
Language Model語言模型,我們可以通俗的理解為解決單詞填空問題的一類模型。這個單詞出現在句尾,則就是預測下一個單詞,出現在句中,則是句子補全。
NNLM則是基於神經網絡的語言模型,出現在2003年,Bengio等人的文章:A neural probabilistic language model。
其網絡結構如圖,采用NGram模型,輸入為前N個單詞的index,然后經過embedding lookup(embedding向量可訓練),之后經過tanh激活的隱層,最后輸出層維度和單詞個數V相同,經過softmax輸出index i對應的單詞成為下一個單詞的概率。
目標函數則使用交叉熵加參數正則化約束項。
NNLM相當於使用一個簡單的前向反饋神經網絡\(f(w_{t-n+1},...,w_{t})\)來擬合一個詞序列的條件概率\(p(w_t|w_{t-1}, w_{t-2}, ..., w_{t-n+1})\)。
Word2Vec: CBoW 與 Skip-gram Model
NNLM相比原始的bigram,trigram,已經可以將考慮的gram數量提升很多。
但是它的訓練是非常的慢的,因為語料庫規模要有千萬甚至上億,這導致embedding向量和網絡最后一層的softmax層參數量極大。
於是2013年,Mikolov通過兩篇論文,提出了word2vec。
很多人誤以為word2vec是一種深度學習算法。其實word2vec算法的背后是一個淺層神經網絡。另外需要強調的一點是,word2vec是一個計算word vector的開源工具。當我們在說word2vec算法或模型的時候,其實指的是其背后用於計算word vector的CBoW模型和Skip-gram模型。很多人以為word2vec指的是一個算法或模型,這也是一種謬誤。
所以word2vec是一個工具,這個工具包含了CBow和Skip-gram兩種模型來計算word vector。CBow和Skip-gram也可以用於NNLM,但是word2vec並不是這么做的,它針對NNLM的缺點提出了新的訓練技巧Hierarchical Softmax和Negative Sampling。
CBow模型 (Continuous Bag-of-Words Model)
CBOW模型的訓練輸入是某一個特征詞的上下文相關的詞對應的詞向量,而輸出就是這特定的一個詞的詞向量。比如下面這段話,我們的上下文大小取值為4,特定的這個詞是"Learning",也就是我們需要的輸出詞向量,上下文對應的詞有8個,前后各4個,這8個詞是我們模型的輸入。由於CBOW使用的是詞袋模型,因此這8個詞都是平等的,也就是不考慮他們和我們關注的詞之間的距離大小,只要在我們上下文之內即可。
這樣我們這個CBOW的例子里,我們的輸入是8個詞向量,輸出是所有詞的softmax概率(訓練的目標是期望訓練樣本特定詞對應的softmax概率最大),對應的CBOW神經網絡模型輸入層有8個神經元,輸出層有詞匯表大小個神經元。隱藏層的神經元個數我們可以自己指定。通過DNN的反向傳播算法,我們可以求出DNN模型的參數,同時得到所有的詞對應的詞向量。這樣當我們有新的需求,要求出某8個詞對應的最可能的輸出中心詞時,我們可以通過一次DNN前向傳播算法並通過softmax激活函數找到概率最大的詞對應的神經元即可。
這里介紹的是CBow的思想,也可以理解為在NNLM中使用CBoW。基於CBoW的word2vec工具在這個思想基礎上還做了很多訓練技巧的改進。
所以如果用基於CBow的NNLM,目標函數可以選交叉熵。
Skip-gram模型
Skip-Gram模型和CBOW的思路是反着來的,即輸入是特定的一個詞的詞向量,而輸出是特定詞對應的上下文詞向量。還是上面的例子,我們的上下文大小取值為4, 特定的這個詞"Learning"是我們的輸入,而這8個上下文詞是我們的輸出。
這樣我們這個Skip-Gram的例子里,我們的輸入是特定詞, 輸出是softmax概率排前8的8個詞,對應的Skip-Gram神經網絡模型輸入層有1個神經元,輸出層有詞匯表大小個神經元。隱藏層的神經元個數我們可以自己指定。通過DNN的反向傳播算法,我們可以求出DNN模型的參數,同時得到所有的詞對應的詞向量。這樣當我們有新的需求,要求出某1個詞對應的最可能的8個上下文詞時,我們可以通過一次DNN前向傳播算法得到概率大小排前8的softmax概率對應的神經元所對應的詞即可。
和CBoW一樣,這里介紹的是Skip-Gram的思想,也可以理解為在NNLM中使用Skip-Gram。基於Skip-Gram的word2vec工具在這個思想基礎上也做了很多訓練技巧的改進。
這里目標函數同樣可以選取交叉熵。
Hierarchical Softmax
NNLM中,hidden layer是由input經過神經網絡的線性變換加激活函數得到的,基於CBow的word2vec中,將這步簡化為了直接對input中的詞向量們做average pooling,即輸入(1,2,3,4),(9,6,11,8),(5,10,7,12),得到(5,6,7,8)。(基於Skip-gram的word2vec的hidden layer就直接等於input了,其實就是沒有hiddenlayer)
另外第二個改進是針對隱藏層到softmax層的。我們知道,哈夫曼樹是一種讓權重高的節點(使用頻率高的)編碼短(更快取到)的數據結構。word2vec就使用哈夫曼樹來對單詞們編碼,從根節點開始,每個節點之間都對應一個權重,通過節點權重和隱層中間語義的二分類邏輯回歸來判斷對應的下一個單詞應該出現在那個葉子節點上。可以看出,哈夫曼樹的葉子節點就對應了NNLM中輸出softmax層中的一個個神經元。
這樣,我們在訓練階段,如果使用NNLM,我們需要對所有V個節點都進行前向傳播,而使用了Hierarchical Softmax之后,前向傳播最多只用計算logV次即可(哈夫曼樹樹深)。大大降低了前向傳播的計算量。
不過反向傳播更新參數的計算量可能並沒有減少。我們依然可以把哈夫曼樹的葉子節點們看作NNLM中最后一層輸出層,所以目標函數還是可以用同樣的softmax。
Hierarchical Softmax與兩種word2vec模型的具體結合參見:word2vec原理(二) 基於Hierarchical Softmax的模型
Negative Sampling
Hierarchical Softmax有效降低了前向傳播的計算量,但是其實它是增加了網絡的參數量的。Negative Sampling則是從另一個方向來對NNLM做改進。
其實思路比Hierarchical Softmax簡單,就是我們要根據輸入的\(w_i\)兩邊的2c個詞,然\(w_i\)在輸出中概率最高,那么我們再采幾個負樣本的詞,然后他們在輸出中概率最低,這樣可以避免網絡的參數傾向於讓大家的得分都越來越高(冷落了那些出現較少的但是其實也很重要的詞)。這點在推薦系統中比較常見。
Negative Sampling具體參見:word2vec原理(三) 基於Negative Sampling的模型
以上的改進在論文https://arxiv.org/pdf/1411.2738.pdf中也有詳細介紹。
參考文獻
https://www.cnblogs.com/guoyaohua/p/9240336.html 整體,Word2Vec
https://www.cnblogs.com/ljy2013/p/6425277.html NGram
https://www.jianshu.com/p/4452cf120bd7 NGram