AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


AIGC算法工程师面经:NLP基础篇——从分词、词表优化、词向量、词频、解码到设计分类模型(二)
发布日期:2024-05-10 21:35:58 浏览次数: 1864 来源:瓦力算法学研所


技术总结专栏

作者:vivida



从分词、词表优化、词向量、词频、解码以及构建一个完整的文本分类模型讲解NLP基础面试题。本篇主要讲词表优化、词向量部分。


目前国产的中文大语言对话模型众多,这里做一个基本盘点,并且在最后给出笔者本人在实际大模型部署后的一点使用感受。


本篇开始继续填AIGC算法工程师面经:NLP基础篇——从分词、词表优化、词向量、词频、解码到设计分类模型(一)的坑,所涉及到的理论知识和代码比较多,没有看第一篇的小伙伴强烈推荐看一下~


本系列将从分词、词表优化、词向量、词频、解码的理论和实践代码讲起,最终会将所有知识化零为整搭建一个完整的文本分类模型。


下面是一个快捷目录。第一篇讲了分词部分,本篇主要讲词表优化、词向量部分。


一、分词

1. 讲讲你知道的分词算法,前后向最大匹配、维特比算法(viterbi)、HMM等

2. 用代码实现文本的分词函数


二、词表优化

1. 训练时词表大小过大,输出层过大,有什么优化方法


三、词向量

1. 词向量有哪些embedding方式

2. 详细讲讲glove、word2vec

3. 详细讲讲目前的动态embedding

4. 动态embedding中,将得到的representation运用到下游任务有哪些方式,特点是什么


四、词频

1. 讲讲TF-TDF

2. 实现TF-TDF算法


五、解码

1. 讲讲Beam search 、Random sample策略

2. 手撕代码


六、文本分类模型构建

1. 停用词设计

2. 词的权重计算(TF-TDF)

3. 考虑否定词对分类效果的影响

4. 分类方法

5. 损失函数/概率设计

6. 加分项:手动分词、temperature等


 词表优化


1. 训练时词表大小过大,输出层过大,有什么优化方法


本质是在考word2vec中用到的经典词向量优化算法——层次 softmax(hierachical softmax) 和负采样( negative sampling)


来源是word2vec中,由于词库中词的数量V非常大,导致最后在计算softmax时的计算量非常大,因此提出了负采样和层次softmax方法来进行优化这一过程。


这里需要注意的是:负采样和层次softmax是两种独立的优化方法,具体实施时根据问题场景只选用一种方法就可以,基本上没有同时采用这两种方法进行优化的。


下面具体介绍这两种方法。


  • 负采样 negative sampling


1)适用场景


负采样适用的场景是结果中正例比较少而负例比较多的情形。


如word2vec,无论是CBOW模式还是skip-gram模型,整个词库词语数量为V,CBOW预测中间词,输出中只有中间词为1,其余词都为0;

skip-gram预测周围词,只有周围有限的n个词为1,其余都为0;

这两种模式下都是正例数很少,而负例数很多的情形。


2)算法原理


在上述实际情况下,负采样的思想就是取所有正样本和部分负样本,比如按照1比10的比例选取负样本,然后整个预测输出的规模就变小了,这样再去计算softmax的时候计算量就很小了。


使用过程中,一个单词被选作negative sample的概率跟它出现的频次有关,出现频次越高的单词越容易被选作negative words。负采样每次让一个训练样本仅仅更新一小部分的权重,这样就会降低梯度下降过程中的计算量。


  • 层次softmax


1)重温sigmod函数和softmax函数的区别


sigmoid函数



sigmod函数接收一个数值类型的输入值z,输出为一个0-1的值,所以sigmoid函数被用来进行二分类,输出大于0.5的为正例,小于0.5的为反例。


softmax函数



softmax计算的是某一项zj在所有可能的结果中出现的概率,一般类别大于2,分母的计算要用到所有类别项。


softmax函数常被用来进行多分类,计算每一个或某一个类别出现的概率。另外softmax可以由多个sigmod函数组合达到同样的效果,即二分类一直切分达到多分类的效果


2)算法原理


层次softmax名字里带着个softmax,其实跟softmax几乎没啥关系了。利用的就是前面提到的,用多个sigmoid函数,进行多次二分类以达到多分类的效果。



层次softmax首先利用树结构的叶节点表示词库中的每一个词,从根节点到叶节点的路径,每一个中间路径都对应着一个概率,某个词出现的概率的计算方式改为路径上所有中间路径概率的乘积,那么现在有一个问题就是中间路径的概率是怎么得到的,其实它们正是要学习的参数,但是它们是怎么表示的呢?


我们先看一下原本计算每个词出现的概率应该怎么算:


有一个或多个1* V的one-hot向量,经过输入层  V*D 的矩阵(CBOW模式多个输入取平均)变为 1*D ,再经过隐层(D*V)得到(1*V)的输出,再经softmax计算出各个词出现的概率;


改为层次softmax后:


输入 1*V 的one-hot向量,经 V*D 的矩阵得到 1*D ,然后就要改变了,每一个中间路节点(上图中实心球)对应一个向量,该向量的形状为(D,1),然后上面得到的 1*D 的向量与中间路径向量相乘,得到一个数值z,z输入到sigmoid函数得到一个0-1的数值,就是该节点到下一节点向左(或向右)的概率,另外一侧概率是1-sigmod(z),这样就得到了中间路径的概率。


前面说到,叶子节点(某个词)的概率就是从根节点到叶子节点中间路径概率的乘积;


同时层次softmax的目标函数也做出了改变,它的目标函数变为最大化目标词的路径概率,就是只关注目标词所在路径的概率,其他路径不再关注,也无需计算,这是层次softmax优化计算量的关键。


层次化softmax的树是二叉树,要学习的参数是中间节点向量,目标函数的计算只关注目标词的路径,计算复杂度只和路径长度有关,路径长度也就是树的高度,假设是满二叉树,则树高=V取2为底的对数值,远远小于V,另外还可以进一步优化,表示词语的树结构采用赫夫曼树,词频高的词语出现在最前面。路径最短,词频低的词语路径较长,这样在实际中可以进一步减少整体的计算量。赫夫曼树的相关知识不在本文讨论范围内,可自行了解。


总结一下,Hierarchical softmax通过构造一棵二叉树将目标概率的计算复杂度从最初的V降低到了logV的量级。但是也缺点是增加了词与词之间的耦合性;比如一个word出现的条件概率的变化会影响到其路径上所有非叶子节点的概率变化。间接地对其他word出现的条件概率带来影响。



 词向量


1. 词向量有哪些embedding方式


1)基于矩阵分解的方式,其中的代表方法是SVD;

2)基于内容的Embedding,它静态Embedding如word2vec、fasttext等和动态Embedding如ELMo、GPT、BERT等;


2. 详细讲讲glove、word2vec 


1)glove


glove算法学习策略本质是一个回归问题,就是通过将词对的词向量经过内积操作和平移变换去趋于词对共现次数的对数值;这里用的是误差平方和作为损失值。


也就是说词对共现次数越多的它有更大的权重将被惩罚得更厉害些,次数少的有更小的权重,这样就可以使得不常共现的词对对结果的贡献不会太小,而不会过分偏向于常共现的词对。


2)word2vec

  • skip-gram

利用类似于自动编码的器网络以中心词的one-hot表示作为输入来预测这个中心词环境中某一个词的one-hot表示,即先将中心词one-hot表示编码然后解码成环境中某个词的one-hot表示(多分类模型,损失函数用交叉熵)。


  • CBOW

跟skip-gram是反过来的,分别用环境中的每一个词去预测中心词。尽管word2vector在学习词与词间的关系上有了大进步,但是它有很明显的缺点:只能利用一定窗长的上下文环境,即利用局部信息,没法利用整个语料库的全局信息。


3. 详细讲讲目前的动态embedding 

主要讲三种:ELMo、GPT、BERT



1)ELMo


ELMo训练了两个LM  —— 一个forward LM  ,一个backward LM(在BERT的论文中被称为left-to-right LM和right-to-left的LM);但特征提取用的是LSTM



特别需要指出的是,ELMo中,每个LM在预测下一个token(后一个或前一个)时,都没有利用到句子的另一半段/另一个方向/另一个LM的信息,这一点与BERT很容易混淆,需要注意区分。 


2)GPT


GPT只训练了一个前向的LM

特征提取器使用的是Transformer Decoder


3)BERT


  • Masked LM(MLM)


随机选择输入序列中15%的WordPiece,然后使用这15%的WordPiece的输出用于预测输入。



为了缓和pre-training与fine-tuning阶段的mismatch(pre-training阶段有[MASK]字符,而fine-tuning阶段没有),对于选中的15%,按80%概率将其替换为特殊字符[MASK],按10%概率将其替换为一个随机的token,按10%概率不做任何替换。


  • Next Sentence Prediction (NSP)


在将两个序列用特殊字符[SEP]拼接起来,然后在开头加上特殊字符[CLS]表示分类(classification),然后使用[CLS]对应的输出用于预测这两个序列是否是相邻的。



另外,关于ELMo、GPT、还有一些点需要注意,强调一下:


  • BERT的语言模型是MLM,并不是“用之前看到的词预测下一个词”这种语言模型任务,而是需要看到整句话(除了15%被mask的词),相当于Transformer Encoder。

  • ELMo没有使用双向LSTM,原文指出:We tie the parameters for both the token represen-tation and Softmax layer in the forwardand backward direction while maintaining separate parameters for the LSTMs in each direction;也就是一个单独的前向LSTM和一个单独的后向LSTM,这两个方向参数是不共享的。

  • ELMo并非直接将预训练得到的biLM的参数固定,而是在应用到具体的任务之前,先用该任务的数据集(如果有label则忽略label)当做LM的语料来fine-tune参数(只需要训练一个epoch),然后再固定biLM的参数,用于抽取representation。

  • GPT以及BERT运用到下游任务的策略是fine-tuning,这与平时所说的fine-tune是有区别的。一般的fine-tune可以译为“微调”,是范围比较宽的微调概念。  例如ELMo在用于下游任务时也要fine-tune。而GPT和BERT的fine-tuning*其实等价于GPT的论文中task-specific input transformation,专门用于指这种将得到预训练得到的representation运用到下游任务的策略。

  • 在BERT的作者看来(见BERT论文的Introduction部分),ELMo的biLM本质上也是unidirectional language model(单向语言模型),称之为“a shallow concatenation of independently trained left-to-right and right-to-left LMs.”,而BERT才是“deeply bidirectional”的。


4. 动态embedding中,将得到的representation运用到下游任务有哪些方式,特点是什么


主要是两种策略:

feature-based和fine-tuning


  • feature-based



固定预训练模型的参数,抽取预训练模型的hidden states作为下游任务的额外/辅助的特征(additional / auxiliary features),与下游任务的embedding拼接起来。优点在于非常灵活,几乎不必改动下游任务的网络架构,所以适用于所有下游任务。


  • fine-tuning


在预训练模型的适当位置加上分类层(FFN+Softmax),直接将其作为下游任务的网络架构,并将下游任务的数据集做适当的转换使其符合预训练模型的输入方式。优点在于需要train from scratch的参数非常少,所以需要的训练时间更少,也往往效果更好,特别是下游任务数据集较小时。


这里附上transformer和BERT中经典的图




最后我们来做一个总结。



53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询