เลเยอร์ Keras 'การฝัง' ทำงานอย่างไร


70

จำเป็นต้องเข้าใจการทำงานของเลเยอร์ 'การฝัง' ในไลบรารี Keras ฉันรันโค้ดต่อไปนี้ใน 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)

ซึ่งให้ผลลัพธ์ต่อไปนี้

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]]]

ฉันเข้าใจว่าแต่ละค่าใน input_array นั้นถูกจับคู่กับเวกเตอร์องค์ประกอบ 2 ตัวใน output_array ดังนั้นเวกเตอร์ 1 X 4 จะให้เวกเตอร์ 1 X 4 X 2 แต่จะคำนวณค่าที่แมปได้อย่างไร


1
อาจเป็นการเริ่มต้นที่ดี: github.com/fchollet/keras/issues/3110 ?
fnl

ในการนี้บล็อกฝังคำโดยใช้ชั้น Keras ฝังถือว่าlearn-neural-networks.com/world-embedding-by-keras
ФаильГафаров

คำตอบ:


87

ในความเป็นจริงเวกเตอร์ผลลัพธ์ไม่ได้คำนวณจากอินพุตโดยใช้การดำเนินการทางคณิตศาสตร์ใด ๆ แต่จะใช้จำนวนเต็มอินพุตแต่ละตัวเป็นดัชนีเพื่อเข้าถึงตารางที่มีเวกเตอร์ที่เป็นไปได้ทั้งหมด นั่นคือเหตุผลที่คุณต้องระบุขนาดของคำศัพท์เป็นอาร์กิวเมนต์แรก (เพื่อให้สามารถเริ่มต้นตาราง)

แอปพลิเคชันทั่วไปของเลเยอร์นี้ใช้สำหรับการประมวลผลข้อความ ลองมาดูตัวอย่างง่ายๆ ชุดการฝึกอบรมของเราประกอบด้วยเพียงสองวลี:

หวังว่าจะได้พบคุณเร็ว ๆ นี้

ยินดีที่ได้พบคุณอีกครั้ง

ดังนั้นเราสามารถเข้ารหัสวลีเหล่านี้โดยกำหนดจำนวนเต็มจำนวนเฉพาะแต่ละคำ (ตามลำดับที่ปรากฏในชุดข้อมูลการฝึกอบรมของเราเป็นต้น) จากนั้นวลีของเราสามารถเขียนใหม่เป็น:

[0, 1, 2, 3, 4]

[5, 1, 2, 3, 6]

ตอนนี้จินตนาการว่าเราต้องการฝึกเครือข่ายที่มีเลเยอร์แรกเป็นเลเยอร์การฝัง ในกรณีนี้เราควรเริ่มต้นดังนี้

Embedding(7, 2, input_length=5)

อาร์กิวเมนต์แรก (7) คือจำนวนคำที่แตกต่างในชุดฝึกอบรม อาร์กิวเมนต์ที่สอง (2) ระบุขนาดของเวกเตอร์การฝัง input_length argumet ของหลักสูตรกำหนดขนาดของลำดับการป้อนข้อมูลแต่ละ

เมื่อเครือข่ายได้รับการฝึกอบรมเราสามารถรับน้ำหนักของเลเยอร์การฝังซึ่งในกรณีนี้จะมีขนาด (7, 2) และสามารถคิดเป็นตารางที่ใช้ในการแม็พจำนวนเต็มเพื่อฝังเวกเตอร์:

+------------+------------+
|   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] |
+------------+------------+

ดังนั้นตาม embeddings เหล่านี้วลีฝึกอบรมที่สองของเราจะแสดงเป็น:

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

มันอาจดูเข้าใจง่ายในตอนแรก แต่เอ็นจิ้นการสร้างความแตกต่างโดยอัตโนมัติ (เช่น Tensorflow หรือ Theano) จัดการเพื่อเพิ่มประสิทธิภาพเวกเตอร์เหล่านี้ที่เกี่ยวข้องกับแต่ละจำนวนเต็มอินพุทเหมือนกับพารามิเตอร์อื่น ๆ ของแบบจำลองของคุณ นอกจากนี้ยังเป็นที่น่าสนใจที่จะใช้ embeddings เรียนรู้โดยวิธีการอื่น ๆ / คนในโดเมนที่แตกต่างกัน (ดูhttps://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html ) เป็น เสร็จใน [1]

[1] López-Sánchez, D. , Herrero, JR, Arrieta, AG, & Corchado, JM Hybridizing การเรียนรู้การวัดแบบเมตริกและเหตุผลเชิงกรณีสำหรับการตรวจจับ clickbait ที่ปรับเปลี่ยนได้ ข่าวกรองประยุกต์, 1-16


4
ขอบคุณสำหรับคำตอบ เพียงหนึ่งแบบสอบถามว่าน้ำหนักของเลเยอร์การฝังเป็นอย่างไร เช่นเดียวกับดัชนี 0 วิธีได้รับ [1.2, 3.1]
prashanth

5
เนื้อหาของตารางที่เกี่ยวข้องกับดัชนีการฝังเวกเตอร์ (กล่าวคือน้ำหนักของเลเยอร์การฝัง) จะเริ่มต้นด้วยการสุ่มแล้วปรับให้เหมาะสมโดยอัลกอริทึมการฝึกอบรม (เช่น Gradient Descent)
Daniel López

3
ขอบคุณ ฉันยังคงไม่ชัดเจนว่าเครื่องมือเพิ่มประสิทธิภาพจะปรับให้เหมาะกับอะไร เช่น "คำตอบที่ถูกต้อง" ที่อนุญาตให้คำนวณฟังก์ชันการสูญเสียคืออะไร หรือพูดอีกวิธีหนึ่งมันทำอะไรกับการส่งต่อและถอยหลัง?
bwest87

2
ดังนั้น ... การฝังตัวนั้นเป็นเพียงเครือข่ายย่อยของสถาปัตยกรรมโดยรวมซึ่งจะลดอินพุตที่เข้ารหัสหนึ่งครั้งใด ๆ ลงไปเป็นอินพุตที่น้อยลง, ..
Mike Campbell

1
เนื่องจากเลเยอร์การฝังสามารถฝึกได้จึงมีความอ่อนไหวต่อค่าที่ขาดหายไปในชุดการฝึกอบรม สมมติว่าฉันมีชุดคำศัพท์สิบคำและชุดทดสอบอีกห้าคำ - ความยาวคำศัพท์ของฉันคือ 15 ... แต่จริงๆแล้วเลเยอร์จะไม่เปิดใช้งานโดยคำว่า 'ทดสอบ' ห้าคำระหว่างการฝึก คุณช่วยอธิบายสถานการณ์นี้ได้ไหม
mikalai

6

ฉันมีคำถามเดียวกันและหลังจากอ่านบทความและสื่อสองสามอย่างฉันคิดว่าฉันเข้าใจว่าบทบาทของเลเยอร์การฝังคืออะไร

ผมคิดว่านี้โพสต์ยังเป็นประโยชน์ที่จะเข้าใจ แต่ผมหาคำตอบของแดเนียลที่สะดวกในการแยกแยะ แต่ฉันก็มีความคิดที่อยู่เบื้องหลังเป็นหลักโดยการทำความเข้าใจกับคำที่ฝังอยู่

ฉันเชื่อว่ามันไม่ถูกต้องที่จะบอกว่าเลเยอร์การฝังลดอินพุตการเข้ารหัสที่ร้อนแรงเพียงหนึ่งเดียวลงไปเป็นอินพุตที่น้อยลง หลังจากเวกเตอร์ที่ร้อนแรงทั้งหมดเป็นข้อมูลหนึ่งมิติและมันกลายเป็น 2 มิติในกรณีของเรา ดีกว่าที่จะกล่าวว่า

เลเยอร์การฝังมาพร้อมกับความสัมพันธ์ของอินพุตในอีกมิติหนึ่ง

ไม่ว่าจะเป็นแบบ 2 มิติหรือสูงกว่า

ฉันยังพบความคล้ายคลึงกันที่น่าสนใจมากระหว่างคำที่ฝังอยู่กับการวิเคราะห์องค์ประกอบหลัก แม้ว่าชื่ออาจดูซับซ้อน แต่แนวคิดก็ตรงไปตรงมา PCA ทำอะไรคือการกำหนดชุดข้อมูลตามกฎทั่วไปบางอย่าง (เรียกว่าองค์ประกอบหลักการ) มันเหมือนมีข้อมูลและคุณต้องการอธิบาย แต่ใช้เพียง 2 องค์ประกอบ ซึ่งในแง่นี้จะคล้ายกันมากกับคำว่า embeddings พวกเขาทั้งสองทำงานเหมือนกันในบริบทที่แตกต่างกัน ท่านสามารถหาข้อมูลเพิ่มเติมได้ที่นี่ ฉันหวังว่าการทำความเข้าใจ PCA จะช่วยให้เข้าใจการฝังเลเยอร์ผ่านการเปรียบเทียบ

ในการสรุปคำตอบของคำถามต้นฉบับของโพสต์ที่ " จะคำนวณค่าได้อย่างไร " จะเป็น:

  • โดยพื้นฐานแล้วโครงข่ายประสาทเทียมของเรารวบรวมโครงสร้างพื้นฐานของอินพุต (ประโยคของเรา) และทำให้ความสัมพันธ์ระหว่างคำในคำศัพท์ของเราอยู่ในมิติที่สูงขึ้น (สมมติว่า 2) โดยการปรับให้เหมาะสม
  • ความเข้าใจที่ลึกซึ้งยิ่งขึ้นจะบอกว่าความถี่ของแต่ละคำที่ปรากฏขึ้นพร้อมกับอีกคำหนึ่งจากอิทธิพลของคำศัพท์ของเรา (ในวิธีที่ไร้เดียงสามากเราสามารถคำนวณด้วยมือ)
  • ความถี่ดังกล่าวอาจเป็นหนึ่งในโครงสร้างพื้นฐานมากมายที่ NN สามารถจับภาพได้
  • คุณสามารถค้นหาปรีชาในลิงค์ youtubeอธิบายคำ embeddings

7
มุมมองที่ดี อย่างไรก็ตามฉันคิดว่าเป็นเรื่องที่น่าสังเกตว่าในขณะที่เทคนิคการฝังคำเช่น word2vec พยายามที่จะจับความหมายทั้งหมดของคำในการฝังผลที่ได้เลเยอร์การฝังในเครือข่ายภายใต้การดูแลอาจไม่ได้เรียนรู้การเป็นตัวแทนเชิงความหมาย ตัวอย่างเช่นหากเครือข่ายของคุณได้รับการฝึกฝนให้จัดประเภทความเชื่อมั่นอาจเป็นเพียงแค่จัดกลุ่มคำ / กลุ่มคำในการฝังตามการโหลด "อารมณ์" อย่างไรก็ตามจากประสบการณ์ของฉันมักจะมีประโยชน์ในการเริ่มต้นชั้นฝังของคุณด้วยน้ำหนักที่เรียนรู้โดย word2vec ในคลังข้อมูลขนาดใหญ่
Daniel López

2
เวกเตอร์แบบหนึ่งร้อนไม่ใช่ข้อมูลมิติเดียว ขนาดของมันคือขนาดของคำศัพท์
Binu Jasim

2
@BinuJasim คุณพูดถูก เวกเตอร์หนึ่งร้อนเป็นตัวแทนของคำศัพท์ที่ไม่ได้เป็นข้อมูลหนึ่งมิติ แต่ข้อมูลที่แสดงถึงนั้นเป็นมิติเดียวและทุกหน่วยงานภายในคำศัพท์นั้นเป็นข้อมูลหนึ่งมิติ เป็นความจริงที่ว่าเรามีองค์ประกอบ n * w (n = ขนาดคำศัพท์, w = จำนวนบิต) แต่ค่าไบนารีแต่ละค่าแทนเวกเตอร์ซึ่งอีกครั้งเป็นอินพุตหนึ่งมิติ
Novin Shahroudi

@NovinShahroudi Brilliant ขอบคุณสำหรับคำอธิบาย
Benyamin Jafari
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.