2016-03-04 30 views
6

में एम्बेडिंग मैट्रिक्स शब्द का केवल एक हिस्सा अपडेट करें मान लें कि मैं प्रशिक्षण के दौरान एक पूर्व-प्रशिक्षित शब्द-एम्बेडिंग मैट्रिक्स को अपडेट करना चाहता हूं, क्या एम्बेडिंग मैट्रिक्स शब्द का केवल एक सबसेट अपडेट करने का कोई तरीका है?टेन्सफोर्लो

मैं Tensorflow API पृष्ठ में देखा और इस पाया है:

# Create an optimizer. 
opt = GradientDescentOptimizer(learning_rate=0.1) 

# Compute the gradients for a list of variables. 
grads_and_vars = opt.compute_gradients(loss, <list of variables>) 

# grads_and_vars is a list of tuples (gradient, variable). Do whatever you 
# need to the 'gradient' part, for example cap them, etc. 
capped_grads_and_vars = [(MyCapper(gv[0]), gv[1])) for gv in grads_and_vars] 

# Ask the optimizer to apply the capped gradients. 
opt.apply_gradients(capped_grads_and_vars) 

हालांकि मैं कैसे लागू करते हैं कि शब्द-embedding मैट्रिक्स के लिए। मान लीजिए मैं करता हूँ:

word_emb = tf.Variable(0.2 * tf.random_uniform([syn0.shape[0],s['es']], minval=-1.0, maxval=1.0, dtype=tf.float32),name='word_emb',trainable=False) 

gather_emb = tf.gather(word_emb,indices) #assuming that I pass some indices as placeholder through feed_dict 

opt = tf.train.AdamOptimizer(1e-4) 
grad = opt.compute_gradients(loss,gather_emb) 

कैसे मैं तो opt.apply_gradients और tf.scatter_update प्रयोग करते हैं मूल embeddign मैट्रिक्स अद्यतन करने के लिए? (इसके अलावा, tensorflow एक त्रुटि फेंकता है तो compute_gradient का दूसरा तर्क एक tf.Variable नहीं है)

+0

कैसे आप "सबसेट" यहाँ परिभाषित करते हैं ? – viksit

+0

एम्बेडिंग मैट्रिक्स में पंक्तियों का केवल एक सबसेट।चूंकि प्रत्येक पंक्ति एक शब्द-एम्बेडिंग वेक्टर है, यह मूल शब्द एम्बेडिंग मैट्रिक्स – user1718064

+0

http://deeplearning.net/software/theano/tutorial/faq_tutorial.html से शब्द-एम्बेडिंग वैक्टर का सिर्फ एक उप-समूह है, यही वह है जो मैं चाहता हूं प्राप्त करने के लिए लेकिन Tensorflow – user1718064

उत्तर

11

टी एल; डॉ:opt.minimize(loss) के डिफ़ॉल्ट कार्यान्वयन, TensorFlow इस बात का केवल पंक्तियों को संशोधित करता word_emb के लिए एक विरल अद्यतन उत्पन्न होगा word_emb जो आगे के पास में भाग लिया।

word_emb के संबंध में tf.gather(word_emb, indices) सेशन की ढाल एक tf.IndexedSlices वस्तु (see the implementation for more details) है। यह ऑब्जेक्ट indices द्वारा चुनी गई पंक्तियों को छोड़कर, हर जगह शून्य है, जो एक दुर्लभ टेंसर का प्रतिनिधित्व करता है। opt.minimize(loss) पर कॉल AdamOptimizer._apply_sparse(word_emb_grad, word_emb) पर कॉल करता है, जो tf.scatter_sub(word_emb, ...) * पर कॉल करता है जो word_emb की पंक्तियों को अपडेट करता है जिन्हें indices द्वारा चुना गया था।

दूसरी ओर आप tf.IndexedSlices कि opt.compute_gradients(loss, word_emb) द्वारा दिया जाता है को संशोधित करना चाहते हैं, तो आप अपने indices और values गुणों पर मनमाने ढंग से TensorFlow कार्रवाई करने, और एक नया tf.IndexedSlicesopt.apply_gradients([(word_emb, ...)]) को पारित किया जा सकता है कि बना सकते हैं। उदाहरण के लिए, आप निम्नलिखित कॉल का उपयोग MyCapper() का उपयोग कर ढ़ाल टोपी सकता है (उदाहरण के रूप में):

grad, = opt.compute_gradients(loss, word_emb) 
train_op = opt.apply_gradients(
    [tf.IndexedSlices(MyCapper(grad.values), grad.indices)]) 
इसी

, आपको लगता है कि एक नई tf.IndexedSlices एक अलग सूचकांक के साथ बनाने के द्वारा संशोधित किया जाएगा सूचकांक के सेट को बदल सकता है ।


*   सामान्य में, अगर आप TensorFlow में एक चर का ही हिस्सा अपडेट करना चाहते हैं, तो आप, tf.scatter_update(), tf.scatter_add(), or tf.scatter_sub() operators, जो क्रमशः सेट का उपयोग कर सकते करने के लिए (+=) जोड़ने के लिए या (-=) से घटाना पहले से संग्रहीत मूल्य एक चर में।

+0

में क्या आप वाकई विज्ञापन के रूप में काम करते हैं? मेरा प्रश्न देखें [यहां] (http://stackoverflow.com/questions/35828037/training-a-cnn-with-pre-trained-word-embeddings-is-very-slow-tensorflow) और इसमें लिंक। ऐसा लगता है कि किसी कारण से टेंसरफ्लो इंडेस्डस्लाइस को घने टेंसर में परिवर्तित कर रहा है और अपडेट धीमे हो जाते हैं। – hillel

+0

यह निश्चित रूप से काम करता है यदि आपका एम्बेडिंग चर 'tf.gather()' (या 'tf.nn.embedding_lookup()') के लिए प्रत्यक्ष 'पैराम्स' तर्क है। 'इंडेक्सड स्लिप्स' को घने टेंसर में परिवर्तित किया जाता है यदि ग्रेडियेंट बैकप्रोपेट्स को किसी भी अधिक सेशन के माध्यम से बैकप्रॉपेट करता है जिसमें 'इंडेक्सड स्लिप्स' को संभालने के लिए विशेष रूप से ढाल वाले फ़ंक्शन नहीं होते हैं (वर्तमान में मेरा मानना ​​है कि केवल 'tf.concat()' में ऐसी विशेषज्ञता है)। – mrry

+0

आश्चर्य है कि इसका उपयोग विशिष्ट शब्द वैक्टरों को अपडेट करने के लिए किया जा सकता है, जैसे कि मेरे ज्यादातर शब्दों के लिए मुझे पहले से प्रशिक्षित वैक्टर मिलते हैं लेकिन कुछ नए हैं और उन्हें प्रशिक्षण की आवश्यकता है। – TheM00s3

4

चूंकि आप केवल अद्यतन करने के लिए तत्वों का चयन करना चाहते हैं (और ग्रेडियेंट को बदलने के लिए नहीं), आप निम्नानुसार कर सकते हैं।

Let एक बूलियन टेन्सर कि सूचकांक आप अपडेट करना चाहते इंगित करता हो indices_to_update, और entry_stop_gradients, लिंक में परिभाषित किया गया है तब:

gather_emb = entry_stop_gradients(gather_emb, indices_to_update) 

(Source)

संबंधित मुद्दे