GloVe 是一种无监督学习算法,用于获取单词的向量表示,它扩展了 Word2Vec 模型并在捕捉单词关系上更有效。GloVe 通过利用语料库的全局词-词共现统计数据进行训练,生成的向量不仅保留上下文关系,还展现了有趣的线性子结构。
代码地址:https://github.com/stanfordnlp/GloVe
1. GloVe 的设计思想与优势
GloVe 结合了 Word2Vec 的跳跃语法模型(skip-gram)的优势,并采用矩阵分解技术来充分利用语料库的全局共现信息。
Word2Vec 注重局部上下文(如滑动窗口内的词),但忽视了全局统计。
GloVe 则通过词-词共现矩阵,将全局统计与局部上下文结合起来,更好地捕捉词之间的类比关系。
例如,GloVe 可以自动学习到类似以下类比关系:
“国王 - 男人 + 女人 ≈ 女王”
2. 共现矩阵的构建与解读
GloVe 的核心是构建一个词-词共现矩阵,用于捕捉两个词在语料库中的共同出现频率:
共现矩阵:描述两个词在同一上下文中出现的频率。
滑动窗口法 (k-skip-n-gram):将窗口扩大至
k+n 个单词,用于捕捉不同句子间的关系。k + n k + n
示例:句子中的共现关系
假设有以下两句话:
There is a bird sitting on a wall.
The cat is sitting on the fence.
通过构建共现矩阵,可以提取如下词组:
(bird, sitting), (sitting, wall), (wall, cat), (cat, fence)
即使这些词不在同一句中,我们也可以通过滑动窗口模型捕捉其共现关系,扩大上下文范围。
3. 通过共现概率比率解释词语关系
GloVe 采用共现概率的比率来解释词与词之间的语义关系。假设我们研究单词 “ice” 和 “gas” 的共现概率比率,我们可以得到以下信息:
solid:与 “ice” 相关而与 “gas” 不相关,比例较大(8.9)。
water:同时与 “ice” 和 “gas” 相关,比例接近 1(1.36)。
fashion:与两者均无关,比例接近 1(0.96)。
这些概率比率通过向量差值编码为单词嵌入,从而揭示词之间的相似性和语义关系。
4. GloVe 的损失函数与实现细节
GloVe 采用加权最小二乘损失函数,以缩小预测向量点积与词共现次数对数之间的差距。损失函数如下:
Xij:单词
i 和i i j 的共现次数j j w~j:分别为中心词和上下文词的向量w i , ,b~j:偏置项b i :为低频和高频词赋予不同权重的函数f ( X i j )
当Wi和bi分别是单词的向量和单词的偏差i,wj的导和bj分别是单词的上下文词向量和偏置词j,Xij是单词的次数i发生在单词的上下文中j和f是一个加权函数,可为罕见和频繁的共生事件分配较低的权重。
5. GloVe、Word2Vec 与 LSA 的比较
特性 | GloVe | Word2Vec | LSA |
---|---|---|---|
统计信息 | 全局词-词共现 | 局部上下文 | 全局统计(矩阵分解) |
模型类型 | 矩阵分解 + 嵌入模型 | 神经网络嵌入模型 | 奇异值分解 (SVD) |
类比任务表现 | 优秀 | 良好 | 较差 |
计算复杂度 | 高 | 中 | 高 |
适用场景 | 大型语料库的全局分析 | 小型上下文预测 | 主题模型分析 |
6. GloVe 代码实现(使用 Gensim 加载模型)
环境:Anaconda3 + Jupyter Notebook
import shutil
import gensim
def getFileLineNums(filename):
with open(filename, 'r') as f:
return sum(1 for _ in f)
def prepend_line(infile, outfile, line):
"""在文件开头添加一行"""
with open(infile, 'r') as old, open(outfile, 'w') as new:
new.write(line + "\n")
shutil.copyfileobj(old, new)
def load_glove_model(filename):
num_lines = getFileLineNums(filename)
dims = 50 # 嵌入维度
gensim_file = 'glove_model.txt'
prepend_line(filename, gensim_file, f"{num_lines} {dims}")
model = gensim.models.KeyedVectors.load_word2vec_format(gensim_file, binary=False)
return model
if __name__ == '__main__':
glove_model = load_glove_model('GloVe-master/vectors.txt')
print(len(glove_model.vocab)) # 输出词汇表大小
words = ['to', 'one']
for word in words:
print(f"{word}:")
for similar_word, score in glove_model.most_similar(word, topn=10):
print(f"{similar_word}: {score}")
总结
GloVe 通过使用全局语料库的统计信息(如词-词共现计数),弥补了 Word2Vec 在捕捉全局语义上的不足。与 LSA 相比,GloVe 能更好地学习词之间的类比关系。
GloVe 适用于大型语料库的分析,尤其是需要全局信息支持的任务。
平方损失函数 比交叉熵更适合处理词-词共现数据。
中心词向量和上下文词向量在数学上等价,可以灵活使用。
GloVe 在自然语言处理中已被广泛应用,如情感分析、问答系统和推荐系统。
想要了解更多内容,可在小程序搜索🔍AI Pulse,获取更多最新内容。