Bagaimana cara kerja lapisan Keras 'Embedding'?

70

Perlu memahami cara kerja lapisan 'Embedding' di perpustakaan Keras. Saya menjalankan kode berikut dengan Python

import numpy as np
from keras.models import Sequential
from keras.layers import Embedding

model = Sequential()
model.add(Embedding(5, 2, input_length=5))

input_array = np.random.randint(5, size=(1, 5))

model.compile('rmsprop', 'mse')
output_array = model.predict(input_array)

yang memberikan output berikut

input_array = [[4 1 3 3 3]]
output_array = 
[[[ 0.03126476  0.00527241]
  [-0.02369716 -0.02856163]
  [ 0.0055749   0.01492429]
  [ 0.0055749   0.01492429]
  [ 0.0055749   0.01492429]]]

Saya mengerti bahwa setiap nilai dalam input_array dipetakan ke 2 elemen vektor dalam output_array, jadi 1 X 4 vektor memberikan 1 X 4 X 2 vektor. Tetapi bagaimana nilai yang dipetakan dihitung?

prashanth
sumber
1
Mungkin awal yang bagus: github.com/fchollet/keras/issues/3110 ?
fnl
Di blog ini, kata embedding dengan menggunakan lapisan Keras Embedding dianggap learn-neural-networks.com/world-embedding-by-keras
Фаиль Гафаров

Jawaban:

87

Bahkan, vektor keluaran tidak dihitung dari input menggunakan operasi matematika apa pun. Sebagai gantinya, setiap integer input digunakan sebagai indeks untuk mengakses tabel yang berisi semua vektor yang memungkinkan. Itulah alasan mengapa Anda perlu menentukan ukuran kosa kata sebagai argumen pertama (sehingga tabel dapat diinisialisasi).

Aplikasi paling umum dari lapisan ini adalah untuk pemrosesan teks. Mari kita lihat contoh sederhana. Set pelatihan kami hanya terdiri dari dua frase:

Semoga bisa melihat Anda segera

Senang bertemu denganmu lagi

Jadi kita dapat menyandikan frasa-frasa ini dengan memberi setiap kata angka integer unik (misalnya dengan urutan penampilan dalam set data pelatihan kami). Maka frasa kami dapat ditulis ulang sebagai:

[0, 1, 2, 3, 4]

[5, 1, 2, 3, 6]

Sekarang bayangkan kita ingin melatih sebuah jaringan yang lapisan pertama adalah lapisan penyematan. Dalam hal ini, kita harus menginisialisasi sebagai berikut:

Embedding(7, 2, input_length=5)

Argumen pertama (7) adalah jumlah kata yang berbeda dalam set pelatihan. Argumen kedua (2) menunjukkan ukuran vektor embedding. The input_length argumet, tentu saja, menentukan ukuran masing-masing urutan input.

Setelah jaringan telah dilatih, kita bisa mendapatkan bobot dari layer embedding, yang dalam hal ini akan berukuran (7, 2) dan dapat dianggap sebagai tabel yang digunakan untuk memetakan bilangan bulat untuk menanamkan vektor:

+------------+------------+
|   index    |  Embedding |
+------------+------------+
|     0      | [1.2, 3.1] |
|     1      | [0.1, 4.2] |
|     2      | [1.0, 3.1] |
|     3      | [0.3, 2.1] |
|     4      | [2.2, 1.4] |
|     5      | [0.7, 1.7] |
|     6      | [4.1, 2.0] |
+------------+------------+

Jadi menurut embeddings ini, frasa pelatihan kedua kami akan direpresentasikan sebagai:

[[0.7, 1.7], [0.1, 4.2], [1.0, 3.1], [0.3, 2.1], [4.1, 2.0]]

Pada awalnya mungkin tampak kontra intuitif, tetapi mesin diferensiasi otomatis yang mendasarinya (misalnya, Tensorflow atau Theano) berhasil mengoptimalkan vektor-vektor yang terkait dengan setiap bilangan bulat input seperti parameter lain dari model Anda. Menarik juga untuk menggunakan embedding yang dipelajari oleh metode / orang lain di domain yang berbeda (lihat https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html ) sebagai dilakukan di [1].

[1] López-Sánchez, D., Herrero, JR, Arrieta, AG, & Corchado, pembelajaran metrik JM Hibridisasi dan penalaran berbasis kasus untuk deteksi clickbait yang dapat disesuaikan. Kecerdasan Terapan, 1-16.

Daniel López
sumber
4
Terima kasih atas jawabannya. Hanya satu permintaan yang bagaimana bobot dari lapisan penyematan diperoleh. Seperti untuk indeks 0, bagaimana [1.2, 3.1] diperoleh.
prashanth
5
Isi tabel yang menghubungkan indeks dengan vektor embedding (yaitu, bobot dari lapisan embedding) diinisialisasi secara acak dan kemudian dioptimalkan oleh algoritma pelatihan (misalnya, Keturunan Gradien).
Daniel López
3
Terima kasih. Saya masih agak tidak tahu apa yang akan dilakukan optimizer terhadap optimizer? Seperti, apa "jawaban yang benar" yang memungkinkannya menghitung fungsi kerugian? Atau dengan kata lain, apa yang dilakukan untuk umpan maju dan mundur?
bwest87
2
jadi ... embedding pada dasarnya hanyalah sebuah subnetwork dari keseluruhan arsitektur yang mengurangi input yang dikodekan satu-panas menjadi input yang lebih sedikit, afaict ..
Mike Campbell
1
Karena layer embedding dapat dilatih, seberapa sensitifnya nilai yang hilang dalam set pelatihan? Katakanlah, saya punya sepuluh kata di set latihan dan lima lagi di set tes - panjang kosakata saya adalah 15 ... tapi layer sebenarnya tidak pernah diaktifkan oleh lima kata 'tes' selama pelatihan. Bisakah Anda jelaskan situasi ini?
mikalai
6

Saya juga memiliki pertanyaan yang sama dan setelah membaca beberapa posting dan materi, saya pikir saya sudah tahu apa peran layer embedding.

Saya pikir ini posting juga membantu untuk memahami, bagaimanapun, saya benar-benar menemukan jawabannya Daniel nyaman untuk mencerna. Tapi saya juga mendapat ide di baliknya terutama dengan memahami kata-kata yang tertanam .

Saya percaya itu tidak akurat untuk mengatakan lapisan embedding mengurangi input encoding satu panas ke input lebih sedikit. Setelah semua vektor satu-panas adalah data satu dimensi dan memang berubah menjadi 2 dimensi dalam kasus kami. Lebih baik dikatakan begitu

lapisan embedding muncul dengan relasi input di dimensi lain

Baik itu dalam 2 dimensi atau bahkan lebih tinggi.

Saya juga menemukan kesamaan yang sangat menarik antara penyisipan kata dengan Analisis Komponen Utama. Meskipun namanya mungkin terlihat rumit, konsepnya sederhana. Apa yang dilakukan PCA adalah mendefinisikan seperangkat data berdasarkan beberapa aturan umum (disebut komponen prinsip). Jadi itu seperti memiliki data dan Anda ingin menggambarkannya tetapi hanya menggunakan 2 komponen. Yang dalam pengertian ini sangat mirip dengan kata embeddings. Mereka berdua melakukan pekerjaan yang sama dalam konteks yang berbeda. Anda dapat mengetahui lebih lanjut di sini . Saya harap mungkin memahami PCA membantu memahami lapisan yang ditanamkan melalui analogi.

Untuk menyelesaikannya, jawaban pertanyaan awal dari postingan itu adalah " bagaimana cara menghitung nilainya? " Adalah:

  • Pada dasarnya, jaringan saraf kami menangkap struktur input yang mendasarinya (kalimat kami) dan menempatkan hubungan antara kata-kata dalam kosakata kami ke dimensi yang lebih tinggi (katakanlah 2) dengan optimisasi.
  • Pemahaman yang lebih dalam akan mengatakan bahwa frekuensi setiap kata muncul dengan kata lain dari pengaruh kosa kata kita (dalam pendekatan yang sangat naif kita dapat menghitungnya dengan tangan)
  • Frekuensi yang disebutkan di atas bisa menjadi salah satu dari banyak struktur mendasar yang dapat ditangkap oleh NN
  • Anda dapat menemukan intuisi di tautan youtube yang menjelaskan kata embeddings
Novin Shahroudi
sumber
7
Sudut pandang yang bagus. Namun, saya pikir perlu dicatat bahwa sementara teknik penyisipan kata seperti word2vec mencoba untuk menangkap makna penuh kata-kata dalam penyematan yang dihasilkan, lapisan penyisipan dalam jaringan yang diawasi mungkin tidak mempelajari representasi semantik yang kaya dan umum seperti itu. Misalnya, jika jaringan Anda dilatih untuk melakukan klasifikasi sentimen, itu mungkin hanya akan mengelompokkan / mengelompokkan kata dalam penyematan sesuai dengan muatan "emosional" mereka. Namun demikian, berdasarkan pengalaman saya, seringkali berguna untuk menginisialisasi lapisan penyertaan Anda dengan bobot yang dipelajari oleh word2vec pada sebuah corpus besar.
Daniel López
2
vektor satu-panas bukan data satu dimensi. Dimensinya adalah ukuran kosakata.
Binu Jasim
2
@ BinuJasim kamu benar. The vektor satu-panas yang mewakili kosakata bukanlah data satu dimensi. Tetapi informasi yang diwakilinya memang satu dimensi dan setiap entitas dalam kosakata adalah data satu dimensi. Memang benar bahwa kita memiliki elemen n * w (n = ukuran kosakata, w = jumlah bit) tetapi setiap nilai biner mewakili vektor yang lagi-lagi merupakan input satu dimensi.
Novin Shahroudi
@NovinShahroudi Brilliant, terima kasih atas penjelasannya.
Benyamin Jafari