-
1 # 嬰幼兒的護理
-
2 # 北航秦曾昌
Embedding問題一直是NLP領域裡十分熱門問題。近年來,有很多工作是利用RNN、CNN等神經網路對詞進行組合(composition operators )以得到句子表示,但這大部分都是監督學習,針對特定領域的特定需求,得到的句子向量的通用型不強。
NIPS"15 的論文,來自 Ryan Kiros等人提出的skip-thought vectors受Word2vec中skip-gram的啟發,把詞級別的Embedding擴充套件到句子級別Embedding,模型稱為skip-thought,得到的句子向量稱為skip-thought vectors.
這篇論文的優點主要有2點:
1)skip-thought是無監督的通用式句子表示方法,利用書中文字的連續性,訓練一個編碼器-解碼器模型,試圖重建一個句子段落的周圍句子,使得語義和句法上相似的句子有相似的向量表示。
2)skip-thought的另一個貢獻是 vocabulary mapping。介紹了一種簡單的詞彙擴充套件方法,將未被視為訓練的單詞編碼,使得詞彙量可以擴大到一百萬個單詞。對於沒在訓練集出現的詞,透過mapping from word embedding pre-trained from word2vec,用一個沒有正則的 L2 學得對映矩陣W,使得任意的詞向量都能在skip-thought中有一個合適的表示。Embedding問題一直是NLP領域裡十分熱門問題。近年來,有很多工作是利用RNN、CNN等神經網路對詞進行組合(composition operators )以得到句子表示,但這大部分都是監督學習,針對特定領域的特定需求,得到的句子向量的通用型不強。
NIPS"15 的論文,來自 Ryan Kiros等人提出的skip-thought vectors受Word2vec中skip-gram的啟發,把詞級別的Embedding擴充套件到句子級別Embedding,模型稱為skip-thought,得到的句子向量稱為skip-thought vectors.
這篇論文的優點主要有2點:
1)skip-thought是無監督的通用式句子表示方法,利用書中文字的連續性,訓練一個編碼器-解碼器模型,試圖重建一個句子段落的周圍句子,使得語義和句法上相似的句子有相似的向量表示。
2)skip-thought的另一個貢獻是 vocabulary mapping。介紹了一種簡單的詞彙擴充套件方法,將未被視為訓練的單詞編碼,使得詞彙量可以擴大到一百萬個單詞。對於沒在訓練集出現的詞,透過mapping from word embedding pre-trained from word2vec,用一個沒有正則的 L2 學得對映矩陣W,使得任意的詞向量都能在skip-thought中有一個合適的表示。
skip-thought的結構是一個encoder-decoder模型,encoder負責把詞序列編碼成一個句子向量,decode用來生成該句子的上下文向量。encoder 輸出一個向量,decoder 在這個向量的基礎上生成一個句子。有關encoder和decoder的結構選擇上論文中也做了幾個選擇實驗,包括 ConvNet-RNN, RNN-RNN,LSTM-LSTM,加入attention mechanism 等。
skip-thought在8個任務上使用線性模型對向量進行評估:語義關聯、釋義檢測、影象句子排序、問題型別分類和4個情緒和主觀性資料集分類問題。實驗結果表明:skip-thought可以產生高度通用的穩健的句子表示,並在實踐中表現良好。
下圖就對句子進行向量表示之後,根據cosine相似度計算出來的句子結果:
回覆列表
我來說說word2vec的原理吧。
word2vec就是把一個詞對映為一個向量表示,那麼怎麼去對映呢?首先隨機分配一個向量,然後透過模型去更新這個向量,讓它能更好的表示這個詞的語義。現在問題變成了怎麼來更新這個向量(我們選擇最簡單的一種作為說明,已知輸入詞預測輸出詞的機率,當然最流行的是CBOW和skip-gram方法)。
1. 首先看下模型圖
從圖中可以看出,V代表整個訓練語料的詞表大小,x_i代表某個詞,W為詞向量(也就是我們要計算得到的),y_i對應的預測詞;
2. 透過這個,可以構建目標函式,如下:
3. 有了目標函式之後,再構建loss function,具體如下(如果對公式有疑問可以隨時問我):
此時就有人會問,為什麼是-logf(x),因為所有機器學習的目標都是最小化損失函式,而我們目的又是使得預測的機率更接近真實值,也就是預測的機率要儘可能大,所以損失函式就加了一個負號;
4. 有了loss function,我們再來最佳化它,使損失達到最優,具體公式如下(使用梯度下降法):
輸出引數更新:
我們最終得到W和W`,所以對引數求導即可;
輸入引數更新:
5. 我們最終得到的W就是我們要計算的詞向量,此時基本就結束了;
6. 但是,我們每次更新一次權重,都需要計算最優的輸出詞,即對詞表每個詞求一次機率,這時計算量會非常大,幾乎不可能完成。這裡就進化出兩個最佳化演算法,Hierarchical Softmax和Negative Sampling。
7. Hierarchical Softmax思想是使用詞頻構造一顆哈夫曼樹,每個末節點表示一個詞,如果要預測某個詞的機率,僅需要計算從根節點到該詞路徑的機率積,此時複雜度從O(V)降為O(log(V)),具體如下(需要注意輸出層和隱層不變,僅僅改變輸出層):
7.1 此時同樣需要構建目標函式:
由此可見進入到左子樹結果為1,進入到右子樹結果為0,此性質符合sigmoid特性,這就是Hierarchical Softmax的由來。
7.2 同樣構建loss function
7.3 更新引數
輸出層的引數更新
輸入層的引數更新
8. 這裡基本上把word2vec的整個流程都介紹了一遍,像CBOW和skip-gram只是應用了上下文資訊,其他內容和上文介紹類似。這裡還有另外一種最佳化演算法(Negative Sampling)沒介紹到,如果感興趣的話,後期再補充。