केरस 'एंबेडिंग' की परत कैसे काम करती है?


69

केर लाइब्रेरी में 'एंबेडिंग' लेयर के काम को समझने की जरूरत है। मैं पायथन में निम्नलिखित कोड निष्पादित करता हूं

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 में प्रत्येक मान output_array में 2 तत्व वेक्टर में मैप किया जाता है, इसलिए 1 X 4 वेक्टर 1 X 4 X 2 वैक्टर देता है। लेकिन मैप किए गए मूल्यों की गणना कैसे की जाती है?


1
शायद एक अच्छी शुरुआत: github.com/fchollet/keras/issues/3110 ?
fnl

इस ब्लॉग में
केरेस एंबेडिंग

जवाबों:


86

वास्तव में, आउटपुट वैक्टर किसी भी गणितीय ऑपरेशन का उपयोग करके इनपुट से गणना नहीं की जाती है। इसके बजाय, प्रत्येक इनपुट पूर्णांक का उपयोग उस तालिका को एक्सेस करने के लिए सूचकांक के रूप में किया जाता है जिसमें सभी पॉसिबल वैक्टर होते हैं। यही कारण है कि आपको पहले तर्क के रूप में शब्दावली के आकार को निर्दिष्ट करने की आवश्यकता है (इसलिए तालिका को इनिशियलाइज़ किया जा सकता है)।

इस परत का सबसे आम अनुप्रयोग टेक्स्ट प्रोसेसिंग के लिए है। आइए एक साधारण उदाहरण देखें। हमारे प्रशिक्षण सेट में केवल दो वाक्यांश होते हैं:

आपसे मिलने की उम्मीद है

आपसे दोबारा मिलकर अच्छा लगा

इसलिए हम प्रत्येक शब्द को एक अद्वितीय पूर्णांक संख्या (उदाहरण के लिए हमारे प्रशिक्षण डाटासेट में उपस्थिति के क्रम से) निर्दिष्ट करके इन वाक्यांशों को एन्कोड कर सकते हैं। तब हमारे वाक्यांशों को फिर से लिखा जा सकता है:

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

तो इन एम्बेडिंग के अनुसार, हमारे दूसरे प्रशिक्षण वाक्यांश का प्रतिनिधित्व किया जाएगा:

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

यह पहली बार में सहज ज्ञान युक्त लग सकता है, लेकिन अंतर्निहित स्वचालित भेदभाव इंजन (जैसे, टेन्सरफ़्लो या थीनो) आपके मॉडल के किसी भी अन्य पैरामीटर की तरह प्रत्येक इनपुट पूर्णांक से जुड़े इन वैक्टर को अनुकूलित करने का प्रबंधन करते हैं। अन्य डोमेन / विभिन्न डोमेन में लोगों द्वारा सीखी गई एम्बेडिंग का उपयोग करना भी दिलचस्प है (देखें https://blog.keras.io/use-pre-trained-word-embeddings-in-a-keras-model.html ) किया हुआ [१]।

[१] लोपेज़-सान्चेज़, डी।, हेरेरो, जेआर, एरीटा, एजी, और कोर्चाडो, जेएम हाइब्रिडाइज़िंग मेट्रिक लर्निंग एंड केस-बेस्ड रीज़निंग फॉर एडाप्टेबल क्लिकबैट डिटेक्शन। एप्लाइड इंटेलिजेंस, 1-16।


4
जवाब के लिए धन्यवाद। बस एक प्रश्न है कि एम्बेडिंग परत का वजन कैसे प्राप्त किया जाता है। इंडेक्स 0 की तरह, कैसे [1.2, 3.1] प्राप्त किया जाता है।
प्रशान्त

5
तालिका की सामग्री जो अनुक्रमणिका वैक्टर (यानी, एम्बेडिंग परत के भार) से संबंधित है, को यादृच्छिक पर आरंभ किया जाता है और फिर प्रशिक्षण एल्गोरिथ्म (जैसे, ग्रेडिएंट डिसेंट) द्वारा अनुकूलित किया जाता है।
डैनियल

3
धन्यवाद। मैं अभी भी थोड़ा स्पष्ट नहीं हूं कि आशावादी के खिलाफ क्या आशावादी होगा? जैसे, "सही उत्तर" क्या है जो इसे नुकसान फ़ंक्शन की गणना करने की अनुमति देता है? या किसी अन्य तरीके से कहा, यह आगे और पिछड़े पास के लिए क्या कर रहा है?
bwest87

2
इसलिए ... एम्बेडिंग मूल रूप से समग्र वास्तुकला का एक सबनेटवर्क है जो किसी भी एक हॉट एन्कोडेड इनपुट को कम इनपुट्स, अफेक्ट में कम करता है ..
माइक कैम्पबेल

1
चूंकि एम्बेडिंग परत ट्रेन करने योग्य है, इसलिए प्रशिक्षण सेट में गायब मूल्यों के प्रति यह कितना संवेदनशील है? मान लीजिए, मुझे प्रशिक्षण सेट में दस शब्द मिले हैं और परीक्षण सेट में पांच और हैं - मेरी शब्दावली की लंबाई 15 है ... लेकिन वास्तव में प्रशिक्षण के दौरान उन पांच 'परीक्षण' शब्दों से परत कभी सक्रिय नहीं होती है। क्या आप कृपया इस स्थिति की व्याख्या कर सकते हैं?
मिकलाई

6

मेरे पास भी यही सवाल था और एक दो पोस्ट और सामग्री पढ़ने के बाद मुझे लगता है कि मुझे पता चल गया है कि परतदार भूमिका क्या है।

मुझे लगता है कि यह पोस्ट समझने में भी मददगार है, हालांकि, मैं वास्तव में डैनियल के जवाब को पचाने के लिए सुविधाजनक पाता हूं। लेकिन मुझे इसके पीछे का विचार मुख्य रूप से एम्बेड किए गए शब्दों को समझने से मिला ।

मेरा मानना ​​है कि यह कहना गलत है कि परतों को एक-एक गर्म एन्कोडिंग इनपुट को कम इनपुट तक कम किया जा सकता है। आखिरकार एक-गर्म वेक्टर एक आयामी डेटा है और यह वास्तव में हमारे मामले में 2 आयामों में बदल जाता है। बेहतर है कि कहा जाए

एम्बेडिंग परत एक और आयाम में इनपुट के संबंध के साथ आती है

चाहे वह 2 आयामों में हो या इससे अधिक हो।

मुझे प्रिंसिपल कंपोनेंट एनालिसिस से एम्बेडिंग शब्द के बीच एक बहुत ही दिलचस्प समानता भी मिलती है। हालांकि नाम जटिल लग सकता है लेकिन अवधारणा सीधी है। पीसीए कुछ सामान्य नियमों (तथाकथित सिद्धांत घटकों) के आधार पर डेटा के एक सेट को परिभाषित करने के लिए क्या करता है। तो यह एक डेटा होने जैसा है और आप इसका वर्णन करना चाहते हैं लेकिन केवल 2 घटकों का उपयोग करके। जो इस अर्थ में शब्द एम्बेडिंग के समान है। वे दोनों समान संदर्भ में समान कार्य करते हैं। आप यहां और अधिक जानकारी प्राप्त कर सकते हैं । मुझे आशा है कि शायद समझ पीसीए सादृश्य के माध्यम से परतों को समझने में मदद करता है।

लपेटने के लिए, पोस्ट के मूल प्रश्न का उत्तर कि " यह मूल्य की गणना कैसे करता है? ":

  • मूल रूप से, हमारा तंत्रिका नेटवर्क इनपुट की अंतर्निहित संरचना (हमारे वाक्य) को पकड़ता है और हमारी शब्दावली में शब्दों के बीच अनुकूलन द्वारा उच्च आयाम (चलो 2 कहता है) में संबंध रखता है।
  • गहरी समझ यह कहेगी कि हमारे शब्दावली प्रभावों से दूसरे शब्द के साथ दिखने वाले प्रत्येक शब्द की आवृत्ति (बहुत ही भोली दृष्टिकोण में हम इसे हाथ से गणना कर सकते हैं)
  • उपरोक्त आवृत्ति कई अंतर्निहित संरचनाओं में से एक हो सकती है जिन्हें एनएन कैप्चर कर सकता है
  • आप शब्द लिंकिंग को समझाते हुए youtube लिंक पर अंतर्ज्ञान पा सकते हैं

7
अच्छी बात है। हालाँकि, मुझे लगता है कि यह ध्यान देने योग्य है कि शब्द-एम्बेडिंग तकनीक जैसे कि word2vec परिणामी एम्बेडिंग में शब्दों के पूर्ण अर्थ को पकड़ने की कोशिश करती है, पर्यवेक्षित नेटवर्क में एम्बेडिंग परत इस तरह के शब्दार्थ-समृद्ध और सामान्य प्रतिनिधित्व को नहीं सीख सकती है। उदाहरण के लिए, यदि आपके नेटवर्क को भावुक वर्गीकरण करने के लिए प्रशिक्षित किया जाता है, तो यह संभवतः "भावनात्मक" भार के अनुसार एम्बेडिंग में समूह / क्लस्टर शब्द होगा। फिर भी, मेरे अनुभव के आधार पर यह एक बड़े कॉर्पस पर word2vec द्वारा सीखे गए भार के साथ अपनी एम्बेडिंग परत को आरम्भ करने के लिए अक्सर उपयोगी होता है।
डैनियल लोपेज

2
एक-गर्म वेक्टर एक आयामी डेटा नहीं है। इसका आयाम शब्दावली का आकार है।
बीनू जसीम '’

2
@BinuJasim तुम सही हो। एक गर्म वैक्टर एक शब्दावली का प्रतिनिधित्व एक आयामी डेटा नहीं है। लेकिन यह जो सूचना प्रस्तुत करता है वह वास्तव में एक आयामी है और शब्दावली के भीतर प्रत्येक इकाई एक आयामी डेटा है। यह सच है कि हमारे पास n * w (n = शब्दावली का आकार, w = बिट्स की संख्या) तत्व हैं लेकिन प्रत्येक बाइनरी मान एक वेक्टर का प्रतिनिधित्व करता है जो फिर से एक आयामी इनपुट है।
नोविन शाहरुदी

@ नोविनाश्राउदी ब्रिलियंट, स्पष्टीकरण के लिए धन्यवाद।
बेनामिन जाफरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.