[Pytorch官方NLP實驗解惑03]基於lstm的seq2seq單詞標註器

序列到序列(seq2seq)是nlp任務中重要的一類,它和其他任務的根本區別在於它以序列作爲處理對象,而序列由彼此獨立又相互聯繫的單詞組成,爲了處理這種關係,需要在層與層之間記憶和傳遞狀態,以表達單詞之間的聯繫,深度學習使用rnn及rnn的變種(lstm,gru)解決這一問題。
這篇博客是對https://pytorch.org/tutorials/beginner/nlp/sequence_models_tutorial.html#sphx-glr-beginner-nlp-sequence-models-tutorial-py中一些問題的解惑,可以配合使用,有其他不理解的也歡迎評論討論。

單詞標註器

本實驗實現一個單詞標註器,即單詞序列->詞性序列。

 ("The dog ate the apple".split(), ["DET", "NN", "V", "DET", "NN"]),

The dog ate the apple
冠詞,名詞,動詞,冠詞,名詞。
可以發現,已知前文有助於推斷下文,例如:已知前一個單詞是冠詞,後一個單詞就很可能是名詞。

網絡模型

class LSTMTagger(nn.Module):
   def __init__(self,VOC,EMB,HID,TAG):
       super(LSTMTagger,self).__init__()
       self.embedding=nn.Embedding(VOC,EMB)
       self.lstm=nn.LSTM(EMB,HID)
       self.linear=nn.Linear(HID,TAG)
   def forward(self,sentence):
       emb=self.embedding(sentence)
       out,hidden=self.lstm(emb.view(len(sentence),1,-1))
       scores=F.log_softmax(self.linear(hid.view(len(sentence),-1)),dim=1)
       return scores

參數問題

embedding層的參數是<字母表長度,embedding向量長度>,輸入是index序列,輸出是embedding序列。
lstm層的參數是<embedding向量長度,hidden向量長度>。
有迷惑性的是lstm層的輸入,根據lstm的結構,輸入有兩個:隱層向量和詞向量,輸出是也有兩個:out,hidden。

詞向量size如何確定?

遵循單次訓練原則,即一次實驗用多少,size就填多少。
詞向量是一個三維tensor,官方文檔裏定義爲<seq_length,batch_size,input_size>。第一維指定一次訓練投入的單詞序列長度,batch_size指定同時並行訓練的序列數,在本次實驗和下次實驗中全部取1,input_size就是每個詞向量的長度了,如果先進一次embedding層,就是embedding空間的長度。
所有的rnn模型都有兩種訓練方法,一種是一次性填充一個序列,每個單詞的填充和狀態在不同rnn層之間的傳遞都是自動的,最終的輸出一個二元組(out,hidden),分別表示每一層的輸出和最後一層的輸出,一般來說,out[0]=hidden。
另一種是每次填充一個單詞,手動完成狀態在不同rnn層之間的傳遞過程,如果希望自定義層的功能(例如attention),這種用法就是必不可少的。
本次實驗使用第一種用法,那麼輸入詞向量的size就是<seq,1,embedding>,也可以寫作<seq,1,-1>

隱層向量size如何確定

lstm有兩個隱層:C和H,分別表示細胞長期狀態和上一次輸出,需要傳入一個
Size=(2,hidden)的tensor,在下一個實驗中,我們使用gru,它是lstm的變體,沒有C層,則只需要傳入一個長度爲hidden的隱層向量,這是單次訓練的hidden輸入,無論是每次填充一個序列,還是每次填充一個單詞,都只傳一個隱層向量。
如果不手動傳,則自動使用全0tensor。

輸出是什麼?

out,hidden=self.lstm(emb.view(len(sentence),1,-1))
其中out表示本次訓練的所有輸出,hidden表示本次訓練的最後一個輸出。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章