2015-11-18 35 views
12

tensorflow tutorial भाषा मॉडल पर वाक्य की संभावना की गणना करने के लिए अनुमति देता है भाषा मॉडल का उपयोग कर अगले शब्द की भविष्यवाणी:tensorflow उदाहरण

probabilities = tf.nn.softmax(logits) 
टिप्पणी में

नीचे यह भी संभावनाओं के बजाय अगले शब्द की भविष्यवाणी करने का एक तरीका निर्दिष्ट करता है लेकिन यह निर्दिष्ट नहीं करता कि यह कैसे किया जा सकता है। तो इस उदाहरण का उपयोग कर संभावना के बजाय एक शब्द कैसे आउटपुट करें?

lstm = rnn_cell.BasicLSTMCell(lstm_size) 
# Initial state of the LSTM memory. 
state = tf.zeros([batch_size, lstm.state_size]) 

loss = 0.0 
for current_batch_of_words in words_in_dataset: 
    # The value of state is updated after processing each batch of words. 
    output, state = lstm(current_batch_of_words, state) 

    # The LSTM output can be used to make next word predictions 
    logits = tf.matmul(output, softmax_w) + softmax_b 
    probabilities = tf.nn.softmax(logits) 
    loss += loss_function(probabilities, target_words) 

उत्तर

0

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

आपके प्रश्न का उत्तर करने के लिए: आप शब्दों की सूची ले जा सकते हैं, हालांकि यह पुनरावृति, और कार्यक्रम के उच्चतम संभावना के साथ शब्द प्रदर्शित करते हैं।

+0

हाँ मैं समझ गया कि आप एक ही के लिए एक उदाहरण कोड कर सकते हैं? इसके अलावा संभवतः एक विशाल vocab आकार भी है और vocab में प्रत्येक शब्द के लिए पुनरावृत्ति व्यावहारिक रूप से अक्षम है। – stackit

+0

अपनी प्रकृति में मशीन सीखना एक समस्या को हल करने की एक उच्च गणना विधि है। आप अपने मॉडल को कैसे प्रशिक्षण दे रहे हैं, इस पर निर्भर करते हुए, आप पहले से ही कई बार vocab पर फिर से चल रहे हो सकता है। एक ठेठ मशीन पर, आप कुछ सेकंड में कुछ मिलियन तारों को फिर से शुरू कर सकते हैं, इसलिए यह अपरिहार्य नहीं हो सकता है। आप गणना समय में कटौती चाहते हैं (और बाद के प्रदर्शन पर) आप एक तरह से बस बार-बार दोहराना जब आप एक बड़ा पर्याप्त संभावना –

+0

के साथ एक परिणाम को पाने के अपने ठीक प्रशिक्षण के दौरान नहीं बल्कि उत्पादन उपयोग – stackit

0

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

पर "मॉडल का मूल्यांकन" इस page से, अपने उत्पादन सूची निम्न उदाहरण में y है:

पहले हम पता लगा लेंगे, जहां हम सही लेबल की भविष्यवाणी की। tf.argmax एक बेहद उपयोगी काम है जो आपको कुछ अक्ष के साथ एक टेंसर में उच्चतम प्रविष्टि का सूचकांक देता है। उदाहरण के लिए, tf.argmax(y,1) वह लेबल है जो हमारे मॉडल को लगता है कि प्रत्येक इनपुट के लिए सबसे अधिक संभावना है, जबकि tf.argmax(y_,1) सही लेबल है। हम का उपयोग यह जांचने के लिए कर सकते हैं कि हमारे भविष्यवाणी सत्य से मेल खाती है या नहीं। correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))

एक और दृष्टिकोण है कि अलग है पूर्व vectorized (एम्बेडेड/इनकोडिंग) शब्द है। आप सीखने में तेजी लाने के लिए Word2vec के साथ अपने शब्दों को सदिश बना सकते हैं (इसलिए उन्हें एम्बेड करें), आप इसे देखना चाहेंगे। प्रत्येक शब्द को 300 आयामों के अर्थ में एक बिंदु के रूप में दर्शाया जा सकता है, और आप नेटवर्क के आउटपुट पर अंतरिक्ष में पूर्वानुमानित बिंदु के निकट स्वचालित रूप से "एन शब्द" पा सकते हैं। उस स्थिति में, argmax आगे बढ़ने का तरीका अब काम नहीं करता है और आप शायद उन शब्दों के साथ कोसाइन समानता की तुलना कर सकते हैं जिनकी आप वास्तव में तुलना करना चाहते थे, लेकिन इसके लिए मुझे यकीन नहीं है कि इससे संख्यात्मक अस्थिरताएं कैसे हो सकती हैं। उस स्थिति में y शब्दों को विशेषताओं के रूप में प्रस्तुत नहीं करेगा, लेकिन विभिन्न मॉडलों के अनुसार, आकार में 100 से 2000 आकार की एक आयामी पर शब्द एम्बेडिंग। आप अधिक जानकारी के लिए Google को ऐसा कुछ कर सकते हैं: एम्बेडिंग के विषय को समझने के लिए "पुरुष महिला रानी शब्द अतिरिक्त शब्द 2vec"।

नोट: जब मैं word2vec के बारे में बात करता हूं, तो यह आपके पूर्व प्रशिक्षण वाले शब्द 2vec मॉडल का उपयोग करने के बारे में है ताकि आपके प्रशिक्षण में केवल पूर्व-एम्बेडेड इनपुट हो और एम्बेडिंग आउटपुट बना सकें। उन समान शब्दों के आउटपुट को समान 2 शीर्ष अनुमानित शब्दों को खोजने के लिए word2vec द्वारा फिर से निकाला जा सकता है।

ध्यान दें कि मेरे द्वारा सुझाए गए दृष्टिकोण सटीक नहीं हैं क्योंकि यह केवल यह जानना उपयोगी होगा कि क्या हम भविष्यवाणी करते हैं कि हम भविष्यवाणी करना चाहते हैं। अधिक नरम दृष्टिकोण के लिए, यदि आप वाक्यों का उपयोग करते हैं या किसी शब्द से अधिक कुछ उपयोग करते हैं तो अपने मॉडल का मूल्यांकन करने के लिए ROUGE या BLEU मीट्रिक का उपयोग करना संभव होगा।

+0

सही नहीं है कि के दौरान बंद करने के लिए लागू कर सकते हैं इस उद्देश्य के लिए कार्य मौजूदा अनुक्रम को दिए जाने वाले अगले सबसे संभावित शब्द के रूप में पाया जाना चाहिए। – stackit

+1

शायद आपका प्रश्न पर्याप्त सटीक नहीं था? ऐसा लगता है कि 'tf.argmax (संभावनाएं, 1)' आपको प्रशिक्षण के बाद जवाब देगी। सबसे संभावित शब्द देना मॉडल को प्रशिक्षित किया जाता है और इसलिए यह _output_ होगा। आपको फंक्शन कॉल द्वारा दिए गए इंडेक्स को थोड़ा सा ट्विक करने की आवश्यकता हो सकती है, मैंने आपको सिर्फ अपनी डिक्शनरी से शब्द प्राप्त करने के लिए दिया है। –

+1

अपने मॉडल शब्द एम्बेडिंग (वैक्टर के रूप में प्रतिनिधित्व शब्द) भविष्यवाणी करने के लिए प्रशिक्षित किया गया था, तो आप पिछड़े-एम्बेड अपने शब्दों के लिए एक उपकरण की आवश्यकता है। Word2vec और GloVe उस कारण से दिलचस्प प्रक्षेपित मॉडल हैं। यदि आपका पूरा शब्द शब्दकोष प्रत्येक शब्द के लिए एक-गर्म वेक्टर के रूप में एम्बेड किया गया है, तो यहां मेरे फ़ंक्शन से आउटपुट की गई संख्या शब्दकोश में उस शब्द का सूचकांक है। –

2

आप संभावनाओं का argmax मिल जाए, और word_to_id नक्शा उलट कर वापस एक शब्द के लिए सूचकांक का अनुवाद करने की जरूरत है। इसे काम करने के लिए, आपको मॉडल में संभावनाओं को सहेजना होगा और फिर उन्हें run_epoch फ़ंक्शन से प्राप्त करना होगा (आप केवल Argmax को भी सहेज सकते हैं)।

inverseDictionary = dict(zip(word_to_id.values(), word_to_id.keys())) 

def run_epoch(...): 
    decodedWordId = int(np.argmax(logits)) 
    print (" ".join([inverseDictionary[int(x1)] for x1 in np.nditer(x)]) 
    + " got" + inverseDictionary[decodedWordId] + 
    + " expected:" + inverseDictionary[int(y)]) 

देखें पूर्ण कार्यान्वयन यहाँ:: यहाँ एक टुकड़ा है https://github.com/nelken/tf