2015-11-18 40 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

是的,我明白,你能爲相同的代碼的例子嗎?也有可能是一個巨大的詞彙量,迭代詞彙中的每個單詞實際上是不可行的。 – stackit

+0

機器學習本質上是解決問題的一種高度計算方法。根據你如何訓練你的模型,你可能已經多次迭代詞彙。在一臺典型的機器上,你可以在幾秒鐘內迭代幾百萬個字符串,所以它可能不是不可行的。如果你想減少計算時間(以及隨後的性能),你可以實現一種方法來停止迭代,當你找到一個足夠大的結果時 –

+0

在訓練過程中罰款,但不是在生產過程中使用 – stackit

0

您的輸出是一個TensorFlow列表,並且可以通過TensorFlow函數獲取其最大參數(預測的最可能類)。這通常是包含下一個單詞概率的列表。

從這個page「評估模型」,你的輸出列表是在下面的例子中y

首先,我們預測正確的標籤,我們會弄清楚。 tf.argmax 是一個非常有用的功能,它可以爲沿着某個軸的張量中的最高條目提供 索引。例如,tf.argmax(y,1) 是我們模型認爲最有可能用於每個輸入的標籤,而 tf.argmax(y_,1)是真正的標籤。我們可以使用tf.equal來檢查我們的 預測是否符合事實。 correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))

另一種不同的方法是使用預矢量化(嵌入/編碼)的單詞。你可以用Word2vec將你的單詞向量化(因此嵌入它們)以加速學習,你可能想看看這個。每個單詞可以表示爲300維空間意義中的一個點,並且可以自動找到網絡輸出處最接近空間預測點的「N個單詞」。在這種情況下,argmax的處理方式不再適用,您可以將餘弦相似度與您真正想要比較的詞進行比較,但爲此我不確定這會如何導致數值不穩定。在這種情況下,y不會將單詞表示爲特徵,而是根據不同的模型將單詞嵌入在尺寸爲100至2000的維度上。你可以谷歌這樣的更多信息:「男人女人女王字添加word2vec」瞭解更多的嵌入主題。

注意:當我在這裏談論word2vec時,它是關於使用外部預先訓練的word2vec模型來幫助您的訓練只有預先嵌入的輸入並創建嵌入輸出。這些輸出的相應單詞可以通過word2vec重新計算出來以找到相應的類似的最高預測單詞。

請注意,我建議的方法並不準確,因爲只有知道我們是否準確預測了我們想要預測的單詞纔有用。對於更軟的方法,在使用句子或長於單詞的情況下,可以使用ROUGE或BLEU度量來評估模型。

+0

這不是正確的函數爲此目的,因爲需要找到給定現有序列的下一個最有可能的詞。 – stackit

+1

也許你的問題不夠精確?在我看來,'tf.argmax(概率1)'會在訓練結束後給你答案。給出最可能的單詞是模型的訓練內容,因此它將會輸出。您可能需要稍微調整一下函數調用給出的索引,我剛剛給您提供了從您的詞典中取回單詞的索引。 –

+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