Keras प्रलेखन स्पष्ट नहीं है कि यह वास्तव में क्या है। मैं समझता हूं कि हम इसका उपयोग इनपुट सुविधा स्थान को छोटे में बदलने के लिए कर सकते हैं। लेकिन यह एक तंत्रिका डिजाइन के नजरिए से कैसे किया जाता है? क्या यह एक ऑटोइन्कोडर, आरबीएम है?
Keras प्रलेखन स्पष्ट नहीं है कि यह वास्तव में क्या है। मैं समझता हूं कि हम इसका उपयोग इनपुट सुविधा स्थान को छोटे में बदलने के लिए कर सकते हैं। लेकिन यह एक तंत्रिका डिजाइन के नजरिए से कैसे किया जाता है? क्या यह एक ऑटोइन्कोडर, आरबीएम है?
जवाबों:
जहाँ तक मुझे पता है, एम्बेडिंग परत एक सरल मैट्रिक्स गुणन है जो शब्दों को उनके संबंधित शब्द एम्बेडिंग में बदल देता है।
एंबेडिंग लेयर के वज़न आकार (शब्दावली_साइज़, एम्बेडिंग_डिमेंशन) के होते हैं। प्रत्येक प्रशिक्षण नमूने के लिए, इसका इनपुट पूर्णांक है, जो कुछ शब्दों का प्रतिनिधित्व करता है। पूर्णांक शब्दावली के आकार की सीमा में हैं। एम्बेडिंग परत प्रत्येक पूर्णांक i को एम्बेडिंग वेट मैट्रिक्स की ith लाइन में बदल देती है।
मैट्रिक्स गुणन के रूप में जल्दी से ऐसा करने के लिए, इनपुट पूर्णांकों को पूर्णांकों की सूची के रूप में नहीं बल्कि एक-गर्म मैट्रिक्स के रूप में संग्रहीत किया जाता है। इसलिए इनपुट आकार प्रति पंक्ति एक गैर-शून्य मान के साथ (nb_words, शब्दावली_साइज़) है। यदि आप इसे एम्बेडिंग वज़न से गुणा करते हैं, तो आपको आउटपुट आकार में मिलता है
(nb_words, vocab_size) x (vocab_size, embedding_dim) = (nb_words, embedding_dim)
तो एक सरल मैट्रिक्स गुणा के साथ आप एक नमूने में सभी शब्दों को संबंधित शब्द एम्बेडिंग में बदल देते हैं।
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
किसी भी फंक्शन को बेहतर तरीके से समझने के लिए सोर्स कोड को देखना एक अच्छी आदत है। यहाँ एंबेडिंग के लिए है तो मूल रूप से यह एक ट्रेन की नज़र तालिका है।
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परत है वास्तव में एक आव्यूह गुणन।
सरल शब्दों में (कार्यक्षमता के दृष्टिकोण से), यह एक-गर्म एनकोडर और पूरी तरह से जुड़ा हुआ परत है । लेयर वेट ट्रेन करने योग्य हैं।