团队博客: CSDN AI小组
相关阅读
在自然语言处理(Natural Language Processing,NLP)领域中,语言表示是一项核心任务,其旨在将人类语言转化为计算机可理解和处理的形式。语言表示的基本原理和历史演变是理解和应用 NLP 技术的基石。随着人工智能和深度学习的迅猛发展,语言表示也经历了一系列的演进和改进。从早期符号化的离散表示方法到如今基于深度学习的分散式表示 (Distributed Representations) 方法,语言表示都在 NLP 任务中扮演着至关重要的角色。本文主要从离散表示和连续表示 (分散式表示是连续表示的一类方法) 的角度,介绍语言表示的基本原理和历史演变。
离散表示主要分为符号表示和基于聚类的表示两类方法,早期的语言表示方法是符号化的离散表示。为了方便计算机进行计算,一般将符号或符号序列转换为高维的稀疏向量。但是符号表示的缺点是词与词之间没有距离的概念,比如“电脑”和“计算机”被看成是两个不同的词,这和语言的特性并不相符。因此,符号表示需要引入人工知识库,比如同义词词典、上下位词典等,才能有效地进行后续的语义计算。一种改进的方法是基于聚类的词表示,比如 Brown 聚类算法,通过聚类得到词的类别簇来改进词的表示。下面将介绍一些常见的离散表示方法,其中除了基于聚类的表示方法之外,其余的都是符号表示方法。
独热编码 (One-Hot Encoding) 是一种离散的词向量化方法。它将词转换为二进制向量表示,以便于分析和建模。以下是一个例子来说明独热编码的工作原理:
假设我们有一个词典,词典中包含以下5个词语:
电脑
计算机
苹果
香蕉
橙子
词典的大小是向量的维度 (此处为5) ,One-Hot 向量就是其中一维为 1、其余维为 0 的向量,以下是词典中所有词的词向量,其中每一行或每一列,都可看作是对应词的向量表示:
- | 电脑 | 计算机 | 苹果 | 香蕉 | 橙子 |
---|---|---|---|---|---|
电脑 | 1 | 0 | 0 | 0 | 0 |
计算机 | 0 | 1 | 0 | 0 | 0 |
苹果 | 0 | 0 | 1 | 0 | 0 |
香蕉 | 0 | 0 | 0 | 1 | 0 |
橙子 | 0 | 0 | 0 | 0 | 1 |
词袋模型是自然语言处理中常用的一种表示文本的方法,它将文本表示为一个固定长度的向量,忽略了文本中词语的顺序和语法结构,仅考虑词语的在文本中的出现频率。
假设我们有以下三个文本句子作为我们的样本:
今天天气真好!
我们出去公园露营了。
露营真有意思,又是开心的一天,下次天气好,我们还去公园露营!
首先,我们需要对这些句子进行预处理。在预处理阶段,我们需要进行分词,并去除常见的停用词(如 “今天”、“我们” 等)。预处理后的样本如下所示:
天气 好
公园 露营
露营 有意思 开心 天气 好 公园 露营
接下来,我们需要构建一个词汇表,该词汇表包含了在所有文本中出现的唯一单词。在这个例子中,词汇表可能包括:“天气”、“好”、“公园”、“露营”、“有意思”、“开心”。
然后,我们将每个句子表示为一个向量。向量的长度等于词汇表中单词的数量。对于每个句子,我们统计每个单词在该句子中的出现次数,并将其放入向量对应的位置。
在这个例子中,我们可以得到以下向量表示:
[1, 1, 0, 0, 0, 0]
[0, 0, 1, 1, 0, 0]
[1, 1, 1, 2, 1, 1]
上述向量表示分别表示了句子中每个单词的出现次数。例如,第一个句子中,“天气”、“不错”分别出现了1次,其他单词则没有出现。
这样,我们就将文本表示为了一个固定长度的向量,可以用于机器学习算法进行训练和分类等任务。然而,词袋模型忽略了单词的顺序信息,可能丢失了一些上下文相关的语义信息。
TF-IDF(Term Frequency-Inverse Document Frequency)是一种用于加权表示词语在文本中重要性的技术,它常常与词袋模型结合使用。
词袋模型仅考虑词语的出现频率,将文本表示为一个向量,而不考虑词语的重要性。TF-IDF是一种改进的方法,它通过结合词频(TF)和逆文档频率(IDF)来度量一个词语在文本集合中的重要性。
TF(词频)表示一个词在一个文档中的出现次数。它衡量了一个词在特定文档中的重要性,如果一个词在文档中出现的次数越多,那么它对该文档的重要性也就越高。公式如下:
TF(t, d) = (词t在文档d中出现的次数) / (文档d中的总词数)
IDF(逆文档频率)衡量了一个词在整个文档集合中的普遍程度。对于一个词在整个文档集合中经常出现的情况,其IDF值较低;而对于一个在文档集合中很少出现的词,其IDF值较高。这样设计是为了降低常见词语对文本的重要性,增加罕见词语的权重。公式如下:
IDF(t) = log((总文档数) / (包含词t的文档数 + 1))
TF-IDF通过将TF和IDF相乘来计算一个词语的最终权重。这种权重表示了一个词语在特定文档中的重要性,同时考虑了它在整个文档集合中的普遍程度。在词袋模型中,TF-IDF被用来代替简单的词频,以更准确地表示词语的重要性。公式如下:
TF-IDF(t, d) = TF(t, d) * IDF(t)
因此,TF-IDF可以说是在词袋模型的基础上引入了对词语重要性的考量,以改进文本的表示和特征选择。
N-gram 模型是一种基于词语序列的文本表示方法。它将文本中的连续 N 个词语作为一个单元进行处理,形成一个 N-gram 序列。通过统计文本中不同 N-gram 序列权重得分 (词频、TF-IDF等),可以得到文本的表示。
使用“词袋模型”中预处理后的样本,进行 Bi-gram (2-gram) 操作后的结果如下所示:
天气好
公园露营
露营有意思 有意思开心 开心天气 天气好 好公园 公园露营
与 TF-IDF 相比,N-gram 模型具有以下优势:
N-gram模型的优势:
符号表示是将语言看成离散的符号。以词为例,一个词可以表示为 One-Hot 向量(一维为 1 其余维为 0 的向量),也叫局部表示。离散表示的缺点是词与词之间没有距离的概念,比如“电脑”和“计算机”被看成是两个不同的词,这和事实不符。
因此,符号表示需要引入人工知识库,比如同义词词典、上下位词典等,才能有效地进行后续的语义计算。一种改进的方法是基于聚类的词表示。其中一个经典的方法是 Brown 聚类算法,该算法是一种层次化的聚类算法。在得到层次化结构的词类簇之后,我们可以用根节点到词之间的路径来表示该词。
连续表示主要分为分布式表示和分散式表示两类方法。连续表示是将词表示为连续空间中的一个点,即为连续向量。这种表示的优势是词与词之间可以通过欧式距离或余弦距离等方式来计算相似度,可以有效地处理传统离散表示中的“一词多义”和“多词一义”问题。下面将介绍一些常见的连续表示方法,其中除了分布式表示方法之外,其余的都是分散式表示方法。
分布式表示 (Distributional Representations) 基于 Harris 的分布式假设,即如果两个词的上下文相似,那么这两个词也是相似的,这样就可以通过共现矩阵的方式来进行词的表示。我们可以构建一个大小为 W×C 的共现矩阵 F,其中 W 是词典大小,C 是上下文。上下文的类型可以为相邻词、所在句子或所在的文档等。共现矩阵的每一行可以看作对应词的向量表示。基于共现矩阵,有很多方法来得到连续的词表示,比如潜在语义分析模型 (Latent Semantic Analysis, LSA)、潜在狄利克雷分配模型 (Latent Dirichlet Allocation,LDA)、随机索引 (random indexing)等。
如果我们取上下文为词所在的句子或篇章,那么共现矩阵的每一列是该句子或篇章的向量表示。结合不同的模型,我们很自然就得到了句子或篇章的向量表示。
Word Embedding 是将文本中的单词映射到低维向量空间的技术,它在自然语言处理(NLP)中具有广泛的应用。Word Embedding 最早可追溯到人工智能三巨头之一的 Bengio 在 2003 年发表的神经网络语言模型NNLM论文,该论文直到 2013 年 Word2Vec 发布后才被翻出来,NNLM 本质上是为了训练一个语言模型,即根据上文预测接下来的单词是什么,训练结束之后,同时还额外获得了一个副产品,也就是 Word Embedding,下面是网络结构图:
接下来介绍几种常见的 Word Embedding 模型及其基本原理:
Word2Vec 是一种基于神经网络的 Word Embedding 模型,它包括两种训练算法:Continuous Bag-of-Words (CBOW) 和 Skip-gram。这两种算法都基于上下文预测目标单词的思想。CBOW 模型通过给定上下文单词来预测目标单词,而 Skip-gram 模型则相反,通过给定目标单词来预测上下文单词。训练完成后,Word2Vec 模型可以生成每个单词的密集向量表示。
GloVe 是一种基于全局词频统计的 Word Embedding 模型。它利用整个语料库中单词的共现统计信息,构建了一个词-词共现矩阵。然后通过奇异值分解 (SVD) 等方法,将词-词共现矩阵转换为低维的单词向量表示。GloVe 模型能够捕捉到词语之间的语义关系。
FastText是一种基于子词 (subword) 的 Word Embedding 模型。它将每个单词表示为子词的集合,例如将单词"apple"表示为"ap", “app”, “appl”, "apple"等子词。FastText模型通过对文本中的子词进行训练,将每个子词映射到对应的向量表示,并通过平均或拼接这些子词向量来表示整个单词。这种方法使得FastText能够更好地处理未登录词 (out-of-vocabulary) 和形态变化较多的单词。
这些 Word Embedding 模型都使用了分散式表示的思想,即将单词的语义信息编码为向量表示,使得具有相似语义的单词在向量空间中距离较近。这种表示方式可以用于词义相似度计算、文本分类、命名实体识别等多个NLP任务。
[1] A Neural Probabilistic Language Model
[2] Word2vec: Efficient Estimation of Word Representations in Vector Space
[3] Word2vec: Distributed Representations of Words and Phrases and their Compositionality
[4] GloVe
[5] GloVe Project
[5] FastText
神经词袋模型,即简单对文本序列中每个 Word Embedding 进行平均,作为整个序列的表示。这种方法的缺点是丢失了词序信息。对于长文本,神经词袋模型比较有效。但是对于短文本,神经词袋模型很难捕获语义组合信息。
递归神经网络(Recursive Neural Network)是一种用于语言表示的神经网络模型。它的设计灵感源于语言的递归结构 (例如句法树),能够处理具有层次结构的语言表达。
递归神经网络的基本思想是通过递归地组合词语或短语来构建更高级的语言表达。它通过递归地将输入的词语或短语与相邻的词语或短语进行组合,形成更大的单元,最终生成整个句子或段落的语言表示。
通过递归地组合词语或短语,递归神经网络能够捕捉到语言中的层次结构和语义信息,提高了对语言的理解能力。
循环神经网络 (Recurrent Neural Network,RNN) 是一种在序列数据上进行建模和处理的神经网络模型,被广泛应用于语言表示和自然语言处理任务中。RNN的基本原理是通过在网络中引入循环连接,使得网络能够保留先前的状态信息,并在处理序列数据时考虑上下文的关系。
RNN的核心组件是一个被称为循环单元(Recurrent Unit)的结构,它会接收当前输入和先前的状态作为输入,并输出当前的状态和相应的输出。在语言表示任务中,输入通常是一个单词或字符的文本序列,将文本序列看作时间序列,不断更新,最后得到整个序列的向量表示。
传统的RNN在处理较长的序列时会遇到梯度消失或梯度爆炸的问题,导致难以捕捉长期依赖关系。为了解决这个问题,一些变体的RNN被提出,如长短期记忆网络(Long Short-Term Memory,LSTM)和门控循环单元(Gated Recurrent Unit,GRU),它们引入了门控机制来更好地控制信息的流动和保留。
RNN 通过循环连接能够有效地捕捉序列数据中的上下文关系,很适合文本数据的建模。但是RNN的计算是逐个时间步进行的,无法进行并行计算,在工业界进行技术选型的时候,在有快得多的模型可用的前提下,是不太可能选择那么慢的模型的。
卷积神经网络 (Convolutional Neural Network,CNN) 是一种主要应用于图像处理和计算机视觉任务的深度学习模型。然而,它也可以用于语言表示任务,相比于传统的 RNN 模型,CNN在语言表示任务中的优势在于它能够通过卷积操作捕捉局部特征和短语结构,同时可以进行并行计算,从而提高了计算效率。但是由于CNN缺少显式的循环连接,它可能不太适合处理长期依赖关系。
卷积神经网络可以通过卷积操作在句子或文档中提取局部特征,并通过池化操作捕获重要的上下文信息。通过多个卷积层和子采样层,最终得到一个固定长度的向量。
相比于前面介绍的静态 Word Embedding ( 即训练好之后,没个词的 Embedding 就固定住了),通过 ELMo 获得的是 Word Embedding 是根据语境动态变化的,静态的 Word Embedding 学习完成之后可能混合了多种语义 (例如:“苹果” 可以指一种水果,也可以指一家公司),而 ELMo 的基本思想是:事先用语言模型学好一个单词的 Word Embedding,此时多义词无法区分。在实际使用 Word Embedding 的时候,可以根据上下文单词的语义去调整当前单词的 Word Embedding 表示,这样经过调整后的 Word Embedding 更能表达在这个上下文中的具体含义,自然也就解决了多义词的问题。
ELMo 的网络结构采用了双层双向 LSTM,在 NLP 任务中很常用,语言模型预训练的任务目标是根据当前单词的上下文去正确预测当前单词。如下图所示:
预训练完成之后,对于一个新输入的句子,其中每个单词都能得到对应的三个 Embedding:(1) 最底层是单词的Word Embedding;(2) 第一层双向LSTM中对应单词位置的 Embedding,这层编码单词的句法信息更多一些;(3) 再往上走是第二层 LSTM 中对应单词位置的 Embedding,这层编码单词的语义信息更多一些。
句子最终的向量表示是上面三个 Embedding 的加权求和,权重可以通过下游任务学习得到。如下图所示:
[1] CNN
[2] 【神经网络】递归神经网络
[3] 史上最详细循环神经网络讲解 (RNN/LSTM/GRU)
[4] ELMo
Transformer 是谷歌在17年做机器翻译任务的 “Attention is all you need” 的论文中提出的,引起了相当大的反响。Transformer 中包含 encoder 和 decoder 两大模块,encode 主要对输入的文本进行编码,decoder 基于 encoder 的编码数据实现文本的生成。其中 Self-Attention 是 Transformer 最核心的内容,其突破了 RNN 模型不能并行计算的限制,相比 CNN 计算两个位置之间的关联所需的操作次数不随距离增长。此外,自注意力可以产生更具可解释性的模型,我们可以从模型中检查注意力分布。
Transformer 开启了大模型时代 (Large Language Model, LLM),基于 Transformer 的大模型如雨后春笋般出现。具体而言,可归类为一下三类:
GPT 预训练任务是基于输入的前 n 个单词,预测句子中的下一个单词是什么,这称为因果语言建模 (Causal Language Modeling, CLM),因为输出取决于过去和现在的输入,而不是未来的输入。如下图所示:
BERT 的预训练任务分为两个,一个是预测文本中被“抠”掉的词 (Masked Language Model, MLM),另一个是预测下一句话 (Next Sentence Prediction, NSP),即给定句子对 ,预测 B 是否是 A 的下一句话。
相比于 BERT 只使用了 Transformer 的 encoder,GPT 只使用了 Transformer 的 decoder,BART 想做到两全其美,即同时使用 Transformer 的 encoder 和 decoder 进行语言模型的预训练。如下图所示:
BART 预训练的 decoder 部分同样使用了 GPT 的 Causal Language Modeling,而在 encoder 部分,除了使用类似BERT 的 Masked Language Modeling,对输入文本的 Token 进行 Mask 之外,还加入了更多的噪声干扰,包括句子中的 Token 重排列、文档旋转、Token 删除、文本填充操作,并且要求模型最终能正确输出原始的输入文本,这些噪声干扰可更好地提升模型的健壮性,的如下图所示:
使用上述三类语言模型进行语言表示,可以直接将文本输入到语言模型中,经过前向传播后,直接取出模型最后一个隐藏层的向量 (其中 Bart 取 decoder 的最后一个隐藏层),作为文本的表示即可。
如果想得到更高质量的向量表示,可以根据具体任务,对预训练后的语言模型进一步微调。
[1] Attention is all you need
[2] 详解 Transformer (Attention Is All You Need)
[3] GPT-3
[4] BERT
[5] BART
在社会媒体处理领域,大多数结构数据表示学习算法旨在为网络或图中的每个节点学习向量表示。以社交网络为例,表示学习技术可以学习网络中的节点 (即用户) 的向量表示,使得表示相近的用户其好友关系/偏好兴趣也相似,进而将学得的表示用于好友推荐、用户画像等实际场景。以知识图谱为例,学习到每个实体节点的向量后,可以进一步进行事实问答、逻辑推理等相关任务。
DeepWalk 的思想与 word2vec 类似,使用图中节点与节点的共现关系来学习节点的向量表示。那么关键的问题就是如何来描述节点与节点的共现关系,DeepWalk给出的方法是使用随机游走 (RandomWalk) 的方式在图中进行节点采样。
RandomWalk 是一种可重复访问已访问节点的深度优先遍历 (Deep First Search, DFS) 算法。给定当前访问起始节点,从其邻居中随机采样节点作为下一个访问节点,重复此过程,直到访问序列长度满足预设条件。
获取足够数量的节点访问序列后,就可以直接使用 word2vec 中的 skip-gram 模型进行节点的向量学习。
LINE 也是一种基于邻域相似假设的方法,只不过与 DeepWalk 使用 DFS 构造邻域不同的是,LINE可以看作是一种使用深度优先遍历 (Breadth First Search, BFS) 构造邻域的算法。
LINE 将节点与其1阶和2阶邻居节点之间的相似性参数化,然后用其学习图结构的节点表示。如下图的例子所示:
以1阶和2阶相似度为训练目标,即可获得图结构中节点的表示。
Node2vec 是一种综合考虑 DFS 邻域和 BFS 邻域的 Graph Embedding 方法。简单来说,可以看作是 DeepWalk 的一种扩展,是结合了 DFS 和 BFS 随机游走的 DeepWalk。如下图所示:
[1] DeepWalk
[2] LINE
[3] Node2vec
[4] 【Graph Embedding】DeepWalk:算法原理,实现和应用
[5] 【Graph Embedding】LINE:算法原理,实现和应用
[6] 【Graph Embedding】node2vec:算法原理,实现和应用
上述都是基于浅层神经网络的结构数据表示学习算法,用的都是简单的神经网络结构。下面将介绍使用图神经网络的结构数据表示学习算法。图神经网络(GNN)是一种应用于图结构的深度学习模型。在图神经网络的每一层中,每个节点都会通过消息传递机制,聚合其邻居和自身在上一层的表示来进行更新。
图卷积神经网络 (Graph Convolutional Networks,GCN) 是一种基于图的半监督神经网络分类模型。GCN 不仅使用了样本关系图作为模型输入,同时还使用了每个样本的特征向量信息。
图卷积的主要思想是将当前样本和其在样本关系图中所有相邻样本的特征向量进行加权融合,并将融合后的向量作为当前样本新的特征向量。这种平滑操作使得同一个簇中的样本,其特征向量在向量空间中更接近,即减小了簇内距离,加大了簇间距离,故使得下游任务变得更加容易。
GCN 是处理直推式 (Transductive) 学习任务,但是无法完成归纳式 (Inductive) 学习任务,即无法对未见样本进行预测,对一个新的未见样本的预测,需要将该未见样本加入到图中,重新进行训练。如下图所示:
此外,GCN 中的图结构数据边的权重是固定不变的,除了先验的权重,无法根据训练数据进一步微调。而图注意力网络 (Graph Attention Networks, GATs) 正好解决了这两个问题。
[1] GCN
[2] GAT
[3] 向往的 GAT (图注意力网络的原理、实现及计算复杂度)
本文只列出了语言表示发展历程中的一些经典模型,还有很多优秀的模型没有一一列出。随着 LLM 的发展,出现了很多大规模的语言表示模型,可参见 Hugging Face 上面的 Leaderboard,里面所有的模型基本都可以划分到上述的分类体系中。
如何将人类的自然语言表示成计算机能够理解的形式,一直是 NLP 的重中之重,语言表示的突破往往也伴随着 NLP 各类下游任务的效果提升。当前最先进的语言表示方法是基于 Transformer 的方法,其中的核心是注意力机制,该机制源于对人类视觉的研究。在认知科学中,由于信息处理的瓶颈,人类会选择性地关注所有信息的一部分,同时忽略其他可见的信息。期待后续认知科学、脑科学等领域的发展,可以给 NLP 的研究带来更多灵感。
[1] 中文信息处理发展报告(2016)
[2] 中文信息处理发展报告(2021)
[3] 从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史
[4] 放弃幻想,全面拥抱Transformer:自然语言处理三大特征抽取器(CNN/RNN/TF)比较
[5] Massive Text Embedding Benchmark (MTEB) Leaderboard
[6] Hugging Face NLP Course
[7] 机器学习-周志华