1. 程式人生 > >無所不能的Embedding5 - skip-thought的兄弟們[Trim/CNN-LSTM/quick-thought]

無所不能的Embedding5 - skip-thought的兄弟們[Trim/CNN-LSTM/quick-thought]

這一章我們來聊聊skip-thought的三兄弟,它們在解決skip-thought遺留問題上做出了不同的嘗試【Ref1~4】, 以下paper可能沒有給出最優的解決方案(對不同的NLP任務其實沒有最優只有最合適)但它們提供了另一種思路和可能性。上一章的skip-thought有以下幾個值得進一步探討的點 - Q1 RNN計算效率低:Encoder-Decoder都是用的RNN, RNN這種依賴上一步輸出的計算方式天然和平行計算互斥, 所以訓練那叫一個慢 - Q2 Decoder:作為最後預測時完全用不到的元件,Decoder在訓練時佔用了大量時間,能否優化? - Q3 通用文字向量的樣本構建:skip-thought只預測前/後一個句子合理麼? - Q4 兩個decoder的神奇設計有道理麼? - Q5 pretrain word embedding考慮一下? - Q6 除了hidden_state還有別的提取句子向量的方式麼? 以下按照文章讓人眼前一亮的程度從小到大排序 ## Trim/Rethink skip-thought 【Ref1/2】是同一個作者的a/b篇對skip-thought模型的一些細節進行調整,並在benchmark裡拿到了和skip-thought不相上下的結果。主要針對以上Q4,Q5,Q6 作者認為兩個decorder的設計沒啥必要,基於中間句子的資訊,前後句子可以用相同的decoder進行reconstruct。這個假設感覺對翻譯類的語言模型不太能接受,不過放在訓練通用文字向量的背景下似乎是可以接受的,因為我們希望encoder部分能儘可能提取最大資訊並能夠在任意上下文語境中泛化,所以簡化Decoder更合適。 作者對比了用Glove,word2vec來初始化詞向量,結果顯示在Evaluation上會比隨機初始化表現更好。感覺用預訓練詞向量初始化的好處有兩個,一個是加速收斂,另一個是在做vocabulary expansion時,linear-mapping可能會更準確,用預訓練詞向量來初始化已經是比較通用的解決方案了。 針對Q6,原始的skip-thought最終輸出的文字向量就是Encoder最後一個hidden_state,那我們有沒有可能去利用到整個sequence的hiddden state輸出呢? 作者提出可以借鑑avg+max pooling, 對Encoder部分所有hidden state做avg, max pooling然後進行拼接作為 輸出的文字向量=$[\frac{\sum_{i=1}^T h_i}{T} , max_{i=1}^T h_i]$。這種方案的假設其實不是把embedding作為一個整體來看,而是把embedding的每一個unit單獨作為一個/類特徵來看,序列不同位置的output state可能提取了不同的資訊,通過avg/max來抽取最有代表性的特徵作為句子特徵。這個問題我們之後還會多次碰到,語言模型訓練好了拿什麼做句子向量更合適呢?這裡留個伏筆吧 所以感覺自己實現的其實是Trimed skip-thought, 我用的word2vec來初始化,只用了1個decoder來訓練pair樣本。。。感興趣的望過來 [Github-Embedding-skip_thought][1] Trim算是對skip-thought進行了瘦身,想要提速?看下面