無所不能的Embedding4 - Doc2vec第二彈[skip-thought & tf-Seq2Seq原始碼解析]
阿新 • • 發佈:2020-11-21
前一章Doc2Vec裡提到,其實Doc2Vec只是通過加入Doc_id捕捉了文字的主題資訊,並沒有真正考慮語序以及上下文語義,n-gram只能在區域性解決這一問題,那麼還有別的解決方案麼?依舊是通用文字向量,skip-thought嘗試應用encoder-decoder來學習包含上下文資訊和語序的句子向量。魔改後的實現可以看這裡( ´▽`) [**github-DSXiangLi-Embedding-skip_thought**][6]
## Skip-Thought模型分析
Skip-Thought顧名思義是沿用了skip-gram的路子,不熟悉的童鞋看這裡 [無所不能的Embedding1 - Word2vec模型詳解&程式碼實現][2] skip-gram是用中間詞來預測周圍單詞,skip-Thought是用中間句子來預測前一個句子和後一個句子,模型思路就是這麼簡單粗暴,具體實現就涉及到句子的資訊要如何提取,以及loss function的選擇。作者選擇了encoder-decoder來提取句子資訊,用翻譯模型常用的log-perplrexity作為loss。 這裡想提一句不同模型,在不同的樣本上,訓練出的文字向量所包含的資訊是不同的。例如word2vec的假設就是context(windo_size內周圍詞)相似的單詞更相似(向量空間距離更近)。skip-thought作者對於文字向量的假設是:能更好reconstruct前後句子的資訊,就是當前句子的所含資訊,換言之前後句子相似的句子,文字向量的空間距離更近。 >第一次讀到這裡感覺哇make perfect sense!可越琢磨越覺著這個task有些迷幻,word2vec skip-gram可以這麼搞,是因為給定中間詞window_size內的單詞選擇是相對有限的。你給我個句子就讓我精準預測前後句子的每一個詞,這能收斂?you what?! 不著急後面似乎有反轉~ Encoder部分負責提取中間句子的資訊生成定長向量output_state,Decoder則基於ouput_state進行迭代生成前(後)句子。Encoder-Decoder支援任意記憶單元,這裡作者選擇了GRU-GRU。 簡單回顧下GRU Cell,GRU有兩個Gate,從兩個角度衡量歷史sequence資訊和當前token的相關程度,$\Gamma_r$控制多少歷史資訊參與state的重新計算是reset gate,$\Gamma_u$控制多少歷史資訊直接進入當前state是update gate,這裡安利一篇部落格 [Illustrated Guide to LSTM’s and GRU’s: A step by step explanation][3] $$ \begin{align} \Gamma_u & =\sigma(w