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模型中使用預訓練的詞向量