Vâng, mục đích của tf.nn.embedding_lookup()
chức năng là để thực hiện một tra cứu trong ma trận nhúng và trả lại embeddings (hoặc trong thuật ngữ đơn giản đại diện vector) của từ ngữ.
Ma trận nhúng đơn giản (vocabulary_size x embedding_dimension
) sẽ trông giống như bên dưới. (Tức là mỗi từ sẽ được đại diện bởi một vector số, vì vậy tên word2vec)
Nhúng Matrix
the 0.418 0.24968 -0.41242 0.1217 0.34527 -0.044457 -0.49688 -0.17862
like 0.36808 0.20834 -0.22319 0.046283 0.20098 0.27515 -0.77127 -0.76804
between 0.7503 0.71623 -0.27033 0.20059 -0.17008 0.68568 -0.061672 -0.054638
did 0.042523 -0.21172 0.044739 -0.19248 0.26224 0.0043991 -0.88195 0.55184
just 0.17698 0.065221 0.28548 -0.4243 0.7499 -0.14892 -0.66786 0.11788
national -1.1105 0.94945 -0.17078 0.93037 -0.2477 -0.70633 -0.8649 -0.56118
day 0.11626 0.53897 -0.39514 -0.26027 0.57706 -0.79198 -0.88374 0.30119
country -0.13531 0.15485 -0.07309 0.034013 -0.054457 -0.20541 -0.60086 -0.22407
under 0.13721 -0.295 -0.05916 -0.59235 0.02301 0.21884 -0.34254 -0.70213
such 0.61012 0.33512 -0.53499 0.36139 -0.39866 0.70627 -0.18699 -0.77246
second -0.29809 0.28069 0.087102 0.54455 0.70003 0.44778 -0.72565 0.62309
tôi chia nhúng trên ma trận và chỉ được tải từ trong vocab
sẽ là từ vựng của chúng tôi và các vectơ tương ứng trong mảng emb
.
vocab = ['the','like','between','did','just','national','day','country','under','such','second']
emb = np.array([[0.418, 0.24968, -0.41242, 0.1217, 0.34527, -0.044457, -0.49688, -0.17862],
[0.36808, 0.20834, -0.22319, 0.046283, 0.20098, 0.27515, -0.77127, -0.76804],
[0.7503, 0.71623, -0.27033, 0.20059, -0.17008, 0.68568, -0.061672, -0.054638],
[0.042523, -0.21172, 0.044739, -0.19248, 0.26224, 0.0043991, -0.88195, 0.55184],
[0.17698, 0.065221, 0.28548, -0.4243, 0.7499, -0.14892, -0.66786, 0.11788],
[-1.1105, 0.94945, -0.17078, 0.93037, -0.2477, -0.70633, -0.8649, -0.56118],
[0.11626, 0.53897, -0.39514, -0.26027, 0.57706, -0.79198, -0.88374, 0.30119],
[-0.13531, 0.15485, -0.07309, 0.034013, -0.054457, -0.20541, -0.60086, -0.22407],
[ 0.13721, -0.295, -0.05916, -0.59235, 0.02301, 0.21884, -0.34254, -0.70213],
[ 0.61012, 0.33512, -0.53499, 0.36139, -0.39866, 0.70627, -0.18699, -0.77246 ],
[ -0.29809, 0.28069, 0.087102, 0.54455, 0.70003, 0.44778, -0.72565, 0.62309 ]])
emb.shape
# (11, 8)
Nhúng Lookup trong TensorFlow
Bây giờ chúng ta sẽ xem làm thế nào chúng ta có thể thực hiện nhúng tra cứu đối với một số câu đầu vào tùy ý.
In [54]: from collections import OrderedDict
# embedding as TF tensor (for now constant; could be tf.Variable() during training)
In [55]: tf_embedding = tf.constant(emb, dtype=tf.float32)
# input for which we need the embedding
In [56]: input_str = "like the country"
# build index based on our `vocabulary`
In [57]: word_to_idx = OrderedDict({w:vocab.index(w) for w in input_str.split() if w in vocab})
# lookup in embedding matrix & return the vectors for the input words
In [58]: tf.nn.embedding_lookup(tf_embedding, list(word_to_idx.values())).eval()
Out[58]:
array([[ 0.36807999, 0.20834 , -0.22318999, 0.046283 , 0.20097999,
0.27515 , -0.77126998, -0.76804 ],
[ 0.41800001, 0.24968 , -0.41242 , 0.1217 , 0.34527001,
-0.044457 , -0.49687999, -0.17862 ],
[-0.13530999, 0.15485001, -0.07309 , 0.034013 , -0.054457 ,
-0.20541 , -0.60086 , -0.22407 ]], dtype=float32)
Quan sát cách chúng tôi đã nhận embeddings từ ma trận nhúng gốc của chúng tôi (bằng lời nói) bằng cách sử dụng chỉ số của từ trong vốn từ vựng của chúng tôi.
Thông thường, việc tra cứu nhúng được thực hiện bởi lớp đầu tiên (được gọi là Lớp nhúng) sau đó chuyển các nhúng này tới các lớp RNN/LSTM để xử lý tiếp.
Side Lưu ý: Thông thường từ vựng cũng sẽ có một đặc biệt unk
token. Vì vậy, nếu một mã thông báo từ câu đầu vào của chúng tôi không có trong từ vựng của chúng tôi, thì chỉ mục tương ứng với unk
sẽ được tra cứu trong ma trận nhúng.
P.S. Lưu ý rằng embedding_dimension
là một hyperparameter rằng người ta phải điều chỉnh cho các ứng dụng của họ, nhưng mô hình phổ biến như Word2Vec và GloVe sử dụng 300
vector chiều cho đại diện cho mỗi từ.
Bonus Readingword2vec skip-gram model
Tại sao họ gọi nó theo cách này chứ không phải 'select_rows'? –
@LenarHoyt vì ý tưởng về tra cứu này xuất phát từ Word Embeddings. và các "hàng" là các biểu diễn (nhúng) của các từ, vào một không gian vectơ - và hữu ích trong chính chúng. Thường thì nhiều hơn so với mạng thực tế. –
Làm thế nào để tensorflow tìm hiểu cấu trúc nhúng? Chức năng này có quản lý quá trình đó không? – vgoklani