GloVe原理与公式讲解

GloVe是2014年提出的一种词嵌入方法,结合了矩阵分解以及上下文窗口两种词嵌入方法。相较于Word2Vec而言,其论文写得很清晰。本文主要是整理了该论文中的内容。

对了宝贝儿们,卑微小李的公众号【野指针小李】已开通,期待与你一起探讨学术哟~摸摸大!

1 背景知识

GloVe是结合了基于矩阵分解的词嵌入技术以及基于局部窗口的词嵌入技术。

1.1 基于矩阵分解的词嵌入技术

基于矩阵分解的词嵌入技术的代表为LSA,在LSA中需要分解的矩阵是term-document矩阵,即每一行代表了词语,每一列代表了文档, x i j x_{ij} xij指的就是第 i i i个词语在第 j j j个文档中的重要性程度。

举个简单的SVD获得词向量的例子[2]:

假设语料库为:

  • I like deep learning.
  • I like NLP.
  • I enjoy flying.

代码为:

import numpy as np

words = ['I', 'like', 'enjoy', 'deep', 'learning', 'NLP', 'flying', '.']
X = np.array([[0, 2, 1, 0, 0, 0, 0, 0],
              [2, 0, 0, 1, 0, 1, 0, 0],
              [1, 0, 0, 0, 0, 0, 1, 0],
              [0, 1, 0, 0, 1, 0, 0, 0],
              [0, 0, 0, 1, 0, 0, 0, 1],
              [0, 1, 0, 0, 0, 0, 0, 1],
              [0, 0, 1, 0, 0, 0, 0, 1],
              [0, 0, 0, 0, 1, 1, 1, 0]])

U, s, Vh = np.linalg.svd(X, full_matrices=False)

import matplotlib.pyplot as plt

for i in range(len(words)):
    plt.scatter(U[i, 0], U[i, 1])
    plt.text(U[i, 0], U[i, 1], words[i])

plt.show()

获得的结果为:

SVD
从图中可以得出结论,Ilike词频最高;对于like而言,enjoyI是距离最近的点。

SVD的更多知识可以看[3],这里不再多赘述。

1.2 基于局部窗口的词嵌入技术

基于局部窗口的词嵌入技术的代表就是Word2Vec,其中有两个模型——Skip-gram和CBOW。

Skip-gram是通过中心词预测窗口中的上下文,CBOW是根据窗口中的上下文预测中心词。

详细的内容可以见:《Word2Vec原理与公式详细推导》[4],《Word2Vec之Hierarchical Softmax与Negative Sampling》[5],《TensorFlow学习笔记(3)——TensorFlow实现Word2Vec》[6]

2 GloVe

作者针对上面两类词嵌入方法,argue到[1]:

  1. 基于矩阵分解的方法可以有效利用统计信息,但是在词语类比(word analogies)任务上表现的相对较差。
  2. 基于局部滑动窗口的方法在词语类比任务上表现较好,但是没有能够利用全局信息。

针对上面的问题,作者们提出的GloVe就既使用了语料库的全局统计特性,也使用了局部上下文特征。于是引入了共现概率矩阵(Co-occurrence Probabilities Matrix)

2.1 共现概率矩阵

以下是论文中的例子:
共现概率矩阵
X i j X_{ij} Xij 为词语 j j j 出现在词语 i i i 的上下文中的次数 X i = ∑ k X i k X_i=\sum_kX_{ik} Xi=kXik,是词语 i i i 上下文中出现的词语总次数 P i j = P ( j ∣ i ) = X i j X i P_{ij}=P(j|i)=\frac{X_{ij}}{X_i} Pij=P(ji)=XiXij 为词语 j j j 出现在词语 i i i 的上下文中的概率

根据我们的常识会发现icesolid比起stramsolid更经常出现;icegas比起steamgas更不容易出现;icewater以及steamwater出现的次数差不多;而icefashion以及steamfashion基本不会共同出现。

于是可以绘制出如下的矩阵[7]:

相关性矩阵

2.1.1 共现概率矩阵构建

共现矩阵的构建就体现了作者提到的滑动窗口的思想,计算的是一个窗口中词语与中心词共现的次数。在原论文中,这个次数并非是出现就 X i j + 1 X_{ij}+1 Xij+1,而是采用了一个递减的函数,假设词语 j j j 与中心词 i i i 之间的距离为 d d d ,那么 X i j + 1 d X_{ij}+\frac{1}{d} Xij+d1。就是说词语 j j j 与词语 i i i 的距离 d = 1 d=1 d=1 i i i j j j 是相邻的词语),则 X i j + 1 X_{ij}+1 Xij+1 ;如果 d = 5 d=5 d=5 ,则 X i j + 1 5 X_{ij}+\frac{1}{5} Xij+51

In all cases we use a decreasing weighting function, so that word pairs that are d d d words apart contribute 1 / d 1/d 1/d to the total count.

作者这样做的是认为距离中心词 i i i 较远的词语,对 i i i 提供的信息就较少。

This is one way to account for the fact that very distant word pairs are expected to contain less relevant information about the words’ relationship to one another.

2.2 目标函数构建

作者为了捕获到词语之间共现概率的关系,于是假定了式(1)这个函数:
F ( w i , w j , w ~ k ) = P i k P j k (1) F(w_i, w_j, \tilde{w}_k)=\frac{P_{ik}}{P_{jk}} \tag{1} F(wi,wj,w~k)=PjkPik(1)

其中 w ∈ R d w \in \mathbb{R}^d wRd 是词向量; w ~ ∈ R d \tilde{w} \in \mathbb{R}^d w~Rd 是目标词上下文词语的词向量。这里的问题在于,根据语料库就可以确定 P i k P j k \frac{P_{ik}}{P_{jk}} PjkPik ,但是 F F F 这个函数就有无数种可能性,所以需要确定 F F F 这个函数。

根据上面2.1最下面的混淆矩阵,我们可以很轻易的得出 P i k P j k \frac{P_{ik}}{P_{jk}} PjkPik 是一种词语间相似度的表达,又由于词向量都是线性的,所以最简单的一种词向量之间相似度的表达方式就是两个向量做差。于是式(1)就可以变为:
F ( w i − w j , w ~ k ) = P i k P j k (2) F(w_i - w_j, \tilde{w}_k) = \frac{P_{ik}}{P_{jk}} \tag{2} F(wiwj,w~k)=PjkPik(2)

根据式(2),我们继续推导发现 P i k P j k \frac{P_{ik}}{P_{jk}} PjkPik 是个标量,而 w i − w j w_i - w_j wiwj w ~ k \tilde{w}_k w~k 是向量,为了让向量也变为标量,所以这里取内积。这里取内积的目的有二:不仅能够将向量变为标量,而且内积也是一种很简单的刻画向量相似度的方法。
F ( ( w i − w j ) T w ~ k ) = P i k P j k (3) F\left((w_i-w_j)^T\tilde{w}_k\right)=\frac{P_{ik}}{P_{jk}} \tag{3} F((wiwj)Tw~k)=PjkPik(3)

又因为 X X X是个对称矩阵,所以在做 w ↔ w ~ w \leftrightarrow \tilde{w} ww~ 以及 X ↔ X T X \leftrightarrow X^T XXT 转换时,等式(3)不应该发生变化,但是现在的公式是不满足的。其原因在于,对于左侧的式子而言,由于是向量的内积,那么能够满足 w T w ~ = w ~ T w w^T\tilde{w}=\tilde{w}^Tw wTw~=w~Tw;但是对于右侧而言,如下所示:
P i k P j k = X j X i k X i X j k ≠ P k i P k j = X k i X k j \frac{P_{ik}}{P_{jk}}=\frac{X_j X_{ik}}{X_{i}X_{jk}} \neq \frac{P_{ki}}{P_{kj}}=\frac{ X_{ki}}{X_{kj}} PjkPik=XiXjkXjXik=PkjPki=XkjXki

为了满足这个条件,我们要求函数 F F F 要满足同态特性(homomorphism)[8]:
F ( ( w i − w j ) T w ~ k ) = F ( w i T w ~ k ) F ( w j T w ~ k ) (4) F\left((w_i-w_j)^T\tilde{w}_k\right)=\frac{F(w_i^T\tilde{w}_k)}{F(w_j^T\tilde{w}_k)} \tag{4} F((wiwj)Tw~k)=F(wjTw~k)F(wiTw~k)(4)

接着我们发现左侧是差(可转换为 w i T w ~ k − w j T w ~ k w_i^T\tilde{w}_k - w_j^T\tilde{w}_k wiTw~kwjTw~k),右侧是商,所以通过指数函数将左右关联起来,即 F F F e x p {\rm exp} exp
e x p ( ( w i − w j ) T w ~ k ) = e x p ( w i T w ~ k ) e x p ( w j T w ~ k ) (5) {\rm exp}\left((w_i-w_j)^T\tilde{w}_k\right)=\frac{{\rm exp}(w_i^T\tilde{w}_k)}{{\rm exp}(w_j^T\tilde{w}_k)} \tag{5} exp((wiwj)Tw~k)=exp(wjTw~k)exp(wiTw~k)(5)

到此,等式左侧与右侧就相等起来了。接着我们开始构建目标函数。

因为
F ( w i T x ~ k ) = P i k = X i k X i F(w_i^T\tilde{x}_k)=P_{ik}=\frac{X_{ik}}{X_i} F(wiTx~k)=Pik=XiXik

所以可以将 e x p ( w i T w k ~ ) {\rm exp}(w_i^T\tilde{w_k}) exp(wiTwk~)转换为:
w i T w ~ k = l o g ( P i k ) = l o g ( X i k ) − l o g ( X i ) (6) w_i^T\tilde{w}_k={\rm log}(P_{ik})={\rm log}(X_{ik})-{\rm log}(X_i) \tag{6} wiTw~k=log(Pik)=log(Xik)log(Xi)(6)

由于 w i T w ~ k w_i^T\tilde{w}_k wiTw~k 是对称的, X i k X_{ik} Xik 也是对称的,但是 X i X_i Xi 不是对称的(因为独立于 k k k ),所以将公式(6)变为:
w i T w ~ k + b i = l o g ( X i k ) (7) w_i^T\tilde{w}_k + b_i = {\rm log}(X_{ik}) \tag{7} wiTw~k+bi=log(Xik)(7)

这里 b i b_i bi 替代 w i w_i wi。同时,为了保证 w ~ k \tilde{w}_k w~k 的对称性,添加一个关于 w ~ k \tilde{w}_k w~k 的偏置项 b ~ k \tilde{b}_k b~k,于是得到GloVe的公式:
w i T w ~ k + b i + b ~ k = l o g ( X i k ) (8) w_i^T\tilde{w}_k + b_i + \tilde{b}_k = {\rm log}(X_{ik}) \tag{8} wiTw~k+bi+b~k=log(Xik)(8)

但是由于 X i k = 0 X_{ik}=0 Xik=0 时, l o g ( X i k ) → − ∞ {\rm log}(X_{ik}) \rightarrow -\infty log(Xik) 是发散的,为了保证不改变 X X X 的稀疏性以及避免发散,所以将式(8)变为:
w i T w ~ k + b i + b ~ k = l o g ( 1 + X i k ) (9) w_i^T\tilde{w}_k + b_i + \tilde{b}_k = {\rm log}(1 + X_{ik}) \tag{9} wiTw~k+bi+b~k=log(1+Xik)(9)

由此可以得到目标函数:
J = 1 2 ∑ i , j = 1 V f ( X i j ) ( w i T w ~ j + b i + b ~ j − l o g ( 1 + X i j ) ) 2 (10) J = \frac{1}{2}\sum_{i, j=1}^V f(X_{ij})(w_i^T\tilde{w}_j + b_i + \tilde{b}_j -{\rm log}(1 + X_{ij}) )^2 \tag{10} J=21i,j=1Vf(Xij)(wiTw~j+bi+b~jlog(1+Xij))2(10)

这里 V V V 是语料库中词语数量的大小。这个目标函数实质上就是一种带权的均方误差。权重就是函数 f ( X i j ) f(X_{ij}) f(Xij)。这个函数需要满足以下3点:

  1. f ( 0 ) = 0 f(0)=0 f(0)=0
  2. f ( x ) f(x) f(x) 应该是个非递减函数;
  3. f ( x ) f(x) f(x) x x x 很大的时候变化的应该相对较小。

这样做的目的在于,既能够保证共现频率低的词语的权重较小,也不至于使得共现频率高的词语的权重过大(比如"the","and"这些非停用词)。由此构建出权重函数:
f ( x ) = { ( x x m a x ) α i f   x < x m a x 1 o t h e r w i s e (11) \begin{aligned} f(x)=\left\{ \begin{aligned} &(\frac{x}{x_{\rm max}})^\alpha && {\rm if}\ x < x_{\rm max} \\ &1 && {\rm otherwise} \end{aligned} \right. \tag{11} \end{aligned} f(x)=(xmaxx)α1if x<xmaxotherwise(11)

其图像如下图所示:
权重函数
论文中提到 x m a x x_{\rm max} xmax 对实验结果影响不大,所以取 x m a x = 100 x_{\rm max}=100 xmax=100。同时根据实验结果得出 α = 3 4 \alpha = \frac{3}{4} α=43

我们从这个公式中就可以得出,我们优化的目标是希望最小化语料库中每一对词的内积距离和两个词计数的对数

根据公式(10),我们可以计算出两个向量, W W W W ~ \tilde{W} W~,由于 X X X 是对称的,所以 W W W W ~ \tilde{W} W~ 的区别仅在于初始化不同。根据经验表明, W + W ~ W+\tilde{W} W+W~ 即可获得最终的词向量。

The model generates two sets of word vectors, W W W and W ~ \tilde{W} W~ . When X X X is symmetric, W W W and W ~ \tilde{W} W~ are equivalent and differ only as a result of their random initializations; the two sets of vectors should perform equivalently. On the other hand, there is evidence that for certain types of neural networks, training multiple instances of the network and then combining the results can help reduce overfitting and noise and generally improve results (Ciresan
et al., 2012). With this in mind, we choose to use the sum W + W ~ W +\tilde{W} W+W~ as our word vectors.

这里也就体现出了GloVe的全局性。Word2Vec模型试图一次捕获同时出现的一个窗口,GloVe试图捕获这些单词词频的总体统计数据。

3 参考

[1] Jeffrey Pennington, Richard Socher, Christopher D. Manning. Glove: Global Vectors for Word Representation[C]// Conference on Empirical Methods in Natural Language Processing. 2014.
[2] AI研习社-译站. 【官方】【中英】CS224n 斯坦福深度自然语言处理课 @雷锋字幕组[EB/OL]. (2019-01-22)[2021-07-06]. https://www.bilibili.com/video/BV1pt411h7aT?p=3
[3] 漫漫成长. 奇异值分解(SVD)[EB/OL]. (2017-10-12)[2021-07-06]. https://zhuanlan.zhihu.com/p/29846048
[4] 野指针小李. Word2Vec原理与公式详细推导[EB/OL]. (2021-04-28)[2021-07-06]. https://blog.csdn.net/qq_35357274/article/details/116240180
[5] 野指针小李. Word2Vec之Hierarchical Softmax与Negative Sampling[EB/OL]. (2021-05-03)[2021-07-06]. https://blog.csdn.net/qq_35357274/article/details/116381205
[6] 野指针小李. TensorFlow学习笔记(3)——TensorFlow实现Word2Vec[EB/OL]. (2021-06-18)[2021-07-06]. https://blog.csdn.net/qq_35357274/article/details/117967345
[7] 梦里寻梦. (十五)通俗易懂理解——Glove算法原理[EB/OL]. (2018-08-15)[2021-07-06]. https://zhuanlan.zhihu.com/p/42073620
[8] 范永勇. GloVe详解[EB/OL]. (2018-02-19)[2021-07-06]. http://www.fanyeong.com/2018/02/19/glove-in-detail/

<think>嗯,用户现在想了解NLP情感分析的原理。我需要先回顾一下相关的知识,确保自己理解正确。首先,情感分析属于自然语言处理的一个应用领域,主要是通过计算机技术来识别和提取文本中的主观情感信息,比如正面、负面或者中性情绪。 接下来,我得考虑用户的背景。用户可能对NLP有一定了解,但需要更具体的原理介绍。可能需要从基础步骤开始讲起,比如预处理、特征提取、模型构建等。同时,用户可能希望知道常用的算法和技术,比如词典方法、机器学习模型和深度学习方法。 然后,我需要检查之前的引用内容。引用[3]提到情感分析属于语义分析的一部分,而引用[4]讨论了特征提取的方法,比如词袋模型、TF-IDF和深度学习模型。这些可以作为支撑材料。引用[2]则提到情感分析的应用场景,可能需要在回答中结合实际例子,让用户更易理解。 用户的问题是关于原理,所以需要深入解释每个步骤的机制。例如,预处理阶段的分词、去除停用词,特征提取中的词向量表示,以及不同模型的运作方式。可能需要提到逻辑回归、SVM、RNN、CNN和Transformer模型,这些在情感分析中常用。 还要注意用户可能存在的疑问,比如为什么需要预处理,不同模型的优缺点是什么。例如,基于词典的方法简单但依赖词典质量,机器学习方法需要标注数据,而深度学习方法能自动提取特征但计算量大。这些对比可以帮助用户全面理解。 另外,用户可能对实际应用感兴趣,可以举一个简单的Python代码示例,比如使用TF-IDF和逻辑回归进行情感分析。这能直观展示流程,同时引用[4]中的方法。不过要确保代码正确,并解释关键步骤,比如特征提取和模型训练。 最后,生成的相关问题需要覆盖用户可能进一步探索的方向,如情感分析中的上下文处理、深度学习的应用、数据质量影响以及多语言情感分析的挑战。这些问题能引导用户深入学习,并展示回答的全面性。 总结起来,回答的结构应该是先定义情感分析,再分步骤讲解原理,结合技术方法和模型,提供代码示例,最后列出相关问题。需要保持逻辑清晰,用词准确,并适当引用提供的资料支持观点。</think>自然语言处理(NLP)情感分析的原理是通过计算模型对文本中表达的主观情感倾向进行识别和分类的技术。以下是其核心原理的逐步说明: --- ### 一、情感分析的基本流程 1. **文本预处理** - 分词:将句子切分为词元(如中文使用结巴分词,英文按空格分割) - 去除停用词:过滤无意义的词(例如“的”“是”等) - 标准化:统一大小写、处理缩写(如"don't"→"do not") - 词形还原:将词语还原为基本形式(如"running"→"run")[^4] 2. **特征提取** - 词袋模型(Bag of Words):统计词频生成向量表示 - TF-IDF:衡量词在文档中的重要程度 - 词向量(Word2Vec/GloVe):将词语映射到低维稠密向量空间[^4] - 上下文嵌入(BERT/GPT):基于Transformer的预训练模型捕捉语义关联 3. **情感分类模型** - **基于词典的方法**:匹配情感词典中的正向/负向词(如"happy"→正向,"sad"→负向)[^3] - **机器学习模型**: - 逻辑回归/SVM:使用TF-IDF特征进行分类 - 朴素贝叶斯:基于概率模型预测情感标签 - **深度学习模型**: - RNN/LSTM:处理序列数据的时序依赖 - CNN:捕捉局部短语的情感特征 - Transformer:通过自注意力机制建模长距离语义[^2] --- ### 二、关键数学模型 1. **TF-IDF公式**: $$ \text{TF-IDF}(t,d) = \text{TF}(t,d) \times \log\left(\frac{N}{\text{DF}(t)}\right) $$ 其中$t$为词,$d$为文档,$N$为总文档数,$\text{DF}(t)$为包含词$t$的文档数[^4] 2. **Softmax分类函数**(用于深度学习模型): $$ P(y_i|x) = \frac{e^{W_i x + b_i}}{\sum_{j=1}^k e^{W_j x + b_j}} $$ 其中$W$和$b$为模型参数,$k$为情感类别数 --- ### 三、Python实现示例(基于Scikit-learn) ```python from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.linear_model import LogisticRegression # 示例数据:评论及标签(0=负面,1=正面) texts = ["电影非常精彩", "剧情拖沓无聊", "演员演技出色"] labels = [1, 0, 1] # TF-IDF特征提取 vectorizer = TfidfVectorizer() X = vectorizer.fit_transform(texts) # 训练逻辑回归模型 model = LogisticRegression() model.fit(X, labels) # 预测新文本 test_text = ["特效震撼但剧情薄弱"] test_vec = vectorizer.transform(test_text) print(model.predict(test_vec)) # 输出预测结果 ``` --- ### 四、技术挑战优化方向 1. **上下文依赖**:如"这个餐厅便宜但难吃"包含转折语义 2. **讽刺检测**:需结合语境理解(如"真是好极了"可能表达负面)[^3] 3. **领域适配**:不同领域的情感词典需定制化(如医疗评论vs电子产品评论) 4. **多语言处理**:需解决语言特性和文化差异问题[^1] ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值