?如何来表示一个词的含义呢
如果我们遇到一个不认识的单词又想知道它的用法,最直接的一个方法就是查字典。根据字典中给出的关于单词的释义,我们就可以知道它的意思和具体的用法。一种理解单词意思的最普遍的语言方式是:
signifier <=> signified: 词的形式通常和词的意思具有很大的联系,这在存在大量象形字的汉字中尤其明显
signifier : n. (语言学)能指(语言的符号形式,区别于意义);记号;表示者
signified : n. 所指(语言符号的意义);意指
例如可以使用WordNet来进行词的查找,当我们输入 g o o d good good 时,它会给出相关的其他词
但是这种离散化的表示形式虽然可以很直接的被人使用,但是它也存在如下的缺点:
因为绝大多数基于规则和统计的NLP工作都将单词视为原子符号(atomic symbols)如果我们想将它们表示在向量空间中,最简单的一种方式就是使用one-hot向量。首先为要处理的文本建立一个较大的词汇表,每个单词在词汇表中都有它的索引,例如单词Man,Woman,King,Queen,Apple,Orange分别出现在词汇表的第5391,9853,4914,7157,456,6257的位置;然后我们用和词汇表维度相同的one-hot向量表示每一个词,在向量对应的位置上取值为1,其余部分取值为0,记为 O i n d e x O_{index} Oindex。
但是one-hot 这样的表示方式存在如下的缺点,所以通常很难在实际应用中使用
通常某一个词和某些其他的词总是共同出现,因此可以通过分析它周围的词的依赖来推断它的含义,这种方式成功广泛的应用在统计NLP模型中。
“You shall know a word by the company it keeps” (J. R. Firth 1957: 11)
我们也可以使用特征表征的方法来对每个单词进行编码,即用不同的特征向量来表示不同的单词,特征向量中每一维都是对于单词某一个特征的描述,相关性的量化范围是 [ − 1 , 1 ] [-1,1] [−1,1]。例如上述的Man,Woman,King,Queen,Apple,Orange就可以使用Gender、Royal、Age等特征组成的特征向量进行表示
其中特征向量的长度取决于你设定的特征的数量,当然特征数量越多表示的信息越全面,但同时也会增加计算量。如果我们将长度设定为300的话,每一个单词都可以使用 300 × 1 300 \times 1 300×1的特征向量唯一的表示,可记为 e i n d e x e_{index} eindex。
通过比较不同单词特征向量之间的差异,我们就可以在一定程度上衡量两者的相似性,极大的提高了在有限词汇量下模型的泛化能力。这样的表示方式也称为 w o r d e m b e d d i n g word \ embedding word embedding ,本质上就是将高维稀疏的向量降维成稠密的低维向量,完成一种高维到低维的映射。
学习word embedding的相关方法有:
其中最著名的便是Tomas Mikolov等人提出的word2vec。
Mikolov T , Chen K , Corrado G , et al. Efficient Estimation of Word Representations in Vector Space[J]. Computer Science, 2013. arXiv:1301.3781v3
Mikolov T, Sutskever I, Kai C, et al. Distributed representations of words and phrases and their compositionality [J]. Advances in Neural Information Processing Systems, 2013, 26:3111-3119. arXiv"1310.4546v1
而通过神经网络来学习word embedding的基本思路为:对于给定中心词 w t w_{t} wt,预测它的上下文是计算后验概率 p ( c o n t e x t ∣ w t ) p(context|w_{t}) p(context∣wt) ,损失函数定义为 J = 1 − p ( w − t ∣ w t ) J=1-p(w_{-t}|w_{t}) J=1−p(w−t∣wt),然后在大型语料库上进行训练来最小化损失函数,希望调整词向量到最佳。下面我们就来看一下word2vec是如何通过神经网络来得到一个好的词嵌入的。
在word2vec的提出论文中主要包括Skip-gram(SG)和Continuous Bag of Words(CBOW)两种算法模型,其中又包含了两种提升模型训练的方法Hierarchical softmax和Negative sampling。
SG示意图
Skip-gram 模型思想是根据给定的中心词(center word),并预测它的窗体大小范围内的上下文单词,训练目标是最大化概率分布。
如上所示,当选择的中心词为 b a n k i n g banking banking,窗口大小为 m m m时,SG通过计算 p ( w t − m ∣ w t ) p(w_{t-m}|w_{t}) p(wt−m∣wt)和 p ( w t + m ∣ w t ) p(w_{t+m}|w_{t}) p(wt+m∣wt)来预测 w t w_{t} wt的上下文单词。具体来说,当文本中的词汇表大小为 T T T时,对于每一个词 w t , t = 1 , 2 , . . . , T w_{t},t=1,2,...,T wt,t=1,2,...,T来预测窗口大小为 m m m的上下文单词即最大化 w i w_{i} wi的每一个上下文单词的预测概率
J ′ ( θ ) = ∏ t = 1 T ∏ − m ≤ j ≤ m T p ( w t + j ∣ w t ; θ ) J'(\theta)=\displaystyle \prod^{T}_{t=1}\displaystyle \prod^{T}_{-m\leq{j}\leq{m}}p(w_{t+j}|w_{t};\theta) J′(θ)=t=1∏T−m≤j≤m∏Tp(wt+j∣wt;θ)
其中 θ \theta θ即模型需要优化的参数列表。通常需要使用极大似然估计来进行优化,因此最后使用的大多是负对数的形式
J ( θ ) = − 1 T ∑ t = 1 T ∑ m ≤ j ≤ m l o g p ( w t + j ∣ w t ) J(\theta)=-{\frac{1}{T}}\displaystyle \sum^{T}_{t=1}\displaystyle \sum_{m\leq{j}\leq{m}}log\, p(w_{t+j}|w_{t}) J(θ)=−T1t=1∑Tm≤j≤m∑logp(wt+j∣wt)
note: loss function = cost function = objective function
对于概率分布计算的损失项来说,同时选择使用的是交叉熵损失(cross-entropy loss)。
对于 p ( w t + j ∣ w t ) p(w_{t+j}|w_{t}) p(wt+j∣wt)的计算,如果用 o o o表示输出词向量对应词的索引, c c c 表示中心词对应的词的索引, v c v_{c} vc表示中心词的词向量, u o u_{o} uo表示输出词的词向量,计算公式为:
p ( o ∣ c ) = e x p ( u o T v c ) ∑ w = 1 V e x p ( u w T v c ) p(o|c) = \displaystyle \frac{exp({u_{o}}^Tv_{c})}{\sum_{w=1}^V exp({u_{w}}^Tv_{c})} p(o∣c)=∑w=1Vexp(uwTvc)exp(uoTvc)
其中 u T v = u ⋅ v = ∑ i = 1 n u i v i u^Tv=u\cdot v = \displaystyle\sum_{i=1}^{n}u_{i}v_{i} uTv=u⋅v=i=1∑nuivi表示 u u u和 v v v之间的点乘(dot-product),如果两个词越相似,它们对应词向量的点乘的结果就越大。为了输出 [ 0 , 1 ] [0,1] [0,1]之间的概率值,最后需要使用softmax函数 p i = e u i ∑ j e u j p_{i}= \displaystyle \frac{e^{u_i}}{\sum_je^{u_j}} pi=∑jeujeui。
一个Skip-gram的完成示例过程如下所示
感谢雅兰同学的辛苦绘图~
首先以中心词 w t w_{t} wt 的one-hot表示作为输入,输入层到投影层之间有一个中心词的表示矩阵W,我们需要用向量乘以该矩阵从而选出矩阵中的对应列(column)即为中心词的表示形式。接下来,我们从投影层到输出层有第二个矩阵,存储着上下文单词的表示。这里会对中心词和上下文单词之间做点乘(dot product),对于点乘之后的向量结果有正有负,我们会对其进行softmax处理,将其转化为一种概率分布。
斯坦福自然语言处理_第二讲_附手打公式手绘图以及详细课程记录
在模型的训练中,我们实际要做的就是使用梯度下降最小化损失项来优化参数向量 θ \theta θ。
θ = [ v aardvark v a ⋮ v z e b r a u a a r d v a r k u a ⋮ u z e b r a ] ∈ R 2 d V \theta=\left[\begin{array}{c}{v_{\text {aardvark}}} \\ {v_{a}} \\ {\vdots} \\ {v_{z e b r a}} \\ {u_{a a r d v a r k}} \\ {u_{a}} \\ {\vdots} \\ {u_{z e b r a}}\end{array}\right] \in \mathbb{R}^{2 d V} θ=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡vaardvarkva⋮vzebrauaardvarkua⋮uzebra⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤∈R2dV
要最小化的损失函数为 J ′ ( θ ) = ∏ t = 1 T ∏ − m ≤ j ≤ m T p ( w t + j ∣ w t ; θ ) J'(\theta)=\displaystyle \prod^{T}_{t=1}\displaystyle \prod^{T}_{-m\leq{j}\leq{m}}p(w_{t+j}|w_{t};\theta) J′(θ)=t=1∏T−m≤j≤m∏Tp(wt+j∣wt;θ) ,训练的目标为 max J ′ ( θ ) = ∏ t = 1 T ∏ − m ≤ j ≤ m T p ( w t + j ∣ w t ; θ ) \max J'(\theta)=\displaystyle \prod^{T}_{t=1}\displaystyle \prod^{T}_{-m\leq{j}\leq{m}}p(w_{t+j}|w_{t};\theta) maxJ′(θ)=t=1∏T−m≤j≤m∏Tp(wt+j∣wt;θ)或是 min J ′ ( θ ) = − ∏ t = 1 T ∏ − m ≤ j ≤ m T p ( w t + j ∣ w t ; θ ) \min J'(\theta)= - \displaystyle \prod^{T}_{t=1}\displaystyle \prod^{T}_{-m\leq{j}\leq{m}}p(w_{t+j}|w_{t};\theta) minJ′(θ)=−t=1∏T−m≤j≤m∏Tp(wt+j∣wt;θ),具体梯度下降的过程为:
有关梯度下降的介绍可见:https://blog.csdn.net/Forlogen/article/details/88778770
word2vec原理(一) CBOW与Skip-Gram模型基础
word2vec原理(二) 基于Hierarchical Softmax的模型
word2vec原理(三) 基于Negative Sampling的模型
一文详解 Word2vec 之 Skip-Gram 模型(结构篇)
一文详解 Word2vec 之 Skip-Gram 模型(训练篇)
一文详解 Word2vec 之 Skip-Gram 模型(实现篇)
word2vec原理推导与代码分析