



自然语言处理(Natural Language Processing,NLP)是人工智能领域的一个重要分支,致力于使计算机能够理解、解释、处理和生成人类语言。自然语言处理的目标是使计算机能够像人类一样理解和使用自然语言,从而实现更智能、更自然的人机交互。
自然语言处理——通向智能交流的桥梁。自然语言处理是一门专注于开发和研究能够理解和生成人类语言的自动系统的科学和工程领域。人类语言作为一种既复杂又多样化的交流工具,是文化和知识传承的载体,是人与人之间深入沟通的桥梁。在科学家和工程师眼中,理解人类语言的复杂性至关重要,因为这不仅关系到计算机技术的发展,也涉及更广泛的社会、文化和人类学领域。
语言与计算机——儿童式学习的挑战。儿童是通过与多模式世界的互动及各种反馈来高效获取语言的。这种自然而然的学习方式展示了人类大脑高效的计算机能力。然而,尽管自然语言处理领域在过去几十年取得了显著的进展,但构建具有儿童式学习能力的学习机器仍然是一个重要但尚未解决的问题。在模仿儿童学习的过程中,科学家们面临着模型复杂性和数据处理等方面的挑战,但这也是推动自然语言处理技术不断发展的动力。
自然语言处理的多重应用——突破传统边界。自然语言处理的应用领域广泛,包括但不限于机器翻译、问答和信息检索、文本摘要和分析以及语音(或手语)转文本等。这些应用不仅是技术发展的体现,更关乎社会各个领域的进步。例如,机器翻译为不同国家和文化之间的交流创造了前所未有的便利,问答和信息检索则为人们获取知识提供了高效途径。然而,当前的自然语言处理工具主要适用于世界上大约7000种语言中的极少数几种(通常只有一种,最多可能达到100种),对于那些使用较少或边缘化的方言和口音,自然语言处理的性能则显著下降。此外,自然语言处理系统普遍存在文本编码的偏见问题,如种族、性别和宗教等,需要认真考虑并解决这些问题,以确保技术的公正和平等应用。
词袋模型(Bag of Words,BoW)是自然语言处理领域一种常用的文本建模技术。它将文本看作一个袋子,其中包含单词,但忽略了单词的顺序和结构。BoW的主要思想是将文本转化为一个向量,其中每个维度对应一个单词,该维度上的值表示该单词在文本中的出现次数。
自然语言处理旨在通过分析大量的文本数据为业务提供洞察。然而,文本数据通常杂乱无序,机器学习算法更喜欢结构化、固定长度的输入数据。词袋模型将不定长的文本转换为固定长度的向量,使文本数据可供机器学习使用。
在词袋模型中,每个文本被表示为一个向量,其中包含文本中所有单词的出现次数信息。这种向量化的表示方法使得文本可以被计算机程序理解和处理。然而,词袋模型也有其局限性,例如它忽略了单词的顺序和结构,无法捕捉到单词之间的语义关系。为了解决这些问题,后续的文本表示方法引入了更多的语境信息,如 N -gram和TF-IDF(词频-逆文档频率),以更好地表达文本的含义和关联性。
在实际应用中,词袋模型常被用于文本分类、信息检索和文本挖掘等任务。尽管它有一定的局限性,但在处理较简单的自然语言处理问题时仍然是一个有效且易于实现的工具。
下面通过一个示例来理解词袋模型的工作原理。
假设有如下两个句子:
句子1:Welcome to Great Learning, Now start learning。
句子2:Learning is a good practice。
首先,需要构建一个词汇表,其包括两个句子中的所有单词,如welcome、to、great、learning、now、start、is、a、good、practice。然后,将每个句子表示为一个向量,向量的每个维度对应一个单词在词汇表中出现的次数。例如,句子1的向量为[1, 1, 1, 2, 1, 1, 0, 0, 0, 0],句子2的向量为[0, 0, 0, 1, 0, 0, 1, 1, 1, 1]。这些向量表示每个句子中的单词频率信息。
使用sklearn的CountVectorizer函数获得词袋模型的结果,代码如下:
N -gram是由 N 个连续的单词组成的序列。例如,2-gram(bigram)由2个连续的单词组成,3-gram(trigram)由3个连续的单词组成,以此类推。引入 N -gram的概念可以更全面地捕捉文本中的信息。在传统的词袋模型中,每个单词都被视为独立的单位,忽略了单词之间的顺序和关系。然而, N -gram考虑了单词在文本中的相对位置,从而更准确地反映了单词之间的语义关联和上下文信息。
下面以一个简单的例子来说明 N -gram的作用。
假设有一个电影评论:“这部电影真是太棒了,演员的表演也非常出色!”
分析这个评论的情感倾向:如果使用2-gram(bigrams),就会将文本分成如下两个连续的词组:
1-gram:["这部","电影","真是","太棒了",",","演员","的","表演","也","非常","出色","!"]
2-gram:["这部 电影","电影 真是","真是 太棒了","太棒了,",",演员","演员 的","的 表演","表演 也","也 非常","非常 出色","出色!"]
通过2-gram可以看到,“太棒了”“演员的”“非常出色”等词组被捕捉到了。这些词组传达了更丰富的信息,帮助我们更好地理解评论者的情感。如果只使用传统的词袋模型,可能会失去这些有意义的词组,而无法准确判断评论的情感倾向。
通过使用 N -gram,不仅可以捕获相邻单词之间的关系,还能够识别出经常一起出现的词组,从而更好地理解文本的含义。例如,在分析电影评论时,2-gram可以识别出经常连用的形容词和名词,从而更准确地判断评论的情感倾向。因此, N -gram的引入丰富了文本特征的表示方式,使得文本分析更加准确和全面。
词频-逆文档频率(Term Frequency-Inverse Document Frequency,TF-IDF)是一种用于衡量单词在文档中重要性的常用方法,它结合了词频(TF)和逆文档频率(IDF)两个因素。TF指单词在文档中出现的频率,即单词在文档中出现的次数。IDF则是逆文档频率,它表示单词在整个文档集中的重要性。通过计算TF和IDF的乘积,得到单词的TF-IDF分数。具体而言,TF-IDF的计算公式如下:
其中, t 是待计算的单词(term)。 d 是指定的文档。 D 是整个文档集合。TF( t,d )表示单词 t 在文档 d 中的词频,即单词 t 在文档 d 中出现的次数。IDF( t,D )表示逆文档频率,计算方式通常为log( N / n t ),其中 N 是文档集中的文档总数, n t 是包含单词 t 的文档数。
通过这个公式,可以得到单词在文档中的重要性分数。如果某个单词在特定文档中频繁地出现(高TF),但在整个文档集中并不常见(低IDF),那么它的TF-IDF分数就会相对较高。这样的单词通常具有特定性,能够更好地区分该文档与其他文档。
TF-IDF的应用广泛,特别是在文本挖掘和信息检索领域,它可以识别文档中最具代表性和关键性的单词,从而提高文本分析的精度和效果。
使用sklearn的TfidfVectorizer获得词频-逆文档频率,代码如下:
虽然词袋模型非常容易理解且易实施,但是也有其局限性,主要表现在如下几个方面:
丢失单词的位置信息:词袋模型不考虑单词的位置信息,例如today is off和Is today off在该模型中具有相同的向量表示。
忽略单词语义:词袋模型无法捕捉单词之间的语义关系,例如soccer和football在该模型中可能具有不同的向量,尽管它们有相似的含义。
词汇范围问题:对于大型词汇表,词袋模型可能无法捕捉稀有但有意义的词汇,因为它们没有在模型中出现。
虽然词袋模型有其局限性,但是它仍然是文本分析中的一个有用工具,特别适用于文本分类和信息检索任务。在处理更复杂的自然语言处理问题时,通常需要更高级的文本表示方法,如词嵌入技术。
传统的自然语言处理方法使用离散的符号表示单词,如在字典中的索引。然而,这种表示方式忽略了单词之间的语义关系和语法结构。词向量的目标是通过连续的向量空间来更好地捕捉单词之间的语义相似性和关联性。这种对单词和文档进行表示的方法被认为是深度学习在复杂自然语言处理问题上的关键突破之一。
词嵌入是一类技术,其中,个别单词被表示为预定义向量空间中的实值向量。每个单词被映射到一个向量上,这些向量的值是以类似神经网络的方式学习的,因此该技术通常被归为深度学习领域。这种方法的关键在于使用稠密分布式来表示每个单词。每个单词由一个实值向量表示,通常是十几到几百个维度。这与稀疏单词(如独热编码)表示所需的数千或数百万维度形成了对比。
词嵌入的核心优势在于使用了低维度的密集向量表示,而不是传统的高维稀疏向量(如词袋模型BoW或TF-IDF)。在计算上,这种密集表示更高效,因为大多数神经网络工具包并不适用于处理超高维度的稀疏向量。更重要的是,密集向量能够捕捉单词之间的语义相似性,从而提高模型的泛化能力。如果两个单词在不同的上下文中经常出现,那么它们的词向量可能会相似,这使得模型能够学习到词义上的相近性,而不仅仅是词频统计信息。
考虑两个类似的句子:Have a good day和Have a great day。它们的意义几乎相同。如果构建一个详尽的词汇表 V ,那么它将包含 V ={Have, a, good, great, day}。
为了在计算机中表示这些单词,为 V 中的每个单词创建一个独热编码向量。这些独热编码向量的长度等于 V 的大小(等于5)。在这个表示中,每个向量除了对应词汇表中的单词索引处的元素为1外,其他元素都是0。Have=[1,0,0,0,0]; a=[0,1,0,0,0]; good=[0,0,1,0,0]; great=[0,0,0,1,0]; day=[0,0,0,0,1]。
然而,独热编码(One-hot Encoding)无法捕捉单词之间的语义关系,因为它仅用高维稀疏向量来表示单词,每个单词都被视为相互独立的个体。分布式表示(Distributed Representation)能够更好地解决这个问题,它将单词映射到一个低维度的密集向量空间,其中每个单词不再是独立的维度,而是由多个连续值组成的向量。这样,相似的单词在多维空间中会有接近的向量表示,从而反映它们的语义关系。例如,在这个向量空间中,good和great会比day和have更接近彼此,而不像独热编码那样完全独立。
从数学角度来看,理想情况下这些单词的向量之间的余弦相似度应接近1,即它们之间的夹角应接近0。通过这种方式可以更好地捕捉单词之间的语义关系,使得它们的表示方式更有意义。这种分布式表示方式是通过单词在不同上下文中的使用情况来学习的。这意味着类似用法的单词将具有相似的向量表示,可以自然地捕捉到它们的语义含义。这与传统的“词袋模型”形成了对比,后者通常会为不同的单词分配截然不同的表示,无论它们的上下文如何。这一方法背后蕴含着深刻的语言学理论,即由Zellig Harris提出的“分布假设”:在相似上下文中出现的单词往往具有相似的含义。
在自然语言处理中,词嵌入(Word Embedding)作为一种学习单词语义表示的方法,通过密集向量捕捉单词之间的语义相似性。相比于独热编码,词嵌入能够将具有相似含义的单词映射到相近的向量空间。最普遍的词嵌入模型包括Word2Vec和GloVe,它们分别基于上下文窗口预测和统计共现信息来学习单词的向量表示。
Word2Vec是一种由谷歌的Tomas Mikolov等人于2013年提出的词嵌入模型。它包含两种主要训练方法:连续词袋模型(Continuous Bag-of-Words,CBOW)和跳跃词(Skip-gram)模型。这两种方法的核心思想是通过神经网络模型来学习单词的向量表示,以便更好地捕捉单词之间的语义关系和上下文信息。跳跃词模型尝试根据给定的单词预测周围的上下文单词;而连续词袋模型则相反,其试图根据周围的上下文单词来预测目标单词。这两种方法都是在局部语境中学习单词,而语境是由一个可配置的窗口定义的。这个窗口大小的选择会影响生成的单词向量的相似性。较大的窗口倾向于捕捉更多主题和语义相似性,而较小的窗口更偏向捕捉功能性和句法相似性。这种上下文相关性的学习使得Word2Vec生成的词向量能够捕捉到单词之间的语义关系和语境信息。Word2Vec的重要性在于它为自然语言处理领域带来了重大突破,成为预训练词嵌入的事实标准。
与此同时,这项研究还涉及对学习到的向量进行深入分析,探索在单词表示上进行向量数学运算的可能性。例如,在向量空间中进行数学运算,从King的向量中减去“男性”并加上“女性”,得到的结果向量非常接近Queen。这种向量之间的关系描述了“king对queen就像man对woman”的类比关系,揭示了语言中的句法和语义规律。这一发现使得基于单词之间的向量偏移进行面向向量的推理成为可能,为自然语言处理研究提供了新的思路。
Word2Vec不仅是一种用于学习自然语言处理任务中的单词关联技术,它还能识别同义词和反义词,或者根据上下文提示一个单词来完成部分不完整的句子。该算法生成的数字列表(向量)代表特定单词,而向量之间的余弦相似度用作选择正确向量的数学函数,指示单词之间的语义相似度级别。Word2Vec的引入为语义分析和语境推断提供了精确的数学工具,极大地推动了自然语言处理的研究和应用。
Word2Vec的优势在于它可以处理大规模语料库,并且对稀有单词的表示效果也相当不错。这种方法的词向量可以用于各种自然语言处理任务,如文本分类、情感分析和机器翻译。通过深入挖掘单词之间的关系,Word2Vec给自然语言处理领域带来了更高的精度和更广泛的应用前景。
连续词袋模型的结构相对简单,由输入层、隐藏层和输出层组成。输入层用于表示上下文单词,隐藏层用于学习单词嵌入,输出层用于预测目标单词。输入层通常由一个独热编码向量表示,其中,向量中的每个元素对应词汇表中的特定单词。例如,如果词汇表包含10 000个单词,输入层将有10 000个元素。隐藏层是一个权重矩阵( V × D ),将独热向量乘以该矩阵,就得到一个嵌入向量(即对应单词的词向量)。隐藏层的神经元数量等于词向量的维度,通常远小于词汇表大小。输出层也是一个密集层,其中的每个神经元表示词汇表中的特定单词。输出层中的神经元数量与词汇表中单词数量相同。
(1)输入独热编码向量:CBOW模型的输入是上下文单词的独热编码向量 x (1) ,x (2) ,x (3) ,…, x ( n ) ,其中,每个 x ( n ) 是一个独热编码向量,表示上下文中的每个词。
(2)权重矩阵 W (1) 和 W (2) : W (1) 是从输入层到隐藏层的权重矩阵,用于将输入向量投影到隐藏层。 W (2) 是从隐藏层到输出层的权重矩阵。
(3)隐藏层 h 的计算:隐藏层表示输入向量通过 W (1) 映射后取平均值,计算公式为:
(4)输出层 y 的计算:输出层表示词汇表上的概率分布,通过softmax函数计算:
(5)目标函数:连续词袋模型的目标是最大化目标词 w t 给定上下文的条件概率:
其中,概率 P ( w t |context( w t ))使用softmax函数计算,以最大化真实目标词的概率。
(6)目标单词选择:目标单词是输出概率分布 y 中概率最高的单词,即:
连续词袋模型的训练过程是使用诸如交叉熵损失等损失函数最小化预测概率分布 y 和实际目标单词之间的差异,这个过程对训练数据集中的每个句子重复进行,最终得到学习到的嵌入向量。目标函数是模型学习过程中追求的方向,而arg max( y )是实际应用时用来做最终决策的过程。两者在不同的阶段起着不同的作用。
连续词袋模型的一个关键优势在于高效。在训练过程中,连续词袋模型只需要基于一组上下文单词来预测目标单词,这使得它相比跳跃词模型的训练速度更快,并且能够在更大规模的数据集上高效训练。此外,由于连续词袋模型通过平均上下文词向量来预测中心词,它在大规模语料或对高频词的学习上表现尤为高效;而跳跃词模型通过中心词预测多个上下文单词,在小语料或低频词场景下通常能学习到更细致的表示,但训练成本更高。连续词袋模型由于其快速收敛和较低的计算成本,更适用于处理大规模语料库,特别是在需要高效训练的应用场景下,如搜索引擎、推荐系统和文本分类任务。
总而言之,连续词袋模型是一个用于训练词嵌入的强大工具,简单性和高效性使其成为自然语言处理任务(如文本分类和语言翻译)中的常用选择。
连续词袋模型使用单一的上下文词来预测目标,但跳跃词模型则相反,如图1-1所示。
图1-1 CBOW模型和Skip-gram模型的结构对比
在跳跃词模型中,将目标词作为输入,模型输出 C 个概率分布,其中, C 代表上下文的位置,每个概率分布有 V 个概率,对应词汇表中的每个词。这意味着跳跃词模型在每个上下文位置生成了多个概率分布,每个分布代表一个词。
连续词袋模型和跳跃词模型各有优势。跳跃词模型在少量数据的情况下表现良好,特别适合表示稀有单词;而连续词袋模型更快,对于频繁出现的单词提供更好的表示。这两种模型的选择取决于具体的应用和数据集。Word2Vec的引入为语义分析和上下文推断提供了强有力的工具,推动了自然语言处理领域的研究和应用。
对于每个位置 t= 1 , 2,… ,T ,在固定大小为 m 的窗口内预测上下文词汇,给定中心词 w t 的数据似然性:
其中, θ 是所有待优化的变量,目标函数 J(θ) 是(平均)负对数似然:
为了实现目标函数的最小化,即最大化预测准确性,需要计算条件概率
。
为此,每个单词 w 都需要准备两个向量:
当
w
是中心词(center word,
c
)时,使用向量
v
w
。
当
w
是上下文词(outside word,
o
)时,使用向量
u
w
。
对于给定的中心词 c 和上下文词 o ,概率 P ( o|c )的计算公式为:
解释:指数运算使点积的结果转换为正数,表示上下文词
u
o
和中心词
v
c
之间的相似度。点积比较
u
o
和
v
c
的在高维空间中的相似性(
)。分母部分对所有词汇中可能的上下文词进行归一化,从而将结果映射为一个概率分布。式(1-8)是一个softmax函数示例,其范围为ℝ
n
→(0,1)
n
。softmax函数的定义如下:
softmax函数将任意值 x i 映射为概率分布 p i 。
对跳跃词模型的损失函数进行梯度下降优化的过程:最大化概率或最小化负对数似然,即式(1-6)就是对条件概率log P ( o|c )求偏导数,由于 v c 直接影响 P ( o|c ),对 v c 求导数,就可以确定如何更新中心词的向量,从而提高模型的性能。偏导数给出了损失函数相对于参数的梯度,这正是梯度下降优化的核心步骤。将式(1-8)代入式(1-7):
1)偏导数拆分
公式(1-10)开始于对条件概率的对数的求导:
使用对数的性质
,将式(1-10)拆分为两部分:
2)对数和指数相消
在式(1-11)的第一个项中,因对数和指数相互抵消:
3)对式(1-12)第二项进行求导
利用链式法则:
应用在式(1-12)第二项:
4)对式(1-14)的指数和的导数求解
接下来对求和部分
进行求导。
对求和的导数,可以将导数作用到每一项上:
指数函数的导数为其自身乘以内部的导数,因此:
将它代入式(1-15)的求和中:
5)合并结果代入式(1-14)
式(1-18)可以进一步简化为:
6)解释简化
式(1-19)左边的项
实际上就是softmax函数的输出,即预测概率
P
(
x
|
c
),导数结果可以被理解为上下文词的向量
u
x
以概率
P
(
x
|
c
)加权的和。
7)最终结果
将式(1-19)代入式(1-12)就得到了最终结果。
公式(1-20)右侧最终得到的观察值减去期望值
是一个期望值,后者对所有上下文向量进行加权平均,权重为它们的概率。
跳跃词模型的Python算法实现的代码如下:
在跳跃词模型的论文中,Mikolov.T等人还提到了负采样损失,这是替代朴素softmax损失的一种方法,以避免softmax分母的昂贵计算量。假设从词汇中抽取
k
个负样本(单词)。为了简化表示,将它们称为
w
1
,
w
2
,
w
3
…
w
k
,并将它们的外部向量称为
,
,
…
。
一般来说,这 k 个负样本是独立有放回抽样得到的,允许同一个词被多次选中。换句话说,如果 i ≠ j ,则 w i ≠ w j ,其中 i ∈{1,…, k }, j ∈{ w 1 ,…, w k }。对于中心词 c 和外部词 o ,负采样损失函数定义如下:
对于样本 w 1 , w 2 , w 3 … w k ,其中 σ ( )是sigmoid函数。
GloVe(Global Vectors for Word Representation)是一种备受欢迎的词嵌入技术,由斯坦福大学的研究团队于2014年提出。GloVe的独特性在于其通过分析整个语料库中单词的共现关系来建模,而不是像Word2Vec那样依赖局部上下文来学习单词的向量表示。在GloVe的训练过程中,它基于整个语料库的统计信息进行建模,而不仅局限于局部上下文窗口。这种方法将单词映射到一个空间中,在这个空间里,语义相似的单词之间的距离更近。GloVe采用了无监督学习算法,将单词表示为向量,并且根据单词的共现信息(单词的共现信息指在语料库中某个单词与其他单词一同出现的频率和模式。这种信息反映了单词之间的语义关系,即当两个单词经常一起出现时,它们的含义通常是相关的或有一定的联系)对语料库进行训练。作为斯坦福大学的开源项目,GloVe的发布为自然语言处理带来了重要的突破。
全局统计信息的利用:GloVe模型通过全局词-词共现计数,有效地捕捉到了词汇之间的关系。相比之下,传统方法(如LSA、HAL)同样基于全局共现矩阵,但缺少对不同频率共现对的加权机制。
权重最小二乘法:GloVe采用了最小二乘法,通过最小化词向量点积与其共现次数对数值之间的加权平方误差,将全局共现信息整合到了词向量的训练中。
在自然语言处理中,共现矩阵是一种用于捕捉单词之间关系的重要工具。它不仅能够提供直观的统计信息,还为后续计算词关联性和构建词向量奠定了基础。构建共现矩阵的过程包括数据收集和条件概率的计算,分别用于统计词语的共现频次以及衡量其在上下文中的相关性。
数据收集:通过单次遍历整个语料库,就可以收集到词-词共现的统计数据。虽然对于大规模语料库而言这一过程可能计算量较大,但是一次性的前期成本。
条件概率:通过共现矩阵,可以计算出任意两个词之间的条件概率,从而反映它们在上下文中出现的关联程度。
共现矩阵的术语如下:
X
:词-词共现矩阵。
X
ij
:词
i
的上下文中词
j
出现的次数。
:词
i
的上下文中出现任意词
k
的次数。
:词
j
在词
i
的上下文中出现的概率。
与传统的跳跃词模型使用softmax计算概率不同,GloVe使用最小二乘法目标函数,从而避免了在整个词汇表上进行高昂的计算。这一变化不仅提高了计算效率,也加速了训练过程。
在跳跃词模型中,使用softmax计算在给定中心词 i 的情况下,上下文中词 j 出现的概率:
j 概率的计算使得模型能够有效学习单词之间的语义关系。虽然训练过程是以在线和随机方式进行的,即参数更新是基于每个训练实例逐步进行的,但是模型仍然通过累积的方式计算全局交叉熵损失。这个损失函数为模型在整个语料库上的表现,从而确保即便在局部随机更新的情况下,模型的整体优化目标也能够得到有效实现。
为了评估跳跃词模型的性能,使用全局交叉熵损失函数 J 来衡量模型在预测上下文单词时的准确性。该损失函数通过累积所有中心词和对应上下文词的预测概率来评估模型的表现:
式(1-23)是式(1-7)的简化版本。其中, Q ij 表示中心词 i 预测上下文词 j 的概率。最小化该损失可以让模型更好地学习单词之间的语义关系,在训练过程中不断优化参数,从而提高预测的准确性。
由于语料库中相同的词 i 和 j 可能会多次出现,因此将相同的 i 和 j 值首先进行分组更高效。通过将式(1-23)中的双重求和形式改写为在整个词汇表范围内进行求和,可以更清楚地表达每个词对的贡献。这里引入前面提到的关键概念共现矩阵 X ,其中 X ij 表示词 i 和词 j 共现的次数或频率。
i
和
j
的范围:
i
和
j
不再是仅限于特定语境中的词对,而是整个词汇表中所有可能的词对。
X
ij
:反映词对(
i
,
j
)在语料库中的共现频率,代替了之前的逐词遍历的方式。
Q
ij
:依然是中心词
i
预测上下文词
j
的概率,保持不变。
在式(1-24)中,共现频率的值由共现矩阵 X 给出。交叉熵损失的一个显著缺点是它要求分布得到适当的归一化,这涉及对整个词汇表进行计算量很大的总和运算。相反,可以使用最小二乘目标函数来替代交叉熵损失,其中舍弃了 P 和 Q 中的归一化因子。
在式(1-25)中,相应值都加上了hat符号,表示未经归一化处理的值,也就是原始的计算结果或估计值,而不是标准的概率分布。
:前面已经解释了
P
的定义。
X
和
P
本质上是频数和归一化分布的关系,可以理解为
X
是未归一化的
P
,
表示未经归一化的值。
只保留了原先定义式(1-22)的分子部分:
。
现在,式(1-25)中的
和
都是未经归一化的分布。这种表述引入了一个新问题:
X
ij
经常取非常大的值(在现实语料库中,一些常见词(如the、and)和高频词会与很多其他单词频繁共现,这会导致
X
ij
的值变得非常大),从而使优化变得困难。为了应对
X
ij
变得很大的问题,改进的方法是对
和
取对数,然后计算平方误差:
进一步展开为:
换句话说,由于共现矩阵 X 中的数值通常较大,这会导致优化过程中数值不稳定,进而影响目标函数的平稳性和模型的收敛速度。为了解决这个问题,GloVe通过最小化对数平方误差来降低对大数值的影响,使得优化过程更加稳定。对共现频率取对数后,较大的数值会被压缩,减少它们对整体损失的放大作用,从而有助于优化的平稳性和收敛性。此外,为了更好地捕捉不同上下文中的语义信息,GloVe并不总是直接使用共现频率 X ij 作为权重,因为固定的 X ij 并不一定能在所有情况下达到最佳效果。相反,可以引入一个权重函数 f ( X ij ),用于调整权重大小。这个函数根据具体上下文中词对的特性调整其影响力,使得模型在学习词向量时能够灵活地适应不同的语境特征,从而提高了模型的灵活性和对多样化语境的适应性。
最后,原公式(1-26)的顺序是
,但在优化问题中,通常写成预测值减去实际值的形式,即(预测-实际),这样的顺序使得梯度更新的方向更符合优化目标的逻辑,让模型训练过程更加顺畅:
下面使用Python的基本库(如NumPy)来简单地实现GloVe算法。
GloVe的主要思想是通过最小化单词向量点积与其共现次数对数值之间的差异来学习单词之间的关系。它的训练目标是寻找一个低维度的向量,使词汇表中的单词在这个低维空间中能够准确地反映它们的语义关系。GloVe模型在词类比(Word Analogy)任务(用来评估词嵌入模型是否能够识别并正确预测词汇间语义关系的测试方法)中的卓越表现,以及在多个词汇相似性任务中的优越性,彰显了它作为词向量学习方法的卓越性能。通过充分利用全局统计信息,GloVe不仅在速度上具备优势,而且在任何速度下都能够获得最佳的结果,使其成为自然语言处理任务中的重要工具。
前面详细解释了Word2Vec和GloVe这两种词嵌入方法的基本原理和应用。为了更清晰地理解这两种方法的核心差异和各自的优势,下面将从训练过程、损失函数、学习方法和计算时间等多个维度进行对比总结。
在训练方式上,Word2Vec是一种基于预测的模型,其采用两种训练方法,即Skip-gram和CBOW。其中,Skip-gram方法通过给定中心词来预测其上下文单词,适用于学习稀有词;而CBOW方法通过给定上下文词来预测中心词,在大规模数据集上通常表现更好。Word2Vec通过优化可训练的嵌入权重,将单词映射到一个低维度的向量空间。与Word2Vec不同,GloVe是基于矩阵分解的模型。它构建了一个共现矩阵,然后对该矩阵进行因子分解,将其压缩到较低维度,使得每一行代表一个单词向量。
在损失函数方面,Word2Vec的损失函数与模型的预测直接相关。Skip-gram采用负采样(Negative Sampling)或层次softmax(Hierarchical Softmax)来优化计算,使得计算复杂度降低,而连续词袋模型在使用完整的softmax时采用交叉熵损失,也可以像跳跃词模型一样结合负采样或层次softmax来加速计算上下文词对目标词的概率。相比之下,GloVe通过最小化重构损失来优化单词向量,这种方法强调让词向量之间的点积反映单词的共现概率。
在学习方式上,Word2Vec采用两层神经网络,输入层为one-hot编码的中心词,隐藏层存储可训练的词向量(嵌入层),输出层用于预测上下文词(Skip-gram)或目标词(CBOW)。通过梯度下降训练,最终学习到的隐藏层权重即为单词的词向量。而GloVe直接基于共现矩阵来学习单词之间的线性关系。它的目标是让向量之间的点积 w i ⋅ w j 反映log( X ij ),这样可以更好地保留全局的统计信息。
在计算时间方面,Word2Vec采用负采样或层次softmax来优化计算效率。负采样通过仅更新部分负样本(而非整个词汇表),大幅降低计算成本;层次softmax通过构建霍夫曼树,使计算复杂度从 O ( V )降至 O (log V ),其中, V 是词汇表大小。因此,Word2Vec在大规模语料上可以更高效地训练。而GloVe需要构建整个共现矩阵并进行优化,虽然可以使用矩阵分解(如SVD变种)进行加速,但是在存储和计算上仍然可能带来较大开销,因此通常适用于离线计算场景。
在向量空间特性上,由于Word2Vec在训练时依赖负采样,其生成的单词向量可能会形成一定的聚类结构并受采样策略的影响。而GloVe由于直接基于全局统计信息进行优化,得到的单词向量通常在空间中更加均匀分布,因此能够更好地捕捉语义关系。
总结来说,Word2Vec是一种基于局部上下文预测的方法,适用于流式训练,而GloVe则是基于全局共现矩阵的方法,更适合离线计算。两者在不同的场景下各具优势,具体选择取决于数据规模、计算资源和应用需求。
在自然语言处理中,对生成的词向量进行评估至关重要,因为它直接影响下游任务的性能和模型的可解释性。词向量评估通常分为两类:内在评估(Intrinsic Evaluation)和外在评估(Extrinsic Evaluation),分别用于衡量词向量在语义和语法层面的表现,以及它们在自然语言处理任务中的实际效果。
内在评估的目的是评估由Word2Vec或GloVe等嵌入技术生成的词向量的质量。这种评估通常在特定的中间子任务中进行,如类比完成。这些子任务设计简单且计算高效,可以快速提供关于词向量系统性能的反馈。内在评估的目标是通过具体的评估子任务,以量化指标的形式反映词向量的表现。
构建高级问答系统的关键步骤之一是将单词转换为词向量,并将其作为复杂机器学习系统的输入。为了获得最优的词向量表示,需要调整Word2Vec子系统中的诸多超参数,如词向量的维度。然而,在实际操作中,对Word2Vec子系统的任何参数调整后重新训练整个系统在工程上并不可行。深度神经网络通常包含数百万参数,训练非常耗时。在这种背景下,设计一种简单的内在评估技术显得尤为重要。这种技术需要能够快速评估词到词向量子系统的质量,并且其评估结果应与最终任务的性能具有正向相关性。
在内在评估中,一种常见的方法是通过完成词向量类比来评估词向量的性能。在词向量类比中,给定一个不完整的类比形式“a : b : : c : ?”如"man : woman : : king : ?",这种类比关系旨在考察词向量之间的语义关联。词向量类比反映了单词之间的语义关系,并且这些关系通常以余弦相似度的形式进行量化。
在内在评估系统中,目标是寻找一个词向量 x d ,它使得类比关系 x b - x a = x d - x c 成立,其中, x a , x b ,x c 分别表示单词"a" "b" "c"的词向量表示。通过最大化归一化点积可以确保词向量之间的关系尽可能接近理想的类比关系,即
x
b
-
x
a
+
x
c
:这一部分表示类比关系的向量计算。例如,在“man : woman :: king : ?”中,
x
b
是woman的向量,
x
a
是man的向量,
x
c
是king的向量。通过向量运算
x
b
-
x
a
+
x
c
来构建一个新向量,这个向量应该接近queen的向量。
点积和归一化:公式中的分子(
x
b
-
x
a
+
x
c
)
T
x
i
是新构建向量与词汇表中其他词向量
x
i
的点积,用于衡量新向量与其他词的相似度。
归一化:分母‖
x
b
-
x
a
+
x
c
‖是新向量的模(L2范数),用于归一化点积的结果,防止向量的长度影响相似度的计算。
arg max:寻找使得点积值最大的词
d
。也就是说,在所有词向量中找到与‖
x
b
-
x
a
+
x
c
‖方向一致的那个词,即最符合类比关系的词。
通过式(1-29),模型能够找出最符合类比关系的词。如果找到的词与预期的词(如queen)一致,就表明词向量模型在捕捉语义关系上表现良好。使用余弦相似度(通过点积归一化计算)来量化词向量之间的相似性,使类比关系能够精确地以几何方式反映在向量空间中,这样就能够确定满足这种类比关系的最佳词向量。需要注意的是,在使用类似词向量类比的内在评估技术时,必须谨慎选择类比关系,并考虑预训练语料库的特性,以确保评估结果的准确性和可靠性。
词嵌入的性能受到多种因素的影响。首先,模型选择起关键作用。不同的词嵌入方法基于不同的属性(如共现次数、奇异向量等)将单词嵌入为向量,其性能与所选模型密切相关。其次,语料库的规模对性能提升有显著影响。较大的语料库提供了更多的样本,使嵌入技术通过更多的示例获得丰富的经验。例如,在类比完成任务中,如果测试单词未在训练语料库中出现,则结果可能会不准确。最后,词向量的维度也会影响性能。极低维度的词向量无法有效捕捉语料库中不同单词的多重含义,这属于高偏差问题,即模型复杂度过低。例如,对于单词king、queen、man和woman,直观上需要使用代表性别和领导力的两个维度将它们编码成词向量。如果维度进一步降低,将无法体现这些单词之间的语义差异。
另一种用于评估词向量质量的内在方法是相关性评估,它通过人工评估单词相似度与词向量之间的余弦相似度之间的关系来衡量词向量对语义相似性的捕捉能力。如果词向量能够很好地匹配人工标注的单词相似度评分,则说明该词向量模型较准确地学习到了单词之间的语义关系。这种方法可以量化词向量与人工评估之间的联系,提供更具直观性的评估结果。这种评估要求人类评估两个单词之间的相似度,通常在一个固定范围内(如0~10),然后将人工评估的相似度与相应词向量的余弦相似度进行比较。这种比较通常在包含人工评估数据的不同数据集进行。
在内在评估中,需要综合考虑诸如词向量的维度、语料库的大小、上下文窗口的大小等参数。通过这些评估方法,可以为下游任务选择最佳的词向量表示,以确保在实际应用中取得出色的性能。
在自然语言处理中,将词向量应用于实际问题面临诸多挑战。虽然研究者们广泛关注内在评估方法,并强调开发高质量词向量的重要性,但是最终的目标是确保这些词向量能够在复杂的外在任务(如文本分类、机器翻译和信息检索)中发挥实际作用。外在评估是指评估由嵌入技术生成的词向量在实际任务中的表现,这些任务通常较为复杂,并需要较长的计算时间。例如,在情感分析或命名实体识别等任务中,需要对句子进行情感分类或识别特定单词的类别。这类问题常使用成对的数据点,包括输入的词向量和对应的标签。
然而,外在评估存在一个主要挑战:难以确定性能较差的原因,可能是某个子系统的问题,也可能是各子系统之间的交互影响。在优化性能较差的外在评估系统时,很难明确找到问题的根源。为了解决这一难题,内在评估成为一种必要手段。内在评估能够识别具体哪个子系统需要改进,从而为系统的进一步优化指明方向。
在处理外在任务时,通常会使用通过优化更简单的内在任务预训练得到的词向量。预训练的词向量在许多外在任务中表现良好,通常是最佳词向量的良好代理。有时可以通过进一步训练(即重新训练)这些预训练的词向量来提升其在外在任务中的性能。
重新训练词向量存在一定风险,尤其是在数据集较小的情况下。如果使用外在任务的数据重新训练词向量,则需要确保训练集足够大,能够覆盖词汇表中的大多数单词。这是因为模型如Word2Vec或GloVe会将语义相关的单词聚集在词空间的相同区域。如果重新训练仅涉及词汇表的一个小子集,这些单词的位置可能会发生偏移,从而影响语义关系,最终可能导致任务性能下降。
因此,当训练数据集较小时,不建议重新训练词向量;若数据集足够大,则重新训练可以提升模型的表现。在实际应用中,通常使用预训练的词向量作为外在任务的输入,但在特定情况下也会考虑进一步训练这些向量以优化任务表现。重新训练时必须确保训练集覆盖足够的词汇,否则原本语义相关的词可能因向量更新而在词空间中分散,影响任务性能。
softmax分类器是外部评估中直接用于测试词向量在实际任务中表现的工具。它将输入的词向量映射到具体的类别中,用于分类、情感分析、命名实体识别等任务。
其中, p ( y j =1 | x ):表示给定输入词向量 x ,它属于类别 j 的条件概率。 W j 表示类别 j 的权重向量。 x :输入词的词向量(或者一般的输入特征向量)。 W c :类别 c 的权重向量,用于计算类别 c 的得分。 C :类别的总数。分子exp( W j ⋅ x ):输入词向量 x 在类别 j 上的得分。 W j ⋅ x :权重向量 W j 与词向量 x 的点积,这个点积衡量的是词向量 x 和类别 j 的权重向量之间的相似性。
注意:
本书中的概率
p
分为大小写,
P
指整个概率结构,即全局概率,
p
为某个具体数值的概率,即局部概率。
:所有类别得分的归一化项。对每一个类别
c
都计算一个类似分子的得分exp
(W
c
⋅x)
,然后对所有得分进行求和,通过求和可以得到一个所有类别的总得分。
式(1-30)计算了词向量 x 属于类别 j 的概率。使用交叉熵损失函数训练示例的损失为:
其中, C 是总类别数。 y j 是指示变量,表示样本是否属于第 j 类。对于正确类别的索引 k , y k =1,其余类别为0。
这意味着求和公式中的大部分项都是0,只有正确类别的项有贡献,因此可将式(1-31)简化为:
然后将上述损失扩展到包含 N 个数据点的数据集上:
式(1-33)是交叉熵损失的公式,用于衡量模型预测的输出与实际类别之间的差异。
N
是样本数量。
k
(
i
)是一个函数,返回样本
x
(
i
)
的正确类别索引。
式(1-33)对每个样本 x ( i ) 计算其属于正确类别的对数概率损失。
一个简单的线性分类器需要接收一个 d 维的输入词向量,并输出一个覆盖 C 个类别的概率分布。为了更新模型权重 W ,需要更新的参数是每个类别的权重向量。假设模型有 C 个类别,每个类别的权重是 d 维的,那么总共需要更新的权重参数是 C × d 个。
如果还要更新词汇表中的词向量,每个词汇表中的词都有一个 d 维向量。词汇表中有| V |个词,每个词对应一个 d 维词向量,因此总共需要更新| V |× d 个参数。对于一个简单的线性分类器,同时更新模型权重和词向量的总参数数量为:
由于模型的参数数量非常庞大,而模型本身的决策边界却相对简单,这样的多参数设计极易导致过拟合。为了降低过拟合的风险,需要在损失函数式(1-33)中引入正则化项。这一正则化项旨在限制参数的大小,使其尽可能小(接近0),以避免参数取过大值而导致模型复杂性增加,从而提升模型的泛化能力。
通过最小化包含正则化项的成本函数,可以降低参数为了适应训练集而取极大值的可能性。如果正则化强度( λ )调整得当,正则化还能有效改善模型的泛化能力。当模型变得更加复杂,如在参数数量庞大的神经网络中,正则化的重要性尤为突出,因为它可以有效防止模型过拟合,提升其在新数据上的表现。
窗口分类通过包含中心词及其前后上下文词的词窗(Context Window)进行分类,从而利用上下文信息来预测单词的类别或语义角色,帮助模型更准确地捕捉单词在不同语境下的含义。在自然语言处理中,单词往往因上下文不同而具有完全相反的含义。单独的词向量可能无法准确表达这些差异。例如,单词overlook在不同的上下文中可能表示“忽视”或“俯瞰”,这两个含义完全相反。如果仅依赖单词本身,很难判断其确切意思。通过结合中心词和周围的上下文词,窗口分类能够区分同一单词在不同语境下截然相反的含义,从而提高语义理解的准确性。
为了提高分类的准确性,模型通常使用包含中心词和其前后上下文词的序列作为输入。这些上下文词的数量称为上下文窗口大小,可以根据任务需求调整。一般而言,较小的窗口在句法任务(如语法判断)中表现更好,而较大的窗口在语义任务(如理解单词意思)中效果更佳。
为了将上一节中的softmax模型修改为使用词窗进行分类,只需要将
x
i
替换为
,其表示方式如下:
因此,当对词窗中的所有单词的词向量求损失函数的梯度时,将得到词向量的梯度:
在实际实现中,这些梯度需要分配到相应的词向量中进行更新。使用词窗能够更好地捕捉上下文信息,提高分类任务的准确性。
在数据分类问题中,首先讲一下线性分类器的局限性。对于具有复杂特征的数据集,线性决策边界往往无法有效区分数据点,导致出现许多分类错误。为了解决这一问题,引入了非线性分类模型(如神经网络)。相比于线性分类器,非线性模型能够构建更加复杂的决策边界,从而更准确地处理复杂数据。
接下来重点讲一下神经网络作为一种非线性模型在深度学习中的出色表现,具体包括神经网络的原理、应用及它为何能在处理复杂数据时展现出卓越的性能。通过理解和应用这些非线性模型,可以更精准地解决实际中的分类问题。
[1] Goldberg Y. Neural Network Methods in Natural Language Processing [M]. San Rafael: Morgan & Claypool Publishers, 2017.
[2] Mikolov T, Chen K, Corrado G, et al. Efficient estimation of word representations in vector space [EB/OL].[2024-01-07]. https://arxiv.org/abs/1301.3781.
[3] Mikolov T, Sutskever I, Chen K, et al. Distributed representations of words and phrases and their compositionality [C]//Advances in Neural Information Processing Systems 26. Nevada: NeurIPS, 2013: 3111-3119.
[4] Pennington J, Socher R, Manning C D. Glove: Global vectors for word representation [C]//Proceedings of the 2014 Conference on Empirical Methods in Natural Language Processing. Doha: EMNLP, 2014: 1532-1543.