这些面试题是在各个平台上搜取的,方便大家面试的时候使用,主要偏向nlp方向
1:向量进行降维(主成分分析)处理,特征值分解或者奇异值分解实现
根据词频进行采样,也就是词频越大的词被采到的概率也越大。
欠拟合:光看书不做题觉得自己会了,上了考场啥都不会。模型不能在训练集上获得足够低的误差,模型复杂度低,模型在训练集上就表现很差,没法学习到数据背后的规律
过拟合: 做课后题全都能做对,上了考场还是啥都不会。训练误差和测试误差之间的差距太大,模型复杂度高于实际问题,模型在训练集上表现很好,但在测试集上却表现很差,泛化能力差。
原因:
1、训练数据集样本单一,样本不足。如果训练样本只有负样本,然后那生成的模型去预测正样本,这肯定预测不准。所以训练样本要尽可能的全面,覆盖所有的数据类型。
2、训练数据中噪声干扰过大。噪声指训练数据中的干扰数据。过多的干扰会导致记录了很多噪声特征,忽略了真实输入和输出之间的关系。
3、模型过于复杂。模型太复杂,已经能够“死记硬背”记下了训练数据的信息,但是遇到没有见过的数据的时候不能够变通,泛化能力太差。我们希望模型对不同的模型都有稳定的输出。模型太复杂是过拟合的重要因素。
解决:
1:ERNIE
旨在优化BERT的masking过程,其中包括实体级masking和短语级masking
2:XLNet
解决masking符号[MASK]永远不会出现在微调阶段,XLNet主要通过两种方式进行修改。 首先是所有排列上的输入因式分解的最大化期望似然,在此将它们称为排列语言模型(PLM)。 其次是将自编码语言模型更改为自回归模型,这与传统的统计语言模型相似。
3:RoBERTa
删除下一个句子的预测,并使用动态masking
4:ALBERT
解决了更高的内存消耗和BERT训练速度慢的问题,
ALBERT引入了两种参数减少技术。 首先是嵌入分解,它将嵌入矩阵分解为两个小的矩阵。 其次是跨层参数共享,跨ALBERT的每一层共享transformer权重,这将显着减少参数。 此外,他们还提出了句序预测(SOP)任务来代替传统的NSP预训练任务。
5:ELECTRA
采用了一种类似于GAN的新生成器-判别器框架
模型在多个方面对RoBERTa进行了改进,尤其是采用MLM作为校正(Mac)的masked策略
我们使用全词masked以及Ngram masked策略来选择候选token来masked,单词级别的unigram到4-gram的比例为40%,30%,20%,10%。
我们提议不要使用[MASK]token进行mask,因为在token微调阶段从未出现过[MASK],我们提议使用类似的单词进行masking。 通过使用基于word2vec(Mikolov et al。,2013)相似度计算的同义词工具包(Wang and Hu,2017)获得相似的单词。 如果选择一个N-gram进行masked,我们将分别找到相似的单词。 在极少数情况下,当没有相似的单词时,我们会降级以使用随机单词替换
我们对15%比例的输入单词进行masking,其中80%替换为相似的单词,10%将替换为随机单词,其余10%则保留原始单词。
对于类似NSP的任务,我们执行ALBERT (Lan等人,2019)引入的句子顺序预测(SOP)任务,其中通过切换两个连续句子的原始顺序来创建负样本。 我们将在第6.1节中消融这些修改,以更好地证明每个组件的贡献。
N-Gram是一种基于统计语言模型的算法。它的基本思想是将文本里面的内容按照字节进行大小为N的滑动窗口操作,形成了长度是N的字节片段序列。
n-gram模型用于评估语句是否合理
你在用谷歌时,输入一个或几个词,搜索框通常会以下拉菜单的形式给出几个像下图一样的备选,这些备选其实是在猜想你想要搜索的那个词串。
1:换用较小的模型
2:蒸馏,裁剪
3:转化onnx
4:NVIDIA推出的TensorRT工具可以进行模型推理层面的加速。
5:量化的加速主要得益于定点运算比浮点运算快,但从FP32量化为INT8会损失模型精度。
6:模型并行和数据并行。
在计算attention时主要分为三步,
第一步是将query和每个key进行相似度计算得到权重,常用的相似度函数有点积,拼接,感知机等;
第二步一般是使用一个softmax函数对这些权重进行归一化;
第三步将权重和相应的键值value进行加权求和得到最后的attention。目前在NLP研究中,key和value常常都是同一个,即key=value 。
attention和self attention 其具体计算过程是一样的,只是计算对象发生了变化而已。
attention是source对target的attention,
而self attention 是source 对source的attention。
对时间戳处理
对离散型变量进行独热编码
对连续型变量进行分箱/分区
特征缩放
特征选择
特征衍生(特征交叉)
随机森林采用的bagging思想,而GBDT采用的boosting思想。这两种方法都是Bootstrap思想的应用,Bootstrap是一种有放回的抽样方法思想。虽然都是有放回的抽样,但二者的区别在于:Bagging采用有放回的均匀取样,而Boosting根据错误率来取样(Boosting初始化时对每一个训练样例赋相等的权重1/n,然后用该算法对训练集训练t轮,每次训练后,对训练失败的样例赋以较大的权重),因此Boosting的分类精度要优于Bagging。Bagging的训练集的选择是随机的,各训练集之间相互独立,弱分类器可并行,而Boosting的训练集的选择与前一轮的学习结果有关,是串行的。
组成随机森林的树可以是分类树,也可以是回归树;而GBDT只能由回归树组成。
组成随机森林的树可以并行生成;而GBDT只能是串行生成。
对于最终的输出结果而言,随机森林采用多数投票等;而GBDT则是将所有结果累加起来,或者加权累加起来。
随机森林对异常值不敏感;GBDT对异常值非常敏感。
随机森林对训练集一视同仁;GBDT是基于权值的弱分类器的集成。
随机森林是通过减少模型方差提高性能;GBDT是通过减少模型偏差提高性能。
XGBoost 使用预排序后需要记录特征值及其对应样本的统计值的索引,而 LightGBM 使用了直方图算法将特征值转变为 bin 值,且不需要记录特征到样本的索引,将空间复杂度大大降低,极大的减少了内存消耗;LightGBM 采用了直方图算法将存储特征值转变为存储 bin 值,降低了内存消耗;LightGBM 在训练过程中采用互斥特征捆绑算法减少了特征数量,降低了内存消耗。
LightGBM 采用了直方图算法将遍历样本转变为遍历直方图,极大的降低了时间复杂度;LightGBM 在训练过程中采用单边梯度算法过滤掉梯度小的样本,减少了大量的计算;LightGBM 采用了基于 Leaf-wise 算法的增长策略构建树,减少了很多不必要的计算量;LightGBM 采用优化后的特征并行、数据并行方法加速计算,当数据量非常大的时候还可以采用投票并行的策略;LightGBM 对缓存也进行了优化,增加了 Cache hit 的命中率。
解析:包括遗忘门,输入门和输出门三种。
GRU与LSTM区别
(1)LSTM和GRU的性能在很多任务上不分伯仲;
(2)GRU参数更少,因此更容易收敛,但是在大数据集的情况下,LSTM性能表现更好;
(3)GRU 只有两个门(update和reset),LSTM 有三个门(forget,input,output),GRU 直接将hidden state 传给下一个单元,而 LSTM 用memory cell 把hidden state 包装起来。
BPTT(back-propagation through time)算法是常用的训练RNN的方法,其实本质还是BP算法,只不过RNN处理时间序列数据,所以要基于时间反向传播,故叫随时间反向传播。BPTT的中心思想和BP算法相同,沿着需要优化的参数的负梯度方向不断寻找更优的点直至收敛。综上所述,BPTT算法本质还是BP算法,BP算法本质还是梯度下降法。
在RNN中经常遇到梯度消失和爆炸现象的原因:很难捕捉到长期的依赖关系,因为乘法梯度可以随着层的数量呈指数递减/递增。
Softmax函数是二分类函数Sigmoid在多分类上的推广,目的是将多分类的结果以概率的形式展现出来。最大的区别在于softmax的计算的是一个比重,而sigmoid只是对每一个输出值进行非线性化。
在处理CTR预估问题中,传统的方法有一个共同的缺点:对于低阶的组合特征,学习到的比较少;但是低阶特征对于CTR也非常重要,于是Google为了同时学习低阶和高阶组合特征,提出了 Wide&Deep 模型:混合了一个 线性模型(Wide part)和 Deep 模型 (Deep part);这两部分模型需要不同的输入,其中Wide part部分的输入仍然依赖人工特征工程;
此时模型存在两个问题:
偏向于提取低阶或者高阶的组合特征,不能同时提取这两种类型的特征;
需要专业的领域知识来做特征工程;
DeepFM 在 Wide&Deep 的基础上进行改进,成功解决了上述这两个问题,并做了一些优化;
优点如下:
不需要预训练FM得到隐向量;
不需要人工特征工程;
能同时学习低阶和高阶的组合特征;
FM模块和Deep 模块共享 Feature Embedding 部分,可以更快、更精确的训练;
首先用训练集训练出模型,然后用验证集验证模型(注意:这是一个中间过程,此时最好的模型还未选定),根据情况不断调整模型,选出其中最好的模型(验证误差用于指导我们选择哪个模型),记录最好的模型的各项设置,然后据此再用(训练集+验证集)数据训练出一个新模型,作为最终的模型,最后用测试集评估最终的模型。
进行shuffle:打乱数据之间的顺序,让数据随机化,避免过拟合
缺点
CNN是一种前馈神经网络,通常包含5层,输入层,卷积层,激活层,池化层,全连接FC层,其中核心部分是卷积层和池化层。
优点:共享卷积核,对高维数据处理无压力;无需手动选取特征。
缺点:需要调参;需要大量样本。
给定一组输入随机变量的条件下另一组输出随机变量的条件概率分布密度。条件随机场假设输出变量构成马尔科夫随机场,而我们平时看到的大多是线性链条随机场,也就是由输入对输出进行预测的判别模型。求解方法为极大似然估计或正则化的极大似然估计。
CRF模型通常应用于优化命名实体识别任务。
Transformer本身是一个典型的encoder-decoder模型,Encoder端和Decoder端均有6个Block,Encoder端的Block包括两个模块,多头self-attention模块以及一个前馈神经网络模块;Decoder端的Block包括三个模块,多头self-attention模块,多头Encoder-Decoder attention交互模块,以及一个前馈神经网络模块;需要注意:Encoder端和Decoder端中的每个模块都有残差层和Layer Normalization层。
BERT采用的是Transformer架构中的Encoder模块;
GPT采用的是Transformer架构中的Decoder模块;
ELMo采用的双层双向LSTM模块。
优点:计算量由V(单词总数)减小为 log2V;高频词靠近根节点,所需步数小,低频词远离根节点。
elmo 词向量是包含上下文信息的,不是一成不变的,而是根据上下文而随时变化。
(1)LSTM和GRU的性能在很多任务上不分伯仲;
(2)GRU参数更少,因此更容易收敛,但是在大数据集的情况下,LSTM性能表现更好;
(3)GRU 只有两个门(update和reset),LSTM 有三个门(forget,input,output),GRU 直接将hidden state 传给下一个单元,而 LSTM 用memory cell 把hidden state 包装起来。
BERT 来自 Google 的论文Pre-training of Deep Bidirectional Transformers for Language Understanding[1],BERT 是“Bidirectional Encoder Representations from Transformers”的首字母缩写,整体是一个自编码语言模型(Autoencoder LM),并且其设计了两个任务来预训练该模型。
BERT 相较于原来的 RNN、LSTM 可以做到并发执行,同时提取词在句子中的关系特征,并且能在多个不同层次提取关系特征,进而更全面反映句子语义。相较于 word2vec,其又能根据句子上下文获取词义,从而避免歧义出现。同时缺点也是显而易见的,模型参数太多,而且模型太大,少量数据训练时,容易过拟合。
在论文原文中,作者提出了两个预训练任务:Masked LM 和 Next Sentence Prediction。
这么做的主要原因是:在后续微调任务中语句中并不会出现 [MASK] 标记,而且这么做的另一个好处是:预测一个词汇时,模型并不知道输入对应位置的词汇是否为正确的词汇( 10% 概率),这就迫使模型更多地依赖于上下文信息去预测词汇,并且赋予了模型一定的纠错能力。上述提到了这样做的一个缺点,其实这样做还有另外一个缺点,就是每批次数据中只有 15% 的标记被预测,这意味着模型可能需要更多的预训练步骤来收敛。
Next Sentence Prediction 任务实际上就是段落重排序的简化版:只考虑两句话,判断是否是一篇文章中的前后句。在实际预训练过程中,文章作者从文本语料库中随机选择 50% 正确语句对和 50% 错误语句对进行训练,与 Masked LM 任务相结合,让模型能够更准确地刻画语句乃至篇章层面的语义信息。
BERT 模型通过对 Masked LM 任务和 Next Sentence Prediction 任务进行联合训练,使模型输出的每个字 / 词的向量表示都能尽可能全面、准确地刻画输入文本(单句或语句对)的整体信息,为后续的微调任务提供更好的模型参数初始值。
从网络结构以及最后的实验效果来看,BERT 比 ELMo 效果好主要集中在以下几点原因:
ELMo 模型是通过语言模型任务得到句子中单词的 embedding 表示,以此作为补充的新特征给下游任务使用。因为 ELMO 给下游提供的是每个单词的特征形式,所以这一类预训练的方法被称为“Feature-based Pre-Training”。而 BERT 模型是“基于 Fine-tuning 的模式”,这种做法和图像领域基于 Fine-tuning 的方式基本一致,下游任务需要将模型改造成 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 模型的主要输入是文本中各个字/词(或者称为 token)的原始词向量,该向量既可以随机初始化,也可以利用 Word2Vector 等算法进行预训练以作为初始值;输出是文本中各个字/词融合了全文语义信息后的向量表示,如下图所示(为方便描述且与 BERT 模型的当前中文版本保持一致,统一以「字向量」作为输入):
BERT的mask方式:在选择mask的15%的词当中,80%情况下使用mask掉这个词,10%情况下采用一个任意词替换,剩余10%情况下保持原词汇不变。
优点:1)被随机选择15%的词当中以10%的概率用任意词替换去预测正确的词,相当于文本纠错任务,为BERT模型赋予了一定的文本纠错能力;2)被随机选择15%的词当中以10%的概率保持不变,缓解了finetune时候与预训练时候输入不匹配的问题(预训练时候输入句子当中有mask,而finetune时候输入是完整无缺的句子,即为输入不匹配问题)。
缺点:针对有两个及两个以上连续字组成的词,随机mask字割裂了连续字之间的相关性,使模型不太容易学习到词的语义信息。主要针对这一短板,因此google此后发表了BERT-WWM,国内的哈工大联合讯飞发表了中文版的BERT-WWM。
答:在此后的研究(论文《Crosslingual language model pretraining》等)中发现,NSP任务可能并不是必要的,消除NSP损失在下游任务的性能上能够与原始BERT持平或略有提高。这可能是由于Bert以单句子为单位输入,模型无法学习到词之间的远程依赖关系。针对这一点,后续的RoBERTa、ALBERT、spanBERT都移去了NSP任务。
答:BERT使用Transformer-encoder来编码输入,encoder中的Self-attention机制在编码一个token的时候同时利用了其上下文的token,其中‘同时利用上下文’即为双向的体现,而并非想Bi-LSTM那样把句子倒序输入一遍。
答:针对特征提取器,Transformer只用了self-attention,没有使用RNN、CNN,并且使用了残差连接有效防止了梯度消失的问题,使之可以构建更深层的网络,所以BERT构建了多层深度Transformer来提高模型性能。
答:不同于RNN计算当前词的特征要依赖于前文计算,有时序这个概念,是按照时序计算的,而BERT的Transformer-encoder中的self-attention计算当前词的特征时候,没有时序这个概念,是同时利用上下文信息来计算的,一句话的token特征是通过矩阵并行‘瞬间’完成运算的,故,并行就体现在self-attention。
答:在使用self-attention通过上下文词语计算当前词特征的时候,X先通过WQ、WK、WV线性变换为QKV,然后如下式右边部分使用QK计算得分,最后与V计算加权和而得。
倘若不变换为QKV,直接使用每个token的向量表示点积计算重要性得分,那在softmax后的加权平均中,该词本身所占的比重将会是最大的,使得其他词的比重很少,无法有效利用上下文信息来增强当前词的语义表示。
而变换为QKV再进行计算,能有效利用上下文信息,很大程度上减轻上述的影响。
答:由于self-attention中的计算都是线性了,为了提高模型的非线性拟合能力,需要在其后接上前馈网络。
类似于cnn中多个卷积核的作用,使用多头注意力,能够从不同角度提取信息,提高信息提取的全面性。
A、在语料中训练一个由词到向量(word 2 vector)的模型来对文本中呈现的上下文语境进行学习
B、训练一个词包模型(a bag of words model)来对文本中的词的发生率(occurrence)进行学习
C、创建一个文献检索词矩阵(document-term matrix)并且对每一个文本应用余弦相似性
D、上述所有方法均可
ord2vec 模型可在基于上下文语境的情况下用于测量文本相似度。词包模型(Bag Of Words)和文献检索词矩阵(document term matrix)可以在基于词条的情况下用来测量相似度。
依赖关系图中的子决策树可以被看做是拥有外部连接的节点,例如:Media, networking, play, role, billions, 和 lives 是子决策树的根。
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。
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是Transformer训练的关键步骤,没有它可能不收敛,或者收敛到比较糟糕的位置。Warmup是在训练开始阶段,将学习率从0缓增到指定大小,而不是一开始从指定大小训练。如果不进行Wamrup,那么模型一开始就快速地学习,由于梯度消失,模型对越靠后的层越敏感,也就是越靠后的层学习得越快,然后后面的层是以前面的层的输出为输入的,前面的层根本就没学好,所以后面的层虽然学得快,但却是建立在糟糕的输入基础上的。如果进行Wamrup,那么留给模型足够多的时间进行“预热”,在这个过程中,主要是抑制了后面的层的学习速度,并且给了前面的层更多的优化时间,以促进每个层的同步优化。
梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。
一词多意。
Word2Vec在训练时结合了上下文并得到了静态向量,每个词可以唯一对应一个向量。但是在测试时,同一个词上下文可能不同,但是映射后的向量是相同的,这显然是不合理的。Bert却不同,因为self-attention机制,测试阶段其也是结合了上下文的,词向量是动态变化的。
词向量平均的方法做分类模型,主要的优势是模型简单
有参数模型,无参数模型都可以尝试使用,模型选择大
模型速度极快,训练的参数量少
在语句少的场景下,效果好
映入一个新的向量,做attention,此向量专门对重要的,和标签相关的词敏感。从而通过加权平均的方式,得到的句向量只包含重要词的信息,忽略不重要的词的信息,从而加强模型的效果。
使用self-attention, 尝试对语句里词的分布做重新的调整,提高模型的学习能力
使用Transformer encoder或者bert来做学习
Transformer模型有encoder和decoder
Bert其实就是Transformer的encoder的部分
Transformer只是一个空模型,里面的参数都是随机的,需要在下游任务上做有监督的训练,由于参数量大,直接使用Transformer做训练,模型难收敛,并且速度慢
Bert其实是预训练好的Transformer的encoder部分,也就是已经在海量的数据集上做了Transformer的参数的训练了,其参数可以保存下来,直接拿来在下游任务上使用,做调优。
在Transformer中,是六层编码器,六层解码器。源数据经过编码器的中间向量与目标一起送入解码器。Bert原论文中,只使用了编码器,并将层数扩展为12层。利用经过12层编码器得到的向量来做预训练任务。
首先是MLM任务,masked language model。随机的mask掉一些词,从而基于上下文,通过attention的方法来训练,来预测mask的词。
NSP任务,Next Sentence Prediction任务。通过CLS的来进行二分类,查看当前两个句子是否是上下文。词任务的有效性在各大论文中也是有争议的,有的说这个任务有用,有的说这个任务没用。
直接使用Bert做句向量的输出,会发现所有的句向量两两相似度都很高。
因为对于句子来说,大多数的句子都是使用常见的词组成的
Bert的词向量空间是非凸的,大量的常见的词向量都是在0点附近,从而计算出的句子向量,都很相似
使用双卡的形式,将两个句子传入两个参数共享的Bert模型,将两个句向量做拼接,进行有监督的学习,从而调整Bert参数。此方法叫sentencebert。
使用无监督或者有监督的对比学习,将同一个句子传入相同的bert(dropout = 0.3)得到标签为正例的一个句子对。通过这种方式来做Bert的微调整,得到SimCSE模型。
举个简单的例子,给一句训练语料,“昨天是高兴的一天”如果用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来训练,“悲喜交加”不是在和“高兴”竞争。模型是见到的是,“悲喜交加+昨天”、“悲喜交加+一天”这些词的搭配。罕见词、罕见搭配能够有更多的训练机会。
当√d_k特别小的时候,其实除不除无所谓。无论编码器还是解码器Q、K矩阵其实本质是一个相同的矩阵。Q、K相乘其实相等于Q乘以Q的转置,这样造成结果会很大或者很小。小了还好说,大的话会使得后续做softmax继续被放大造成梯度消失,不利于梯度反向传播。
多次attention综合的结果至少能够起到增强模型的作用,也可以类比CNN中同时使用多个卷积核的作用,直观上讲,多头的注意力有助于网络捕捉到更丰富的特征/信息。
BPE与Wordpiece都是首先初始化一个小词表,再根据一定准则将不同的子词合并。词表由小变大。
BPE与Wordpiece的最大区别在于,如何选择两个子词进行合并:BPE选择频数最高的相邻子词合并,而WordPiece选择能够提升语言模型概率最大的相邻子词加入词表。
从bert最开始的mask token 到后面ernie的 mask entity以及还有mask n-gram,动态mask等等。
常见的激活函数有: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中,损失函数减小最快的方向也是本身的导数方向。当损失函数为均方误差时,损失函数的负梯度和残差一样,但当损失函数不为均方误差时,本质上拟合的还是负梯度。
BLEU (Bilingual Evaluation Understudy)
ROUGE (Recall Oriented Understudy for Gisting Evaluation)
BLEU是机器翻译中使用最广泛的评估指标,可以看成是精确率。
哪些参数可以调?
网络设计相关参数:网络层数、不同层的搭建顺序、隐藏层神经元的参数设置、loss的选择、正则化参数
训练过程相关参数:网络权重初始化方法、学习率、迭代次数、batch_size。
什么时候需要调参?
欠拟合:优化数据集(数据清洗)、增加训练迭代次数、添加更多的层,增大神经元参数等
过拟合:增加样本数量(数据增强),加正则化参数(dropout),使用早停机制等
残差
BatchNorm是对一个batch-size样本内的每个特征做归一化,LayerNorm是对每个样本的所有特征做归一化。
形象点来说,假设有一个二维矩阵。行为batch-size,列为样本特征。那么BN就是竖着归一化,LN就是横着归一化。
它们的出发点都是让该层参数稳定下来,避免梯度消失或者梯度爆炸,方便后续的学习。但是也有侧重点。
一般来说,如果你的特征依赖于不同样本间的统计参数,那BN更有效。因为它抹杀了不同特征之间的大小关系,但是保留了不同样本间的大小关系。(CV领域)
而在NLP领域,LN就更加合适。因为它抹杀了不同样本间的大小关系,但是保留了一个样本内不同特征之间的大小关系。对于NLP或者序列任务来说,一条样本的不同特征,其实就是时序上字符取值的变化,样本内的特征关系是非常紧密的。
虽然Post Norm会带来一定的梯度消失问题,但其实它也有其他方面的好处。最明显的是,它稳定了前向传播的数值,并且保持了每个模块的一致性
其次,梯度消失也不全是“坏处”,其实对于Finetune阶段来说,它反而是好处。在Finetune的时候,我们通常希望优先调整靠近输出层的参数,不要过度调整靠近输入层的参数,以免严重破坏预训练效果。而梯度消失意味着越靠近输入层,其结果对最终输出的影响越弱,这正好是Finetune时所希望的。所以,预训练好的Post Norm模型,往往比Pre Norm模型有更好的Finetune效果
允许使用更大的学习率,加速训练。有一定的抗过拟合作用,使训练过程更加平稳
自回归模型。
所谓自回归,即使用当前自己预测的字符再去预测接下来的信息。Transformer在预测阶段(机器翻译任务)会先预测第一个字,然后在第一个预测的字的基础上接下来再去预测后面的字,是典型的自回归模型。Bert中的Mask任务是典型的自编码模型,即根据上下文字符来预测当前信息。
Transformer在训练的时候是并行的,在验证的时候是串行的。这个问题与Transformer是否是自回归模型考察的是同一个知识点。
n是序列长度,d是embedding的长度。Transformer中最大的计算量就是多头自注意力层,这里的计算量主要就是QK相乘再乘上V,即两次矩阵相乘。QK相乘是矩阵【n d】乘以【d n】,这个复杂度就是 n 2 d n^2d n2d
Transformer中有三个多头自注意力层,编码器中有一个,解码器中有两个。
编码器中的多头自注意力层的作用是将原始文本序列信息做整合,转换后的文本序列中每个字符都与整个文本序列的信息相关(这也是Transformer中最创新的思想,尽管根据最新的综述研究表明,Transformer的效果非常好其实多头自注意力层并不占据绝大贡献)
解码器的第一个多头自注意力层比较特殊,原论文给其起名叫Masked Multi-Head-Attention。其一方面也有上图介绍的作用,即对输入文本做整合(对与翻译任务来说,编码器的输入是翻译前的文本,解码器的输入是翻译后的文本)。另一个任务是做掩码,防止信息泄露。拓展解释一下就是在做信息整合的时候,第一个字符其实不应该看到后面的字符,第二个字符也只能看到第一个、第二个字符的信息,以此类推。
解码器的第二个多头自注意力层与编码器的第一个多头自注意力层功能是完全一样的。不过输入需要额外强调下,我们都知道多头自注意力层是通过计算QKV三个矩阵最后完成信息整合的。在这里,Q是解码器整合后的信息,KV两个矩阵是编码器整合后的信息,是两个完全相同的矩阵。QKV矩阵相乘后,翻译前与翻译后的文本也做了充分的交互整合。至此最终得到的向量矩阵用来做后续下游工作。
对不等长的序列做padding补齐
掩码防止信息泄露
mask机制的作用1在三个多头自注意力层中都用了,作用2只用在了解码器的第一个多头自注意力层。
直接使用词向量做平均得到句向量,通过余弦相似度来计算
直接使用词向量做平均得到句向量,通过向量距离来计算
使用sentenceBert输出两个句子各自的句向量,通过余弦相似度来计算
使用sentenceBert输出两个句子各自的句向量,拼接起来,通过全连接层,再做二分类
使用simCSE输出两个句子各自的句向量,通过余弦相似度来计算。
不能使用xgboost代替
不能使用任何非参数模型代替全连接层,比如以树模型为基础的模型,SVM。
因为Bert中的参数的调整是需要通过梯度反向传播来进行梯度下降来更新的,如果梯度都没有,那么如何更新参数。如果需要梯度的话,就必须上可对参数求导的模型,如果参数可求导,那么一定是有参数模型,比如逻辑回归,全链接层。
Roberta可以直接看成收敛后的bert模型
在更加大量的数据集上做了Bert预训练任务
取消了NSP任务,只关注MLM任务
使用了动态的MASK方式
Albert模型相当于乞丐版的bert模型
由于Bert模型效果好,很多业务上都想尝试使用bert来做预测,但是发现Bert重大的缺陷就是模型太大,不好移植,且速度慢,不能达到快速响应。
于是尝试想看下是否可以生成一个缩小版的Bert,用于快速响应,且效果差不多
Albert首先减少了词向量的维度
Albert还尝试block中的参数做共享
以上两种方法下,极大的减少了模型参数的个数,且也达到了和Bert-Base差不多的效果
使用使用GPU,或者TPU来做运算
可以尝试做剪执以减少参数
可以尝试做TeacherForcing做知识蒸馏
Bert模型是Transformer的encoder,适合做情感分类,文本分类,意图识别,命名实体识别,句子是否相似,句子是否有被包含,半指针半标注的SPO三元组抽取,问答,等任务。
Bert只是Transformer的encoder,不能做任何生成式的任务。比如翻译,文本摘要,问题生成,等seq2seq任务。
Roberta、Albert、Bert-wwm、XLnet、DistillationBert、SimBert、SimCSE、UNIgram、PET、BART等等
可以尝试做数据增强,模拟出其他的数据
可以尝试使用Prompt的思路,做小样本学习,甚至零样本学习
如果是分类问题,那么可以使用PET模型来构建Pattern,通过完形填空的方式来间接的解决分类问题
最笨的办法就是尝试重新标记好数据集,将新的标签标记到原来的数据集中,重新训练模型
将新的标签重新标记到数据集中,将新标签和非新标签分开。
首先用一个二分类模型判断样本是否属于新标签或者非新标签,如果属于新标签则结束,如果属于非新标签,则尝试用老模型继续判断样本属于哪一个老标签。
直接使用PET的方式来训练,在MASK的位置多增加一个Verbalizer,然后做微调即可,完全不用更加其他的代码
BatchNorm:计算每个最小批每层的平均值和方差
LayerNorm:独立计算每层每一个样本的均值和方差