学习时间: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.”,则其贡献矩阵如下:
![]()
共现矩阵的词向量一定程度上缓解了one-hot向量相似度为0的问题,但没有解决数据稀疏性(稀疏矩阵,sparse matrix)和维度灾难的问题。
(2)奇异值分解 SVD
既然基于共现矩阵得到的离散词向量存在着高维和稀疏性的问题,一个解决思路是对原始词向量进行降维,从而得到一个稠密的连续词向量。
eg:对上图中的共现矩阵进行SVD分解,得到矩阵正交矩阵U,对U进行归一化得到矩阵如下:
![]()
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×N N×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 i i位上的词 w i w_i wi出现的概率,仅与它前面的 ( n − 1 ) (n-1) (n−1)个历史词有关。
但是这个模型具有一定的缺陷:参数空间大且稀疏(由于训练语料限制,无法追求更大的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)的条件下,选择符合所有事实,且在其他方面近可能均匀的模型。