NLP 中的embedding layer


https://blog.csdn.net/chuchus/article/details/78386059

詞匯是語料庫的基本元素, 所以, 使用embedding layer來學習詞嵌入, 將一個詞映射成為固定維度的稠密向量. 有了這一步, 才能構造矩陣, 實現神經網絡的前向傳播.

如何使用?

  • 從頭訓練 
    就像word2vec一樣, 這一層是可學習的, 用隨機數initialize , 通過BP去調整.
  • pre-trained + fine tuning 
    用其他網絡(如 word2vec) 訓練好的現成的詞向量, 作為初始化參數, 然后繼續學習.
  • pre-trained + static 
    用其他網絡(如 word2vec) 訓練好的現成的詞向量, 作為初始化參數, 並且這些參數保持固定, 不參與網絡的學習.

keras 的 Embedding

Embedding(Layer) 
類. 將索引映射為固定維度的稠密的向量. 
eg. [[4], [20]] -> [[0.25, 0.1], [0.6, -0.2]] 
This layer can only be used as the first layer in a model.

__init__(self, input_dim, output_dim,input_length,...) 
構造函數, 分別為三個參數分別代表vocab_size,vector_dimension,fixed_word_number. 
還有繼承自父類的weights,trainable參數. 
如一個語料庫, 詞匯量為20萬, word representation vector is 200d, 文章的截斷長度為250個單詞, 那么 
embedding_layer=Embedding(input_dim=20E4,output_dim=200,input_length=250,weights=embedding_matrix,trainable=is_trainable)

 


keras:3)Embedding層詳解

https://blog.csdn.net/jiangpeng59/article/details/77533309

Embedding層

keras.layers.embeddings.Embedding(input_dim, output_dim, embeddings_initializer='uniform', embeddings_regularizer=None, activity_regularizer=None, embeddings_constraint=None, mask_zero=False, input_length=None)
  • 1

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

Embedding層只能作為模型的第一層

參數

input_dim:大或等於0的整數,字典長度,即輸入數據最大下標+1 
output_dim:大於0的整數,代表全連接嵌入的維度 
embeddings_initializer: 嵌入矩陣的初始化方法,為預定義初始化方法名的字符串,或用於初始化權重的初始化器。參考initializers 
embeddings_regularizer: 嵌入矩陣的正則項,為Regularizer對象 
embeddings_constraint: 嵌入矩陣的約束項,為Constraints對象 
mask_zero:布爾值,確定是否將輸入中的‘0’看作是應該被忽略的‘填充’(padding)值,該參數在使用遞歸層處理變長輸入時有用。設置為True的話,模型中后續的層必須都支持masking,否則會拋出異常。如果該值為True,則下標0在字典中不可用,input_dim應設置為|vocabulary| + 2。 
input_length:當輸入序列的長度固定時,該值為其長度。如果要在該層后接Flatten層,然后接Dense層,則必須指定該參數,否則Dense層的輸出維度無法自動推斷。 
輸入shape 
形如(samples,sequence_length)的2D張量 
輸出shape 
形如(samples, sequence_length, output_dim)的3D張量

較為費勁的就是第一句話: 
嵌入層將正整數(下標)轉換為具有固定大小的向量,如[[4],[20]]->[[0.25,0.1],[0.6,-0.2]]

哪到底咋轉啊,親? 
這涉及到詞向量,具體看可以參考這篇文章:Word2vec 之 Skip-Gram 模型,下面只進行簡單的描述, 
這里寫圖片描述

上圖的流程是把文章的單詞使用詞向量來表示。 
(1)提取文章所有的單詞,把其按其出現的次數降許(這里只取前50000個),比如單詞‘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×2M1000×2的矩陣,而tom對應的是該矩陣的第4行,取出該行的數據就是[0.25,0.1]

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


免責聲明!

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



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