静态词向量近年其实没有什么工作,毕竟应该算是LLM的时代了。
大概阅读了一下Word2Vec和GloVe之类静态词向量的后续改进。
AWE (2020)
Attention Word Embedding,发表在COLING 2020(CCF-B)
Word2Vec的一个局限是,CBOW模型对于上下文会赋予相同的权重(虽然有动态窗口缩放,但是这里指的是窗口固定下来后),但是实际上不是每个词的价值都相同的,比如一些词与一些词可能更相关,和一些没什么用的词就没那么相关。
为了解决这个问题,这个工作的贡献大概如下:
- CBOW模型里面引入注意力。
- 原始的CBOW模型,有两个权重矩阵。这里改成了只有一个。
- 这里也做了fastText的子词支持。
NOTE感觉核心共现就是CBOW引入了注意力机制。
引入的注意力,简单来说,就是原先的CBOW使用的上下文向量
其中, 是词 的词向量, 是计算出来的上下文向量。
引入注意力机制后,这里改成加权和
这里的 是一个标量。
的计算,仿照了QKV的注意力机制。这里可能考虑到, 要表示出词和词之间的相关性和意义权重,更有意义。参考了Transformer的QKV,这里是这样算的
这里的 和 向量,从设计的角度说,并不是transfomer那样的 ,而是直接每个词向量都有一个 和 ——也就是说现在有3个矩阵Q、K、U,其中Q矩阵每行是每个词的 向量,K矩阵每行是每个词的 向量,U矩阵,每行是每个词的词向量表示。
此外,这样设计,也并不是普通attention那样直接softmax,我自己的理解,这个可能是考虑到softmax会导致不同上下文之间相互竞争,而有时候实际上我们并不在乎他们相互的竞争,不希望一个权重大了后其他的都一起变小。
NOTE但是这样可能会训练不稳定,需要复现时测一下softmax的效果。或者sigmoid gate,说不定效果更好。
我感觉这个做法确实也是引入了注意力,但是做得有点奇怪。为了得到更好的词向量,反而多训练了两个权重矩阵,而且既然权重是和词和词之间的相关性和意义有关,那 q、k 向量天生就和原本的词向量有一定关系,或者说,直接拿词向量来做 q、k 也未尝不可以,只是可能相当于加大了更新权重,可能训练会有点不稳定。
实验测试集用的是词相似度任务和下游NLP任务,训练语料用的是17GB的Wikipedia。
我在思考这个为什么测试集没有用最经典的google analogy,一个改进了CBOW和word2vec的论文不测word2vec的google analogy。
此外,这里实验也说了,实验结果来看,高频词相比其他词,受到的注意力更高。不过因为考虑到高频词和很多词的点积都是0,所以最终影响不大。
我感觉这里很有问题啊。
- 这些高频词没什么意义,注意力权重高,会形成common direction,可能会导致各向异性增加。
- 高频词attention高,那K/Q空间,能不能解释成,attention只是学习到了频率,而不是真正的意义?
X2Static(2021)
Obtaining Better Static Word Embeddings Using Contextual Embedding Models,发表在ACL 2021(CCF-A)
这个论文主要是从BERT里面来蒸馏出静态词向量。(上下文模型作为教师模型,主要是BERT,但是这个论文也支持其他的比如GPT)
关于BERT蒸馏静态词向量的相关工作,比较重要的是直接对指定窗口去跑BERT,12层跑出来最终挖空位置的那个静态词向量,作为这个词可能的一个词义向量, 拿去更新当前词表中目标词当前的词义向量,这个方法被称为ASE。但是X2Static分析它的缺点——这只是在平均BERT的输出,随着语料增大,效果会饱和,每个词向量会接近BERT输出的期望值,而不会随着语料越多,训练越好。换言之它并没有在语料增加时训练,只是在学习BERT的已有表达,这篇论文就尝试解决这个问题。
X2Static的主要创新点,是并不是直接取BERT输出的向量作为静态词向量,而是用BERT输出的向量来构造上下文向量,用这个来训练CBOW模型。
对句子 作为上下文时,并不是对句子中除了目标词直接加权求和,而是替换成上下文模型 的输出。假设上下文模型 对句子 中词 位置的输出为 ,这里把上下文写成:
用这个上下文向量 作为训练时输入,跑CBOW训练一个权重矩阵,作为静态词向量。
这里并没有去掉上下文词挖空,而是直接对整个句子跑BERT,这样子虽然只用跑一次BERT,但是上下文向量 实际上就和需要预测的词 无关了。应该是精度和速度的一点权衡。
考虑到静态词向量维度和BERT一样,这个无法在大多数情况下公平复现(比如要测500维,这里要先有一个500维度的BERT)
Bert2Vec (2021)
Improving Skip-Gram Embeddings Using BERT,发表在TASLP 2021,CCF-B
这也是把BERT蒸馏到静态词向量。
和X2Static不同的是关注SG而不是CBOW。
对于中心词和全部上下文窗口,正常跑SG是用中心词预测上下文,这里把句子扔进BERT去得到中心词位置的词向量,又因为BERT和静态词向量维度不一样,这里加了个投影矩阵 来映射,然后用映射后的去跑SG预测上下文,和X2Static差不多了。
这里加了注意力机制,对于中心词 ,先用 BERT 得到它在当前句子里的上下文化表示 。然后用 和窗口内每个上下文词的静态向量 做点积,得到相关性分数。分数经过 softmax 后变成注意力权重 。最后用这些权重对上下文词向量加权求和,得到一个综合上下文向量 。
感觉不像SG,更像一个加权的CBOW。
SemGlove(2022)
SemGloVe: Semantic Co-Occurrences for GloVe From BERT,发表在TASLP 2022,CCF-B。
这也是把BERT蒸馏到静态词向量。
提出了两种做法,一种是用BERT的注意力权重来做Glove的共现矩阵。另一种是用上下文去跑预测词ID,然后对于BERT预测出的所有词取概率最大的前 2*window 个作为新的上下文词,然后同样做共现矩阵。
具体来说,第一种做法里,glove原先是直接用 的权重,这里替换成了BERT的注意力权重。
但是考虑到BERT是有子词的,那就再合并成词级的而不是子词级,也就是说对被拆分的子词矩阵,按照子矩阵求个平均还原回去。最终每个注意力头,会得到一个word to word的权重矩阵:
将从词 到词 的注意力权重,也就是一个实数值,记为 。
为了去除语义无关的词,将 按降序排序,并选择前 个词作为 的上下文词 。
然后归一化一下,让最大原始注意力权重的变成1,其他除以这个最大值,语义上的距离函数
最后,对于整个语料,全局词—词共现计数矩阵 中的元素按照如下方式累积:
其实就是将原始的注意力权重归一化后,逐个层累加起来,用这个来做Glove。
第二种做法,就是把原始的BPE token输入进BERT去预测,然后预测出来的词ID,取前 2*window 的最可能的,作为原始目标词 的上下文词,
对应的 logits 也就是预测的分数记为:
然后把这些目标词和上下文词的词对,计入共现矩阵,距离也是归一化了
最后能得到一个共现矩阵,跑Glove。
不过这里似乎根本没有mask掉目标词,而且会不会出现大量的自身和自身的共现?
小数据复现了一下,的确能大幅度超过GloVe,但是google analogy上和GloVe一样,比不过SGNS。应该是因为GloVe和word2vec的区别。
text8, window=5, size=128, iter=20 对比如下:
| Model | Google Analogy Total | Semantic | Syntactic | SimLex999 |
|---|---|---|---|---|
| SG | 47.39% | 49.91% | 46.12% | 0.2933 |
| GloVe | 18.01% | 33.73% | 10.12% | 0.1492 |
| SemGloVe | 24.93% | 24.59% | 25.11% | 0.4093 |
Context-to-Vec(2022)
Using Context-to-Vector with Graph Retrofitting to Improve Word Embeddings,发表在ACL 2022,CCF-A。
这也是用BERT蒸馏静态词向量。
思路和2021年的X2Static很类似,主要区别感觉就是X2Static主要是CBOW,这里做了SG,然后加了些改进,比如X2Static要求BERT向量维度和静态词向量维度一样,这里不需要。
对于SG用中心词向量预测上下文,这里中心词直接把句子扔进BERT去跑对应中心词位置的带上下文的向量,然后跑SG来训练。
由于两个问题:
- BERT跑出来的是BERT空间的向量,不是静态词向量空间的向量,比如维度什么的可能不一样。
- BERT一次会得到所有位置的向量,如果只取中心词位置,就会忽略掉很多信息
因此这里想了个绑定上下文的注意力
也就是说,上下文向量,不像普通SG只看一个位置,会加上其他位置的表示。
相当于对原始BERT的中心词窗口内其他位置的输出向量,分别做同一个线性变换 后取平均值,然后再和原始中心词位置的BERT输出向量经过线性变换 后的结果做一个加权,最后输出一个新的向量作为上下文向量。
感觉这里宣称自己还是SG,也就是词对,但是实际上已经引入了窗口内的所有上下文,只是指定位置的权重大一点,还是更像CBOW。
不过引入的权重矩阵的确可以解决BERT维度和静态词向量维度不同问题。
同时,这里在训练后做了一个后处理。用同义词词典来做,根据原先的训练后的词向量同一组同义词之间不同的欧式距离来修正。
GloVe-PMIDP (2022)
Word representation using refined contexts
动机是上下文距离和位置对词向量有影响。
受这个启发,这篇文章提出了PMIDP,
它给不同位置的上下文一个权重
的时候, 随着距离的图像:

感觉就是换了个公式做距离衰减,和 没有本质区别。
然后这里还统计了每个词对出现不同位置的数目。这篇文章认为,应该奖励位置分布有规律的情况。两种分布被认为比较有价值:不同位置均匀分布,和高度集中在某个位置。
为了奖励这种情况,用一个公式来对位置加权:
怎么感觉有点扯淡。如果一个词有多个意思,它可能位置峰值会有两个,就会被这篇文章视为没规律,被惩罚。
也就是说,这里只假设了有效上下文要么是均匀分布,要么是单一位置分布。但是多义词完全可以多峰分布。
PMIDP就是把前面两个权重乘起来,然后做GloVe。
meta-word embedding (2022)
Learning Meta Word Embeddings by Unsupervised Weighted Concatenation of Source Embeddings,发表在IJCAI 2022,CCF-A
元嵌入就是把多个不同的词嵌入结果拼接起来,成为更好的嵌入。
之前的做法是,不同词嵌入加权拼接。比如计算词 的源级加权元嵌入
但是有时候,一个原始嵌入内部可能不是所有方向都一样好,这样加权只能将单个原始嵌入一起放大缩小。所以这的创新点是维度级加权。
维度级加权拼接方法:
这里, 是一个对角矩阵,其主对角线元素为:
要求对于所有 ,都有:
维度级加权拼接得到的元嵌入矩阵 可以写为:
CWM (2023)
https://aclanthology.org/2023.repl4nlp-1.14/,出处ACL 2023 workshop。
认为类比关系未必表现为平行四边形,表现为平行线即可。
提出了一个对比词模型(Contrastive Word Model, CWM),和word2vec宣称在质量差不多的情况下跑的更快。
用的归一化向量(只关心方向,不关心长度),所以推拉体现在向量夹角上。
对每个三元组 (中心词 c, 正样本 w, 负样本 w'),损失是:
是余弦相似度,希望它大也就是方向接近,后面同理是负样本的的余弦相似度,希望它小就是方向远离。损失要求两者之差至少达到 margin m,否则就产生梯度去调整。
论文里并没有测google analogy,评测重点是 BATS 上的 PCS/MSM。
简单复现后发现在text8上跑得比较好,analogy一度能超过word2vec,但是在大语料上不行,word2vec能跑75%以上的准确率,这个只能有60%。
LFW+EDWS (2024)
Learning Word Embedding with Better Distance Weighting and Window Size Scheduling,出处不是很靠谱,但是主题比较相关
动机是word2vec存在上下文向量和距离无关的问题。为了解决这个问题,这篇论文提出了两种方法,分别针对CBOW和SG。
一种是针对CBOW的LFW,Learnable Formulated Weights,也是给每个上下文向量增加一个和距离有关的归一化的权重
构造 ,是把一些参数拿去训练来构造的。
设计了这样好几个不同公式, 是距离,然后训练参数
为什么不直接对窗口训练节点,而是用写死的公式+训练参数?这样子表达能力受限。
可能是考虑到窗口大小是超参数,不方便训练?但是不足是还是写死的公式。
另一种是针对SG,从调整权重变成了调整采样概率。
在第 个 epoch 上,窗口大小 被定义为:
其中, 是总训练轮数, 是最大窗口大小。
这里感觉也是硬写的经验公式。
这篇论文实验没和任何除了原始word2vec以外的baseline对比。语料1GB,写的提升幅度有点夸张,CBOW从37.34%到52.68%,SG从42.70%到45.21%,但是没写超参数,可信度存疑。
New GloVes(2024)
A New Pair of GloVes,Stanford NLP 组对 GloVe 的一点更新,
在原始GloVes的基础上,换了新的数据,加了个低频词过滤,其他的没有变。
GSW-SGNS(2025)
Statistically Optimized SGNS Model: Enhancing Word Vector Representation with Global Semantic Weight,发表在CCL 2025
动机是SGNS存在的词频问题、固定上下文窗口和负采样数不能动态调整的问题。
这篇论文的贡献是:
- 提出用PMI来构造一个全局语义权重指标GSW,宣称可以量化一个词的全局语义重要性。
- 用这个GSW来调整负采样,同时引入了动态调整窗口大小和负采样数,语义密度更高的词扩大上下文窗口。
GSW其实就是全局归一化的PMI
然后把GSW扔给负采样
同时改了高频下采样。
动态窗口
负样本数量
感觉最有意思的动态窗口缩放,公式也只是随着epoch增加了窗口而已,加一点GSW调参。
论文说改负样本数目是为了增加困难负样本来提升训练质量,结果给出的措施居然是增加负样本数目,而没有针对中心词提升负样本抽取质量。
正文里面前后反复指出了SGNS很多不足,但是提出的方法居然解决不了。比如针对SGNS上下文不敏感的不足,提出的新方法GSW是一个和词有关的全局标量,实际上也根本没有看上下文
给了一堆超参数 来调参,但是不开源,也不说怎么调参。
实验里baseline是固定窗口 5、负样本数 10,但它的方法用了 ,负样本数最高到 20。这样对比不公平,不是同一个超参数下的超过baseline。
实验用的训练语料只有95MB的text8,逃避了更大语料,感觉在更大语料上未必更优。
复现后发现,这个GSW方案可能有一点问题。而且复现结果可以从理论上分析出来。
这是论文中宣称的最终数据

这里text8上训练,d=200, epoch=20,window=5,k=10,sample=1e-5。这篇论文引入的超参数是alpha=0.75, beta=0.5, gamma=0.75等。
然后论文宣称原始SGNS总准确率是40.01%,SGNS+GSW+AWN能达到48.48%。
我完全按照它推荐参数复现的:
| Semantic | Syntactic | Average(all) | |
|---|---|---|---|
| SGNS | 61.07 | 38.25 | 46.03 |
| SGNS+GSW | 37.55 | 32.81 | 34.42 |
| SGNS+GSW+AW | 17.95 | 26.80 | 23.78 |
| SGNS+GSW+AWN | 18.04 | 28.42 | 24.88 |
baseline的原始SGNS就比他们复现出来的高,而且用的是原始的word2vec代码。不知道为什么他们复现的baseline会这么低。(猜测这篇论文跑出来这样奇怪数据的原因,可能因为他们word2vec不是按照原版代码的,是按照pytorch重写的。)
猜测效果不佳原因:
一,GSW用PMI_avg直接min-max归一化,这个公式是扁的。
PMI对低频共现非常敏感。绝大部分词都接近0,词频位于中位数的词,这个GSW只有最大值的0.0247,才2.5%。这样的话,采样公式
这里 是非常小的。保留概率非常小。被丢的太多了。正文也承认了 要调大,说建议设 倍,但是即使按照他们推荐的 倍,也远远不够,实际测试要设成4倍才能正常。
而且动态窗口这个公式
大部分词根本到不了这里的 ,(要到 cbase 需 GSW ≥ 0.667,基本没有词到得了)实际上跑出来的平均窗口大小是接近 的,按照论文给的推荐超参数,是2.84,而不是他们希望达到的7。
二,GSW可能只是在语义和语法之中取折中。
即使处理完归一化被压扁的问题(clip95之类的),让密度和窗口恢复到论文里说的这个范围,比如avg_window=6,这样了也根本达不到宣称的全部任务提升。
可以测试到语义能持平或者稍微超过baseline,但是这时候语法也会下降。这个原因应该是因为窗口扩张会让语法下降,word2vec基本都是这样的。