參考鏈接keras:3)Embedding層詳解
示例原文鏈接:
https://blog.csdn.net/qianshishangdi/article/details/88640204
個(gè)人理解:
以下是個(gè)人對(duì)Embedding及其與word2vec關(guān)系的通俗理解,表達(dá)盡量接地氣,語(yǔ)言可能不準(zhǔn)確,有不正確的地方歡迎指正。
keras原型和關(guān)鍵參數(shù):
keras.layers.embeddings.Embedding(input_dim, output_dim, input_length=None)
? input_dim: int > 0。詞匯表大小, 即,最大整數(shù) index + 1。
? output_dim: int >= 0。詞向量的維度。
? input_length: 輸入序列的長(zhǎng)度,必須和輸入數(shù)據(jù)長(zhǎng)度一致。當(dāng)它是固定的時(shí)。 如果你需要連接 Flatten 和 Dense 層,則這個(gè)參數(shù)是必須的 (沒有它,dense 層的輸出尺寸就無(wú)法計(jì)算)
Embedding:建立一個(gè)可訓(xùn)練的兩層神經(jīng)網(wǎng)絡(luò),對(duì)輸入的數(shù)據(jù)進(jìn)行預(yù)處理;包括輸入層、input層和output層。
input_dim即input層節(jié)點(diǎn)數(shù)對(duì)應(yīng)詞匯表,Embedding層自動(dòng)實(shí)現(xiàn)每節(jié)點(diǎn)對(duì)應(yīng)一個(gè)詞匯
Embedding實(shí)質(zhì)是訓(xùn)練一個(gè)與輸入相關(guān)的向量表,該向量表的尺寸為[input_dim,input_length,output_dim](隱含要求輸入是one-hot碼);訓(xùn)練過程input層和output層權(quán)重逐漸優(yōu)化,權(quán)重表可以表達(dá)訓(xùn)練數(shù)據(jù)之間的邏輯關(guān)系。
Embedding輸出=輸入*Embedding,相當(dāng)于按輸入one-hot碼在Embedding權(quán)重矩陣中查表,得到一個(gè)與輸入對(duì)應(yīng)的向量。該向量在nlp中可以用作詞向量,與one-hot相比,該詞向量尺寸更小并且可以表達(dá)詞之間的邏輯關(guān)系,詞向量之間的夾角表示詞向量之間語(yǔ)義相近程度。
word2vec與Embedding關(guān)系:word2vec本身是一個(gè)語(yǔ)言模型,一般認(rèn)為是一個(gè)三層的神經(jīng)網(wǎng)絡(luò),其中第一層相當(dāng)于Embedding,且優(yōu)化了查表速度(因?yàn)镋mbedding本身是兩層網(wǎng)絡(luò),所以可以將word2vec理解為一個(gè)4層的深度神經(jīng)網(wǎng)絡(luò))。word2vec第一層的權(quán)重即為輸入的詞向量表,第一層的輸出即為word2vec的詞向量。很多NLP將word2vec單純作為文本向量化工具。
示例代碼
import numpy as np
from keras.models import Sequential
from keras.layers import Embedding, Masking
# Embedding和Masking都可以用來(lái)處理變長(zhǎng)文本,Embedding只能過濾0
model = Sequential()
model.add(Embedding(input_dim=2,
output_dim=2, #將輸入拆分成一個(gè)幾維的量
input_length=7,
))
print('Embedding input shape:\n', model.layers[0].input_shape)
print('Embedding output shape:\n', model.layers[0].output_shape)
model.compile('rmsprop', 'mse')
a=np.array([[0, 1, 0, 1, 1, 0, 0],
[1, 1, 1, 1, 1, 1, 1]]
)
print('input shape a:\n', a, a.shape)
result = model.predict(a)
print('Embedded a:\n', result)
print('shape Embedded a:\n', result.shape)
運(yùn)行結(jié)果
Using TensorFlow backend.
Embedding input shape:
(None, 7)
Embedding output shape:
(None, 7, 2)
input shape a:
[[0 1 0 1 1 0 0]
[1 1 1 1 1 1 1]] (2, 7)
2019-03-18 15:23:16.590430: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
Embedded a:
[[[ 0.00076254 0.04154864]
[-0.03167279 -0.00586861]
[ 0.00076254 0.04154864]
[-0.03167279 -0.00586861]
[-0.03167279 -0.00586861]
[ 0.00076254 0.04154864]
[ 0.00076254 0.04154864]]
[[-0.03167279 -0.00586861]
[-0.03167279 -0.00586861]
[-0.03167279 -0.00586861]
[-0.03167279 -0.00586861]
[-0.03167279 -0.00586861]
[-0.03167279 -0.00586861]
[-0.03167279 -0.00586861]]]
shape Embedded a:
(2, 7, 2)