2016-03-01 50 views
12

में प्रति उदाहरण समेकित ग्रेडियेंट/ग्रेडियेंट्स tensorflow में mnist पर एक साधारण मिनी-बैच ग्रेडेंट वंश समस्या (जैसे tutorial) को देखते हुए, मैं व्यक्तिगत रूप से बैच में प्रत्येक उदाहरण के लिए ग्रेडियेंट कैसे प्राप्त कर सकता हूं।tensorflow

tf.gradients() बैच में सभी उदाहरणों पर औसत ग्रेडियेंट लौटने लगता है। क्या समेकन से पहले ग्रेडियेंट को पुनः प्राप्त करने का कोई तरीका है?

संपादित करें: इस उत्तर की ओर पहला कदम यह पता लगा रहा है कि किस बिंदु पर टेंसफोर्लो बैच में उदाहरणों पर ग्रेडियेंट औसत करता है। मैंने सोचा कि यह _AggregatedGrads में हुआ, लेकिन ऐसा लगता है कि यह मामला नहीं है। कोई विचार?

+1

ऐसा लगता है कि आप एक Jacobian, नहीं एक ढाल चाहते हैं। –

उत्तर

5

tf.gradients हानि के संबंध में ढाल लौटाता है। इसका अर्थ यह है कि यदि आपका नुकसान प्रति उदाहरण हानियों का योग है, तो ढाल प्रति उदाहरण हानि ग्रेडियेंट का योग भी है।

संक्षेप में संक्षेप है। उदाहरण के लिए यदि आप Wx-y त्रुटियों के वर्ग मानदंडों के योग को कम करना चाहते हैं, तो W के संबंध में ढाल 2(WX-Y)X' है जहां X अवलोकनों का बैच है और Y लेबल का बैच है। आप कभी भी "प्रति-उदाहरण" ग्रेडियेंट्स को स्पष्ट रूप से तैयार नहीं करते हैं जिन्हें आप बाद में जोड़ते हैं, इसलिए ढाल पाइपलाइन में कुछ चरण को हटाने का यह एक साधारण मामला नहीं है।

k प्रति उदाहरण हानि ग्रेडियेंट प्राप्त करने का एक आसान तरीका आकार 1 के बैच का उपयोग करना है और k पास करना है। इयान गुडफेलो wrote up कैसे के लिए यह आप स्पष्ट रूप से ढ़ाल निर्दिष्ट करने के लिए और tf.gradients विधि

+4

आप अधिकांश काम करने के लिए tf.gradients का उपयोग कर सकते हैं। मान लें कि आप एक्स के संबंध में प्रति उदाहरण ग्रेडियेंट चाहते हैं। आप एक्स के उपभोक्ताओं पर tf.gradients को कॉल करते हैं। उदाहरण के लिए आपके पास एक वेरिएबल जेड है जो एक्स को कुछ मैट्रिक्स डब्ल्यू द्वारा गुणा किया गया है। फिर आपको प्रति-तर्क करने के लिए अपने तर्क की आवश्यकता है। मैट्रिक्स गुणा के माध्यम से उदाहरण भिन्नता, लेकिन आप Z. –

+0

के संबंध में डेरिवेटिव प्राप्त करने के लिए tf.gradients का उपयोग कर सकते हैं धन्यवाद! बस यह सुनिश्चित करने के लिए कि मैं इसे सही ढंग से समझता हूं: यह केवल पिछली प्रचार श्रृंखला में पहले मैट्रिक्स गुणा के लिए काम करेगा, है ना?मतलब यह है कि एमएलपी में पहली परत के वजन के लिए डेरिवेटिव की गणना करने के लिए बैक प्रोप के लगभग सभी चरणों को लागू करने की आवश्यकता होगी। वैसे भी? – Bas

+0

यदि हानि प्रति उदाहरण हानियों का योग है तो कोई समस्या नहीं है जो भी tf.gradients सही चीज़ की गणना कर रहा है जो प्रति उदाहरण हानि ग्रेडियेंट्स का योग है। बात यह है कि जब "हानि" एक ऐसा कार्य होता है जो प्रत्येक उदाहरण के लिए एक स्केलर देता है। –

1

पर भरोसा नहीं आंशिक रूप से थोड़ी देर के लिए इस को संवारता के बाद अपने ही सवाल का जवाब देने की जरूरत है, एक भी पास में सभी k ढ़ाल पाने के लिए। ऐसा लगता है कि यह उदाहरण के प्रति ढ़ाल हेरफेर करने के लिए, जबकि अभी भी करके बैच में काम संभव है निम्नलिखित:

  • () tf.gradients की एक प्रति है कि उदाहरण के विशिष्ट कारकों
  • साथ एक अतिरिक्त टेन्सर/प्लेसहोल्डर स्वीकार करता बनाएं
  • _AggregatedGrads (की कॉपी बनाएं) और एक कस्टम एकत्रीकरण विधि उदाहरण-विशिष्ट कारकों का उपयोग करता है जोड़ने
  • अपने कस्टम tf.gradients समारोह कॉल और स्लाइस की एक सूची के रूप में अपने नुकसान दे:

custagg_gradients( ys=[cross_entropy[i] for i in xrange(batch_size)],
xs=variables.trainable_variables(), aggregation_method=CUSTOM, gradient_factors=gradient_factors )

लेकिन संभवतः प्रति उदाहरण व्यक्तिगत पास करने के समान ही जटिलता होगी, और मुझे यह जांचने की आवश्यकता है कि ग्रेडियेंट सही हैं या नहीं :-)।

0

एकत्रीकरण से पहले ग्रेडियेंट को पुनर्प्राप्त करने का एक तरीका grads_ys पैरामीटर का उपयोग करना है। एक अच्छी चर्चा यहाँ पाया जाता है:

Use of grads_ys parameter in tf.gradients - TensorFlow