首先,我们先理解一下什么是Embedding。
Word Embedding
翻译过来的意思就是词嵌入,通俗来讲就是将文字转换为一串数字。因为数字是计算机更容易识别的一种表达形式。
我们词嵌入的过程,就相当于是我们在给计算机制造出一本字典的过程。计算机可以通过这个字典来间接地识别文字。
词嵌入向量的意思也可以理解成:词在神经网络中的向量表示。
所以,接下来看看Pytorch里面的Embedding是什么样子的叭:
torch.nn.Embedding
介绍:
- 一个简单的查找表(lookup table),存储固定字典和大小的词嵌入。
- 此模块通常用于存储单词嵌入并使用索引检索它们(类似数组)。模块的输入是一个索引列表,输出是相应的词嵌入。
参数:
- num_embeddings - 词嵌入字典大小,即一个字典里要有多少个词。
- embedding_dim - 每个词嵌入向量的大小。
变量:
~Embedding.weight(Tensor)–形状模块(num_embeddings,Embedding_dim)的可学习权重,初始化自(0,1)。
也就是说,pytorch的nn.Embedding()是可以自动学习每个词向量对应的w权重的。
例子:
>>> # an Embedding module containing 10 tensors of size 3
>>> embedding = nn.Embedding(10, 3)
>>> # a batch of 2 samples of 4 indices each
>>> input = torch.LongTensor([[1,2,4,5],[4,3,2,9]])
>>> embedding(input)
tensor([[[-0.0251, -1.6902, 0.7172],
[-0.6431, 0.0748, 0.6969],
[ 1.4970, 1.3448, -0.9685],
[-0.3677, -2.7265, -0.1685]],
[[ 1.4970, 1.3448, -0.9685],
[ 0.4362, -0.4004, 0.9400],
[-0.6431, 0.0748, 0.6969],
[ 0.9124, -2.3616, 1.1151]]])
>>> # example with padding_idx
>>> embedding = nn.Embedding(10, 3, padding_idx=0)
>>> input = torch.LongTensor([[0,2,0,5]])
>>> embedding(input)
tensor([[[ 0.0000, 0.0000, 0.0000],
[ 0.1535, -2.0309, 0.9315],
[ 0.0000, 0.0000, 0.0000],
[-0.1655, 0.9897, 0.0635]]])
此外,我们也可以自己导入权重参数:
from_pretrained
介绍:
- 从给定的二维FloatTensor创建embedding实例。
参数:
- embeddings - 包含嵌入权重的FloatTensor。
第一个维度作为num_embeddings(这里是2)传递给Embedding,第二个维度作为Embedding_dim(这里是3)传递给Embedding。
例子:
>>> # FloatTensor containing pretrained weights
>>> weight = torch.FloatTensor([[1, 2.3, 3], [4, 5.1, 6.3]])
>>> embedding = nn.Embedding.from_pretrained(weight)
>>> # Get embeddings for index 1
>>> input = torch.LongTensor([1])
>>> embedding(input)
tensor([[ 4.0000, 5.1000, 6.3000]])
可以看到,我们weight是一个FloatTensor,维度为[2*3]:第一个维度 [1,2.3,3] 代表第一个词的词向量;第二个维度 [4,5.1,6.3] 代表第二个词的词向量。
此外,我们也可以设置:
>>> # FloatTensor containing pretrained weights
>>> embedding = nn.Embedding.from_pretrained(weight, freeze=False)
通过设置参数:freeze=False,来使模型学习embedding中的参数。
该参数默认值为:True。