
https://docs.pytorch.org/docs/stable/generated/torch.nn.Embedding.html#torch.nn.Embedding
nn.Embedding(num_embeddings, embedding_dim) 可以看成是一个查表词典:
num_embeddings 行,每一行是一个 embedding_dim 维的向量。max_norm 的作用:
给这个“词典”里的每一行向量设一个“最大长度”限制:
max_norm,就会被按比例缩小,使得它的范数刚好等于 max_norm。重要点:
假设我们手动构造一个 embedding 权重(方便算):
num_embeddings = 5 # 总共有 5 行
embedding_dim = 3 # 每行是 3 维向量
max_norm = 1.5
我们设定当前(某一次训练时刻)的权重矩阵为:
也就是:
[0.3367, 0.1288, 0.2345][0.2303, -1.1229, -0.1863][2.2082, -0.6380, 0.4617][0.2674, 0.5349, 0.8094][1.1103, -1.6898, -0.9890]对每一行向量 ,L2 范数定义为:
逐行计算:
(约等于 0.43,小于 1.5,不会被改动)
(小于 1.5,不会被改动)
这个超过了 max_norm=1.5,需要被缩小。
不改。
也超过了 1.5,需要缩小。
小结:
对每一个需要被裁剪的向量 :
这样就有:
数值约为:
再检查一下新范数:
新范数:
归一化之后,新的权重矩阵 变为:
新的各行范数:
max_norm 只会根据这些 index 去检查并缩放对应行。官方文档明确说明:当 max_norm 不为 None 时,Embedding.forward 会 原地修改 weight 。
这意味着:
embedding.weight 做可微操作,需要先 .clone() 一份再用,否则会和 autograd 的 in-place 规则冲突。在 nn.Embedding 里:
max_norm= “给每一行 embedding 向量设一个最大长度, 每次 forward 时,凡是被用到且长度超过这个上限的行,都会被按比例缩到这个长度,并且是直接改写权重矩阵的。”