Word2Vec介紹
Word2Vec是一個將單詞轉換成向量形式的工具。可以把對文本內容的處理簡化為向量空間中的向量運算,計算出向量空間上的相似度,來表示文本語義上的相似度。(Word Embedding是根據該word在句中的上下文來決定的)可以提高模型的泛化能力。
1.在應用中充當語言模型
2.什么是語言模型?
我說的一句話中,后一個詞出現的概率總是和前一個出現的概率是相關的。
如 我 = p(w1),今天=p(w2|w1)=“我”出現的情況下,“今天”出現的概率
3.存在的問題
最后一個詞的概率,如果句子過長會導致計算量過大,同時后一個詞和前一個詞組合的可能性越多,那么計算量也會增大。
4.一種解決辦法-N-gram
之前是后一個詞出現的概率只和前一個詞有關,這樣會導致數據稀疏和參數空間太大。
現在在改進之后,后一個詞出現的概率會和前N個詞有關。
4.1例子:下面以 I want Chinese food 為例
如這里統計了一個語料庫,以1-gram為例。i 出現的次數是2533,eat 在i后面出現的次數是9,那么概率為 9 / 2533 ≈ 0.0036.
4.2N-gram模型參數的量級
N代表語料庫詞的個數,n代表是依賴前幾個詞。通常會讓n=2或3。
5.詞向量(word to vector)
人類認識詞,但是計算機認識0和1,那么這時候就需要使用一種方法(如One-hot編碼)轉換這些詞讓計算機來識別這些詞。但是這樣的方法過于簡單,現在需要的詞向量需要能夠代表存在一種潛在的含義。
向量就是一些值的排列,可以讓它的值的范圍在-1到1之間,同時也可以向量的維度,向量的維度與向量的復雜程度呈正相關。
在語料庫中,詞和詞之間是有一定的距離的。
此前提到的詞向量在向量空間生成的時候要代表一定的含義就是,意思相似的詞,他們之間的距離應該是相近的。(即生成的向量空間和真實的語言越相關,那么計算機所生成的語言也會越相關。or 兩個詞上下文相似,則它們的語義也相似)
6.詞向量在神經網絡模型中的應用(2003)
鑒于N-gram等模型的不足,2003年,Bengio等人發表了一篇開創性的文章:A neural probabilistic language model。在這篇文章里,他們總結出了一套用神經網絡建立統計語言模型的框架(Neural Network Language Model,以下簡稱NNLM),并首次提出了word embedding的概念(雖然沒有叫這個名字),從而奠定了包括word2vec在內后續研究word representation learning的基礎。
7.Word2Vec:CBOW 含有一定層次的Softmax
Word2Vec實際上是兩種不同的方法:Continuous Bag of Words (CBOW)和Skip-gram。CBOW的目標是根據上下文來預測當前詞語的概率。Skip-gram剛好相反:根據當前詞語來預測上下文的概率(如下圖所示)。這兩種方法都利用人工神經網絡作為它們的分類算法。起初,每個單詞都是一個隨機 N 維向量。經過訓練之后,該算法利用 CBOW 或者 Skip-gram 的方法獲得了每個單詞的最優向量。
7.1CBOW簡介
預測的概率值越大越好。
7.2為什么要用Hierarchical Softmax模型?
因為CBOW最后OUTPUT得到的詞向量維度太高,此時利用Hierarchical Softmax模型作為CBOW的輸出層OUTPUT,來解決高緯度問題并保證詞向量都完備沒有丟失。它利用哈夫曼樹構造多個二分類,讓詞向量達成了這種分層的思想。
取一個適當大小的窗口當做語境(上下文),輸入層讀入窗口內的詞,將它們的向量(K維,初始隨機)加和在一起,形成隱藏層K個節點。輸出層是一個巨大的二叉樹,葉節點代表語料里所有的詞(語料含有V個獨立的詞,則二叉樹有|V|個葉節點)。而這整顆二叉樹構建的算法就是Huffman樹。這樣,對于葉節點的每一個詞,就會有一個全局唯一的編碼,形如"010011",不妨記左子樹為1,右子樹為0。接下來,隱層的每一個節點都會跟二叉樹的內節點有連邊,于是 對于二叉樹的每一個內節點都會有K條連邊,每條邊上也會有權值。
7.3哈夫曼樹
構造目的和帶權路徑最短:讓不同的節點能夠有優先級,如高頻使用的單詞讓它們的帶權路徑長度盡量小。
7.3.1哈夫曼樹的構造以及哈夫曼編碼
權重小的節點置于左邊;哈夫曼編碼左為0,右為1,則D的哈夫曼編碼為0,A的哈夫曼編碼為111。
Hierarchical Softmax 就是利用這種分層的思想,將優先級更高的向量放在前面。
7.4CBOW模型
7.4.1Logistic回歸模型
其實Softmax就是一個多分類的邏輯回歸,由多個邏輯回歸組合在一起。
7.5CBOW原理
7.6CBOW參數含義約定
7.7CBOW求解實例
右為正例。左為負例。將剛才CBOW的θ數量級壓縮成log級別,都壓縮到了非葉子節點上。形成了四條決策路徑,四個sigmoid。
7.7CBOW求解目標函數
根據上面的實例和約定好的參數含義,利用最大似然函數得到目標函數,這里用到log函數的公式對目標函數進行了展開。目標函數的目標讓其中的概率p值越大越好。
7.8CBOW梯度上升求解最優參數
既然要讓目標函數得到最大值(極值),那么就是一個梯度上升的問題。
對函數進行求導,那么導數點為極值點。η為學習率, x_w為投影層向量
似然函數是由很多的θ參數決定的,那么似然函數對它求偏導即可解決θ的更新問題。
x_w參數對于目標函數也有一定影響,那么也可以對x_w投影層詞向量進行更新,同理,似然函數對齊求偏導。
Google出品的word2vec,它認為每個詞向量v(w)都與和向量X_w是相關的,那么直接將X_w的更新量整個應用到每個單詞的詞向量上去。好處是所有的詞向量更新會有整體的趨勢,分配的空間是類似的,保證屬于上下文的邏輯。
即沿著最大最好的優化目標,提出梯度上升的解決方案,用這種方案不斷的優化更新θ和X_w,最終得到每個詞的詞向量v(w)。
7.8總結
對于語料庫中的某個詞w_t,對應著二叉樹的某個葉子節點,因此它必然有一個二進制編碼,如"010011"。在訓練階段,當給定上下文,要預測后 面的詞w_t的時候,我們就從二叉樹的根節點開始遍歷,這里的目標就是預測這個詞的二進制編號的每一位。
即對于給定的上下文,我們的目標是使得預測詞的二 進制編碼概率最大。形象地說,我們希望在根節點,詞向量和與根節點相連經過 logistic 計算得到 bit=1 的概率盡量接近 0,在第二層,希望其 bit=1 的概率盡量接近1,這么一直下去,我們把一路上計算得到的概率相乘,即得到目標詞w_t在當前網絡下的概率P(w_t),那么對于當前這個 sample的殘差就是1-P(w_t),于是就可以使用梯度下降法訓練這個網絡得到所有的參數值了。顯而易見,按照目標詞的二進制編碼計算到最后的概率 值就是歸一化的。
Hierarchical Softmax用Huffman編碼構造二叉樹,其實借助了分類問題中,使用一連串二分類近似多分類的思想。例如我們是把所有的詞都作為輸出,那么“桔 子”、“汽車”都是混在一起。給定w_t的上下文,先讓模型判斷w_t是不是名詞,再判斷是不是食物名,再判斷是不是水果,再判斷是不是“桔子”。
但是在訓練過程中,模型會賦予這些抽象的中間結點一個合適的向量,這個向量代表了它對應的所有子結點。因為真正的單詞公用了這些抽象結點的向量,所 以Hierarchical Softmax方法和原始問題并不是等價的,但是這種近似并不會顯著帶來性能上的損失同時又使得模型的求解規模顯著上升。
沒有使用這種二叉樹,而是直接從隱層直接計算每一個輸出的概率——即傳統的Softmax,就需要對|V|中的每一 個詞都算一遍,這個過程時間復雜 度是O(|V|)的。而使用了二叉樹(如Word2vec中的Huffman樹),其時間復雜度就降到了O(log2(|V|)),速度大大地加快了。
現在這些詞向量已經捕捉到上下文的信息。我們可以利用基本代數公式來發現單詞之間的關系(比如,“國王”-“男人”+“女人”=“王后”)。這些詞向量可 以代替詞袋用來預測未知數據的情感狀況。該模型的優點在于不僅考慮了語境信息還壓縮了數據規模(通常情況下,詞匯量規模大約在300個單詞左右而不是之前 模型的100000個單詞)。因為神經網絡可以替我們提取出這些特征的信息,所以我們僅需要做很少的手動工作。但是由于文本的長度各異,我們可能需要利用 所有詞向量的平均值作為分類算法的輸入值,從而對整個文本文檔進行分類處理。
然而,即使上述模型對詞向量進行平均處理,我們仍然忽略了單詞之間的排列順序對情感分析的影響。即上述的word2vec只是基于詞的維度進行"語義分析"的,而并不具有上下文的"語義分析"能力。
同時,Word2Vec是對于每個local context window單獨訓練,沒有利用包含全局共現矩陣global co-currence中的統計信息;它對多義詞無法很好的表示和處理,因為使用了唯一的詞向量。
8.用負采樣模型Negative Sampling來分類,進而訓練word2vec的網絡模型
利用Hierarchical Softmax 分層來訓練Word2Vec中的參數,······可能有些啰嗦和計算量過大,現在用另一種方法。
比如有一個句子 我今天想打___.
給定上下文的語境下去預測詞,給定正樣本是 球, 負樣本是除球之外的詞,比如 人、動物、氣球等等。
假設output映射出了10w個詞向量,規定一個詞向量為正樣本,那么負樣本就會有很多,那么我們該如何選擇恰當的負樣本?
得到似然目標函數。
利用似然函數對θ和X_w參數進行求偏導.
最終得到了優化好的v(w),此時就是我們想要的詞向量。
9.Skip-gram和CBOW使用場景
根據樣本量的大小,如果數據量大的話使用Skip-gram,反之使用CBOW。
10.工具
Python 使用gensim即可。
11.實戰:word2vec工具訓練中文模型
Python的話可用jieba完成分詞,生成分詞文件wiki.zh.text.seg,然后接著用word2vec工具訓練。