Dokumentasi Keras tidak jelas apa ini sebenarnya. Saya mengerti bahwa kita dapat menggunakan ini untuk memampatkan ruang fitur masukan menjadi yang lebih kecil. Tapi bagaimana ini dilakukan dari perspektif desain saraf? Apakah ini autoenocder, RBM?
97
Jawaban:
Sejauh yang saya tahu, lapisan Embedding adalah perkalian matriks sederhana yang mengubah kata menjadi embeddings kata yang sesuai.
Bobot dari lapisan Embedding adalah bentuknya (vocabulary_size, embedding_dimension). Untuk setiap sampel pelatihan, masukannya adalah bilangan bulat, yang mewakili kata-kata tertentu. Bilangan bulat berada dalam kisaran ukuran kosakata. Layer Embedding mengubah setiap integer i menjadi baris ke-i dari matriks bobot embedding.
Untuk melakukan ini dengan cepat sebagai perkalian matriks, bilangan bulat masukan tidak disimpan sebagai daftar bilangan bulat tetapi sebagai matriks satu panas. Oleh karena itu, bentuk masukannya adalah (nb_words, vocabulary_size) dengan satu nilai bukan nol per baris. Jika Anda mengalikannya dengan bobot embedding, Anda akan mendapatkan output dalam bentuk
Jadi dengan perkalian matriks sederhana Anda mengubah semua kata dalam sampel menjadi embeddings kata yang sesuai.
sumber
The
Keras
Embedding
lapisan tidak melakukan setiap perkalian matriks tapi hanya:1. membuat matriks bobot (vocabulary_size) x (embedding_dimension) dimensi
2. mengindeks matriks bobot ini
Itu selalu berguna untuk melihat kode sumber untuk memahami apa yang dilakukan kelas. Dalam hal ini, kita akan melihat
class
Embedding yang mewarisi dari lapisan dasar yangclass
disebut Layer .(1) - Membuat matriks bobot (vocabulary_size) x (embedding_dimension) dimensi:
Ini terjadi pada
build
fungsi Embedding :Jika Anda melihat Layer kelas dasar, Anda akan melihat bahwa fungsi di
add_weight
atas hanya membuat matriks bobot yang dapat dilatih (dalam hal ini dimensi (vocabulary_size) x (embedding_dimension) ):(2) - Mengindeks matriks bobot ini
Ini terjadi pada
call
fungsi Embedding :Fungsi ini mengembalikan keluaran dari
Embedding
lapisanK.gather(self.embeddings, inputs)
. Apa yang sebenarnya dilakukan oleh tf.keras.backend.gather adalah mengindeks matriks bobotself.embeddings
(lihatbuild
fungsi di atas) sesuai denganinputs
yang seharusnya berupa daftar bilangan bulat positif.Daftar ini dapat diambil misalnya jika Anda meneruskan input teks / kata Anda ke fungsi one_hot dari Keras yang mengkodekan teks ke dalam daftar indeks kata berukuran n (ini BUKAN satu encoding panas - lihat juga contoh ini untuk info lebih lanjut: https://machinelearningmastery.com/use-word-embedding-layers-deep-learning-keras/ ).
Oleh karena itu, itu saja. Tidak ada perkalian matriks.
Sebaliknya, yang
Keras
Embedding
lapisan hanya berguna karena persis menghindari melakukan perkalian matriks dan karena itu irit pada beberapa sumber daya komputasi.Jika tidak, Anda bisa menggunakan lapisan
Keras
Dense (setelah Anda menyandikan data masukan Anda) untuk mendapatkan matriks bobot yang dapat dilatih (dari (vocabulary_size) dimensi x (embedding_dimension) ) dan kemudian cukup lakukan perkalian untuk mendapatkan keluaran yang akan tepat sama dengan outputEmbedding
lapisan.sumber
Untuk lebih memahami fungsi apa pun, sebaiknya lihat kode sumbernya. Ini untuk Menyematkan Jadi pada dasarnya ini adalah tabel pencarian yang bisa dilatih.
sumber
Dalam Keras, yang
Embedding
lapisan adalah TIDAK lapisan perkalian matriks sederhana, tetapi lapisan lihat tabel-up (lihat fungsi panggilan di bawah atau asli definisi ).Apa yang dilakukannya adalah untuk memetakan setiap integer dikenal
n
diinputs
sebuah vektor fitur dilatihW[n]
, yang dimensi adalah yang disebut tertanam panjang fitur.sumber
Embedding
layer tersebut memang merupakan perkalian matriks.Dengan kata sederhana (dari sudut pandang fungsionalitas), ini adalah encoder one-hot dan lapisan yang terhubung sepenuhnya . Bobot lapisan dapat dilatih.
sumber