2017-02-15 138 views
2

我想一個模型來生成文本,類似於訓練到this blog postKeras - 如何使用學習的嵌入()圖層進行輸入和輸出?

該模型使用 - 據我所知 - 下列結構
[詞索引序列] - > [嵌入] - > [ LSTM] - > [1 Hot Encoded「next word」]

基本上,作者將過程建模爲分類問題,其中輸出層具有與語料庫中的單詞一樣多的維度。


我想通過重新使用學習的嵌入,然後最小化預測嵌入和真實嵌入之間的距離,將過程建模爲迴歸問題。

基本上:

[詞索引序列] - > [嵌入] - > [LSTM] - >

我的問題是[ 「下一個字」 的嵌入矢量],作爲模型正在動態地學習嵌入,我怎樣才能以與輸入輸入相同的方式(如字索引)來提供輸出,然後告訴模型「但在使用輸出之前,將其替換爲嵌入向量」?


非常感謝您的所有幫助:-)

+0

您是否得到了這個工作?如果是這樣,任何鏈接到代碼/博客(甚至自我答覆) - 正確標記的答案只是顯示分類方法,而不是你想要做的迴歸方法。 –

回答

1

在訓練階段:

您可以使用兩個輸入(一個目標,一個用於輸入,還有的1偏移在這兩個序列之間)並重新使用嵌入層。 如果輸入句子爲[1,2,3,4],則可以從中生成兩個序列:in = [1,2,3],out = [2,3,4]。然後你可以使用Keras的功能API來重新使用嵌入層:

emb1 = Embedding(in) 
emb2 = Embedding(out) 
predict_emb = LSTM(emb1) 
loss = mean_squared_error(emb2, predict_emb) 

注意這不是Keras代碼,只是僞代碼。

在測試階段:

通常情況下,你需要編寫自己的解碼功能。首先,你從一開始選擇一個詞(或幾個詞)。然後,將該詞(或短詞序列)送入網絡以預測下一個詞的嵌入。在這一步,你可以定義你自己的樣本函數,例如:你可能想要選擇嵌入距離預測的最近的單詞作爲下一個單詞,或者你可能想要從一個分佈中抽取下一個單詞,更接近預測嵌入的嵌入具有較大的被選擇的概率。一旦你選擇了下一個單詞,然後將它提供給網絡並預測下一個單詞,等等。

因此,您需要一次生成一個單詞(換句話說,一個嵌入),而不是將整個序列輸入到網絡。

如果上面的語句是你過於抽象,這裏是一個很好的例子:https://github.com/fchollet/keras/blob/master/examples/lstm_text_generation.py

85號線是引進部分,它隨機選擇從陰莖一小塊文本上下工夫。從第90行開始有一個循環,其中每個步驟對一個字符進行採樣(這是一個char- rnn,所以每個時間步輸入一個char。對於你的情況,它應該是一個字,而不是字符):L95預測下一個字符的分佈,來自分佈的L96個樣本。希望這已經夠清楚了。

+0

非常感謝,這對訓練有意義! 但是在運行時怎麼辦?當我想預測'out'並且不將它饋送到網絡時? –

+0

我已經更新了答案。希望能幫助到你。 – soloice

+0

是的,謝謝! –

相關問題