torch.nn.Embedding()
Word Embedding
词嵌入,就是把一个词典,随机初始化映射为一个向量矩阵。
列如:有一组词典,有两个词“hello”和“world”,对应的值为0和1.通过pytorch中的torch.nn.Embedding()建立一个2x10的向量矩阵,其中2表示词典中词的数量,10表示每个词对应的向量大小。
word_to_id = {'hello':0, 'world':1}
embeds = nn.Embedding(2, 10)
hello_idx = torch.LongTensor([word_to_id['hello']])
hello_embed = embeds(hello_idx)
print(hello_embed)
应用pytorch自带的nn.Enbedding构建词嵌入向量。
torch.nn.Embedding(num_embeddings: int, embedding_dim: int, padding_idx: Optional[int] = None, max_norm: Optional[float] = None, norm_type: float = 2.0, scale_grad_by_freq: bool = False, sparse: bool = False, _weight: Optional[torch.Tensor] = None)
num_embeddings:表示词典中词的数量
embedding_dim:表示每个词对应的向量维度
自然语言中使用批处理时候, 每个句子的长度并不一定是等长的, 这时候就需要对较短的句子进行padding, 填充的数据一般是0, 这个时候, 在进行词嵌入的时候就会进行相应的处理, nn.embedding会将填充位置的值映射为0。
padding_idx
padding_idx:表示用于填充的参数索引,比如用3填充,嵌入向量索引为3的向量设置为0
import torch
import torch.nn as nn
embed = nn.Embedding(10, 3, padding_idx=3) # padding_idx 默认是0
embed.weight
让我们再举个栗子,所有索引为3的都用0来填充,。
x = torch.tensor([[2, 2, 3, 3], [1, 2, 5, 4]])
embed(x)
也就是说,为了便于模型训练需统一句子长度,对那些句子长度不够的句子进行填充,比如用值3进行填充,当用nn.Embedding()进行词向量嵌入时,对应的索引为3的向量将变为全为0的向量。这样就减少了填充值对模型训练的影响。
把padding_idx设置为填充的值,如padding_idx=3,训练过程中索引为3的将始终设置为0,不进行参数更新.