本文只代表自己的观点。如有错误或者其他问题,欢迎批评指正。

1. 为什么BERT在第一句前会加一个[CLS]标志?

[CLS]用来作为整个句子的向量表示。

为什么要单独引入一个标记呢,是因为如果使用别的词,那么这个位置的词向量主要成分应该是关于这个词的(因为attention机制),所以需要引入一个标记位来代表整个句子。

PS:苏神也有直接全局池化的做法,并没有什么原因,苏神给的解释是“CLS用腻了,换池化玩玩”。

不过很多研究都表明,当作为句向量时,最后一层的平均池化要比取CLS的效果要要好,从我的实验来看,池化至少不输于CLS。

2. BERT的三个Embedding直接相加会对语义有影响吗?

不会,三个embedding拼接(假设)经过一个Linear的结果和三个直接相加没有什么本质区别。

引用苏神的一句话

Embedding的数学本质,就是以one hot为输入的单层全连接。
也就是说,世界上本没什么Embedding,有的只是one hot。 ”

3. 在BERT中,token分3种情况做mask,分别的作用是什么?

3种mask方式:80%[MASK]、10%随机替换、10%保留。

他们的作用其实都是强迫模型更好的理解语义信息(在各种情况下)。

4. 为什么BERT选择mask掉15%这个比例的词,可以是其他的比例吗?

其实可以的,好多人都说实际上是当取15%时,恰好大概7个词mask一个,正好就是CBOW中,长度为7的滑动窗口的中心词,因此会有比较好的效果(当然了,实际上只有一个人这么说,但是大家抄来抄去就变成都这么说了)。

但是应该是有人做过这个实验的,我忘了是在哪里看到的,但是我印象里是看到过的,是有人做过对比实验的,结果就是15%~20%是一个比较好的解。

5. 针对句子语义相似度/多标签分类/机器翻译翻译/文本生成的任务,利用BERT结构怎么做fine-tuning?

对于分类任务,微调其实比较简单,就是对输出进行多分类。

但是对于文本生成任务,其实从传统意义来说,bert对文本生成任务敏感度不是很高(因为是双向结构的;因此GPT可能更适合文本生成任务),但是也有将Bert与Seq2Seq结合的几个工作,分别是MASS(https://arxiv.org/abs/1905.02450)和UNILM(https://arxiv.org/abs/1905.03197),二者都来自于微软。

MASS主要还是传统的seq2seq结构,只不过都是使用的bert类似的结果来做encoder和decoder。

而UNILM则是通过MASK,将文本生成任务转换为文本补全任务(Bert和GPT的合体)。因此并不需要特别的结构就可以进行文本生成任务。

6.使用BERT预训练模型为什么最多只能输入512个词,最多只能两个句子合成一句?

其实也不是绝对,只不过原生bert限制了只能输入512个词。有很多改进版本(比如NEZHA,Roformer等)都已经没有512这个限制了。

最多两个句子也不是绝对的,只不过预训练任务(NSP或者SOP)都使用的两个句子,在很多任务中都可以自定义拼接符号(或SEP)来进行多句输入拼接。

而对于类似于roberta这类模型的预训练方式,其天生就支持多句子输入。甚至可以抛弃掉segment embedding的预训练权重从而输大更多的segment id范围。

7. BERT非线性的来源在哪里?multi head attention 是线性的嘛?

非线性能力来自前馈层GELU激活函数以及self-attention。

是非线性的。

8. BERT 是如何区分一词多义的?

通过强大的上下文理解能力(别说这里还有词可以做判断, 就是mask这种情况,不也是训练中的情况吗)。

9. BERT的输入是什么,哪些是必须的,为什么position id不用给,type_id 和 attention_mask没有给定的时候,默认会是什么

输入为 token_ids(输入的词索引)、segment_ids(就是 type_id ,多个框架这里都使用的segment_id,句子id),attention_mask(注意力mask)。

不输入就默认全0或不mask(1)。

10.BERT训练时使用的学习率 warm-up 为什么要这么做?

有助于缓解mini-batch的提前过拟合现象,保持分布的平稳。并且有助于保证模型深层的稳定性。

由于warm-up实际上是先使用较低的学习率对数据进行学习,一定步数后改用大学习率继续进行学习。因此可以有效的防止前期由于对一些batch的数据进行过拟合。

实验结果表明,应用了warm-up的训练最终结果往往会比不是用warm-up的网络的准确率要高,因此也就证明了,前期“学错”的参数,后期并不能拟补。

11. Bert 采用哪种Normalization结构,LayerNorm和BatchNorm区别,LayerNorm结构有参数吗,参数的作用?

bert采用的是layernorm。有参数, β、γ 。

LN和BN的区别为标准化的方向不同。

也很容易看出来,BN 对序列长度更敏感,因此BN在序列模型中很少出现(RNNs)这也是为什么bert(trm)中使用LN而不是BN的原因。

12. 为什么说ELMO是伪双向,BERT是真双向?产生这种差异的原因是什么?

个人理解。ELMO只是使用了双向的RNN(LSTM)结构,而RNN本质上只是正逆进行两次编码。而Bert可以对两个方向(正逆)进行attention,属于一次性流程。

13. Bert在哪里做了权重共享,为什么可以做权重共享?好处是什么?

embedding复用,更专业的叫法是weight tying(但是我真不知道这个怎么翻译)。详见【深度学习笔记】bert的mlm任务实现方式

14.Bert(Transformer)做点积缩放(scaled)的原因是什么?

在做attention时,会先除根号下dk(scaled)。

理由是如果不除以这个,将会导致梯度消失。

由于 数量级对softmax得到的分布影响非常大。在数量级较大时,softmax将几乎全部的概率分布都分配给了最大值对应的标签

并且作者认为

We suspect that for large values of dk, the dot products grow large in magnitude, pushing the softmax function into regions where it has extremely small gradients.

极大的点积值将整个 softmax 推向梯度平缓区,使得收敛困难

那为什么最后一个分类层不是用sacled呢?

因为最后一层往往意味着和交叉熵联合求导。因此对于预测正确(与测试值和真实值差很小),学习率低就低吧, 抑制参数更新 ;反之给出最大程度的负反馈。

15.transformer的encoder和decoder是如何进行交互的?和一般的seq2seq有什么区别?

依然是通过隐藏层进行交互。

和seq2seq不同的是transformer的decoder的输入包括:encoder的输出、encoder的输入(teaching force,并不是全部);将encoder的输出(K,V)和decoder的输入进行注意力计算后,继续进行decoder计算。

也就是说,decoder端实际上进行了两次attention运算,一次是自己的input的attention,结果进行add&LN之后,进行第二次encoder的output(self attention的输出作为Q,与encoder输出的K,V进行attention)的attention,随后add&LN。

16.transformer中的multi-head attention中为什么要对每个head进行降维?

一言以蔽之: 在不增加时间复杂度的情况下,同时,借鉴CNN多核的思想,在更低的维度,在多个独立的特征空间更容易学习到更丰富的特征信息。

因为self-attention的时间复杂度实际上是O(n*n*d)的,其中n是序列长度,d是embedding维度。所以降低embedding维度(768->64)有利于加快 计算速度。

详见【深度学习笔记】为什么transformer(Bert)的多头注意力要对每一个head进行降维?

但是在这里一提,虽然attention的可解释行很强,但是依然有研究表明(ICML2021)attention机制的并不想人们认为的那样——即使它有效。


0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用 * 标注