【问题标题】:Embedding in PyTorch creates embedding with norm larger than max_norm在 PyTorch 中嵌入会创建范数大于 max_norm 的嵌入
【发布时间】:2021-02-23 18:29:38
【问题描述】:

假设我们有一个包含 10 个维数为 100 的向量的嵌入矩阵,我们强加max_norm=1

x = Embedding(num_embeddings=10, embedding_dim=100, max_norm=1)

原则上,每个嵌入的范数都应该小于或等于 1。但是,当我打印向量范数时,我得到的值远大于 1:

for w in x.weight: 
    print(torch.norm(w))

> tensor(11.1873, grad_fn=<CopyBackwards>)
> tensor(10.5264, grad_fn=<CopyBackwards>)
> tensor(9.6809, grad_fn=<CopyBackwards>)
> tensor(9.7507, grad_fn=<CopyBackwards>)
> tensor(10.7940, grad_fn=<CopyBackwards>)
> tensor(11.4134, grad_fn=<CopyBackwards>)
> tensor(9.7021, grad_fn=<CopyBackwards>)
> tensor(10.4027, grad_fn=<CopyBackwards>)
> tensor(10.1210, grad_fn=<CopyBackwards>)
> tensor(10.4552, grad_fn=<CopyBackwards>)

发生这种情况的任何具体原因以及如何解决?

【问题讨论】:

  • max_norm 限制了嵌入的范数,这里计算的是权重的范数,不一定是 1。如果你尝试嵌入一个输入,并计算结果嵌入,该范数将是 1
  • 如何获得嵌入的规范?

标签: python pytorch


【解决方案1】:

max_norm 参数限制了嵌入的范数,但不限制权重的范数。

为了更好地理解这一点,您可以运行以下示例:

from torch import LongTensor, norm
from torch.nn import Embedding

sentences = LongTensor([[1,2,4,5],[4,3,2,9]])
embedding = Embedding(num_embeddings=10, embedding_dim=100, max_norm=1)
for sentence in embedding(sentences):
    for word in sentence:
        print(norm(word))

这是通过将嵌入向量中的每个权重除以嵌入向量本身的范数,然后乘以max_norm 来实现的。在您的示例中max_norm=1,因此它相当于除以范数。

要回答您在评论中提出的问题,您可以使用embedding(sentences) 获得一个句子的嵌入(包含从您的字典中提取的单词索引的向量),规范使用上面的 2 个for 循环。

【讨论】:

    猜你喜欢
    • 2019-02-08
    • 2018-11-17
    • 2018-04-22
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多