केरस में एंबेडिंग क्या है?


97

Keras प्रलेखन स्पष्ट नहीं है कि यह वास्तव में क्या है। मैं समझता हूं कि हम इसका उपयोग इनपुट सुविधा स्थान को छोटे में बदलने के लिए कर सकते हैं। लेकिन यह एक तंत्रिका डिजाइन के नजरिए से कैसे किया जाता है? क्या यह एक ऑटोइन्कोडर, आरबीएम है?

keras 

7
यह एक लुकअप टेबल है जिसे प्रशिक्षित किया जा सकता है
gokul_uf

1
यह बस एक वजन मैट्रिक्स बनाता है और अनुक्रमित करता है; नीचे मेरा विस्तृत जवाब देखें ( stackoverflow.com/a/53101566/9024698 )।
निर्वासित

3
हालांकि सबसे अधिक वोट किए गए उत्तर का कहना है कि यह एक मैट्रिक्स गुणा है, स्रोत कोड और अन्य उत्तर बताते हैं कि वास्तव में वे सिर्फ एक ट्रेन योग्य मैट्रिक्स हैं। इनपुट शब्द इस मैट्रिक्स में संबंधित पंक्ति को चुनते हैं।
डैनियल मोलर

जवाबों:


66

जहाँ तक मुझे पता है, एम्बेडिंग परत एक सरल मैट्रिक्स गुणन है जो शब्दों को उनके संबंधित शब्द एम्बेडिंग में बदल देता है।

एंबेडिंग लेयर के वज़न आकार (शब्दावली_साइज़, एम्बेडिंग_डिमेंशन) के होते हैं। प्रत्येक प्रशिक्षण नमूने के लिए, इसका इनपुट पूर्णांक है, जो कुछ शब्दों का प्रतिनिधित्व करता है। पूर्णांक शब्दावली के आकार की सीमा में हैं। एम्बेडिंग परत प्रत्येक पूर्णांक i को एम्बेडिंग वेट मैट्रिक्स की ith लाइन में बदल देती है।

मैट्रिक्स गुणन के रूप में जल्दी से ऐसा करने के लिए, इनपुट पूर्णांकों को पूर्णांकों की सूची के रूप में नहीं बल्कि एक-गर्म मैट्रिक्स के रूप में संग्रहीत किया जाता है। इसलिए इनपुट आकार प्रति पंक्ति एक गैर-शून्य मान के साथ (nb_words, शब्दावली_साइज़) है। यदि आप इसे एम्बेडिंग वज़न से गुणा करते हैं, तो आपको आउटपुट आकार में मिलता है

(nb_words, vocab_size) x (vocab_size, embedding_dim) = (nb_words, embedding_dim)

तो एक सरल मैट्रिक्स गुणा के साथ आप एक नमूने में सभी शब्दों को संबंधित शब्द एम्बेडिंग में बदल देते हैं।


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

3
यहाँ शब्द एम्बेडिंग और उनके फायदे के बारे में एक अच्छा ब्लॉगपोस्ट है।
सेसेटकी

3
इस मामले में जो मैंने प्रस्तुत किया है, प्रत्येक प्रशिक्षण इनपुट शब्दों का एक सेट है (एक वाक्य हो सकता है)। प्रत्येक शब्द एक-गर्म वेक्टर के रूप में दर्शाया गया है और एक घने वेक्टर में एम्बेडेड है। इस दृष्टिकोण का नुकसान यह है कि, चूंकि इनपुट को निरंतर लंबाई की आवश्यकता है, इसलिए आपके सभी वाक्यों को समान संख्या में शब्दों की आवश्यकता है। एक विकल्प पैराग्राफ वैक्टर होगा , जो वाक्यों, पैराग्राफों या यहां तक ​​कि दस्तावेजों को वैक्टर में एम्बेड कर सकता है।
लोरिक

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

2
मैं user36624 (नीचे उत्तर) से सहमत हूं। इसकी नहीं एक सरल आव्यूह गुणन।
डैनियल मोलर

21

Keras Embeddingपरत किसी भी आव्यूह गुणन लेकिन यह केवल प्रदर्शन नहीं कर रहा:

1. (शब्दावली_साइज़) x (एम्बेडिंग_डिमेंशन) आयामों का एक भार मैट्रिक्स बनाता है

2. इस वजन मैट्रिक्स को अनुक्रमित करता है


कक्षा क्या करती है, यह समझने के लिए स्रोत कोड पर एक नज़र रखना हमेशा उपयोगी होता है। इस मामले में, हम पर एक नज़र होगा class एम्बेडिंग जो आधार परत से विरासत classकहा जाता है परत

(1) - (शब्दावली_साइज़) x (एम्बेडिंग_डिमेंशन) आयामों का एक भार मैट्रिक्स बनाना :

इस पर उत्पन्न कर रहा है buildके समारोह एम्बेडिंग :

def build(self, input_shape):
    self.embeddings = self.add_weight(
        shape=(self.input_dim, self.output_dim),
        initializer=self.embeddings_initializer,
        name='embeddings',
        regularizer=self.embeddings_regularizer,
        constraint=self.embeddings_constraint,
        dtype=self.dtype)
    self.built = True

यदि आपके पास बेस क्लास लेयर पर एक नज़र है तो आप देखेंगे कि add_weightऊपर का कार्य केवल ट्रेन वेट का एक मैट्रिक्स बनाता है (इस के मामले में (शब्दावली_साइज़) x (एम्बेडिंग_डिमेंशन) आयाम):

def add_weight(self,
               name,
               shape,
               dtype=None,
               initializer=None,
               regularizer=None,
               trainable=True,
               constraint=None):
    """Adds a weight variable to the layer.
    # Arguments
        name: String, the name for the weight variable.
        shape: The shape tuple of the weight.
        dtype: The dtype of the weight.
        initializer: An Initializer instance (callable).
        regularizer: An optional Regularizer instance.
        trainable: A boolean, whether the weight should
            be trained via backprop or not (assuming
            that the layer itself is also trainable).
        constraint: An optional Constraint instance.
    # Returns
        The created weight variable.
    """
    initializer = initializers.get(initializer)
    if dtype is None:
        dtype = K.floatx()
    weight = K.variable(initializer(shape),
                        dtype=dtype,
                        name=name,
                        constraint=constraint)
    if regularizer is not None:
        with K.name_scope('weight_regularizer'):
            self.add_loss(regularizer(weight))
    if trainable:
        self._trainable_weights.append(weight)
    else:
        self._non_trainable_weights.append(weight)
    return weight

(२) - इस भार मैट्रिक्स का अनुक्रमण करना

इस पर उत्पन्न कर रहा है callके समारोह एम्बेडिंग :

def call(self, inputs):
    if K.dtype(inputs) != 'int32':
        inputs = K.cast(inputs, 'int32')
    out = K.gather(self.embeddings, inputs)
    return out

यह फ़ंक्शन Embeddingपरत के आउटपुट को लौटाता है जो है K.gather(self.embeddings, inputs)। क्या tf.keras.backend.gather वास्तव में वज़न मैट्रिक्स self.embeddings( buildऊपर फ़ंक्शन देखें ) को अनुक्रमित inputsकरना है जिसके अनुसार सकारात्मक पूर्णांक की सूची होनी चाहिए।

इन सूचियों को उदाहरण के लिए पुनर्प्राप्त किया जा सकता है यदि आप अपने पाठ / शब्द इनपुट को Keras के one_hot फ़ंक्शन से पास करते हैं जो कि टेक्स्ट को आकार n के शब्द अनुक्रमित की सूची में एन्कोड करता है (यह एक हॉट एन्कोडिंग नहीं है - अधिक जानकारी के लिए यह उदाहरण देखें: https://machinelearningmastery.com/use-word-embedding-layers-deep-learning-keras/ )।


इसलिए, यह सब है। कोई मैट्रिक्स गुणन नहीं है।

इसके विपरीत, परत ही उपयोगी है, क्योंकि वास्तव में यह एक आव्यूह गुणन प्रदर्शन से बचा जाता है है और इसलिए यह कुछ कम्प्यूटेशनल संसाधनों पर economizes।Keras Embedding

अन्यथा, आप केवल ट्रेन लेवल ( (शब्दावली_साइज़) x (एम्बेडिंग_डिमेंशन) आयाम) का एक मैट्रिक्स प्राप्त करने के लिए एक Keras घने परत (आपके इनपुट डेटा को एन्कोड करने के बाद) का उपयोग कर सकते हैं और फिर आउटपुट प्राप्त करने के लिए गुणा करें। परत के आउटपुट के साथ भी ऐसा ही है ।Embedding



4

Keras में, Embeddingपरत है नहीं एक सरल आव्यूह गुणन परत है, लेकिन एक लुक-अप तालिका परत (नीचे कॉल समारोह या मूल देखना परिभाषा )।

def call(self, inputs):
    if K.dtype(inputs) != 'int32':
        inputs = K.cast(inputs, 'int32')
    out = K.gather(self.embeddings, inputs)
    return out

यह क्या करता है प्रत्येक एक ज्ञात पूर्णांक को एक ट्रेन करने योग्य फीचर वेक्टर nमें मैप inputsकरना है W[n], जिसका आयाम तथाकथित एम्बेडेड सुविधा लंबाई है।


खैर जब आप मैट्रिक्स के साथ वैक्टर के एक-गर्म प्रतिनिधित्व वाले सेट को गुणा करते हैं, तो उत्पाद लुक-अप हो जाता है। तो Embeddingपरत है वास्तव में एक आव्यूह गुणन।
यानिस

सिवाय इसके कि कहीं भी इस गुणन को नहीं करता है। यह सिर्फ "एम्बेडिंग = एक ट्रेन करने योग्य मैट्रिक्स" को परिभाषित करता है, और मैट्रिक्स से शब्दों को इकट्ठा करने के लिए इनपुट सूचकांकों का उपयोग करता है।
डैनियल मोलर

इस प्रकार, यह एम्बेडिंग इनपुट के किसी भी एक-गर्म संस्करण को नहीं बनाकर बहुत सारी मेमोरी बख्शता है।
डैनियल मोलर

1

सरल शब्दों में (कार्यक्षमता के दृष्टिकोण से), यह एक-गर्म एनकोडर और पूरी तरह से जुड़ा हुआ परत है । लेयर वेट ट्रेन करने योग्य हैं।

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