【人工智能基础】自然语言处理基础
文章目录
- 一. 语言模型基本概念
- 1. n-gram模型
- 2. 评价指标
- 2.1. 困惑度
- 2.2. 交叉熵
- 3. 训练中的特殊字符
- 3.1. OOV问题:处理模型未见过的字符
- 3.2. 起始字符:起始出现概率的处理
- 4. 字模型与词模型
- 5. 中英文差别
- 二. 向量语义
- 1. 词向量
- 1.1. 相似度:表示语义的接近程度
- 1.2. 词向量的应用
- 2. Word2Vec
- 1. CBOW 与 skip-gram
- 2. 负采样
- 负采样的目的
- 基本逻辑
- 三. 基于神经网络的语言模型处理(ing)
- 1. 基于全连接神经网络的bgram模型
- 2. 基于LSTM的模型
- 四. 基于神经网络的机器翻译
- 1. Seq2Seq
- 2. Beam Search
- 3. 基于注意力机制的Seq2Seq模型
- 4. 基于Transformer的Seq2Seq模型
- 五. 预训练语言模型的基本原理与方法
- 1. GPT
- 2. BERT
- 3. 判别式与生成式建模方法的讨论
一. 语言模型基本概念
语言模型是自然语言处理(NLP)领域的一个核心概念,它主要用于预测自然语言中下一个词或者序列的概率分布。语言模型可以应用到许多实用场景,如文本纠错(改正错别字、语法错误)、翻译、语言生成等。
1. n-gram模型
n - gram 模型是一种基于统计的语言模型。它的基本思想是通过统计文本中连续的 n 个单词(或字符)出现的频率,来预测下一个单词(或字符)出现的概率。
概率计算原理
模型分类:分为unigram、bigram 和 trigram等
- unigram元模型中k = 1,只考虑单个字符出现的概率,忽略上下文,即序列中的每个字符相互独立,在此模型下,即使改变字符在序列中的顺序,序列概率也不变;
- bigram(二元模型)中k = 2,考虑当前字符和它前面一个字符一起出现的概率;
- trigram(三元模型)中k = 3,考虑当前字符和它前面两个字符出现的概率;
- 更高阶的n-gram按照此规律类推,可以构建四元模型、五元模型等等。
2. 评价指标
2.1. 困惑度
衡量语言模型性能的常用指标,它反映了模型对测试集的预测正确性,困惑度越低,模型通常越好。
2.2. 交叉熵
衡量的是模型预测的概率分布与真实数据分布之间的差异。交叉熵越低,表示模型的预测分布与真实分布越接近,模型的性能越好。
3. 训练中的特殊字符
3.1. OOV问题:处理模型未见过的字符
由于测试语料与训练语料并不完全一致,模型训练完毕在测试集上预测时往往会遇到在字典L中没有出现的字符,即未知字符(unknown character)或字典外字符(out-of-vocabulary,OOV),因此引入<unk>字符。
- 可将训练集中出现频次较少的字符替换为<unk>,
- 也可将只在训练集中没有出现或者出现很少但在测试集中出现的字符替换为<unk>.
3.2. 起始字符:起始出现概率的处理
对于序列 c 1 c 2 ⋯ c N c _ { 1 } c _ { 2 } \cdots c _ { N } c1c2⋯cN的起始字符 c 1 c _ { 1 } c1,由于之前没有字符,因此使用 P ( c 1 ) P ( c _ { 1 } ) P(c1)作为条件概率。但对完整的一句话进行建模时,往往要求 c 1 c _ { 1 } c1恰好作为一句话中第一个字符出现的概率,因此引入特殊字符<start>,c出现的概率为 P ( c 1 ∣ < s t a r t > ) P ( c _ { 1 } \vert < start > ) P(c1∣<start>),同样结束字符出现的概率为 P ( < e n d > ∣ c N ) P ( < end > \vert c _ { N } ) P(<end>∣cN)。
4. 字模型与词模型
词模型的优势:需要处理的序列长度大大减少,增加语言模型的准确度。
语言模型处理的字符以汉字或词语为基本单位,如句子“深度神经网络是人工智能研究的热点”,如果以字为基本单位处理起来较复杂,但如果用词作为分析的基本单元,可以得到一个长度为6的序列,即“深度神经网络”“是”“人工智能”“研究”的“热点”,需要处理的序列长度大大减小,语言模型也能更准确地进行计算。
不同场景下如何选择子模型和词模型
词作为建模单位缺点在于字典L会变得非常大,汉语中常见汉字约2500个,常见词语可达到万或者十万级别,因此用词语进行建模需要更大规模的语料。所以在实际应用中应根据具体应用的需要和训练语料的大小,适当选择词、字还是二者混合为基本单位。
对较短句子或短语建模,可以以字为单位,对较长的语句或者专业术语较多的场合,应当考虑以词为基本单位。
5. 中英文差别
英文分词 | 1. 英文由于存在分隔符,词作为语言的基本单位非常自然,汉字分词相对复杂一些。 2. 英文更关注词性分割,简称 POS tagging,如"We talk about artificialintelligence"和"He gave a talk on artificial intelligence”中尽管都使用了talk,但在前一句中talk是动词,后一句是名词。 |
英文中的特定名词 | 英文虽然常用词汇不多,但在专业领域有很多拼写复杂的专用名词,如果都简单处理成<ank>,容易造成严重的信息丢失。 |
英文中的缩写与连写(词条化) | 英文不能单纯以空格或分隔符作为划分单词的绝对依据,如U.S.A.不能将3个字母看成三个词,但21-year-old则应分割“21”、“year”,"old”三个词,这种将连续的英文序列分割为词单元的过程称为词条化,词条化在英文自然处理中是一个必要步骤。 |
英文中不同的词性变化(词干化) | 同样的单词有单数和复数的区别,如“man”和“men”;有时态变化,如“Iam happy”和“was happy”;有人称变化,如“Ihave”和“he has”;有词性变化,如“I want to see you”和”llookforward to seeing you”,还有大小写变化。将这些不同形式的单词处理成相同形式,这个过程称为词干化。 |
二. 向量语义
1. 词向量
向量语义可以比较好地表达出词的语义信息,指的是利用一个高维向量 w = ( ω 1 , ω 2 , ⋯ , ω d ) ∈ R d w = ( \omega _ { 1 } , \omega _ { 2 } , \cdots , \omega _ { d } ) \in R ^ { d } w=(ω1,ω2,⋯,ωd)∈Rd表示一个词,d为维度,将这个向量称为词向量或词嵌入。本质是将一个抽象的词映射到d维空间中的一个点,每个空间的维度对应不同含义。
1.1. 相似度:表示语义的接近程度
如果两个词w和v语义越接近,那么它们的词向量w和v就应该越像,可以用两个词向量夹角 < w , v > < w , v > <w,v>的余弦值 cos ⟨ ω , , v ⟩ \cos \langle \omega _ { , } , v \rangle cos⟨ω,,v⟩,计算方式如下: cos < w , v > = w ⋅ v ∣ w ∣ ∣ v ∣ \cos < w , v > = \frac { w \cdot v } { \vert w \vert \vert v \vert } cos<w,v>=∣w∣∣v∣w⋅v
余弦值越小,夹角越小,两个词的语义越接近。
1.2. 词向量的应用
词向量将离散数据转换为连续数据,即对于词w的d维词向量w,可以认为这d个实数
w
1
,
w
2
,
⋯
w
d
w _ { 1 } , w _ { 2 } , \cdots w _ { d }
w1,w2,⋯wd是词w的d个特征,对于句子
w
1
,
w
2
,
⋯
w
N
w _ { 1 } , w _ { 2 } , \cdots w _ { N }
w1,w2,⋯wN,最简单的特征计算方法是取所有词的词向量平均值作为句子特征,即
1
N
∑
i
N
w
i
\frac { 1 } { N } \sum _ { i } ^ { N } w _ { i }
N1∑iNwi,对于文章也是如此。
应用领域 | 例子 |
---|---|
文本相似度计算 - 信息检索 | 用户搜索“智能手机推荐”,搜索引擎通过词向量找到包含“热门手机评测”等语义相关网页。 |
情感分析 - 产品评论分析 | 产品评论“这款手机性能超棒”,词向量分析出积极情感倾向。 |
语义理解 - 同义词、近义词识别 | “开心”和“高兴”词向量相近,被识别为近义词。 |
自动问答系统 - 问题理解 | 问题“如何提高学习效率?”通过词向量理解为学习方法类问题。 |
机器翻译 - 翻译模型优化 | 根据上下文词向量,准确翻译多义词“bank”为“银行”或“河岸”。 |
文本生成 - 创意写作辅助 | 输入“天空”,词向量推荐“湛蓝”等词语辅助创意写作。 |
2. Word2Vec
Word2veç算法的核心是将词向量的计算转换为机器学习的分类问题,将每个词的词向量看作模型参数进行训练,定义分类损失函数,通过梯度下降算法进行优化,最终将模型训练收敛后得到的参数作为最终的词向量。
1. CBOW 与 skip-gram
Word2Vec提出了两种分类问题的建模方式,即连续词袋模型(continuous bag-of-words model)和跳跃模型(skip-gram model)。
- CBOW给定上下文 c − k ⋯ c − 1 ? c 1 ⋯ c k c _ { - k } \cdots c _ { - 1 } ? c _ { 1 } \cdots c _ { k } c−k⋯c−1?c1⋯ck,判断中间词w;
- skip-gram模型给定中间词w,判断上下文词 c − k ⋯ c − 1 c 1 ⋯ c k c _ { - k } \cdots c _ { - 1 } c _ { 1 } \cdots c _ { k } c−k⋯c−1c1⋯ck的出现概率,如下图。
两种方法都采用独立性假设,如对于CBOW,将联合分布 P ( w ∣ c ) P ( w \vert c ) P(w∣c)分解为每一个上下文词 c i c _ { i } ci与当前词w条件概率的乘积,即 P ( w ∣ c ) = ∏ 1 ≤ ∣ i ∣ ≤ k P ( w ∣ c i ) P ( w \vert c ) = \prod _ { 1 \leq \vert i \vert \leq k } P ( w \vert c _ { i } ) P(w∣c)=∏1≤∣i∣≤kP(w∣ci).
两种方法训练得到的词向量效果都不错,但是skip-gram任务更难,效果更好。
2. 负采样
Word2Vec实际上是对词表的多分类问题,大规模的词表给具体计算带来很大困准,因此采用负采样的方法加快训练速度。
负采样的目的
负采样主要是为了优化词向量训练过程。在传统的基于神经网络的词向量模型(如 Word2Vec)训练中,计算词的概率分布通常要考虑整个词汇表,这在词汇量很大时会导致计算量过大。
例如,使用 Softmax 函数计算一个词在词汇表中的概率,需要对词汇表中的每个词都进行计算。负采样通过一种巧妙的方式减少了这种计算量,同时也能有效地学习词向量。
基本逻辑
正样本和负样本的定义
在词向量训练的语境中,正样本是指符合语义关联的词对。以 Skip - Gram 模型为例,中心词和它在文本中的上下文词构成正样本。比如在句子 “我喜欢读书” 中,(“喜欢”,“我”)和(“喜欢”,“读书”)是正样本。负样本则是不符合这种语义关联的词对,比如(“喜欢”,“跑步”),其中 “跑步” 在这个句子的上下文中与 “喜欢” 没有直接关联。
采样过程
对于每个正样本,会随机抽取一定数量(通常是一个较小的固定数量,如 5 - 20 个左右)的负样本。这个采样过程是基于词汇表中的词进行的。一般会根据词的频率等因素来确定每个词被采样为负样本的概率。通常,高频词被采样为负样本的概率会相对较高,但这个概率也会受到其他因素的影响,以保证采样的合理性。
训练调整:
在训练过程中,模型不再需要计算词汇表中所有词的概率,而是重点关注正样本和这些采样得到的负样本。对于正样本,希望模型预测它们出现的概率较高;对于负样本,希望模型预测它们出现的概率较低。
目标函数为
L ( θ ) = ∑ ( w , c i ϵ D + ) log P ( + ∣ w , c i ) + ∑ ( w , n i ∈ D − ) log P ( − ∣ w , n i ) L ( \theta ) = \sum _ { ( w , c _ { i } \epsilon D ^ { + } ) } \log P ( + \vert w , c _ { i } ) + \sum _ { ( w , n _ { i } \in D ^ { - } ) }\log P ( - \vert w , n _ { i }) L(θ)=(w,ciϵD+)∑logP(+∣w,ci)+(w,ni∈D−)∑logP(−∣w,ni)
训练目标是使得目标函数最大化,其中 w , c i w ,c _ { i } w,ci为正例 w , n i w,n_{i} w,ni为负例。
模型的目标是最大化(使得正样本的概率更接近1)正样本的预测概率,同时最小化(负样本的概率更接近0)负样本的预测概率。这样,训练过程只需要考虑部分词汇,从而减少了计算量。
通过这种方式,模型能够有效地学习到词之间的语义关系(下次遇见负样本的词句,就直接抛弃不加以训练),同时大大减少了计算量。
三. 基于神经网络的语言模型处理(ing)
1. 基于全连接神经网络的bgram模型
2. 基于LSTM的模型
四. 基于神经网络的机器翻译
Seq2Seq(Sequence - to - Sequence)模型主要用于处理序列到序列的转换问题,在自然语言处理领域应用广泛,如机器翻译、文本摘要、对话系统等。它由两个主要部分组成:编码器(Encoder)和解码器(Decoder)。
1. Seq2Seq
2. Beam Search
3. 基于注意力机制的Seq2Seq模型
4. 基于Transformer的Seq2Seq模型
五. 预训练语言模型的基本原理与方法
语言模型预训练是一种在自然语言处理(NLP)领域广泛使用的技术,特别是在Transformer 模型出现之后。
这种方法的核心思想是首先在大量无标注的数据上训练一个通用的语言模型,然后再将这个预训练模型微调(fine-tune)到特定的下游任务上。预训练模型能够捕捉到语言的通用特征和模式,而微调则可以让模型适应特定的任务需求。
预训练过程是无监督学习,微调一般需要标签属于监督学习。
下面介绍两种最经典的使用Transformer 模型进行预训练的范式:生成式(generative)建模和判别式(discriminative)建模。
1. GPT
GPT是由人工智能研究实验室OpenAI提出的一种预训练语言模型,基于Transformer架构设计。
核心思想
GPT模型的核心思想是利用大量无标注的文本数据进行预训练,收集大量语料并对每一个句子X建模 P ( x i ∣ x 1 x 2 ⋯ x i − 1 ) P ( x _ { i } \vert x _ { 1 } x _ { 2 } \cdots x _ { i - 1 } ) P(xi∣x1x2⋯xi−1),不需要Seq2Seq模型中的编码器,也无需交叉注意力层(cross attention layer),仅需要解码部分,即使用下三角矩阵为掩码的掩码自注意力(masked self-attention)作为计算核心即可,相较于Seq2Seq模型有了大幅的简化。
引领潮流
GPT最早由OpenAl公司开发,到2020年发布GPT-3时,模型总参数量已经达到了170B(1.7*1011),引领了大规模自然语言预训练模型的潮流。OpenAl通过GPT-3发现,当语言模型的参数量和训练数据量都足够大时,语言模型甚至可以和人一样进行高效率的推理。
零样本和少样本学习,协助大模型推理
- 我们可以直接把一个任意的问题作为GPT-3的输入前缀,并要求GPT-3根据给定前缀补全句子(也称为零样本学习,zero-shot learning)。
- GPT-3很多时候可以直接给出复杂问题的答案,甚至也可以把很少量的数据直接作为句子的前缀输入给GPT-3模型,GPT-3就可以根据输入的几个例子,直接补全出正确的输出,OpenAl在论文中称这种现象为语言模型的快速学习能力(也称为小样本学习,few-shot learning)。
2. BERT
BERT 全称为双向Transformer编码器表示(bidirectional encoder representations fromTransformers),主要为了自然语言处理中大量的非生成式任务设计。
GPT的局限与全局信息的重要性
在前面的介绍中,GPT建模简单,训练方式直接,但缺点在于仅能依赖前缀词的信息,虽然这样保证了语言的顺序生成,但是对于很多判别式任务,如文本分类、关系提取、情感分析等,文本的全局信息是非常重要的。若仅仅使用语言模型的单向顺序建模方式,会使模型的表达和特征提取能力大为受限。因而,对于不需要生成自然语言的判别式任务,我们希望建立预训练模型使词对其前后文信息都能够很好地表征。
基本逻辑:
BERT是一种预训练语言表示的方法,它使用深度双向Transformer编码器来学习大规模文本语料库中的复杂语言模式。BERT通过掩码语言模型(MLM)和下一句预测(NSP)两种预训练任务来学习语言表示,其中:
- NSP是判断两个句子是否是连续的文本, 用于学习句子间的关系
- MLM是指随机掩盖输入句子中的一些词,并让模型预测这些掩盖的词
成就:
- BERT由2018年由Google的研究员发表,并一举刷新子当时几乎所有自然语言处理任务的最佳成绩,如文本分类、问答系统、命名实体识别等任务震撼了整个领域。
- BERT的提出标志着NLP领域的一个重要转折点,它的双向上下文理解能力使得模型在理解语言的复杂性和细微差别方面取得了巨大进步。BERT的成功也催生了一系列基于Transformer的预训练模型,如RoBERTa、ALBERT等,进一步推动了NLP技术的发展。
3. 判别式与生成式建模方法的讨论
预训练生成器、预训练编码器
从Seq2seq模型的角度而言,生成式预训练模型采用无监督语料预训练了生成器,而判别式预训练模型则可以认为是预训练了编码器。在基于Transformer的Seq2Seq模型中,编码器中自注意力模块的掩码是全1的,即可以对整个上下文建模,而解码器由于需要顺序生成句子,因此使用了下三角矩阵作为自注意力机制的掩码。
生成式预训练:擅长文本输出,判别式预训练表征能力强
- 总体而言,生成式预训练模型更简单,擅长文本生成,也引出了全新的小样本学习和脚本学习的研究领域,但在非生成任务上表现会弱一些。
- 判别式预训练模型训练相对复杂,不擅长生成文本,但是表征能力更强,因此在实际应用中这两种预训练方式也需要有所取舍。
并行地生成整个句子
当然,能不能使用类似BERT的建模方式,采用Transformer直接并行地生成整个句子,而不需要像传统语言模型那样一个字一个字地按顺序生成一个句子?以机器翻译为例,能不能直接采用单个Transformer,即对于输入X,直接生成Y,而不需要编码器、解码器以及交叉注意力模块?
事实上,这种生成方式在自然语言处理领域被称为非自回归文本生成(non-autoregressive text generation)或非自回归机器翻译(non-autoregressive)。
非自回归方法由于可以一下子并行生成很长的句子,在测试阶段计算效率会比传统逐字解码的方式极大提高,因此在工业应用中有很大的前景。