基于GloVe的词向量生成算法详解
我将为您详细讲解GloVe(Global Vectors for Word Embeddings)算法,这是一种基于全局词频统计的词向量生成方法。
题目描述
GloVe是一种无监督学习算法,用于从语料库中学习词的分布式向量表示。与Word2Vec基于局部上下文窗口的方法不同,GloVe结合了全局词-词共现统计和局部上下文窗口的优点,通过矩阵分解和上下文窗口方法相结合来生成词向量。
算法核心思想
基本假设:词向量的点积应该等于共现概率的对数。具体来说,对于任意三个词i、j、k,以下关系应该成立:
v_i · v_j ≈ log(P(i|j))
其中P(i|j)是词j出现时词i出现的条件概率。
详细解题步骤
步骤1:构建共现矩阵
首先统计整个语料库中词与词在特定窗口大小内的共现频率。
具体过程:
- 定义滑动窗口大小(通常为5-10个词)
- 遍历整个语料库,对于每个中心词,记录其上下文窗口中出现的所有词
- 构建对称的共现矩阵X,其中X_{ij}表示词j在词i的上下文中出现的次数
- 可选:使用距离加权,给距离中心词更近的上下文词更高权重
示例:
对于句子"The cat sat on the mat",窗口大小为2:
- 中心词"sat"的上下文:["the", "cat", "on", "the"]
- 相应更新共现矩阵中的计数
步骤2:定义损失函数
GloVe的损失函数精心设计,用于学习词向量:
损失函数公式:
J = Σ_{i,j=1}^V f(X_{ij}) (w_i^T w̃_j + b_i + b̃_j - log X_{ij})^2
其中:
- w_i 是词i作为中心词时的向量
- w̃_j 是词j作为上下文词时的向量
- b_i, b̃_j 是偏置项
- f(X_{ij}) 是加权函数,用于平衡高频词和低频词的影响
步骤3:设计加权函数
加权函数f(X)的设计很关键,它需要满足:
- f(0) = 0,避免log(0)的情况
- 非递减的,确保高频词不会过度主导
- 相对较小的值给过高频词,防止过度拟合
常用形式:
f(x) = { (x/x_max)^α if x < x_max
{ 1 otherwise
其中x_max是截断阈值(通常为100),α是经验参数(通常为0.75)
步骤4:模型优化
使用随机梯度下降(SGD)或AdaGrad优化算法来最小化损失函数:
优化过程:
-
随机初始化所有词向量和偏置项
-
对每个非零的共现对(i,j):
- 计算当前预测值:w_i^T w̃_j + b_i + b̃_j
- 计算与目标值log(X_{ij})的差异
- 根据加权函数f(X_{ij})调整梯度
- 更新词向量和偏置项
-
重复直到收敛或达到最大迭代次数
步骤5:词向量组合
训练完成后,最终的词向量通常采用以下两种方式之一:
- 直接使用中心词向量W
- 使用W + W̃(中心词向量和上下文词向量之和),这通常能获得更好的性能
算法优势分析
-
利用全局统计信息:与Word2Vec只使用局部窗口不同,GloVe利用了整个语料库的统计信息
-
高效训练:只需要对非零共现对进行训练,计算效率高
-
可扩展性:适用于大规模语料库
-
良好的语言学特性:能够捕捉到词之间的线性关系,如:vec(king) - vec(man) + vec(woman) ≈ vec(queen)
实际应用考虑
超参数调优:
- 向量维度:通常50-300维
- 窗口大小:5-10
- 学习率:0.05-0.1
- 最小词频:过滤掉出现次数过少的词
实现细节:
- 需要对共现矩阵进行稀疏表示以节省内存
- 使用异步SGD可以加速训练过程
- 早停策略防止过拟合
GloVe算法通过巧妙结合全局矩阵分解和局部上下文窗口的优点,在多项自然语言处理任务中展现了优异的性能,成为词向量学习的重要基准方法。