nn.Embedding 的理解

Embedding是将输入向量化,参数包括:

nn.Embedding(vocab_size, emb_size)
vocab_size:词典大小(不是每个batch size的长度,而是数据集词库的大小)

emb_size:每个词需要嵌入多少维来表示(也就是输入维度)

构造一个(假装)vocab size=10,每个vocab用3-d向量表示的table
>>> embedding = nn.Embedding(10, 3)
>>> embedding.weight
Parameter containing:
tensor([[ 1.2402, -1.0914, -0.5382],
[-1.1031, -1.2430, -0.2571],
[ 1.6682, -0.8926, 1.4263],
[ 0.8971, 1.4592, 0.6712],
[-1.1625, -0.1598, 0.4034],
[-0.2902, -0.0323, -2.2259],
[ 0.8332, -0.2452, -1.1508],
[ 0.3786, 1.7752, -0.0591],
[-1.8527, -2.5141, -0.4990],
[-0.6188, 0.5902, -0.0860]], requires_grad=True)

 

根据定义的table对输入两个句子每个句子由四个词进行嵌入:

input = torch.LongTensor([[1,2,4,5],[4,3,2,9]])

>>> a = embedding(input)
>>> a
tensor([[[-1.1031, -1.2430, -0.2571],
[ 1.6682, -0.8926, 1.4263],
[-1.1625, -0.1598, 0.4034],
[-0.2902, -0.0323, -2.2259]],
[[-1.1625, -0.1598, 0.4034],
[ 0.8971, 1.4592, 0.6712],
[ 1.6682, -0.8926, 1.4263],
[-0.6188, 0.5902, -0.0860]]], grad_fn=<EmbeddingBackward>)

  

可以观察到每一行是一个词的向量表示,且输入input是indices,即词对应的标签(比如:“我”--“1”,“音”--“2”,“识”--“3”,别--“4”)

在通过nn.Embedding 初始化他的权重时已经为每一个输入标签构建好了对应的词向量,比如a = embedding(input)中的第一行对应的标签是“1”,所以在生成的embedding.weight取出下标为1的向量表示该标签。

posted @ 2022-11-11 23:42  Uriel-w  阅读(1313)  评论(0编辑  收藏  举报