http://blog.csdn.net/pipisorry/article/details/76147604
深度學習在自然語言處理中第一個應用:訓練詞嵌入。通過詞嵌入的詞表示方式,大量的nlp領域的任務都得到了提升。Google 的 Tomas Mikolov 在《Efficient Estimation of Word Representation in Vector Space》提出 Word2Vec,就成爲了深度學習在自然語言處理中的基礎部件。
目前官方最新的word2vec工具包發佈於2013年,爲c語言版本,此外還有非官方版本:python版本和java版本。
Word2Vec 的基本思想是把自然語言中的每一個詞,表示成一個統一意義統一維度的短向量。至於向量中的每個維度也許對應於世界上的一些最基本的概念。一個人讀書時,如果遇到了生僻的詞,一般能根據上下文大概猜出生僻詞的意思,而 Word2Vec 正是很好的捕捉了這種人類的行爲。
word2vec工具包輸入是一個文本文件,稱爲訓練語料,輸出是一個詞典,詞典中包含訓練語料中出現的單詞以及它們的詞嵌入表示。單詞的詞嵌入表示,就是用一個n維的實數向量來代表一個單詞,單詞之間的語義關係可以通過詞嵌入體現出來,所以,要衡量詞嵌入好與不好,可以觀察詞嵌入可以多大程度體現單詞的語義信息。使用word2vec訓練詞向量的一個基本假設就是分佈式假設,分佈式假設是說詞語的表示反映了它們的上下文,也就是它認爲,有相似上下文的單詞的語義也是相近的。
使用word2vec訓練出的詞嵌入有兩個特點:
在介紹word2vec前,先介紹一些基礎知識,包括詞向量和語言模型。然後介紹word2vec訓練詞嵌入時可以選擇的四種模型,分別介紹它們的模型結構,以及使用梯度更新訓練過程的數學推導。
NLP(Natural Language Processing)問題要轉化爲機器學習的問題,首先就要把單詞數學化表示,就是用n維實數向量來代表一個單詞,常見的詞向量有以下兩種:
例如: 「話筒」表示爲 [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 …]
「麥克」表示爲 [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 …]
One-hot表示使用了單詞在詞表中的編號信息,編碼方式如下:向量長度爲詞表大小,單詞在詞表中的編號對應的那一個維度爲1,其餘爲0。
One-hot表示存在兩個問題:
1.維度比較大,尤其在用於神經網絡的一些算法時,出現「維數災難」。
2.詞彙鴻溝:任意兩個詞之間都是孤立的,不能體現詞和詞之間的關係(因爲編碼過程僅僅使用了它們在詞表中的編號信息)。
例如: [0.792, −0.177, −0.107, 0.109, 0.542, …],每個維度用一個實數值表示
克服了One-hot表示存在的兩個問題:
1.解決了維度大的問題:常見維度50或者100。
2.解決了「詞彙鴻溝」問題:可以通過計算向量之間的距離(歐式距離、餘弦距離等)來體現詞與詞的相似性。
這樣的詞向量稱爲詞嵌入(word-embedding),那麼如何訓練這樣的詞向量呢?我們可以通過訓練語言模型的同時,得到詞向量。
接下來本文將介紹語言模型的概念,並介紹幾種常見的語言模型。
語言模型其實就是判斷一句話是不是正常人說出來的。用數學符號描述爲:
給定一個字符串「
簡單表示爲:p(s)=
從上面的公式可以看出,建立語言模型要解決的核心問題就是如何計算
該模型基於這樣一種假設:某個詞的出現只與前面N-1個詞相關,而與其它任何詞都不相關。整句的概率就是各個詞出現概率的乘積。這些概率可以通過直接從語料中統計N個詞同時出現的次數得到。
常用的是二元的Bi-Gram和三元的Tri-Gram。高於四元的用的很少,因爲訓練它需要更龐大的語料,而且數據稀疏嚴重,時間複雜度高,精度卻提高的不多。
怎麼得到P(Wn|W1W2…Wn-1)呢?一種簡單的估計方法就是最大似然估計(Maximum Likelihood Estimate)了。即P(Wn|W1W2…Wn-1) = (C(W1 W2…Wn))/(C(W1 W2…Wn-1))。剩下的工作就是在訓練語料庫中數數兒了,即統計序列C(W1 W2…Wn) 出現的次數和C(W1 W2…Wn-1)出現的次數。
一個bigram的例子,假設語料庫總詞數爲
存在的問題:
稀疏問題:假設詞表中有10000個詞,如果是bigram,那麼可能的N-gram就有100000000個,如果是trigram,那麼可能的N-gram就有1000000000000個,對於其中的很多詞對的組合,在語料庫中都沒有出現,根據最大似然估計得到的概率將會是0,這會造成很大的麻煩,在算句子的概率時一旦其中的某項爲0,那麼整個句子的概率就會爲0,於是我們的模型只能算可憐兮兮的幾個句子,而大部分的句子算得的概率是0。suffers from data sparsity and high dimensionality.
解決辦法:數據平滑(data Smoothing),數據平滑的目的有兩個:一個是使所有的N-gram概率之和爲1,使所有的N-gram概率都不爲0。
[N-gram模型]
N-gram模型是基於統計的語言模型,無法得到單詞的詞嵌入。接下來介紹的語言模型會把詞嵌入作爲輸入(初始的詞嵌入是隨機值),訓練語言模型的同時也在訓練詞嵌入,最終可以同時得到語言模型和詞嵌入。
word2vec也是一種語言模型,在訓練語言模型的同時得到詞嵌入。word2vec工具包提供了四種可選的訓練模型,分別是由兩種模型(CBOW,Skip-gram),兩種方法(Hierarchical Softmax,Negative Sampling)(只是用Hierarchical Softmax和負採樣加速訓練計算)組合而成:[CBOW+Hierarchical Softmax] [CBOW+Negative Sampling] [Skip-gram+Hierarchical Softmax] [Skip-gram+Negative Sampling]
訓練語言模型的最經典之作[Bengio, Yoshua, et al. "A neural probabilistic language model." JMLR2003]或者在這裏[Bengio, Yoshua, Schwenk, Holger, et al. Neural probabilistic language models. In Innovations in Machine Learning. Springer, 2006]。
這裏實際就是CBOW模型。
[Bengio, Yoshua, et al. "A neural probabilistic language model." JMLR2003] [Le, Quoc, and Tomas Mikolov. "Distributed representations of sentences and documents." ICML2014]
Bengio 用了一個三層的神經網絡來構建語言模型,同樣也是 n-gram 模型(即假設某個詞的出現只與前面N-1個詞相關,而與其它任何詞都不相關)。
圖中最下方的
網絡的第一層(輸入層)是將
。 或者average也可以。
網絡的第二層(隱藏層)就如同普通的神經網絡,直接使用
網絡的第三層(輸出層)一共有
整個模型的多數計算集中在
hierarchical softmax加速
後面發表論文的 3 個工作,都有對這一環節的簡化,提升計算的速度。如In practice, hierarchical softmax (Morin & Bengio, 2005; Mnih & Hinton, 2008; Mikolov et al., 2013c) is preferred to softmax for fast training.
[Morin, Frederic and Bengio, Yoshua. Hierarchical probabilistic neural network language model. Aistats2005] [Mnih, Andriy and Hinton, Geoffrey E. A scalable hierarchical distributed language model. In Advances in Neural Information Processing Systems2008]
the structure of the hierarical softmax is a binary Huffman tree, where short codes are assigned to frequent words.[Mikolov, Tomas, Sutskever, Ilya, et al. Distributed representations of phrases and their compositionality. NIPS2013c]
代碼code.google.com/p/word2vec/ [Mikolov, Tomas, et al. Efficient estimation of word representations in vector space. arXiv 2013a]
用隨機梯度下降法把這個模型優化出來就可以了,需要注意的是,一般神經網絡的輸入層只是一個輸入值,而在這裏,輸入層 x 也是參數(存在 C 中),也是需要優化的。優化結束之後,詞向量有了,語言模型也有了。
θ = (b, d,W,U, H,C)
優點:
1.這樣得到的語言模型自帶平滑,無需傳統 n-gram 模型中那些複雜的平滑算法。Bengio 在 APNews 數據集上做的對比實驗也表明他的模型效果比精心設計平滑算法的普通 n-gram 算法要好 10% 到 20%。
2.詞語間的相似性可以通過詞向量體現,例如:語料中S1=「A dog is running in the room」出現了10000,次,S2= 「A cat is running in the room」出現了0次,按照n-gram模型的做法,p(S1)肯定遠大於p(S2)。而在NNLM中,兩者非常接近,因爲cat的詞向量和dog非常接近,將詞向量代入計算得到的結果就很接近。
其他幾種模型如C&W 的 SENNA,M&H 的 HLBL,Mikolov 的 RNNLM,Huang 的語義強化都是在Bengio論文發表後受到啓發並進行一定改進的模型[http://licstar.net/archives/328]。
Word2Vec 的訓練模型,看穿了,是具有一個隱含層的神經元網絡(如下圖)。它的輸入是詞彙表向量,當看到一個訓練樣本時,對於樣本中的每一個詞,就把相應的在詞彙表中出現的位置的值置爲1,否則置爲0。它的輸出也是詞彙表向量,對於訓練樣本的標籤中的每一個詞,就把相應的在詞彙表中出現的位置的值置爲1,否則置爲0。那麼,對所有的樣本,訓練這個神經元網絡。收斂之後,將從輸入層到隱含層的那些權重,作爲每一個詞彙表中的詞的向量。比如,第一個詞的向量是(w1,1 w1,2 w1,3 ... w1,m),m是表示向量的維度。所有虛框中的權重就是所有詞的向量的值。有了每個詞的有限維度的向量,就可以用到其它的應用中,因爲它們就像圖像,有了有限維度的統一意義的輸入。
CBOW,它的做法是,將一個詞所在的上下文中的詞作爲輸入,而那個詞本身作爲輸出,也就是說,看到一個上下文,希望大概能猜出這個詞和它的意思。通過在一個大的語料庫訓練,得到一個從輸入層到隱含層的權重模型。如下圖所示,第l個詞的上下文詞是i,j,k,那麼i,j,k作爲輸入,它們所在的詞彙表中的位置的值置爲1。然後,輸出是l,把它所在的詞彙表中的位置的值置爲1。訓練完成後,就得到了每個詞到隱含層的每個維度的權重,就是每個詞的向量。
一個實例:窗口長度爲2時:
兩個模型都包含3層:輸入層,投影層,輸出層。
CBOW模型:已知上下文
Skip-gram模型:已知當前詞
1.輸入層:包含Context(w)中2c個詞的詞向量
2.投影層:將輸入層的2c個詞向量求和,即
3.輸出層:輸出層對應一棵二叉樹,它是以詞典D中的詞作葉子節點,以該詞在語料中的頻數作爲權值構造的一棵Huffman樹。這棵樹中,葉子節點有N(=|D|)個,分別對應詞典D中的詞,非葉子節點有N-1個。
對一個樣本進行預測的例子:
句子:我,喜歡,觀看,巴西,足球,世界盃
w=足球
正類概率:
負類概率:
「足球」葉子節點經過4次二分類,每次分類結果對應的概率爲:
第一次:
第二次:
第三次:
第四次:
由Context(「足球」)預測「足球」出現的概率爲: