【Pytorch基础教程28】浅谈torch.nn.embedding

学习总结

文章目录

一、nn.Embedding

CLASStorch.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, device=None, dtype=None)[

torch.nn.Embedding经常用来存储单词embedding,使用对应indices进行检索对应的embedding。从上面的官方参数看:

  • 输入(最重要的还是前三个参数):
  • torch.nn.Embedding(
  • num_embeddings, – 词典的大小尺寸,比如总共出现5000个词,那就输入5000。此时index为(0-4999
  • embedding_dim,– 嵌入向量的维度,即用多少维来表示一个符号。
  • padding_idx=None,– 填充id,比如,输入长度为100,但是每次的句子长度并不一样,后面就需要用统一的数字填充,而这里就是指定这个数字,这样,网络在遇到填充id时,就不会计算其与其它符号的相关性。(初始化为0)
  • (不常用)max_norm=None, – 最大范数,如果嵌入向量的范数超过了这个界限,就要进行再归一化。
  • (不常用)norm_type=2.0, – 指定利用什么范数计算,并用于对比max_norm,默认为2范数。
  • scale_grad_by_freq=False, 根据单词在mini-batch中出现的频率,对梯度进行放缩。默认为False.

  • sparse=False, – 若为True,则与权重矩阵相关的梯度转变为稀疏张量。

  • _weight=None)
  • 输出:[规整后的句子长度,样本个数(batch_size),词向量维度]

注:

  • 对句子进行规整,即对长度不满足条件的句子进行填充pad(填充的值也可以自己选定),另外句子结尾的EOS也算作一个词。
  • 可以通过 weight看对应的embedding字典矩阵对应的初始化数值,一般是通过正态分布进行初始化。

二、代码栗子

2.1 通过embedding降维

【Pytorch基础教程28】浅谈torch.nn.embedding
独热编码向量:维度会太高、向量系数、硬编码。
通过embedding将向量编码为低维、稠密的向量(从data中学习)。
【Pytorch基础教程28】浅谈torch.nn.embedding
【Pytorch基础教程28】浅谈torch.nn.embedding

一个1乘4维度矩阵传入10乘3的nn.embedding中,然后得到1乘4乘3矩阵:


embedding = nn.Embedding(10, 3, padding_idx=2)
print(embedding.weight, "\n")

input = torch.LongTensor([[0,2,0,5]])
print(input.shape, "\n")

ans2 = embedding(input)
ans2.shape

ans2

对应的结果如下,可以看到分别检索出对应的第0,2,0,5行embedding默认的初始权重数据:

Parameter containing:
tensor([[-0.8261,  1.9007,  1.4342],
        [ 1.6798, -0.3864, -1.0726],
        [ 0.0000,  0.0000,  0.0000],
        [-0.9938,  0.3280,  0.1925],
        [-0.2799, -0.9858, -0.7124],
        [ 0.4406,  0.3621, -0.1915],
        [-0.1846,  0.2060, -0.4933],
        [-0.4918,  0.0625, -0.5818],
        [ 0.6995,  0.6223, -1.4094],
        [ 0.3378, -1.0894, -0.7570]], requires_grad=True)

torch.Size([1, 4])

tensor([[[-0.8261,  1.9007,  1.4342],
         [ 0.0000,  0.0000,  0.0000],
         [-0.8261,  1.9007,  1.4342],
         [ 0.4406,  0.3621, -0.1915]]], grad_fn=<EmbeddingBackward0>)

如果input是对应的2乘4矩阵:


import torch
import torch.nn as nn
from torch.autograd import Variable

embedding = nn.Embedding(10, 3)

input1 = torch.LongTensor([[1, 2, 4, 5],
                           [4, 3, 2, 9]])
emb1 = embedding(input1)
print(emb1)
print(emb1.shape)

print('-' * 60)

embedding = nn.Embedding(10, 3, padding_idx = 0)
input2 = Variable(torch.LongTensor([[0, 2, 0, 5]]))
emb2 = embedding(input2)
print(emb2)
print(emb2.shape)

`python
tensor([[[ 0.3004, -0.7126, 0.8605],
[ 0.1484, -0.9476, 1.0352],
[ 2.2382, -0.3619, -1.6866],
[-0.2713, 0.3627, 0.4067]],

    [[ 2.2382, -0.3619, -1.6866],
     [ 1.2409,  0.6028,  0.0371],
     [ 0.1484, -0.9476,  1.0352],
     [-0.5018,  0.3566, -0.6405]]], grad_fn=<EmbeddingBackward>)

torch.Size([2, 4, 3])

Original: https://blog.csdn.net/qq_35812205/article/details/125303611
Author: 山顶夕景
Title: 【Pytorch基础教程28】浅谈torch.nn.embedding

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/707536/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球