1. 程式人生 > 程式設計 >基於pytorch 預訓練的詞向量用法詳解

基於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_list中的單詞和embeding_vector中的位置對應起來 ​

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

之後,我們要做的其實就是將 word_to_index word\_to\_indexword_to_index 這個矩陣搞出來,這裡的單詞轉下標的矩陣,就是聯絡 embeding_vector embeding\_vectorembeding_vector 和 word_list word\_listword_list 這兩個矩陣的中間者. 我們在輸入到torch.nn.Embedding中之前,需要先通過 word_to_index word\_to\_indexword_to_index 將單詞轉換成 embeding_vector embeding\_vectorembeding_vector 的下標就可以了.

以上這篇基於pytorch 預訓練的詞向量用法詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。