nn.Embedding 的理解
Embedding是将输入向量化,参数包括:
nn.Embedding(vocab_size, emb_size)
vocab_size:词典大小(不是每个batch size的长度,而是数据集词库的大小)
emb_size:每个词需要嵌入多少维来表示(也就是输入维度)
构造一个(假装)vocab size=10,每个vocab用3-d向量表示的table
1 2 3 4 5 6 7 8 9 10 11 12 13 | >>> 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对输入两个句子每个句子由四个词进行嵌入:
1 2 3 4 5 6 7 8 9 10 11 12 | 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的向量表示该标签。
本文作者:Uriel-w
本文链接:https://www.cnblogs.com/Uriel-w/p/16882467.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步