官網:https://pytorch.org/docs/stable/nn.html#embedding
torch.nn.
Embedding
(num_embeddings, embedding_dim, padding_idx=None, max_norm=None, norm_type=2.0, scale_grad_by_freq=False, sparse=False, _weight=None)
torch.nn.Embedding 模塊可以看做一個字典,字典中每個索引對應一個詞和詞的embedding形式。利用這個模塊,可以給詞做embedding的初始化操作。
模塊中主要參數:
num_embeddings :字典中詞的個數
embedding_dim:embedding的維度
padding_idx(索引指定填充):如果給定,則遇到padding_idx中的索引,則將其位置填0(0是默認值)。
大小說明:
input:(∗) , LongTensor 結構
output:(*,e):*是input的大小,e是embedding_dim,即每個詞的embedding的維度
注:embeddings中的值是正態分佈N(0,1)中隨機取值。
例子:
import torch
import torch.nn as nn
x = torch.LongTensor([[1,2,4],[4,3,2]])
embeddings = nn.Embedding(5,5,padding_idx=4) #5個詞,每個詞也是5維
print(embeddings(x))
print(embeddings(x).size())
output:
tensor([[[ 0.8839, -1.2889, 0.0697, -0.9998, -0.7471],
[-0.5681, 0.8486, 0.8176, 0.8349, 0.1719],
[ 0.0000, 0.0000, 0.0000, 0.0000, 0.0000]], ->index=4 賦值 0
[[ 0.0000, 0.0000, 0.0000, 0.0000, 0.0000], ->index=4 賦值 0
[ 1.4224, 0.2333, 1.9383, -0.7320, 0.9987],
[-0.5681, 0.8486, 0.8176, 0.8349, 0.1719]]],
grad_fn=<EmbeddingBackward>)
torch.Size([2, 3, 5])
embedding方法獲取的向量只是隨機初始化的,並不代表任何含義,並且不會有word2vec等訓練出來的效果。但是可以利用這樣的方法先賦值然後在學習。
總結一下一般任務中的流程:
首先將單詞轉成字典的形式,由於英語中以空格爲詞的分割,所以可以直接建立詞典索引結構。類似於:dic={'i':1,'like':2,'you':3,'want':4,'an':5,'apple':6}這樣的形式。如果是中文的話,首先進行分詞操作。
然後在以句子爲list,爲每個句子建立索引結構,list[[sentence1],[sentence2]]。以上面字典的索引來說,最終建立的就是[[1,2,3],[1,4,5,6]]。這樣長短不一的句子。
接下來要進行padding的操作。由於tensor結構中都是等長的,所以要對上面那樣的句子做padding操作後再利用nn.Embedding來進行詞的初始化。padding後的可能是這樣的結構[[1,2,3,0],[1,4,5,6]]。其中0作爲填充。(注意:由於在NMT任務中肯定存在着填充問題,所以在embedding時一定存在着第三個參數,讓某些索引爲下的值爲0,代表無實際意義的填充)