2017-05-19 32 views
0

我不知道如果我的理解是正確的,但...權重更新埋層與預訓練fasttext權

同時培養了seq2seq模型的目的,一個我要發起一組的前訓練的嵌入層中的快速文本權重是減少測試環境中的未知單詞(這些未知單詞不在訓練集中)。由於預先訓練fasttext模型具有較大的詞彙,在測試環境中,未知單詞可以通過fasttext外的詞彙字載體,其應該有的在訓練集中的語義相似的單詞相似方向表示。

然而,由於這樣的事實:在嵌入層中的初始權重fasttext將通過訓練過程來更新(更新的權重產生更好的結果)。我想知道更新後的嵌入權重是否會扭曲單詞之間語義相似性的關係並破壞fasttext詞表向量的表達? (並且在初始嵌入層中的那些更新的嵌入權重和詞向量之間,但是它們的對應ID沒有出現在訓練數據中)

如果輸入ID可以分佈表示從預先訓練的模型中提取的代表矢量,然後,通過查找表將這些預先訓練的單詞向量(訓練時的固定權重)映射到嵌入層(這些權重將在訓練時更新),這是否會是更好的解決方案?

任何建議將不勝感激!

回答

0

一下你對這個問題的正確:使用預訓練的載體,並在您最終的模型微調他們的時候,是少有或沒有出現在訓練集不會得到任何更新的話。

現在,通常是一個可以測試多少的問題,爲您的特定情況下,這是。例如。如果您有驗證集,請嘗試微調而不是微調權重,查看驗證集上模型性能的差異。

如果你看到在驗證組的性能有很大的區別,當你不能微調,這裏是處理這幾個方面:

一)未可訓練的嵌入後添加一個線性變換層。微調嵌入在許多情況下仿射轉換到空間,所以人們可以在一個可以在測試時間應用的單獨層中捕獲它。

E.g. A是預先訓練嵌入矩陣:

embeds = tf.nn.embedding_lookup(A, tokens) 
X = tf.get_variable("X", [embed_size, embed_size]) 
b = tf.get_vairable("b", [embed_size]) 
embeds = tf.mul(embeds, X) + b 

二)請預先訓練的嵌入在沒有可訓練嵌入矩陣A.添加訓練的嵌入矩陣B,具有流行語較小的詞彙在你的訓練集,嵌入大小。在A和B中查找單詞(如果單詞不在詞彙中,則使用ID = 0),concat結果並將其用於輸入到模型中。這樣你就可以教你的模型大多使用A,有時候在你的訓練集中使用B來表達流行的單詞。

fixed_embeds = tf.nn.embedding_lookup(A, tokens) 
B = tf.get_variable("B", [smaller_vocab_size, embed_size]) 
oov_tokens = tf.where(tf.less(tokens, smaller_vocab_size), tokens, tf.zeros(tf.shape(tokens), dtype=tokens.dtype)) 
dyn_embeds = tf.nn.embedding_lookup(B, oov_tokens) 
embeds = tf.concat([fixed_embeds, dyn_embeds], 1) 
+0

非常感謝您的解決方案! – zuxfoucault

+0

在閱讀您的答案時,它激發了我對另一種潛在解決方案的可行性的好奇心,這種解決方案正朝着與當前職位不同的方向發展。在最終的訓練模型中從嵌入層中提取那些微調的向量/權重並將它們替換回原始的fasttext向量是否可行? – zuxfoucault

相關問題