1. 程式人生 > >神經網路中embedding層作用——本質就是word2vec,資料降維,同時可以很方便計算同義詞(各個word之間的距離),底層實現是2-gram(詞頻)+神經網路

神經網路中embedding層作用——本質就是word2vec,資料降維,同時可以很方便計算同義詞(各個word之間的距離),底層實現是2-gram(詞頻)+神經網路

Embedding

tflearn.layers.embedding_ops.embedding (incoming, input_dim, output_dim, validate_indices=False, weights_init='truncated_normal', trainable=True, restore=True, reuse=False, scope=None, name='Embedding')

Embedding layer for a sequence of integer ids or floats.

Input

2-D Tensor [samples, ids].

Output

3-D Tensor [samples, embedded_ids, features].

Arguments

  • incoming: Incoming 2-D Tensor.
  • input_dim: list of int. Vocabulary size (number of ids).
  • output_dim: list of int. Embedding size.
  • validate_indices: bool. Whether or not to validate gather indices.
  • weights_init: str (name) or Tensor
    . Weights initialization. (see tflearn.initializations) Default: 'truncated_normal'.
  • trainable: bool. If True, weights will be trainable.
  • restore: bool. If True, this layer weights will be restored when loading a model
  • reuse: bool. If True and 'scope' is provided, this layer variables will be reused (shared).
  • scope: str. Define this layer scope (optional). A scope can be used to share variables between layers. Note that scope will override name.
  • name: A name for this layer (optional). Default: 'Embedding'.

這涉及到詞向量,具體看可以參考這篇文章:Word2vec 之 Skip-Gram 模型,下面只進行簡單的描述,

上圖的流程是把文章的單詞使用詞向量來表示。
(1)提取文章所有的單詞,把其按其出現的次數降許(這裡只取前5000個),比如單詞‘network’出現的次數最多,編號ID為0,依次類推…

(2)每個編號ID都可以使用50000維的二進位制(one-hot)表示

(3)最後,我們會生產一個矩陣M,行大小為詞的個數50000,列大小為詞向量的維度(通常取128或300),比如矩陣的第一行就是編號ID=0,即network對應的詞向量。

那這個矩陣M怎麼獲得呢?在Skip-Gram 模型中,我們會隨機初始化它,然後使用神經網路來訓練這個權重矩陣

那我們的輸入資料和標籤是什麼?如下圖,輸入資料就是中間的哪個藍色的詞對應的one-hot編碼,標籤就是它附近詞的one-hot編碼(這裡windown_size=2,左右各取2個)

就上述的Word2Vec中的demo而言,它的單詞表大小為1000,詞向量的維度為300,所以Embedding的引數 input_dim=10000,output_dim=300

回到最初的問題:嵌入層將正整數(下標)轉換為具有固定大小的向量,如[[4],[20]]->[[0.25,0.1],[0.6,-0.2]]

舉個栗子:假如單詞表的大小為1000,詞向量維度為2,經單詞頻數統計後,tom對應的id=4,而jerry對應的id=20,經上述的轉換後,我們會得到一個M1000×2的矩陣,而tom對應的是該矩陣的第4行,取出該行的資料就是[0.25,0.1]

如果輸入資料不需要詞的語義特徵語義,簡單使用Embedding層就可以得到一個對應的詞向量矩陣,但如果需要語義特徵,我們大可把以及訓練好的詞向量權重直接扔到Embedding層中即可,具體看參考keras提供的栗子:在Keras模型中使用預訓練的詞向量

摘自:http://blog.csdn.net/jiangpeng59/article/details/77533309

補充:

接下來我們來看看如何訓練我們的神經網路。假如我們有一個句子“The dog barked at the mailman”

  • 首先我們選句子中間的一個詞作為我們的輸入詞,例如我們選取“dog”作為input word;

  • 有了input word以後,我們再定義一個叫做skip_window的引數,它代表著我們從當前input word的一側(左邊或右邊)選取詞的數量。如果我們設定skip_window=2,那麼我們最終獲得視窗中的詞(包括input word在內)就是['The', 'dog','barked', 'at']。skip_window=2代表著選取左input word左側2個詞和右側2個詞進入我們的視窗,所以整個視窗大小span=2x2=4。另一個引數叫num_skips,它代表著我們從整個視窗中選取多少個不同的詞作為我們的output word,當skip_window=2,num_skips=2時,我們將會得到兩組 (input word, output word) 形式的訓練資料,即 ('dog', 'barked')('dog', 'the')

  • 神經網路基於這些訓練資料將會輸出一個概率分佈,這個概率代表著我們的詞典中的每個詞是output word的可能性。這句話有點繞,我們來看個栗子。第二步中我們在設定skip_window和num_skips=2的情況下獲得了兩組訓練資料。假如我們先拿一組資料 ('dog', 'barked') 來訓練神經網路,那麼模型通過學習這個訓練樣本,會告訴我們詞彙表中每個單詞是“barked”的概率大小。

模型的輸出概率代表著到我們詞典中每個詞有多大可能性跟input word同時出現。舉個栗子,如果我們向神經網路模型中輸入一個單詞“Soviet“,那麼最終模型的輸出概率中,像“Union”, ”Russia“這種相關詞的概率將遠高於像”watermelon“,”kangaroo“非相關詞的概率。因為”Union“,”Russia“在文字中更大可能在”Soviet“的視窗中出現。我們將通過給神經網路輸入文字中成對的單詞來訓練它完成上面所說的概率計算。下面的圖中給出了一些我們的訓練樣本的例子。我們選定句子“The quick brown fox jumps over lazy dog”,設定我們的視窗大小為2(window_size=2),也就是說我們僅選輸入詞前後各兩個詞和輸入詞進行組合。下圖中,藍色代表input word,方框內代表位於視窗內的單詞。

一文詳解 Word2vec 之 Skip-Gram 模型(結構篇)

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

模型細節

我們如何來表示這些單詞呢?首先,我們都知道神經網路只能接受數值輸入,我們不可能把一個單詞字串作為輸入,因此我們得想個辦法來表示這些單詞。最常用的辦法就是基於訓練文件來構建我們自己的詞彙表(vocabulary)再對單詞進行one-hot編碼。

假設從我們的訓練文件中抽取出10000個唯一不重複的單片語成詞彙表。我們對這10000個單詞進行one-hot編碼,得到的每個單詞都是一個10000維的向量,向量每個維度的值只有0或者1,假如單詞ants在詞彙表中的出現位置為第3個,那麼ants的向量就是一個第三維度取值為1,其他維都為0的10000維的向量(ants=[0, 0, 1, 0, ..., 0])。

還是上面的例子,“The dog barked at the mailman”,那麼我們基於這個句子,可以構建一個大小為5的詞彙表(忽略大小寫和標點符號):("the", "dog", "barked", "at", "mailman"),我們對這個詞彙表的單詞進行編號0-4。那麼”dog“就可以被表示為一個5維向量[0, 1, 0, 0, 0]。

模型的輸入如果為一個10000維的向量,那麼輸出也是一個10000維度(詞彙表的大小)的向量,它包含了10000個概率,每一個概率代表著當前詞是輸入樣本中output word的概率大小。

下圖是我們神經網路的結構:

一文詳解 Word2vec 之 Skip-Gram 模型(結構篇)

隱層沒有使用任何啟用函式,但是輸出層使用了sotfmax。

我們基於成對的單詞來對神經網路進行訓練,訓練樣本是 ( input word, output word ) 這樣的單詞對,input word和output word都是one-hot編碼的向量。最終模型的輸出是一個概率分佈