学习笔记:深度学习(5)——词向量的相关概念

学习时间:2022.04.21

自然语言处理(Natural Language Processing,NLP)是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理是一门融语言学、计算机科学、数学于一体的科学。

NLP的2大核心任务是:自然语言理解NLU和自然语言生成NLG。NLP常见的应用有:

  • 序列标注:譬如命名实体识别(Named Entity Recognition,NER)、语义标注、词性标注、分词等;
  • 分类任务:譬如文本分类、情感分析等;
  • 句对关系判断:譬如自然语言推理、问答QA、文本语义相似性等;
  • 生成式任务:譬如机器翻译、文本摘要、观点提取、写诗造句、图像描述生成等;
  • 其他:舆情监测、语音识别、中文OCR。

4. 词向量的相关概念

BERT是目前应用很广的一个NLP模型,在正式学习BERT之前,想对预训练这方面的相关概念做一个基本了解。

4.1 概念定义

4.1.1 词向量

在NLP任务中,首先要考虑词如何在计算机中表示。词向量是指用一组数值来表示一个字或者词语。

  • 离散表示

    • 传统的基于规则或基于统计的自然语义处理方法将单词看作一个原子符号被称作one-hot representation(独热编码)。它把每个词表示为一个长向量。这个向量的维度是词表大小,向量中只有一个维度的值为1,其余维度为0,这个维度就代表了当前的词;
    • 这相当于给每个词分配一个id,这就导致这种表示方式不能展示词与词之间的关系,并且维度太高也太稀疏了。
  • 分布式表示

    • 分布式表示将词表示成一个定长的连续的稠密向量,又称词向量(即:用一组数值来表示一个字或者词语)。包括基于矩阵的分布表示、基于聚类的分布表示、基于神经网络的分布表示等等。
    • 这样词之间可以存在相似关系:是词之间存在“距离”概念,这对很多自然语言处理的任务非常有帮助;还能包含更多信息,并且每一维都有特定的含义。

4.1.2 词嵌入 Word Embedding

这些通过各种语言模型训练好的词向量实例,也被称为词嵌入

可以将Embedding理解为一个字典,将整数索引(特定单词对应的编码)映射为密集向量。它接收整数作为输入,并在内部字典查找这些整数,然后返回相关联的向量。

个人理解:传统的表示方式是用语料构建词的向量表示,而词嵌入是用一个统一维度的向量表示各种词,每个词被映射到低维连续向量。

4.1.3 预训练 Pre-training

通过设计好一个网络结构来做语言模型任务,然后把大量甚至是无穷尽的无标注的自然语言文本利用起来编码到网络结构中。当你觉得结果很满意的时候,就可以将训练模型的参数保存下来,以便训练好的模型可以在下次执行类似任务时获得较好的结果。这个过程就是pre-training。

基本思想:使用尽可能多的训练数据,从中提取出尽可能多的共性特征,从而让模型对特定任务的学习负担变轻。

原理:底层特征的可复用性。这样经过预训练得到的词向量,是在极大样本上训练的结果,有很好的通用性,无论什么任务都可以直接拿来用。

在预训练模型训练好了的基础上,再接下游相关任务时,有以下两种使用方法:

(1)Frozon / Feature-based

浅层加载的参数在训练新任务的时候不改变,其它高层参数仍然随机初始化。

指使用预训练语言模型训练出的词向量作为特征(就是Word Embedding那层网络参数固定不动),输入到下游目标任务中。

(2)Fine-tuning

微调(Fine-tuning)是指:使用之前预训练模型的参数作为底层网络的初始参数,但在训练过程中仍然随着训练的进程不断改变(Word Embedding这层参数使用新的训练集合训练也需要跟着训练过程更新掉)。

目的是更好地把参数进行调整,使得更适应当前的下游任务。这时候,你使用的就是一个Pre-trained模型,而过程就是Fine-tuning。

因此,预训练就是将字、词表示成向量的过程,预训练模型就是通过大量语料训练好的向量模型。

4.1.4 分词 Tokenization

使用文本的第一步就是将文本分解成词(Tokens)。词(Token)是具有基本语义单元的最小的词,将文本拆分为词的过程称为分词(Tokenization),而分词用到的模型或工具称为分词器(Tokenizer)。

Tokenization的粒度有三种:词粒度(Word-Level)、字粒度(Char-Level)和子词粒度(SubWord-Level)。

SubWord有三种经典的算法:

  • Byte-Pair Encoding(字节对,BEP):BPE编码或二元编码是一种简单的数据压缩形式,其中最常见的一对连续字节数据被替换为该数据中不存在的字节。 后期使用时需要一个替换表来重建原始数据。
  • WordPiece:BPE的变种,基于概率生成新的subword而不是下一最高频字节对。
  • Unigram Language Model:ULM是另外一种subword分隔算法,它能够输出带概率的多个子词分段。它引入假设:所有subword的出现都是独立的,并且subword序列由subword出现概率的乘积产生。

4.2 词向量表示方法

首先要清楚,预训练是词向量表示方法发展到一定阶段的产物,为了更为宏观地了解预训练模型,想首先对整个词向量表示方法进行一个梳理。因此,本小节来简单介绍词向量的生成技术。

4.2.1 基于传统统计方法

(1)词袋模型 Bag of Words

通俗的说,就是将句子、语料中的词语都丢到一个袋子里,构建一个词语集合-词频的一维矩阵,不考虑顺序,不考虑重要性,认为词语是独立的。

可用于信息检索与数据挖掘的常用加权技术,关键词,句子相似度等,但无法展示不同词语的重要程度、不能刻画相似词语,不能刻画一词多义、不能刻画出词序信息,维度灾难。

(2)TF-IDF

Term Frequency-Inverse Document Frequency,词频-逆文本频率。划分词语重要程度,引入外部语料库信息(即所谓的先验概率),用于信息检索与数据挖掘的常用加权技术,关键词,句子相似度等。但词频等重合会导致表示冲突,严重依赖于语料库;会偏向于文本中频率小的词;不能刻画出词序信息。

4.2.2 基于矩阵的统计方法

本部分来源:什么是词向量自然语言表示简史

(1)共现矩阵

通过统计一个事先指定大小的窗口内的字、词共现次数,以字、词周边的共现词的次数做为当前字、词的向量。具体来说,我们通过从大量的语料文本中构建一个共现矩阵来定义词向量。

eg:有语料集如下:“I like deep learning.”、“I like NLP.”、“I enjoy flying.”,则其贡献矩阵如下:

img

共现矩阵的词向量一定程度上缓解了one-hot向量相似度为0的问题,但没有解决数据稀疏性(稀疏矩阵,sparse matrix)和维度灾难的问题。

(2)奇异值分解 SVD

既然基于共现矩阵得到的离散词向量存在着高维和稀疏性的问题,一个解决思路是对原始词向量进行降维,从而得到一个稠密的连续词向量。

eg:对上图中的共现矩阵进行SVD分解,得到矩阵正交矩阵U,对U进行归一化得到矩阵如下:

img

SVD得到了字、词的稠密矩阵(dense matrix),该矩阵具有很多良好的性质:语义相近的词在向量空间相近,甚至可以一定程度反映字、词间的线性关系。

补充:SVD奇异值分解算法

特征值分解和奇异值分解的目的都是一样,就是提取出一个矩阵最重要的特征。

特征值分解是一个提取矩阵特征很不错的方法,但是它只能作用于方阵。在现实的世界中,我们看到的大部分矩阵都不是方阵,比如说有N个学生,每个学生有M科成绩,这样形成的一个N * M的矩阵就不可能是方阵。奇异值分解是一个能适用于任意的矩阵的一种分解的方法。

缺点:计算代价很大,时间复杂度是3次方的,空间复杂度是2次方的;不能共享内存;很难并行计算;数据转换可能难以理解。

(3)主题模型 Topic Model

主题模型包括:非负矩阵分解(Non-negative Matrix Factorization,NMF)、潜在语义分析(Latent Semantic Analysis,LSA)、概率潜在语义分析(Probabilistic Latent Semantic Analysis,PLSA)、潜在狄利克雷分配(Latent Dirichlet Allocation,LDA)、相关主题模型(Correlated Topic Model,CTM)

一般而言,首先构建构建N × N N×NN×N的方矩(N为词典大小),矩阵中元素填充一般为训练语料中的TF-IDF、词频或BM25。提出的假设是"词-主题,主题-句子",所以使用主题模型进行降维,得到的权重矩阵W,就是词语对应的词向量。

BM25(BM=best matching)是TD-IDF的优化版本,具体介绍可见:BM25算法介绍

解决了词向量间隐藏的语义,算法简洁明了可解释;有严谨的假设和证明;使用全局特征;常见python工具包都会集成。但严重依赖于语料库、不能刻画出词序信息、计算复杂维度灾难、主题个数不好确定。

(4)相似度与共现矩阵 Glove

诞生于word2vec之后,是一种传统统计学习方法而没有使用人工神经,但效果与word2vec相似,没有什么明显性能提升。

glove算法认为,A的词向量 / B的词向量 = Pac / Pbc;统计共现矩阵,共现矩阵为X,在整个语料库中,Pac为单词A和单词C共同出现在一个窗口中的次数除以语料中单词A出现的个数; 同理,Pbc为单词B和单词C共同出现在一个窗口中的次数除以语料中单词B出现的个数。化简为 A的词向量 * B的词向量 ∝ Freq ab,即 A的词向量 乘以 B的词向量 正比于 AB词出现的词频,再加上一些偏置项,就是glove了,glove损失函数如下:

算法简单直观,只用了纯统计方法,综合了词语的全局信息和局部信息等,部分解决词向量全局关系。但严重依赖于语料库、不能刻画出词序信息、不能解决一词多义问题、常见python工具包不集成使得训练麻烦,应用较少。

4.2.3 统计语言模型 Statistical Language Model

统计语言模型把语言(词的序列)看作一个随机事件,并赋予相应的概率来描述其属于某种语言集合的可能性。即:统计语言模型是用来描述词、语句乃至于整个文档这些不同的语法单元的概率分布的模型。

(1)N元模型 N-gram Model

N-gram Model的思想就是:基于马尔科夫假设,出现在第i ii位上的词w i w_iwi出现的概率,仅与它前面的( n − 1 ) (n-1)(n1)个历史词有关。

但是这个模型具有一定的缺陷:参数空间大且稀疏(由于训练语料限制,无法追求更大的N,并且N越大导致计算量越来越大,目前使用较多的是三元模型);泛化能力不强,没有表示词语之间的相似性的能力,每个词语都是单独的毫无联系的类别,单纯基于统计,且需要完全匹配;没有长期依赖;N-gram语言模型还存在[OOV问题](N-gram和NNLM语言模型 - OwnLu)(Out Of Vocabulary)。

(2)最大熵模型 MaxEnt

模型详细介绍:最大熵模型。最大熵原理认为,在所有可能的概率模型中,熵最大的模型是是最好的模型。

对已知的知识建模,对未知的不过任何假设(model all that is known and assume nothing about that which is unknown)。换句话说,在给定一组事实(features+output)的条件下,选择符合所有事实,且在其他方面近可能均匀的模型。

(3)概率图模型 Probabilistic Graphical Models

概率图模型(probabilistic graphical models)在概率模型的基础上, 使用了基于图的方法来表示概率分布(或者概率密度、密度函数),是 一种通用化的不确定性知识表示和处理方法。

  1. 隐马尔可夫模型 HMM

    隐马尔科夫模型(Hidden Markov Model,简称HMM):它是结构最简单的动态贝叶斯网,这是一种著名的有向图模型,同时它属于生成式模型,它是一个含有隐含未知参数的马尔可夫过程。主要用于时序分析,在语音识别,自然语言处理等领域应用广泛。

    HMM有两个假设:

    • 齐次马尔可夫性假设:它假设任一时刻的隐状态只与其前一时刻的隐状态相关,而与其它任何时刻的隐状态以及观测状态无关;
    • 观测独立性假设:它假设任一时刻的观测状态只与当前时刻的隐状态相关,而与其它观测状态以及隐状态无关。

    此外,最大熵与HMM可以结合:MEMM(最大熵马尔科夫模型)。它是有向图模型,是判别模型;MEMM打破了HMM的观测独立性假设,MEMM考虑到相邻状态之间依赖关系,且考虑整个观察序列,因此MEMM的表达能力更强;但MEMM会带来标注偏置问题:由于局部归一化问题,MEMM倾向于选择拥有更少转移的状态。这就是标记偏置问题。

    模型介绍具体可见:NLP中的概率图模型

    隐马尔科夫原理:NLP硬核入门-隐马尔科夫模型HMM

  2. 条件随机场模型 CRF

    条件随机场(Conditional Random Fields,CRF):是给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模型,其特点是假设输出随机变量构成马尔科夫随机场。条件随机场是一种判别式模型。

    概念理解:

    • 随机场是由若干个位置组成的整体,当给每一个位置中按照某种分布随机赋予一个值之后,其全体就叫做随机场。还是举词性标注的例子:假如我们有一个十个词形成的句子需要做词性标注。这十个词每个词的词性可以在我们已知的词性集合(名词,动词…)中去选择。当我们为每个词选择完词性后,这就形成了一个随机场。
    • 马尔科夫随机场(Markov Random Field,MRF)是随机场的特例,它是一种典型的马尔科夫网,这是一种著名的无向图模型,图中的每一个结点表示一个或一组变量,结点之间的边表示两个变量之间的依赖关系。它假设随机场中某一个位置的赋值仅仅与和它相邻的位置的赋值有关,和与其不相邻的位置的赋值无关。继续举十个词的句子词性标注的例子:如果我们假设所有词的词性只和它相邻的词的词性有关时,这个随机场就特化成一个马尔科夫随机场。比如第三个词的词性除了与自己本身的位置有关外,只与第二个词和第四个词的词性有关。
    • CRF是马尔科夫随机场的特例,它假设马尔科夫随机场中只有X和Y两种变量,X一般是给定的,而Y一般是在给定X的条件下我们的输出。这样马尔科夫随机场就特化成了条件随机场。在我们十个词的句子词性标注的例子中,X是词,Y是词性。因此,如果我们假设它是一个马尔科夫随机场,那么它也就是一个CRF。

    CRF模型是无向图模型,是判别模型;解决了标注偏置问题,去除了HMM中两个不合理的假设,当然,模型相应得也变复杂了。

    CRF不仅解决了HMM输出独立性假设的问题,还解决了MEMM的标注偏置问题,MEMM容易陷入局部最优是因为只在局部做归一化,而CRF统计了全局概率,在做归一化时考虑了数据在全局的分布,而不是仅仅在局部归一化,这样就解决了MEMM中的标记偏置的问题。使得序列标注的解码变得最优解。

    模型具体介绍可见:NLP之概率图模型

    条件随机场原理:NLP硬核入门-条件随机场CRF

(4)GloVe

本部分主要来源:GloVe详解理解GloVe模型

GloVe的全称叫Global Vectors for Word Representation(全局词向量),它是一个基于全局词频统计(count-based & overall statistics)的词表征(word representation)工具。该模型核心思想是训练出蕴含共现矩阵所蕴含信息的词向量。

GloVe的实现分为以下三步:

  • 根据语料库(corpus)构建一个共现矩阵X XX,矩阵中的每一个元素X i j X_{ij}Xij代表单词j jj在单词i ii上下文窗口(context window)中出现的次数。一般而言,这个次数的最小单位是1 11,但是GloVe不这么认为:它根据两个单词在上下文窗口的距离d dd,提出了一个衰减函数(decreasing weighting):d e c a y = 1 d decay=\frac{1}{d}decay=d1用于计算权重,也就是说距离越远的两个单词所占总计数(total count)的权重越小;

  • 构建词向量(Word Vector)和共现矩阵(Co-ocurrence Matrix)之间的近似关系,论文的作者提出以下的公式可以近似地表达两者之间的关系:w i T w ‾ j + b i + b j = l o g ( X i j ) w_i^T\overline{w}_j+b_i+b_j = log(X_{ij})wiTwj+bi+bj=log(Xij)。其中,w i T w_i^TwiTw ‾ j \overline{w}_jwj是我们最终要求解的词向量;b i b_ibib ˉ j \bar{b}_jbˉj分别是两个词向量的bias term。

  • 有了以上公式,我们就可以构造它的损失函数了:J = ∑ i , j = 1 V f ( X i j ) ( w i T w ˉ j + b i + b ˉ j − l o g ( X i j ) ) 2 J = \sum^V_{i,j=1}f(X_{ij})(w^T_i\bar{w}_j+b_i+\bar{b}_j-log(X_{ij}))^2J=i,j=1Vf(Xij)(wiTwˉj+bi+bˉjlog(Xij))2,即在mean square loss的基础上加了一个权重函数f ( X i j ) f(X_{ij})f(Xij)

    • 为什么要添加这个函数呢?我们知道在一个语料库中,肯定存在很多单词他们在一起出现的次数是很多的(frequent co-occurrences),那么我们希望:

      • 这些单词的权重要大于那些很少在一起出现的单词(rare co-occurrences),所以这个函数要是非递减函数(non-decreasing);
      • 但我们也不希望这个权重过大(overweighted),当到达一定程度之后应该不再增加;
      • 如果两个单词没有在一起出现,也就是X i j = 0 X_{ij}=0Xij=0,那么他们应该不参与到loss function的计算当中去,也就是f ( x ) f(x)f(x)要满足f ( 0 ) = 0 f(0)=0f(0)=0
    • 满足以上两个条件的函数有很多,作者采用了如下形式的分段函数(这篇论文中的所有实验,α αα的取值都是0.75,而x m a x x_{max}xmax取值都是100。):

      • f ( x ) = { ( x x m a x ) α i f x < x m a x 1 o t h e r w i s e f(x) = \begin{cases}(\frac{x}{x_{max}})^\alpha & if x<x_{max}\\ 1 & otherwise \end{cases}f(x)={(xmaxx)α1ifx<xmaxotherwise
      • 在这里插入图片描述

Glove是结合了LSA和Word2Vec(可见后)两者的优点。LSA是一种词向量表征工具,也是基于共现矩阵,采用了基于奇异值分解SVD的矩阵分解技术对大矩阵进行降维,但是SVD计算代价太高,并且它对于所有单词的统计权重都是一致的,而glove克服了这些缺点。Word2vec因为它是基于局部滑动窗口计算的,利用了局部上下文的特征,所以缺点就是没有充分利用所有的语料。因此Glove将这俩种特征合并到一起。

总的来说,GloVe更容易并行化,所以对于较大的训练数据,GloVe更快。但Word2Vec的效果可能稍好一点,应用更加普及。

4.2.4 基于深度学习的语言模型 Language Model

目前来看,基于深度学习的语言模型技术已经完全超越了传统语言模型,为了好地展开,对语言模型发展的梳理准备重新开一节。


版权声明:本文为Morganfs原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。