pytorch如何使用預訓練的詞向量

如何在pytorch中使用word2vec訓練好的詞向量

torch.nn.Embedding()

  這個方法是在pytorch中將詞向量和詞對應起來的一個方法. 一般情況下,如果我們直接使用下面的這種:

self.embedding = torch.nn.Embedding(num_embeddings=vocab_size, embedding_dim=embeding_dim)
num_embeddings=vocab_size   表示詞彙量的大小
embedding_dim=embeding_dim  表示詞向量的維度

  這種情況下, 因爲沒有指定訓練好的詞向量, 所以embedding會幫咱們生成一個隨機的詞向量(但是在我剛剛測試的一個情感二分類問題中, 我發現好像用不用預訓練的詞向量, 結果差不多, 不過不排除是因爲當時使用的模型比較簡單, 導致一些特徵根本就沒提取出來).

  如果我想使用word2vec預訓練好的詞向量該怎麼做呢?
  其實很簡單,pytorch已經給我們提供好了接口

self.embedding.weight.data.copy_(torch.from_numpy(embeding_vector))
self.embedding.weight.requires_grad = False

  上面兩句代碼的意思, 第一句就是導入詞向量, 第二句表示的是在反向傳播的時候, 不要對這些詞向量進行求導更新. 我還看到有人會在優化器那裏使用這樣的代碼:

# emotion_net是我定義的模型
optimizer = torch.optim.Adam(filter(lambda p: p.requires_grad, emotion_net.parameters()), lr=1e-3, betas=(0.9, 0.99))

  大概意思也是爲了保證詞向量不會被反向傳播而更新, 具體有沒有用我就不清楚了.

  其實我感覺大家比較在意的其實應該是embeding_vector的形式, 下面我就介紹一下embeding_vector的形式

爲了講述方便, 這裏定義出下面幾個矩陣

embeding_vector:,,word_list:,word_to_index:word_listembeding_vector \begin {aligned} embeding\_vector &: 表示詞向量, 每行是一個詞的詞向量, 有多少行就說明有多少單詞 \\ word\_list &: 表示單詞列表, 裏面就是單詞 \\ word\_to\_index &: 這個矩陣將word\_list中的單詞和 embeding\_vector中的位置對應起來 \end {aligned}

  其實embeding_vector是一個numpy矩陣, 當然你看到了, 實際輸入到pytorch的時候, 是需要轉換成tensor類型的. 這個矩陣是什麼樣子的呢? 其中這個矩陣是 [vocab_size×embeding_dim][vocab\_size \times embeding\_dim] 的形式. 其中一共包含vocab_sizevocab\_size 個單詞, 每個單詞的維度是 embed_dimembed\_dim, 我們把這樣一個矩陣輸入就行了.

  之後, 我們要做的其實就是將 word_to_indexword\_to\_index 這個矩陣搞出來, 這裏的單詞轉下標的矩陣, 就是聯繫 embeding_vectorembeding\_vectorword_listword\_list 這兩個矩陣的中間者. 我們在輸入到torch.nn.Embedding中之前, 需要先通過 word_to_indexword\_to\_index 將單詞轉換成 embeding_vectorembeding\_vector 的下標就可以了.

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