tf.nn.embedding_lookup(params, ids, partition_strategy='mod', name=None)
Saya tidak dapat memahami tugas dari fungsi ini. Apakah ini seperti tabel pencarian? Yang berarti mengembalikan parameter yang sesuai dengan setiap id (dalam id)?
Misalnya, dalam skip-gram
model jika kita gunakan tf.nn.embedding_lookup(embeddings, train_inputs)
, maka untuk masing-masing train_input
menemukan embedding yang sesuai?
Jawaban:
embedding_lookup
fungsi mengambil barisparams
tensor. Perilaku ini mirip dengan menggunakan pengindeksan dengan array dalam numpy. Misalnyaparams
Argumen dapat juga merupakan daftar tensor dalam hal manaids
akan didistribusikan di antara tensor. Sebagai contoh, diberikan daftar 3 tensor[2, 64]
, perilaku default adalah bahwa mereka akan mewakiliids
:[0, 3]
,[1, 4]
,[2, 5]
.partition_strategy
mengontrol caraids
distribusi di antara daftar. Partisi berguna untuk masalah skala yang lebih besar ketika matriks mungkin terlalu besar untuk tetap utuh.sumber
select_rows
?embedding_lookup
hanya menyediakan cara yang nyaman (dan paralel) untuk mengambil hiasan yang terkait dengan idids
. Theparams
tensor biasanya variabel tf yang dipelajari sebagai bagian dari proses pelatihan - variabel tf yang komponen yang digunakan, langsung atau tidak langsung, dalam fungsi kerugian (sepertitf.l2_loss
) yang dioptimalkan oleh optimizer (sepertitf.train.AdamOptimizer
).Ya, fungsi ini sulit dimengerti, sampai Anda mengerti maksudnya.
Dalam bentuknya yang paling sederhana, mirip dengan
tf.gather
. Ini mengembalikan elemenparams
sesuai dengan indeks yang ditentukan olehids
.Misalnya (dengan asumsi Anda ada di dalam
tf.InteractiveSession()
)akan kembali
[10 20 30 40]
, karena elemen pertama (indeks 0) dari params adalah10
, elemen kedua dari params (indeks 1) adalah20
, dll.Demikian pula,
akan kembali
[20 20 40]
.Tetapi
embedding_lookup
lebih dari itu. Theparams
Argumen bisa menjadi daftar dari tensor, daripada tensor tunggal.Dalam kasus seperti itu, indeks, ditentukan dalam
ids
, sesuai dengan elemen tensor sesuai dengan strategi partisi , di mana strategi partisi default adalah 'mod'.Dalam strategi 'mod', indeks 0 sesuai dengan elemen pertama dari tensor pertama dalam daftar. Indeks 1 sesuai dengan elemen pertama dari tensor kedua . Indeks 2 sesuai dengan elemen pertama dari tensor ketiga , dan seterusnya. Cukup indeks
i
sesuai dengan elemen pertama dari tensor (i + 1), untuk semua indeks0..(n-1)
, dengan asumsi params adalah daftarn
tensor.Sekarang, indeks
n
tidak dapat sesuai dengan tensor n +1, karena daftarparams
hanya berisin
tensor. Jadi indeksn
sesuai dengan elemen kedua dari tensor pertama. Demikian pula, indeksn+1
berhubungan dengan elemen kedua dari tensor kedua, dll.Jadi, dalam kodenya
indeks 0 sesuai dengan elemen pertama dari tensor pertama: 1
indeks 1 sesuai dengan elemen pertama dari tensor kedua: 10
indeks 2 sesuai dengan elemen kedua dari tensor pertama: 2
indeks 3 sesuai dengan elemen kedua dari tensor kedua: 20
Dengan demikian, hasilnya adalah:
sumber
partition_strategy='div'
, dan akan mendapatkan[10, 1, 10, 2, 10, 20]
, yaituid=1
elemen kedua dari param pertama. Pada dasarnya:partition_strategy=mod
(default)id%len(params)
: indeks param di paramsid//len(params)
: indeks elemen di param di ataspartition_strategy=*div*
sebaliknyaYa, tujuan
tf.nn.embedding_lookup()
fungsinya adalah untuk melakukan pencarian dalam matriks penyematan dan mengembalikan embeddings (atau secara sederhana representasi vektor) dari kata-kata.Matriks penyematan sederhana (bentuk:)
vocabulary_size x embedding_dimension
akan terlihat seperti di bawah ini. (Yaitu setiap kata akan diwakili oleh vektor angka; maka nama word2vec )Matriks Embedding
Saya membagi atas embedding matriks dan dimuat hanya kata-kata di
vocab
yang akan menjadi kosa kata dan yang sesuai vektor diemb
berbagai.Menanamkan Pencarian di TensorFlow
Sekarang kita akan melihat bagaimana kita bisa melakukan pencarian embedding untuk beberapa kalimat input sewenang-wenang.
Amati bagaimana kami mendapatkan embeddings dari matriks embedding asli kami (dengan kata-kata) menggunakan indeks kata-kata dalam kosakata kami.
Biasanya, pencarian embedding dilakukan oleh lapisan pertama (disebut lapisan Embedding ) yang kemudian melewati embeddings ini ke lapisan RNN / LSTM / GRU untuk diproses lebih lanjut.
Catatan Samping : Biasanya kosa kata juga akan memiliki
unk
token khusus . Jadi, jika token dari kalimat input kami tidak ada dalam kosakata kami, maka indeks yang sesuai untukunk
akan dicari dalam matriks embedding.Catatan PS yang
embedding_dimension
merupakan hyperparameter bahwa seseorang harus menyetel untuk aplikasi mereka tetapi model populer seperti Word2Vec dan GloVe menggunakan300
vektor dimensi untuk mewakili setiap kata.Bonus Membaca model skip-gram word2vec
sumber
Berikut adalah gambar yang menggambarkan proses menanamkan pencarian.
Singkatnya, ia mendapat baris yang sesuai dari lapisan embedding, ditentukan oleh daftar ID dan menyediakannya sebagai tensor. Itu dicapai melalui proses berikut.
lookup_ids = tf.placeholder([10])
embeddings = tf.Variable([100,10],...)
embed_lookup = tf.embedding_lookup(embeddings, lookup_ids)
lookup = session.run(embed_lookup, feed_dict={lookup_ids:[95,4,14]})
sumber
Ketika tensor params dalam dimensi tinggi, id hanya mengacu pada dimensi atas. Mungkin sudah jelas bagi kebanyakan orang tetapi saya harus menjalankan kode berikut untuk memahami bahwa:
Hanya mencoba strategi 'div' dan untuk satu tensor, tidak ada bedanya.
Berikut hasilnya:
sumber
Cara lain untuk melihatnya adalah, asumsikan bahwa Anda meratakan tensor ke satu array dimensi, dan kemudian Anda melakukan pencarian.
(mis. Tensor0 = [1,2,3], Tensor1 = [4,5,6], Tensor2 = [7,8,9]
Tensor keluar yang rata adalah sebagai berikut [1,4,7,2,5,8,3,6,9]
Sekarang ketika Anda melakukan pencarian [0,3,4,1,7] itu akan lebih baik [1,2,5,4,6]
(i, e) jika nilai pencarian adalah 7 misalnya, dan kami memiliki 3 tensor (atau tensor dengan 3 baris),
7/3: (Pengingat adalah 1, Quotient adalah 2) Jadi elemen ke-2 dari Tensor1 akan ditampilkan, yaitu 6
sumber
Karena saya juga tertarik dengan fungsi ini, saya akan memberikan dua sen.
Cara saya melihatnya dalam kasus 2D hanya sebagai perkalian matriks (mudah untuk menggeneralisasi ke dimensi lain).
Pertimbangkan kosakata dengan simbol N. Kemudian, Anda dapat mewakili simbol x sebagai vektor dimensi Nx1, satu-panas-disandikan.
Tetapi Anda ingin representasi simbol ini bukan sebagai vektor Nx1, tetapi sebagai satu dengan dimensi Mx1, yang disebut y .
Jadi, untuk mengubah x menjadi y , Anda dapat menggunakan dan menanamkan matriks E , dengan dimensi MxN:
y = E x .
Ini pada dasarnya adalah apa yang dilakukan tf.nn.embedding_lookup (params, ids, ...), dengan nuansa bahwa id hanya satu angka yang mewakili posisi angka 1 dalam vektor yang dikodekan satu-panas x .
sumber
Menambah jawaban Asher Stern,
params
diartikan sebagai partisi dari tensor embedding besar. Ini bisa berupa tensor tunggal yang mewakili tensor penyisipan lengkap, atau daftar tensor X semua dengan bentuk yang sama kecuali untuk dimensi pertama, mewakili tensor penyisipan sharded.Fungsi
tf.nn.embedding_lookup
ini ditulis mengingat fakta bahwa penyematan (params) akan besar. Karena itu kami membutuhkannyapartition_strategy
.sumber