基本问题
- tf-idf是什么
描述单词在文档中的概率分布 - 如何解决长文本问题
- 有哪些分词方法
- 怎么处理UNK
英文可以用char-embedding;直接用UNK - 高维特征检索
- 刚拿到一批文本的时候,可以进行哪些预处理
分词、词频统计、词干提取、特殊符号删除
预训练语言模型
基本概念
- Language model 的两种优化目标
1)AR:auto regressive 自回归,可以参考GPT,只考虑单侧信息,对一句句子abcd,
P ( a b c d ) = p ( a ) p ( b ∣ a ) p ( c ∣ a b ) p ( d ∣ a b c ) P(abcd) = p(a)p(b|a)p(c|ab)p(d|abc) P(abcd)=p(a)p(b∣a)p(c∣ab)p(d∣abc)
2)AE:auto encoding 自编码,他从损坏的信息进行复原,考虑双侧的信息
P ( a b [ m a s k ] d ) = p ( [ m a s k ] = c ∣ a b d ) P(ab[mask]d) = p([mask]=c|abd) P(ab[mask]d)=p([mask]=c∣abd) - AE的缺点
针对下式这种情况
P ( a b [ m a s k ] [ m a s k ] ) = p ( [ m a s k ] = c ∣ a b ) p ( [ m a s k ] = d ∣ a b ) P(ab[mask][mask]) = p([mask]=c|ab)p([mask]=d|ab) P(ab[mask][mask])=p([mask]=c∣ab)p([mask]=d∣ab)
他默认的是cd独立,但在实际情况中,cd可能可以组成一个单词(也就是cd不独立)
Word2Vec
- word2vec的tricky是什么
1)少采样常见的词(在正采样的过程中,就筛选出更新的词汇,可见“是否正采样的概率计算公式”)
2)负采样
3)hierarchical softmax(基于哈夫曼树的多层sigmoid,huffman tree:将word以词频作为哈夫曼树的权值来构建哈夫曼树,这样经常出现的单词路径就会更短) - word embedding可以用auto-encoder来做吗
不可以,因为one-hot向量中不包含任何信息 - word2vec中的高频效益是什么
一些连接单词,比如and/of/the,他们很容易作为content word出现在别的单词的window中,也就是他们与别的其他单词的点积会很高,但这个点积并没有很大的意义,这就是高频效益,这种情况下可以通过删除这些点积高的单词来增加单词之间的相似性计算 - word2vec的两个模型是什么
每一个word有两个向量,一个 u u u 用于该word是content word时,一个 v v v 用于该word是center word时
1)CBOW:通过windows里面的content words来预测center word
2)Skip-Gram:通过center word来预测windows里面的 content words(使用softmax来计算概率)
P ( o ∣ c ) = exp ( u o T v c ) ∑ w ∈ V exp ( u w T v c ) P(o|c)=\frac{\exp(u_o^Tv_c)}{\sum_{w\in V}\exp(u_w^Tv_c)} P(o∣c)=∑w∈Vexp(uwTvc)exp(uoTvc)
目标就是最大化这个概率值,可以转换为最小化它的负对数似然(样本中有 T T T 个center word,窗口大小为 2 m 2m 2m),参数 θ \theta θ 就是 U U U 和 V V V
min J ( θ ) = − 1 T ∑ t = 1 T ∑ − m ≤ j ≤ m , j ≠ 0 log exp ( u w t + j T v w t ) ∑ i = 1 V exp ( u w i T v w t ) \min J(\theta) = -\frac{1}{T}\sum_{t=1}^{T}\sum_{-m\leq j\leq m, j\neq0}\log\frac{\exp(u_{w_{t+j}}^Tv_{w_t})}{\sum_{i=1}^{V}\exp(u_{w_i}^Tv_{w_t})} minJ(θ)=−T1t=1∑T−m≤j≤m,j=0∑log∑i=1Vexp(uwiTvwt)exp(uwt+jTvwt) - 为什么word2vec要使用两个向量
两个向量分别是这个单词作为center word时使用的向量,以及这个单词作为content words时使用的向量,由此便于更新和计算,最后的word vector会取两个向量的平均值 - word2vec训练的最后一步有什么办法可以优化softmax的计算
这里指的是负采样概率值的计算,指数函数的计算会用查表来近似代替,也就是为word根据概率建立表格(大小不是dictionary size,如大小为10,有2个word,则概率为0.2的word有2格,概率为0.8的word有8格),然后随机一个数,选到哪个就用哪个word。 - CBOW和skip-Gram的区别,哪个模型更好,哪个模型计算复杂度高
- negative sampling的概率计算公式
P = f ( w i ) 3 4 ∑ j = 0 n ( f ( w j ) 3 4 ) P=\frac{f(w_i)^{\frac{3}{4}}}{\sum_{j=0}^{n}(f(w_j)^{\frac{3}{4}})} P=∑j=0n(f(wj)43)f(wi)43
f ( w i ) f(w_i) f(wi)用于计算 w i w_i wi的出现频次,低频词被选中的概率较高
3/4是经验数据,作者通过测试选择了这个数值 - 是否正采样的概率计算公式
P = ( z ( w i ) s a m p l e _ r a t e + 1 ) × s a m p l e _ r a t e z ( w i ) P=\frac{(\sqrt{\frac{z(w_i)}{sample\_rate}}+1)\times sample\_rate}{z(w_i)} P=z(wi)(sample_ratez(wi)+1)×sample_rate
sample_rate是自己设定的超参,该值越小,则越容易丢弃 w i w_i wi
P的概率是保留 w i w_i wi的概率,在sample_rate=0.001的情况下,可以发现 z ( w i ) ≤ 0.0026 z(w_i) \leq 0.0026 z(wi)≤0.0026 时,P恒为1,当 z ( w i ) = = 1 z(w_i) == 1 z(wi)==1时,P=0.033,仍有可能被保留 - negative sampling选择的负采样数量
小规模数据:5-20个negative words
大规模数据:2-5个negative words
ELMo
- ELMo简介
基本思想是利用两层双向的LSTM结构,训练Language Model。其中较低层的LSTM代表了比较简单的语法信息,而上层的LSTM捕捉的是依赖于上下文的语义信息。两个方向的LSTM是独立训练的,也就是说在训练过程中每层其实是两个单向的LSTM,最后一层再将两个方向训练出来的向量进行拼接,达到利用前后文的目的。
- ELMo如何做到动态词向量的
- ELMo的缺点
Transformer/BERT系列
通用问题
- 自注意力机制的运行过程
- 自注意力机制对于每一个词的分数会进行标准化,这一步的意义在哪里
Transformer
- 如何生成位置向量
原版论文:通过sin和cos来完成,连着交替穿插构成position embedding,每个值都在 [ − 1 , 1 ] [-1, 1] [−1,1] 之间
P o s i t i o n E m b e d d i n g ( p o s , 2 i ) = sin ( p o s 10 , 00 0 2 i d m o d e l ) Position Embedding_{(pos, 2i)} = \sin(\frac{pos}{10, 000^{\frac{2i}{d_{model}}}}) PositionEmbedding(pos,2i)=sin(10,000dmodel2ipos)
P o s i t i o n E m b e d d i n g ( p o s , 2 i + 1 ) = cos ( p o s 10 , 00 0 2 i + 1 d m o d e l ) Position Embedding_{(pos, 2i+1)} = \cos(\frac{pos}{10, 000^{\frac{2i+1}{d_{model}}}}) PositionEmbedding(pos,2i+1)=cos(10,000dmodel2i+1pos)
以sin为例,可以理解为绘制不同宽度的sin曲线, 2 i = 2 2i = 2 2i=2 即为在坐标中绘制一条 x = 1 x=1 x=1 的直线,这条直线和所有sin的交点的 y y y 坐标,就是position embedding中sin的部分的结论值,其中 i i i 的大小为(0~511) - position embedding的意义
可以拓展句子长度,在test数据中存在句子长度>train句子长度的时候,较为有效 - transformer中的残差链接
残差链接体现在encoder/decoder的每个子结构之后,即self attention/masked self attention/encoder-decoder attention和前馈神经网络之后
假设子结构的输出为 F ( x ) F(x) F(x),则再与输入数据 X X X 进行线性叠加,再通过layer norm,送入下一个子结构,具体可以看另一篇里面的残差网络 - transformer的组成
6个堆叠的encoder和6个堆叠的decoder,不同的encoder和decoder之间共享结构但不共享参数
encoder由self-attention和前馈神经网络构成
decoder由masked self attention,encoder-decoder attention和前馈神经网络构成 - Multi-head的作用&实际意义
聚焦到多个不一样的重点上 - self-attention计算公式
Z = ( s o f t m a x ( Q K T d k ) ) V Z=(softmax(\frac{QK^T}{\sqrt{d_k}}))V Z=(softmax(dkQKT))V
s c o r e = Q K T d k score = \frac{QK^T}{\sqrt{d_k}} score=dkQKT
其中KQV都是通过前馈神经网络计算出来的针对不同word的特征向量, d k \sqrt{d_k} dk的作用可以看下文BERT的描述 - self-attention/masked self attention/encoder-decoder attention的区别
1)self-attention:计算自身的KQV,然后计算Z
2)masked self-attention:每次计算的时候,会mask掉自身单词之后的其他单词,再计算softmax,mask的方式为将对应位置的score置为-inf
3)encoder-decoder attention:使用的是最后一个encoder中的KV和这个子模块中自己的Q - 为什么要做layer norm而不做batch norm
norm的原因:让数据在这个维度上归一化,因为在训练过程中,上一层传递下去的值会有各式各样的分布
BN就是通过对batch size这个维度归一化来让分布稳定下来。然而一个Batch中对应位置的分量不一定有意义,它可能是padding的结果。LN则是通过对Hidden size这个维度归一化来让某层的分布稳定。
BN取的是不同样本的同一个特征,而LN取的是同一个样本的不同特征。
在BN和LN都能使用的场景中,BN的效果一般优于LN,原因是基于不同数据,同一特征得到的归一化特征更不容易损失信息。
然而在batchsize较小或者在RNN中,可以选择使用LN,LN得到的模型更稳定且起到正则化的作用。BN会导致有意义的embedding损失信息,所以embedding需要在hidden size进行归一化。 - 为什么position embedding用线性相加而不是concat
在原输入上 concat 一个代表位置信息的向量再经过线性变换 等同于 将原输入经线性变换后直接加上位置编码信息。
或者说concat和线性相加其实没有太大区别,但线性相加可以减少参数量
BERT
- BERT的整体模型
Bert用的是transformer中的encoder,包括一个多头自注意力网络和一个前馈神经网络,BERT-base有12层encoder,BERT-large有24层encoder - BERT的输入是什么
token embedding + segment embedding + position embedding 这里不是concat,是直接puls
token embedding:BERT分词之后对每个token做随机向量初始化
segment embedding:由于有NSP任务,所以一个输入中包含两个segment,segment embedding通过0/1来区分第一个segment和第二个segment
position embedding:和transformer中的不太一样,初始化的时候为 [0~n]的index(最高为511)的随机初始化向量,后期会与模型一起学习训练
BERT的一条序列是两个句子,由特殊分隔符 [CLS] 作为开头,通过特殊分隔符 [SEP] 标识句子结尾 - BERT的预训练任务
MLM+NSP (同时训练)
MLM:mask language model,用的是AE,bert会随机mask 15%的单词,其中10%会替换为其他的单词(由一定概率替换为自身);10%不做替换,80%替换为[mask]
NSP:next sentence prediction,它选用的正样本为“两个连续的segment”,选用的负样本为“在两个不同的文档中分别随机选取一条句子进行组合”,对NSP的判断,为对input sequence的特殊分隔符[CLS]的输出进行softmax获得0/1概率得到。 - NSP的缺点
它将主题预测和连贯性预测合并成了一个单项任务,即模型实际训练的是“主题预测”任务,并没有完成连贯性预测,用于进行NSP的[CLS]的输出不能很好的表征sentence embedding。
AlBert中改进了这一点,剥离出了主题预测,正样本为a, b,负样本为b, a。 - BERT的微调方式
1)文本匹配 -> 针对[CLS]的输出进行二分类任务
2)句子分类 -> 针对[CLS]的输出进行多分类任务
3)文本问答 -> 针对第一个[SEP]后的所有token进行 start/end span预测(2个二分类)
4)序列标注 -> 针对所有token进行多分类任务 - BERT中的残差链接
对经过注意力矩阵加权后的 Z Z Z,和 X e m b e d d i n g X_{embedding} Xembedding 进行元素相加做残差链接。 - BERT中根号dk的作用
(scale product)
QK进行点积之后,值之间的方差会较大,也就是大小差距会较大;如果直接通过Softmax操作,会导致大的更大,小的更小;进行缩放,会使参数更平滑,训练效果更好。 - BERT中多头的作用
多次attention综合的结果至少能够起到增强模型的作用,也可以类比CNN中同时使用多个卷积核的作用,直观上讲,多头的注意力有助于网络捕捉到更丰富的特征/信息。 - BERT 的缺点
1)MLM直接对单个token进行随机mask,丢失了短语和实体信息,这一点对中文尤其明显,
2)MLM仅预测被mask的token,其他token没有参与到预测中。导致MLM训练效率偏低,训练时间过长。
2)NSP任务可以学到sequence level信息,但仅为一个二分类,且负样本构造过于简单,导致模型不能充分训练。 - BERT 中[CLS]/[SEP]的作用
CLS:不能代表整个句子的语义信息(即不能作为sentence embedding) - BERT 中激活函数GELU
在激活中引入随机正则
类似于ReLU和dropout,对每个神经元随机乘以0/1,这个随机的概率取决于当前的input有多大概率大于其余的input。
G E L U ( x ) = x Φ ( x ) GELU(x)= x \Phi(x) GELU(x)=xΦ(x)
Φ ( x ) \Phi(x) Φ(x)服从伯努利分布,是标准正态分布的累积分布函数(因为输入一般符合正态分布) - BERT 与BiLSTM 有什么不同
BERT是通过mask来同时获取上下文的信息,但如果用BiLSTM进行Language Model的任务,会造成信息泄露(不确定对不对) - BERT和ELMO的区别
- BERT的改进类型
1)预训练任务优化:ERNIE,spanBERT
2)训练方法优化:RoBERTa,T5
3)模型结构优化:XLNet,ALBERT,ELECTRA
4)模型轻量化:ALBERT,Q8BERT,DistillBERT,TinyBERT - MLM 为什么mask一部分保留一部分
[MASK]引入后,作为模型输入;模型输出为[MASK]词对应位置的词表示,希望输出和真正的词正好匹配。在self-attention会通过KQV学习到[MASK]词和其他周边所有词的关系。因为ground truth的词虽然和[MASK]的词没有任何关系,但是和周边词有关系,所以self-attention参数更新过程中,会弱化[MASK]自身对生成向量的影响,尽量用周边向量生成[MASK]位置对应的向量。
然而这样虽然学习到了上下文的信息,却带来了一个问题:[MASK]的信息在生成向量中没有贡献,那么模型仅关心周边的信息。模型仅关心周边的信息,[MASK]的位置固定后,周边tocken的贡献度也是固定的。因为周边tocken的贡献度都是不变的,且其各个tocken对生成向量的贡献度是通过Q和K内积加softmax实现的,那么只要[MASK]的位置信息固定,且Q和K的权值共享,那么Q和K的值,向量的每一行也都是相同的。根据上述分析,虽然[MASK]可以学习到周边的信息,但是带来的是Q和K的向量固定。
针对上述问题,如果用10%用原始tocken表示,虽然原始信息会泄露到高层,但是数据量很少,这种效果不明显。但是10%用原始tocken带来Q向量的输入embedding变化了,带来Q的变化,从而K也跟随变化,解决了Q和K向量固定的问题。
针对高层的信息泄露,这里又引入随机tocken的替换,这样弱化信息泄露的影响。 - BERT如何使用Transformer的encoding模块
- BERT的输入和Transformer有什么不同
- 分层结构会不会破坏文本的连贯性
- BERT中位置向量的作用
- BERT提升与训练效果的方案
1)下载通用BERT:用大量通用语料训练语言模型
2)domain transfer:在相同领域的语料上训练语言模型
3)task transfer:在相同任务的语料上训练语言模型
4)fine-tune:在任务相关的相同领域数据集上做具体任务 - domain transfer的trick
1)动态mask:在每个epoch训练的时候选择不同的单词进行mask(即每个epoch都是mask不同的文字),bert中对所有epoch训练的时候都选择相同的单词进行mask
2)n-gram mask:可以参考ERNIE,ERNIE是选择entity,在缺少标注数据的情况下,可以用n-gram凑合一下 - 参数特征
1)learning rate:尽量小
2)微调的epoch:3/4 - 如何对脱敏数据使用bert
1)如果语料足够大,可以直接用脱敏数据训练BERT
2)如果语料太小,可以按照词频,把脱敏数字映射到对应的bert预训练文本上来获取初始权重
BERT的改进类型
- ERNIE的创新点
1)提出了短语和实体级别的mask方式,通过此方法融合了外部知识。
2)提出了DLM任务。对Dialog的角色,进行了Dialog embedding,从而加强模型在Dialog上的效果 - ERNIE的MLM任务的mask选择
1)Basic-Level mask。这种方法和BERT基本相同,中文以汉字为基础token,进行15%的随机mask
2)Phrase-Level mask。通过分词工具来获得中文短语,通过词汇分析来判断英文短语(如"a lot of")。随机选择一些短语进行mask,然后predict整个短语
3)Entity-Level mask。先分析sequence中的人名、地名、机构名等实体,对他们进行随机mask,然后predict整个实体。 - ERNIE的DLM任务
针对对话进行,添加了人物信息 - spanBERT的创新点
1)span Masking。随机长度随机span进行Mask。
2)Span Boundary Objective (SBO)。利用span的左右两个边界词和当前词位置,来预测当前词。SpanBERT认为span边界词对理解span很重要,故引入了这一学习目标
3)Single-Sequence Training。去掉了BERT中的NSP任务。 - spanBERT的span masking
1)先按照几何分布,随机选择span长度。
2)然后在sequence中随机选择span起点,从而得到一个span。span起点必须是一整个词的起点。 - Span Boundary Objective
1)将span左右两个边界词的encoding,和要预测的span中的词的position embedding,concat起来
2)经过两层DNN、gelu和归一化,得到预测词的最终向量 - RoBERTa的创新点
1)动态masking
2)取消了NSP
3)原始BERT采用字符级别的BPE编码,英文vocab size为30k。容易出现UNK问题,影响模型效果。RoBERTa采用了Byte级别的BPE词汇表,vocab size为50k。 - AlBERT的优点
减少参数冗余,提升参数效率。从而在大大压缩模型体积的同时,通过增加隐层和层数,来提升模型效果。 - AlBERT的创新点
1)矩阵分解。将BERT的token embedding向量大小记为E,隐层大小记为H,vocab大小为V。原版BERT中,E = H。embedding层向量主要是当前token的特征表达,而且比较低维。而隐层则包含了更多来自上下文的信息。和隐层相比,embedding层不需要那么大的向量。基于这一点,ALBERT对embedding层进行了矩阵分解。典型值E = 128, H = 2014,然而效果不明显
2)跨层参数共享。将Transformer每一层的参数,包括self-attention和fead-forward,都进行共享
3)sentence-order prediction (SOP) 语句顺序预测。一个pair的两个文本,不论正负样本,都来自同一文档。正样本为AB,负样本为BA。模型需要预测语句顺序。 - ELECTRA的创新点
提出了一种类似于生成-判别网络的架构,利用RTD(replaced token detection)来对每个token进行predict,从而减少了模型所需算力。 - ELECTRA的RTD
1)对原始文本进行随机mask,然后由Generator生成mask位置token。
2)然后对生成好的语句,利用Discrimination判断每个token是否为原始token。这个任务称为RTD,二分类任务,label为original和replaced。这个网络也是采用的Transformer encoder。
其他模型
- 为什么XLNet效果优于BERT
- 针对中文,BERT有什么可以改进的地方
参考ERNIE(基于知识的mask训练方式)
其他
- fasttext是什么
- fasttext和word2vec的区别