Python/Gensim - syn0 和 syn0norm 是什么意思?

Python/Gensim - What is the meaning of syn0 and syn0norm?

我知道在gensims KeyedVectors-model中,可以通过属性[=12访问嵌入矩阵=].还有一个syn0norm,好像对我最近加载的glove模型不起作用。我想我之前也曾在某处看到过 syn1

我还没有找到这方面的文档字符串,我只是想知道这背后的逻辑是什么?

那么如果syn0是嵌入矩阵,那么syn0norm是什么?那么 syn1 会是什么?一般来说,syn 代表什么?

这些名称继承自最初的 Google word2vec.c 实现,gensim Word2Vec class 正是基于这些实现。 (我相信 syn0 只存在于最新版本中以实现向后兼容性。)

syn0 数组本质上包含原始词向量。从用于训练词向量的神经网络的角度来看,这些向量是 'projection layer' 可以将一个词的单热编码转换为正确维度的密集嵌入向量。

相似性操作倾向于在 单位规范化 版本的词向量上进行。也就是说,向量的大小都已缩放为 1.0。 (这使得余弦相似度计算更容易。) syn0norm 数组在第一次需要时填充了这些单位归一化向量。

syn0norm 将是空的,直到您执行需要它的操作(如 most_similar()),或者您明确执行 init_sims() 调用。如果您显式执行 init_sims(replace=True) 调用,您实际上会用单位范数向量就地破坏原始向量。这节省了存储每个单词的两个向量的内存,否则将需要。 (但是,一些词向量的使用可能仍然对不同大小的原始原始向量感兴趣,所以只有当你确定 most_similar() 余弦相似性操作是你所需要的时才这样做。)

syn1(或 syn1neg 在更常见的负采样训练情况下)属性,当它们存在于完整模型时(而不是普通 KeyedVectors 对象只有词向量)是模型神经网络的内部 'hidden' 权重导致输出节点。它们在模型训练期间需要,但不是训练后收集的典型词向量的一部分。

我相信 syn 前缀只是神经网络变量命名的约定,可能源自 'synapse'。