文字分類深度學習實踐 學習記錄

2021-10-08 17:40:30 字數 4576 閱讀 5179

word2vec的主要思路:通過單詞和上下文彼此**,對應的兩個演算法分別為:

也就是說模型的輸出概率代表著到我們詞典中每個詞有多大可能性跟input word同時出現。例如:如果我們向神經網路模型中輸入乙個單詞「soviet「,那麼最終模型的輸出概率中,像「union」, 」russia「這種相關詞的概率將遠高於像」watermelon「,」kangaroo「非相關詞的概率。因為」union「,」russia「在文字中更大可能在」soviet「的視窗**現。

我們將通過給神經網路輸入文字中成對的單詞來訓練它完成上面所說的概率計算。下面的圖中給出了一些我們訓練樣本的例子。我們選定句子「the quick brown fox jumps over lazy dog」,設定我們的視窗大小為2(window_size=2),也就是說我們僅選輸入詞前後各兩個詞和輸入詞進行組合。下圖中,藍色代表input word,方框內代表位於視窗內的單詞。

我們的模型將會從每對單詞出現的次數中習得統計結果。例如,我們的神經網路可能會得到更多類似(「soviet「,」union「)這樣的訓練樣本對,而對於(」soviet「,」sasquatch「)這樣的組合卻看到的很少。因此,當我們的模型完成訓練後,給定乙個單詞」soviet「作為輸入,輸出的結果中」union「或者」russia「要比」sasquatch「被賦予更高的概率。

ps:input word和output word都會被我們進行one-hot編碼。仔細想一下,我們的輸入被one-hot編碼以後大多數維度上都是0(實際上僅有乙個位置為1),所以這個向量相當稀疏,那麼會造成什麼結果呢。如果我們將乙個1 x 10000的向量和10000 x 300的矩陣相乘,它會消耗相當大的計算資源,為了高效計算,它僅僅會選擇矩陣中對應的向量中維度值為1的索引行:

2. skip-grams訓練

由上部分可知,word2vec模型是乙個超級大的神經網路(權重矩陣規模非常大)。例如:我們擁有10000個單詞的詞彙表,我們如果想嵌入300維的詞向量,那麼我們的輸入-隱層權重矩陣和隱層-輸出層的權重矩陣都會有 10000 x 300 = 300萬個權重,在如此龐大的神經網路中進行梯度下降是相當慢的。更糟糕的是,你需要大量的訓練資料來調整這些權重並且避免過擬合。百萬數量級的權重矩陣和億萬數量級的訓練樣本意味著訓練這個模型將會是個災難

解決方案:

2.1 word pairs and "phases"

一些單詞組合(或者片語)的含義和拆開以後具有完全不同的意義。比如「boston globe」是一種報刊的名字,而單獨的「boston」和「globe」這樣單個的單詞卻表達不出這樣的含義。因此,在文章中只要出現「boston globe」,我們就應該把它作為乙個單獨的詞來生成其詞向量,而不是將其拆開。同樣的例子還有「new york」,「united stated」等。

在google發布的模型中,它本身的訓練樣本中有來自google news資料集中的1000億的單詞,但是除了單個單詞以外,單詞組合(或片語)又有3百萬之多。

2.2 對高頻詞抽樣

在上一部分中,對於原始文字為「the quick brown fox jumps over the laze dog」,如果使用大小為2的視窗,那麼我們可以得到圖中展示的那些訓練樣本。

但是對於「the」這種常用高頻單詞,這樣的處理方式會存在下面兩個問題:

word2vec通過「抽樣」模式來解決這種高頻詞問題。它的基本思想如下:對於我們在訓練原始文字中遇到的每乙個單詞,它們都有一定概率被我們從文字中刪掉,而這個被刪除的概率與單詞的頻率有關。

ωi 是乙個單詞,z(ωi) 是 ωi 這個單詞在所有語料**現的頻次,例如:如果單詞「peanut」在10億規模大小的語料**現了1000次,那麼 z(peanut) = 1000/1000000000 = 1e - 6。

p(ωi) 代表著保留某個單詞的概率:

2.3 negative sampling

訓練乙個神經網路意味著要輸入訓練樣本並且不斷調整神經元的權重,從而不斷提高對目標的準確**。每當神經網路經過乙個訓練樣本的訓練,它的權重就會進行一次調整。

所以,詞典的大小決定了我們的skip-gram神經網路將會擁有大規模的權重矩陣,所有的這些權重需要通過數以億計的訓練樣本來進行調整,這是非常消耗計算資源的,並且實際中訓練起來會非常慢。

負取樣(negative sampling)解決了這個問題,它是用來提高訓練速度並且改善所得到詞向量的質量的一種方法。不同於原本每個訓練樣本更新所有的權重,負取樣每次讓乙個訓練樣本僅僅更新一小部分的權重,這樣就會降低梯度下降過程中的計算量。

當我們用訓練樣本 ( input word: "fox",output word: "quick") 來訓練我們的神經網路時,「 fox」和「quick」都是經過one-hot編碼的。如果我們的詞典大小為10000時,在輸出層,我們期望對應「quick」單詞的那個神經元結點輸出1,其餘9999個都應該輸出0。在這裡,這9999個我們期望輸出為0的神經元結點所對應的單詞我們稱為「negative」 word。

當使用負取樣時,我們將隨機選擇一小部分的negative words(比如選5個negative words)來更新對應的權重。我們也會對我們的「positive」 word進行權重更新(在我們上面的例子中,這個單詞指的是」quick「)。

ps: 在**中,作者指出指出對於小規模資料集,選擇5-20個negative words會比較好,對於大規模資料集可以僅選擇2-5個negative words。

我們使用「一元模型分布(unigram distribution)」來選擇「negative words」。個單詞被選作negative sample的概率跟它出現的頻次有關,出現頻次越高的單詞越容易被選作negative words。

在**負取樣的**實現中,unigram table有乙個包含了一億個元素的陣列,這個陣列是由詞彙表中每個單詞的索引號填充的,並且這個陣列中有重複,也就是說有些單詞會出現多次。那麼每個單詞的索引在這個陣列**現的次數該如何決定呢,有公式,也就是說計算出的負取樣概率*1億=單詞在表**現的次數。

有了這張表以後,每次去我們進行負取樣時,只需要在0-1億範圍內生成乙個隨機數,然後選擇表中索引號為這個隨機數的那個單詞作為我們的negative word即可。乙個單詞的負取樣概率越大,那麼它在這個表**現的次數就越多,它被選中的概率就越大。

3. hierarchical softmax

3.1 霍夫曼樹

輸入:權值為(w1,w2,…wn)的n個節點

輸出:對應的霍夫曼樹

霍夫曼樹的建立:

如上圖所示:

注意:此時的theta是乙個待定係數,它是由推導最大似然之後求解得到迭代式子。

下面我們用乙個具體的例子來說明霍夫曼樹建立的過程,我們有(a,b,c,d,e,f)共6個節點,節點的權值分布是(16,4,8,6,20,3)。

首先是最小的b和f合併,得到的新樹根節點權重是7.此時森林裡5棵樹,根節點權重分別是16,8,6,20,7。此時根節點權重最小的6,7合併,得到新子樹,依次類推,最終得到下面的霍夫曼樹。

那麼霍夫曼樹有什麼好處呢?一般得到霍夫曼樹後我們會對葉子節點進行霍夫曼編碼,由於權重高的葉子節點越靠近根節點,而權重低的葉子節點會遠離根節點,這樣我們的高權重節點編碼值較短,而低權重值編碼值較長。這保證的樹的帶權路徑最短,也符合我們的資訊理論,即我們希望越常用的詞擁有更短的編碼。如何編碼呢?一般對於乙個霍夫曼樹的節點(根節點除外),可以約定左子樹編碼為0,右子樹編碼為1。如上圖,則可以得到c的編碼是00。

在word2vec中,約定編碼方式和上面的例子相反,即約定左子樹編碼為1,右子樹編碼為0,同時約定左子樹的權重不小於右子樹的權重。

3.2hierarchical softmax過程

為了避免要計算所有詞的softmax概率,word2vec取樣了霍夫曼樹來代替從隱藏層到輸出softmax層的對映。

使用gensim訓練word2vec

from gensim.models.word2vec import word2vec

model = word2vec(sentences, workers=num_workers, size=num_features)

以上大部分為理論基礎,接下來為實踐與理論結合部分:

textcnn利用cnn(卷積神經網路)進行文字特徵抽取,不同大小的卷積核分別抽取n-gram特徵,卷積計算出的特徵圖經過maxpooling保留最大的特徵值,然後將拼接成乙個向量作為文字的表示。(也就是將文字應用於cnn中)

將z個詞嵌入,成為z×m的矩陣,通道數為q也就是樣本條數,最後形成的詞向量樣本張量為z×m×q,再使用n✖1的k個卷積核,n-gram提取特徵,這裡的n-grame可以調整大小,最後對多個卷積核得到的特徵圖譜使用最基礎的全域性池化保留最大特徵值進行拼接,在使用dense層進行全連線輸出。

textrnn

textrnn利用rnn(迴圈神經網路)進行文字特徵抽取,由於文字本身是一種序列,而lstm天然適合建模序列資料。textrnn將句子中每個詞的詞向量依次輸入到雙向雙層lstm,分別將兩個方向最後乙個有效位置的隱藏層拼接成乙個向量作為文字的表示。

textrnn的結構非常靈活,可以任意改變。比如把lstm單元替換為gru單元,把雙向改為單向,新增dropout或batchnormalization以及再多堆疊一層等等。textrnn在文字分類任務上的效果非常好,與textcnn不相上下,但rnn的訓練速度相對偏慢,一般2層就已經足夠多了。

深度學習和文字分類

參考部落格 fasttext 模型輸入乙個詞的序列 一段文字或者一句話 輸出這個詞序列屬於不同類別的概率。序列中的詞和片語組成特徵向量,特徵向量通過線性變換對映到中間層,中間層再對映到標籤。fasttext 在 標籤時使用了非線性啟用函式,但在中間層不使用非線性啟用函式。fasttext 模型架構和...

深度學習和文字分類

傳統的文字分類模型 深度學習文字分類模型 fasttext fasttext 模型輸入乙個詞的序列 一段文字或者一句話 輸出這個詞序列屬於不同類別的概率。序列中的詞和片語組成特徵向量,特徵向量通過線性變換對映到中間層,中間層再對映到標籤。fasttext 在 標籤時使用了非線性啟用函式,但在中間層不...

nlp實踐 基於深度學習的文字分類1

fasttext bag of tricks for efficient text classification 與傳統機器學習不同,深度學習既提供特徵提取功能,也可以完成分類的功能。基於fasttext的文字分類 如何使用驗證集調參 在基於機器學習的文字分類中,介紹了4中文字表示方法 one ho...