gpt4 book ai didi

neural-network - 使用预训练的词嵌入 - 如何为未知/OOV token 创建向量?

转载 作者:行者123 更新时间:2023-12-03 19:32:11 24 4
gpt4 key购买 nike

我不想加pre-trained embeddings到一个模型。但似乎没有词表外 (OOV) 代币。不存在不可见词的向量。

那么我能做些什么来处理我遇到的 OOV token 呢?我有一些想法,但似乎都不是很好:

  • 我可以为这个 token 创建一个随机向量,但理想情况下我希望向量在现有模型的逻辑内。如果我只是随机创建它,我担心该向量可能会与非常频繁的单词非常相似,例如“the”、“for”、“that”等,这不是我的意图。
  • 或者我应该只用纯零来初始化向量?
  • 另一个想法是对其他现有向量的 token 进行平均。但是对哪些向量求平均呢?所有?这似乎也不是很确定。
  • 我也想过尝试训练这个向量。但是,如果我想在训练期间卡住其余的嵌入,这并不是很方便。

  • (通用的解决方案值得赞赏,但我想补充一点,我正在使用 PyTorch - 以防万一 PyTorch 已经为这个问题提供了一个方便的解决方案。)

    那么创建这样一个向量的一个好的和简单的策略是什么?

    最佳答案

    有多种方法可以处理。我不认为我可以引用关于哪个效果更好的引用。

    不可训练选项 :

  • 随机向量作为嵌入
  • 您可以对 OOV 使用全零向量。
  • 您可以表示所有嵌入向量,这样您就可以避免偏离实际分布的风险。
  • 此外,嵌入通常带有在训练期间学习的“unk”向量,您可以使用它。

  • 可训练选项 :

    您可以为 OOV 声明一个单独的嵌入向量,并使其可训练并保持其他嵌入固定。您可能必须为此重写嵌入查找的前向方法。您可以声明一个新的可训练 Variable并在前向传递中使用此向量作为 OOV 的嵌入,而不是进行查找。

    解决 OP 的评论:

    我不确定这三种不可训练的方法中的哪一种可能效果更好,我不确定是否有一些关于此的工作。但是方法 4) 应该工作得更好。

    对于可训练选项,您可以创建一个新的嵌入层,如下所示。
    class Embeddings_new(torch.nn.Module): 
    def __init__(self, dim, vocab):
    super().__init__()
    self.embedding = torch.nn.Embedding(vocab, dim)
    self.embedding.weight.requires_grad = False
    # vector for oov
    self.oov = torch.nn.Parameter(data=torch.rand(1,dim))
    self.oov_index = -1
    self.dim = dim

    def forward(self, arr):
    N = arr.shape[0]
    mask = (arr==self.oov_index).long()
    mask_ = mask.unsqueeze(dim=1).float()
    embed =(1-mask_)*self.embedding((1-mask)*arr) + mask_*(self.oov.expand((N,self.dim)))
    return embed

    用法:
    model = Embeddings_new(10,20000)    
    out = model.forward(torch.tensor([-1,-1, 100, 1, 0]))
    # dummy loss
    loss = torch.sum(a**2)
    loss.backward()

    关于neural-network - 使用预训练的词嵌入 - 如何为未知/OOV token 创建向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53316174/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com