神經網絡中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編碼的向量。最終模型的輸出是一個概率分布

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM