https://blog.csdn.net/qq_39309652/article/details/121008114
Jieba分词的原理是什么
首先用正则表达式将中文段落粗略的分成一个个句子。
将每个句子构造成有向无环图,之后寻找最佳切分方案。
最后对于连续的单字,采用HMM模型将其再次划分。
特征工程的常用方法
对时间戳处理
对离散型变量进行独热编码
对连续型变量进行分箱/分区
特征缩放
特征选择
特征衍生(特征交叉)
随机森林和GBDT区别
随机森林采用的bagging思想,而GBDT采用的boosting思想。这两种方法都是Bootstrap思想的应用,Bootstrap是一种有放回的抽样方法思想。虽然都是有放回的抽样,但二者的区别在于:Bagging采用有放回的均匀取样,而Boosting根据错误率来取样(Boosting初始化时对每一个训练样例赋相等的权重1/n,然后用该算法对训练集训练t轮,每次训练后,对训练失败的样例赋以较大的权重),因此Boosting的分类精度要优于Bagging。Bagging的训练集的选择是随机的,各训练集之间相互独立,弱分类器可并行,而Boosting的训练集的选择与前一轮的学习结果有关,是串行的。
组成随机森林的树可以是分类树,也可以是回归树;而GBDT只能由回归树组成。
组成随机森林的树可以并行生成;而GBDT只能是串行生成。
对于最终的输出结果而言,随机森林采用多数投票等;而GBDT则是将所有结果累加起来,或者加权累加起来。
随机森林对异常值不敏感;GBDT对异常值非常敏感。
随机森林对训练集一视同仁;GBDT是基于权值的弱分类器的集成。
随机森林是通过减少模型方差提高性能;GBDT是通过减少模型偏差提高性能。
xgboost和lightgbm区别
内存更小
XGBoost 使用预排序后需要记录特征值及其对应样本的统计值的索引,而 LightGBM 使用了直方图算法将特征值转变为 bin 值,且不需要记录特征到样本的索引,将空间复杂度大大降低,极大的减少了内存消耗;LightGBM 采用了直方图算法将存储特征值转变为存储 bin 值,降低了内存消耗;LightGBM 在训练过程中采用互斥特征捆绑算法减少了特征数量,降低了内存消耗。
速度更快
LightGBM 采用了直方图算法将遍历样本转变为遍历直方图,极大的降低了时间复杂度;LightGBM 在训练过程中采用单边梯度算法过滤掉梯度小的样本,减少了大量的计算;LightGBM 采用了基于 Leaf-wise 算法的增长策略构建树,减少了很多不必要的计算量;LightGBM 采用优化后的特征并行、数据并行方法加速计算,当数据量非常大的时候还可以采用投票并行的策略;LightGBM 对缓存也进行了优化,增加了 Cache hit 的命中率。
LSTM的结构
解析:包括遗忘门,输入门和输出门三种。
GRU与LSTM区别
(1)LSTM和GRU的性能在很多任务上不分伯仲;
(2)GRU参数更少,因此更容易收敛,但是在大数据集的情况下,LSTM性能表现更好;
(3)GRU 只有两个门(update和reset),LSTM 有三个门(forget,input,output),GRU 直接将hidden state 传给下一个单元,而 LSTM 用memory cell 把hidden state 包装起来。
RNN BPTT的机制
BPTT(back-propagation through time)算法是常用的训练RNN的方法,其实本质还是BP算法,只不过RNN处理时间序列数据,所以要基于时间反向传播,故叫随时间反向传播。BPTT的中心思想和BP算法相同,沿着需要优化的参数的负梯度方向不断寻找更优的点直至收敛。综上所述,BPTT算法本质还是BP算法,BP算法本质还是梯度下降法。
RNN为什么会出现梯度消失或者梯度爆炸
在RNN中经常遇到梯度消失和爆炸现象的原因:很难捕捉到长期的依赖关系,因为乘法梯度可以随着层的数量呈指数递减/递增。
sigmoid和softmax的区别
Softmax函数是二分类函数Sigmoid在多分类上的推广,目的是将多分类的结果以概率的形式展现出来。最大的区别在于softmax的计算的是一个比重,而sigmoid只是对每一个输出值进行非线性化。
描述下DeepFM模型
在处理CTR预估问题中,传统的方法有一个共同的缺点:对于低阶的组合特征,学习到的比较少;但是低阶特征对于CTR也非常重要,于是Google为了同时学习低阶和高阶组合特征,提出了 Wide&Deep 模型:混合了一个 线性模型(Wide part)和 Deep 模型 (Deep part);这两部分模型需要不同的输入,其中Wide part部分的输入仍然依赖人工特征工程;
此时模型存在两个问题:
偏向于提取低阶或者高阶的组合特征,不能同时提取这两种类型的特征;
需要专业的领域知识来做特征工程;
DeepFM 在 Wide&Deep 的基础上进行改进,成功解决了上述这两个问题,并做了一些优化;
优点如下:
不需要预训练FM得到隐向量;
不需要人工特征工程;
能同时学习低阶和高阶的组合特征;
FM模块和Deep 模块共享 Feature Embedding 部分,可以更快、更精确的训练;
训练集、测试集和验证集的作用,训练的时候为什么要进行shuffle
首先用训练集训练出模型,然后用验证集验证模型(注意:这是一个中间过程,此时最好的模型还未选定),根据情况不断调整模型,选出其中最好的模型(验证误差用于指导我们选择哪个模型),记录最好的模型的各项设置,然后据此再用(训练集+验证集)数据训练出一个新模型,作为最终的模型,最后用测试集评估最终的模型。
进行shuffle:打乱数据之间的顺序,让数据随机化,避免过拟合
CNN原理及优
缺点
CNN是一种前馈神经网络,通常包含5层,输入层,卷积层,激活层,池化层,全连接FC层,其中核心部分是卷积层和池化层。
优点:共享卷积核,对高维数据处理无压力;无需手动选取特征。
缺点:需要调参;需要大量样本。
word2vec的两种优化方式
基于层序 softmax 的模型
首先构建哈夫曼树,即以词频作为 n 个词的节点权重,不断将最小权重的节点进行合并,最终形成一棵树,权重越大的叶子结点越靠近根节点,权重越小的叶子结点离根节点越远。
然后进行哈夫曼编码,即对于除根节点外的节点,左子树编码为1,右子树编码为0。
最后采用二元逻辑回归方法,沿着左子树走就是负类,沿着右子树走就是正类,从训练样本中学习逻辑回归的模型参数。
基于负采样的模型
通过采样得到少部分的负样本,对正样本和少部分的负样本,利用二元逻辑回归模型,通过梯度上升法,来得到每个词对应的模型参数。具体负采样的方法为:根据词频进行采样,也就是词频越大的词被采到的概率也越大。
描述下CRF模型及应用
给定一组输入随机变量的条件下另一组输出随机变量的条件概率分布密度。条件随机场假设输出变量构成马尔科夫随机场,而我们平时看到的大多是线性链条随机场,也就是由输入对输出进行预测的判别模型。求解方法为极大似然估计或正则化的极大似然估计。
CRF模型通常应用于优化命名实体识别任务。
CNN的卷积公式
逻辑回归用的什么损失函数
transformer结构
Transformer本身是一个典型的encoder-decoder模型,Encoder端和Decoder端均有6个Block,Encoder端的Block包括两个模块,多头self-attention模块以及一个前馈神经网络模块;Decoder端的Block包括三个模块,多头self-attention模块,多头Encoder-Decoder attention交互模块,以及一个前馈神经网络模块;需要注意:Encoder端和Decoder端中的每个模块都有残差层和Layer Normalization层。
elmo 和 Bert的区别
BERT采用的是Transformer架构中的Encoder模块;
GPT采用的是Transformer架构中的Decoder模块;
ELMo采用的双层双向LSTM模块。
优点:计算量由V(单词总数)减小为 log2V;高频词靠近根节点,所需步数小,低频词远离根节点。
elmo 和 word2vec 的区别
elmo 词向量是包含上下文信息的,不是一成不变的,而是根据上下文而随时变化。
lstm 与 GRU区别
(1)LSTM和GRU的性能在很多任务上不分伯仲;
(2)GRU参数更少,因此更容易收敛,但是在大数据集的情况下,LSTM性能表现更好;
(3)GRU 只有两个门(update和reset),LSTM 有三个门(forget,input,output),GRU 直接将hidden state 传给下一个单元,而 LSTM 用memory cell 把hidden state 包装起来。
BERT 的基本原理是什么?
BERT 来自 Google 的论文Pre-training of Deep Bidirectional Transformers for Language Understanding[1],BERT 是“Bidirectional Encoder Representations from Transformers”的首字母缩写,整体是一个自编码语言模型(Autoencoder LM),并且其设计了两个任务来预训练该模型。
第一个任务是采用 MaskLM 的方式来训练语言模型,通俗地说就是在输入一句话的时候,随机地选一些要预测的词,然后用一个特殊的符号[MASK]来代替它们,之后让模型根据所给的标签去学习这些地方该填的词。
第二个任务在双向语言模型的基础上额外增加了一个句子级别的连续性预测任务,即预测输入 BERT 的两段文本是否为连续的文本,引入这个任务可以更好地让模型学到连续的文本片段之间的关系。
最后的实验表明 BERT 模型的有效性,并在 11 项 NLP 任务中夺得 SOTA 结果。
BERT 相较于原来的 RNN、LSTM 可以做到并发执行,同时提取词在句子中的关系特征,并且能在多个不同层次提取关系特征,进而更全面反映句子语义。相较于 word2vec,其又能根据句子上下文获取词义,从而避免歧义出现。同时缺点也是显而易见的,模型参数太多,而且模型太大,少量数据训练时,容易过拟合。
BERT 是怎么用 Transformer 的?
BERT 的训练过程是怎么样的?
在论文原文中,作者提出了两个预训练任务:Masked LM 和 Next Sentence Prediction。
「Masked LM」
Masked LM 的任务描述为:给定一句话,随机抹去这句话中的一个或几个词,要求根据剩余词汇预测被抹去的几个词分别是什么
BERT 模型的这个预训练过程其实就是在模仿我们学语言的过程,思想来源于「完形填空」的任务。具体来说,文章作者在一句话中随机选择 15% 的词汇用于预测。对于在原句中被抹去的词汇, 80% 情况下采用一个特殊符号 [MASK] 替换, 10% 情况下采用一个任意词替换,剩余 10% 情况下保持原词汇不变。
这么做的主要原因是:在后续微调任务中语句中并不会出现 [MASK] 标记,而且这么做的另一个好处是:预测一个词汇时,模型并不知道输入对应位置的词汇是否为正确的词汇( 10% 概率),这就迫使模型更多地依赖于上下文信息去预测词汇,并且赋予了模型一定的纠错能力。上述提到了这样做的一个缺点,其实这样做还有另外一个缺点,就是每批次数据中只有 15% 的标记被预测,这意味着模型可能需要更多的预训练步骤来收敛。
Next Sentence Prediction
Next Sentence Prediction 的任务描述为:给定一篇文章中的两句话,判断第二句话在文本中是否紧跟在第一句话之后
这个类似于「段落重排序」的任务,即:将一篇文章的各段打乱,让我们通过重新排序把原文还原出来,这其实需要我们对全文大意有充分、准确的理解。
Next Sentence Prediction 任务实际上就是段落重排序的简化版:只考虑两句话,判断是否是一篇文章中的前后句。在实际预训练过程中,文章作者从文本语料库中随机选择 50% 正确语句对和 50% 错误语句对进行训练,与 Masked LM 任务相结合,让模型能够更准确地刻画语句乃至篇章层面的语义信息。
BERT 模型通过对 Masked LM 任务和 Next Sentence Prediction 任务进行联合训练,使模型输出的每个字 / 词的向量表示都能尽可能全面、准确地刻画输入文本(单句或语句对)的整体信息,为后续的微调任务提供更好的模型参数初始值。
为什么 BERT 比 ELMo 效果好?ELMo 和 BERT 的区别是什么
从网络结构以及最后的实验效果来看,BERT 比 ELMo 效果好主要集中在以下几点原因:
LSTM 抽取特征的能力远弱于 Transformer
拼接方式双向融合的特征融合能力偏弱(没有具体实验验证,只是推测)
其实还有一点,BERT 的训练数据以及模型参数均多余 ELMo,这也是比较重要的一点
ELMo 和 BERT 的区别是什么?
ELMo 模型是通过语言模型任务得到句子中单词的 embedding 表示,以此作为补充的新特征给下游任务使用。因为 ELMO 给下游提供的是每个单词的特征形式,所以这一类预训练的方法被称为“Feature-based Pre-Training”。而 BERT 模型是“基于 Fine-tuning 的模式”,这种做法和图像领域基于 Fine-tuning 的方式基本一致,下游任务需要将模型改造成 BERT 模型,才可利用 BERT 模型预训练好的参数。
BERT 有什么局限性?
BERT 在第一个预训练阶段,假设句子中多个单词被 Mask 掉,这些被 Mask 掉的单词之间没有任何关系,是条件独立的,然而有时候这些单词之间是有关系的,比如”New York is a city”,假设我们 Mask 住”New”和”York”两个词,那么给定”is a city”的条件下”New”和”York”并不独立,因为”New York”是一个实体,看到”New”则后面出现”York”的概率要比看到”Old”后面出现”York”概率要大得多。
但是需要注意的是,这个问题并不是什么大问题,甚至可以说对最后的结果并没有多大的影响,因为本身 BERT 预训练的语料就是海量的(动辄几十个 G),所以如果训练数据足够大,其实不靠当前这个例子,靠其它例子,也能弥补被 Mask 单词直接的相互关系问题,因为总有其它例子能够学会这些单词的相互依赖关系。
BERT 的在预训练时会出现特殊的[MASK],但是它在下游的 fine-tune 中不会出现,这就出现了预训练阶段和 fine-tune 阶段不一致的问题。其实这个问题对最后结果产生多大的影响也是不够明确的,因为后续有许多 BERT 相关的预训练模型仍然保持了[MASK]标记,也取得了很大的结果,而且很多数据集上的结果也比 BERT 要好。但是确确实实引入[MASK]标记,也是为了构造自编码语言模型而采用的一种折中方式。
另外还有一个缺点,是 BERT 在分词后做[MASK]会产生的一个问题,为了解决 OOV 的问题,我们通常会把一个词切分成更细粒度的 WordPiece。BERT 在 Pretraining 的时候是随机 Mask 这些 WordPiece 的,这就可能出现只 Mask 一个词的一部分的情况,例如:
BERT 的输入和输出分别是什么
BERT 模型的主要输入是文本中各个字/词(或者称为 token)的原始词向量,该向量既可以随机初始化,也可以利用 Word2Vector 等算法进行预训练以作为初始值;输出是文本中各个字/词融合了全文语义信息后的向量表示,如下图所示(为方便描述且与 BERT 模型的当前中文版本保持一致,统一以「字向量」作为输入):
BERT 的MASK方式的优缺点?
BERT的mask方式:在选择mask的15%的词当中,80%情况下使用mask掉这个词,10%情况下采用一个任意词替换,剩余10%情况下保持原词汇不变。
优点:1)被随机选择15%的词当中以10%的概率用任意词替换去预测正确的词,相当于文本纠错任务,为BERT模型赋予了一定的文本纠错能力;2)被随机选择15%的词当中以10%的概率保持不变,缓解了finetune时候与预训练时候输入不匹配的问题(预训练时候输入句子当中有mask,而finetune时候输入是完整无缺的句子,即为输入不匹配问题)。
缺点:针对有两个及两个以上连续字组成的词,随机mask字割裂了连续字之间的相关性,使模型不太容易学习到词的语义信息。主要针对这一短板,因此google此后发表了BERT-WWM,国内的哈工大联合讯飞发表了中文版的BERT-WWM。
BERT中的NSP任务是否有必要?
答:在此后的研究(论文《Crosslingual language model pretraining》等)中发现,NSP任务可能并不是必要的,消除NSP损失在下游任务的性能上能够与原始BERT持平或略有提高。这可能是由于Bert以单句子为单位输入,模型无法学习到词之间的远程依赖关系。针对这一点,后续的RoBERTa、ALBERT、spanBERT都移去了NSP任务。
BERT深度双向的特点,双向体现在哪儿?
答:BERT使用Transformer-encoder来编码输入,encoder中的Self-attention机制在编码一个token的时候同时利用了其上下文的token,其中‘同时利用上下文’即为双向的体现,而并非想Bi-LSTM那样把句子倒序输入一遍。
BERT深度双向的特点,深度体现在哪儿?
答:针对特征提取器,Transformer只用了self-attention,没有使用RNN、CNN,并且使用了残差连接有效防止了梯度消失的问题,使之可以构建更深层的网络,所以BERT构建了多层深度Transformer来提高模型性能。
BERT中并行计算体现在哪儿?
答:不同于RNN计算当前词的特征要依赖于前文计算,有时序这个概念,是按照时序计算的,而BERT的Transformer-encoder中的self-attention计算当前词的特征时候,没有时序这个概念,是同时利用上下文信息来计算的,一句话的token特征是通过矩阵并行‘瞬间’完成运算的,故,并行就体现在self-attention。
BERT中Transformer中的Q、K、V存在的意义?
答:在使用self-attention通过上下文词语计算当前词特征的时候,X先通过WQ、WK、WV线性变换为QKV,然后如下式右边部分使用QK计算得分,最后与V计算加权和而得。
倘若不变换为QKV,直接使用每个token的向量表示点积计算重要性得分,那在softmax后的加权平均中,该词本身所占的比重将会是最大的,使得其他词的比重很少,无法有效利用上下文信息来增强当前词的语义表示。
而变换为QKV再进行计算,能有效利用上下文信息,很大程度上减轻上述的影响。
BERT中Transformer中Self-attention后为什么要加前馈网络?
答:由于self-attention中的计算都是线性了,为了提高模型的非线性拟合能力,需要在其后接上前馈网络。
BERT中Transformer中的Self-attention多个头的作用?
类似于cnn中多个卷积核的作用,使用多头注意力,能够从不同角度提取信息,提高信息提取的全面性。
下列哪些是语料库的可能性特征?
文本中词的总数
布尔特征——文本中词的出现
词的向量标注
语音标注部分
基本依赖性语法
整个文本作为一个特征
答案:
12345
解析
除了全部文本作为特征这个选项,其余均可被用作文本分类特征,从而来对模型进行学习。
下列那种模型可以被用于文本相似度(document similarity)问题?
A、在语料中训练一个由词到向量(word 2 vector)的模型来对文本中呈现的上下文语境进行学习
B、训练一个词包模型(a bag of words model)来对文本中的词的发生率(occurrence)进行学习
C、创建一个文献检索词矩阵(document-term matrix)并且对每一个文本应用余弦相似性
D、上述所有方法均可
ord2vec 模型可在基于上下文语境的情况下用于测量文本相似度。词包模型(Bag Of Words)和文献检索词矩阵(document term matrix)可以在基于词条的情况下用来测量相似度。
文本分类模型组成部分的正确顺序是:
文本清理(Text cleaning) 2. 文本标注(Text annotation) 3. 梯度下降(Gradient descent) 4. 模型调优(Model tuning) 5. 文本到预测器(Text to predictors)
正确的文本分类模型包含——文本清理以去除噪声,文本标注以创建更多特征,将基于文本的特征转换为预测器,使用梯度下降学习一个模型,并且最终进行模型调优。
关于无语境依赖关系图(context-free dependency graph),句子里有多少子决策树(sub-trees)?
依赖关系图中的子决策树可以被看做是拥有外部连接的节点,例如:Media, networking, play, role, billions, 和 lives 是子决策树的根。
Word2vec 模型是一种用于给文本目标创建矢量标记的机器学习模型。对于Word2vec,它包含多个深度神经网络,这么说对么?
Word2vec 也包含预处理模型(preprocessing mode),它不属于深度神经网络。
下列哪种方法不是灵活文本匹配的一部分?
A、字符串语音表示(Soundex)
B、语音发声散列(Metaphone)
C、编辑距离算法(Edit Distance)
D、关键词哈希算法(Keyword Hashing)
除了关键词哈希算法,其它所有方法都用于灵活字串匹配
参阅以下的文档词矩阵 在整个语料库中使用最大次数的词和它的词频分别是?
t3 在整个语料库中的使用的最大次数是 3,t3 的词频是 3/(2+1+3)=3/6
参阅以下的文档词矩阵 下面哪个文档包含相同数量的词条,并且在整个语料库中其中一个文档的词数量不等同于其他任何文档的最低词数量。
答案:
d2 和 d4
解析:文章d1包含6个词条,重复也算,d2包含4个,d3包含3个,d4包含4个,d5包含3个,d6包含3个,d7包含3个,而且最低词数量为3,所以选择d2和d4
参阅以下的文档词矩阵 语料库中最常见和最稀少的词条分别是什么?
答案:
t4、t6
解析
t4和t5出现的文档数最多,二者相比之下,t4出现的总次数较多,故最常见的词条是t4;t6只在 d3 和 d4 中出现,在语料库中出现的次数也最少,故最稀少的词条是t6。
在包含 N 个文档的语料库中,随机选择一个文档。该文件总共包含 T 个词,词条「数据」出现 K 次。如果词条「数据」出现在文件总数的数量接近三分之一,则 TF(词频)和 IDF(逆文档频率)的乘积的正确值是多少?
TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。
TF-IDF实际上是:TF * IDF
TF是词频(Term Frequency)
IDF是逆向文件频率(Inverse Document Frequency)
所以
T F = K / T TF=K/T
TF=K/T
,
I D F = l o g ( 1 / ( 1 / 3 ) ) = l o g ( 3 ) IDF=log(1/(1/3))=log(3)
IDF=log(1/(1/3))=log(3)
故答案为
k l o g ( 3 ) / T klog(3)/T
klog(3)/T
Warmup的作用
Warmup是Transformer训练的关键步骤,没有它可能不收敛,或者收敛到比较糟糕的位置。Warmup是在训练开始阶段,将学习率从0缓增到指定大小,而不是一开始从指定大小训练。如果不进行Wamrup,那么模型一开始就快速地学习,由于梯度消失,模型对越靠后的层越敏感,也就是越靠后的层学习得越快,然后后面的层是以前面的层的输出为输入的,前面的层根本就没学好,所以后面的层虽然学得快,但却是建立在糟糕的输入基础上的。如果进行Wamrup,那么留给模型足够多的时间进行“预热”,在这个过程中,主要是抑制了后面的层的学习速度,并且给了前面的层更多的优化时间,以促进每个层的同步优化。
梯度是什么
梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。
词向量
Bert相比Word2Vec解决了其什么痛点?
一词多意。
Word2Vec在训练时结合了上下文并得到了静态向量,每个词可以唯一对应一个向量。但是在测试时,同一个词上下文可能不同,但是映射后的向量是相同的,这显然是不合理的。Bert却不同,因为self-attention机制,测试阶段其也是结合了上下文的,词向量是动态变化的。
词向量平均法做分类的优劣势是什么?
优势
词向量平均的方法做分类模型,主要的优势是模型简单
有参数模型,无参数模型都可以尝试使用,模型选择大
模型速度极快,训练的参数量少
在语句少的场景下,效果好
劣势
在语句长的长的场景下,效果会变的很差
语句长,分出的词多,词越多,信息量越杂,简单的做平均的话,重要的词的信息会在平均的过程中极大的被消弱,从而分类效果差
词向量的基础上如何做优化?
映入一个新的向量,做attention,此向量专门对重要的,和标签相关的词敏感。从而通过加权平均的方式,得到的句向量只包含重要词的信息,忽略不重要的词的信息,从而加强模型的效果。
使用self-attention, 尝试对语句里词的分布做重新的调整,提高模型的学习能力
使用Transformer encoder或者bert来做学习
Bert模型和Transformer模型之间的关系?
Transformer模型有encoder和decoder
Bert其实就是Transformer的encoder的部分
Transformer只是一个空模型,里面的参数都是随机的,需要在下游任务上做有监督的训练,由于参数量大,直接使用Transformer做训练,模型难收敛,并且速度慢
Bert其实是预训练好的Transformer的encoder部分,也就是已经在海量的数据集上做了Transformer的参数的训练了,其参数可以保存下来,直接拿来在下游任务上使用,做调优。
在Transformer中,是六层编码器,六层解码器。源数据经过编码器的中间向量与目标一起送入解码器。Bert原论文中,只使用了编码器,并将层数扩展为12层。利用经过12层编码器得到的向量来做预训练任务。
Bert模型中有哪些预训练的任务?
首先是MLM任务,masked language model。随机的mask掉一些词,从而基于上下文,通过attention的方法来训练,来预测mask的词。
NSP任务,Next Sentence Prediction任务。通过CLS的来进行二分类,查看当前两个句子是否是上下文。词任务的有效性在各大论文中也是有争议的,有的说这个任务有用,有的说这个任务没用。
Bert模型的做句向量的缺陷?
直接使用Bert做句向量的输出,会发现所有的句向量两两相似度都很高。
因为对于句子来说,大多数的句子都是使用常见的词组成的
Bert的词向量空间是非凸的,大量的常见的词向量都是在0点附近,从而计算出的句子向量,都很相似
如何解决Bert句向量的缺陷?
使用双卡的形式,将两个句子传入两个参数共享的Bert模型,将两个句向量做拼接,进行有监督的学习,从而调整Bert参数。此方法叫sentencebert。
使用无监督或者有监督的对比学习,将同一个句子传入相同的bert(dropout = 0.3)得到标签为正例的一个句子对。通过这种方式来做Bert的微调整,得到SimCSE模型。
词向量稀疏,用CBOW好还是skip-gram好呢
举个简单的例子,给一句训练语料,“昨天是高兴的一天”如果用CBOW来训练。
大家都知道CBOW是用context word来预测center word,所以是拿“昨天、是、的、一天”这些词的向量,先求平均,再喂入softmax,预测center word是“高兴”的概率。第1个后果,这一句话,针对“高兴”这一个center word,只产生一条训练样本。
如果训练语料充足,这是一条优势,避免训练集肿胀得太厉害;而如果训练语料不足,这是一条劣势。第2个后果,训练结果偏向常用词。“昨天 是 xxx 的一天”,填空中间词,大概率会填写成“高兴”、“悲伤”、“愉快”等常见词,而不太可能填写成"悲喜交加"、"峰回路转"这样不太常见的词。因为前者的训练语料更充足,"寡头统治"了整个模型
如果用SkipGram训练,即用center word预测context word,也就是,分别预测【昨天/是/的/一天】能否发现在“高兴”的周围第1个后果,这一句话,针对“高兴”这一个center word,就产生了4条样本。因此非常适合小训练集,因为能够衍生出更多的训练样本第2个后果,训练结果对于罕见词、罕见搭配更加友好。
上面说了,语料库里有“昨天是高兴的一天”和“昨天是悲喜交加的一天”两句话,前者出现的次数更频繁如果用CBOW训练,“昨天是xxx的一天”,大概率会把xxx填写成 “高兴”。而如果用SkipGram来训练,“悲喜交加”不是在和“高兴”竞争。模型是见到的是,“悲喜交加+昨天”、“悲喜交加+一天”这些词的搭配。罕见词、罕见搭配能够有更多的训练机会。
原论文中Q、K矩阵相乘为什么最后要除以√d_k
当√d_k特别小的时候,其实除不除无所谓。无论编码器还是解码器Q、K矩阵其实本质是一个相同的矩阵。Q、K相乘其实相等于Q乘以Q的转置,这样造成结果会很大或者很小。小了还好说,大的话会使得后续做softmax继续被放大造成梯度消失,不利于梯度反向传播。
原论中编码器与解码器的Embedding层的权重为什么要乘以√d_model
Bert模型中多头的作用
多次attention综合的结果至少能够起到增强模型的作用,也可以类比CNN中同时使用多个卷积核的作用,直观上讲,多头的注意力有助于网络捕捉到更丰富的特征/信息。
BPE的了解
BPE与Wordpiece都是首先初始化一个小词表,再根据一定准则将不同的子词合并。词表由小变大。
BPE与Wordpiece的最大区别在于,如何选择两个子词进行合并:BPE选择频数最高的相邻子词合并,而WordPiece选择能够提升语言模型概率最大的相邻子词加入词表。
mask策略和改进
从bert最开始的mask token 到后面ernie的 mask entity以及还有mask n-gram,动态mask等等。
Bert模型中激活函数GELU
GELU函数是RELU的变种,形式如下:
部分激活函数的公式及求导
常见的激活函数有:Sigmoid、Tanh、ReLU
特点︰
它能够把输入的连续实值变换为0和1之间的输出,特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1。
缺点:
缺点1:在深度神经网络中梯度反向传递时导致梯度消失,其中梯度爆炸发生的概率非常小,而梯度消失发生的概率比较大。
缺点2:Sigmoid 的output不是0均值(即zero-centered)。
缺点3:其解析式中含有幂运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,这会较大地增加训练时间。
特点︰它解决了Sigmoid函数的不是zero-centered输出问题,收敛速度比sigmoid要快,然而,梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。
特点︰
ReLu函数是利用阈值来进行因变量的输出,因此其计算复杂度会比剩下两个函数低(后两个函数都是进行指数运算)
ReLu函数的非饱和性可以有效地解决梯度消失的问题,提供相对宽的激活边界。
ReLU的单侧抑制提供了网络的稀疏表达能力。
神经网络有哪些初始化的方法、为什么要初始化?
不初始化可能会减慢收敛速度,影响收敛效果。
如果使用的是预训练模型,是不需要自己进行初始化的,只有没有预训练模型的时候需要初始化。
GBDT为什么拟合负梯度而不是残差
函数中下降最快的方向是导数方向,同理:GBDT中,损失函数减小最快的方向也是本身的导数方向。当损失函数为均方误差时,损失函数的负梯度和残差一样,但当损失函数不为均方误差时,本质上拟合的还是负梯度。
NLG的评估指标有哪些
BLEU (Bilingual Evaluation Understudy)
ROUGE (Recall Oriented Understudy for Gisting Evaluation)
BLEU是机器翻译中使用最广泛的评估指标,可以看成是精确率。
神经网络有什么调参技巧?
哪些参数可以调?
网络设计相关参数:网络层数、不同层的搭建顺序、隐藏层神经元的参数设置、loss的选择、正则化参数
训练过程相关参数:网络权重初始化方法、学习率、迭代次数、batch_size。
什么时候需要调参?
欠拟合:优化数据集(数据清洗)、增加训练迭代次数、添加更多的层,增大神经元参数等
过拟合:增加样本数量(数据增强),加正则化参数(dropout),使用早停机制等
Transformer如何解决梯度消失问题?
残差
为何Transformer中使用LN而不用BN
BatchNorm是对一个batch-size样本内的每个特征做归一化,LayerNorm是对每个样本的所有特征做归一化。
形象点来说,假设有一个二维矩阵。行为batch-size,列为样本特征。那么BN就是竖着归一化,LN就是横着归一化。
它们的出发点都是让该层参数稳定下来,避免梯度消失或者梯度爆炸,方便后续的学习。但是也有侧重点。
一般来说,如果你的特征依赖于不同样本间的统计参数,那BN更有效。因为它抹杀了不同特征之间的大小关系,但是保留了不同样本间的大小关系。(CV领域)
而在NLP领域,LN就更加合适。因为它抹杀了不同样本间的大小关系,但是保留了一个样本内不同特征之间的大小关系。对于NLP或者序列任务来说,一条样本的不同特征,其实就是时序上字符取值的变化,样本内的特征关系是非常紧密的。
虽然Post Norm会带来一定的梯度消失问题,但其实它也有其他方面的好处。最明显的是,它稳定了前向传播的数值,并且保持了每个模块的一致性
其次,梯度消失也不全是“坏处”,其实对于Finetune阶段来说,它反而是好处。在Finetune的时候,我们通常希望优先调整靠近输出层的参数,不要过度调整靠近输入层的参数,以免严重破坏预训练效果。而梯度消失意味着越靠近输入层,其结果对最终输出的影响越弱,这正好是Finetune时所希望的。所以,预训练好的Post Norm模型,往往比Pre Norm模型有更好的Finetune效果
LN的作用是什么?
允许使用更大的学习率,加速训练。有一定的抗过拟合作用,使训练过程更加平稳
Transformer是自回归模型还是自编码模型?
自回归模型。
所谓自回归,即使用当前自己预测的字符再去预测接下来的信息。Transformer在预测阶段(机器翻译任务)会先预测第一个字,然后在第一个预测的字的基础上接下来再去预测后面的字,是典型的自回归模型。Bert中的Mask任务是典型的自编码模型,即根据上下文字符来预测当前信息。
Transformer在训练与验证的时候有什么不同
Transformer在训练的时候是并行的,在验证的时候是串行的。这个问题与Transformer是否是自回归模型考察的是同一个知识点。
Transformer模型的计算复杂度是多少
n是序列长度,d是embedding的长度。Transformer中最大的计算量就是多头自注意力层,这里的计算量主要就是QK相乘再乘上V,即两次矩阵相乘。QK相乘是矩阵【n d】乘以【d n】,这个复杂度就是
n 2 d n^2d
n
2
d
Transformer中三个多头自注意力层分别有什么意义与作用?
Transformer中有三个多头自注意力层,编码器中有一个,解码器中有两个。
编码器中的多头自注意力层的作用是将原始文本序列信息做整合,转换后的文本序列中每个字符都与整个文本序列的信息相关(这也是Transformer中最创新的思想,尽管根据最新的综述研究表明,Transformer的效果非常好其实多头自注意力层并不占据绝大贡献)
解码器的第一个多头自注意力层比较特殊,原论文给其起名叫Masked Multi-Head-Attention。其一方面也有上图介绍的作用,即对输入文本做整合(对与翻译任务来说,编码器的输入是翻译前的文本,解码器的输入是翻译后的文本)。另一个任务是做掩码,防止信息泄露。拓展解释一下就是在做信息整合的时候,第一个字符其实不应该看到后面的字符,第二个字符也只能看到第一个、第二个字符的信息,以此类推。
解码器的第二个多头自注意力层与编码器的第一个多头自注意力层功能是完全一样的。不过输入需要额外强调下,我们都知道多头自注意力层是通过计算QKV三个矩阵最后完成信息整合的。在这里,Q是解码器整合后的信息,KV两个矩阵是编码器整合后的信息,是两个完全相同的矩阵。QKV矩阵相乘后,翻译前与翻译后的文本也做了充分的交互整合。至此最终得到的向量矩阵用来做后续下游工作。
Transformer中的mask机制有什么作用
对不等长的序列做padding补齐
掩码防止信息泄露
mask机制分别用在了哪里?
mask机制的作用1在三个多头自注意力层中都用了,作用2只用在了解码器的第一个多头自注意力层。
如何计算文本相似度?
直接使用词向量做平均得到句向量,通过余弦相似度来计算
直接使用词向量做平均得到句向量,通过向量距离来计算
使用sentenceBert输出两个句子各自的句向量,通过余弦相似度来计算
使用sentenceBert输出两个句子各自的句向量,拼接起来,通过全连接层,再做二分类
使用simCSE输出两个句子各自的句向量,通过余弦相似度来计算。
Bert模型的输出一般接上一个全连接层做下游的任务,是否可以用xgboost代替全连接层?为什么?
不能使用xgboost代替
不能使用任何非参数模型代替全连接层,比如以树模型为基础的模型,SVM。
因为Bert中的参数的调整是需要通过梯度反向传播来进行梯度下降来更新的,如果梯度都没有,那么如何更新参数。如果需要梯度的话,就必须上可对参数求导的模型,如果参数可求导,那么一定是有参数模型,比如逻辑回归,全链接层。
描述下Roberta模型和bert有什么不同?
Roberta可以直接看成收敛后的bert模型
在更加大量的数据集上做了Bert预训练任务
取消了NSP任务,只关注MLM任务
使用了动态的MASK方式
描述下Albert模型和bert有什么不同
Albert模型相当于乞丐版的bert模型
由于Bert模型效果好,很多业务上都想尝试使用bert来做预测,但是发现Bert重大的缺陷就是模型太大,不好移植,且速度慢,不能达到快速响应。
于是尝试想看下是否可以生成一个缩小版的Bert,用于快速响应,且效果差不多
Albert首先减少了词向量的维度
Albert还尝试block中的参数做共享
以上两种方法下,极大的减少了模型参数的个数,且也达到了和Bert-Base差不多的效果
如何减少训练好的神经网络模型的运行的时间?
使用使用GPU,或者TPU来做运算
可以尝试做剪执以减少参数
可以尝试做TeacherForcing做知识蒸馏
Bert模型适合做什么任务,不适合做什么任务?
Bert模型是Transformer的encoder,适合做情感分类,文本分类,意图识别,命名实体识别,句子是否相似,句子是否有被包含,半指针半标注的SPO三元组抽取,问答,等任务。
Bert只是Transformer的encoder,不能做任何生成式的任务。比如翻译,文本摘要,问题生成,等seq2seq任务。
你看过哪些以Bert为基础的模型
Roberta、Albert、Bert-wwm、XLnet、DistillationBert、SimBert、SimCSE、UNIgram、PET、BART等等
如果训练集的数据量太少了怎么办?
可以尝试做数据增强,模拟出其他的数据
可以尝试使用Prompt的思路,做小样本学习,甚至零样本学习
如果是分类问题,那么可以使用PET模型来构建Pattern,通过完形填空的方式来间接的解决分类问题
如果业务中,训练好的模型的标签多了一个怎么办?
最笨的办法就是尝试重新标记好数据集,将新的标签标记到原来的数据集中,重新训练模型
将新的标签重新标记到数据集中,将新标签和非新标签分开。
首先用一个二分类模型判断样本是否属于新标签或者非新标签,如果属于新标签则结束,如果属于非新标签,则尝试用老模型继续判断样本属于哪一个老标签。
直接使用PET的方式来训练,在MASK的位置多增加一个Verbalizer,然后做微调即可,完全不用更加其他的代码
BatchNorm和LayerNorm的区别?
BatchNorm:计算每个最小批每层的平均值和方差
LayerNorm:独立计算每层每一个样本的均值和方差