BERT

记录学习前的问题

  1. hidden layer到底是啥?是attention吗?【bert是由多个Block组成,一个block就是一个hidden layer。每个block里面由两个大的部分组成:attention 和前馈神经网络。attention部分先是进行一个attention,然后经过feed-forward将输出转换成跟输入的shape一致,方便残差连接。第二个feed-forward部分,先将第一部分的输出通过FF转换成一个中间大小的维度,然后再将其通过FF转换回之前的shape,也是为了方便残差。】
  2. 结构是怎么样的?多头attention是一个单元,由很多个这样的单元组成吗?
  3. 各个input和output的shape
  4. attention层如何做dropout?【这里面的dropout分为两个部分。第一部分是FF层加上的dropout。在每一个block中,在每一次残差之前,对当前的输出进行一次dropout,然后和整体的输入进行相加构成残差。第二部分的dropout是在attention内部,每次attention之后,对softmax之后的attention score进行dropout,相当于当前的probability不参与对应的value值的计算。】
  5. mask LM的时候,只对key进行了mask,那对应位置上的query怎么处理呢?后续怎么进行预测呢?
  6. attention mask是如何实现的?【首先,mask的shape是[batch_size, from_seq_length, to_seq_length],需要mask的地方为0,其余都为1。我们的目的是将为0的地方,变成$-\infty$。因此,我们先将mask中0,1互换,然后乘以$-10000.0$,此时,对于不需要mask的地方,数值为0;对于需要mask的地方,数值为-10000.0。将这个和所得的attention score进行相加,即可。】
  7. token type是啥呢?16种token type分别对应什么呢?
  8. bert模型命名中的含义?【cased/uncased,表明是否全转成小写;L指的是layer/block的个数,每一个由attention和FF组成;H是hidden size,是多头attention的最终输出width;A是attention的head的个数。】
  9. 不同的长度如何训练?【因为句子的长度不等,所以最开始我以为会按照两个句子的组合长度进行排序,然后相同长度的按batch进行训练。这里有两个错误的认知:每个训练数据并不是两个句子,而是从一个document中截取大概max_seq_length长度的sequence进行训练,虽然也是分成AB句,但跟现实中的句子不是对应的;没有不同的训练长度,每次训练的长度都是固定的,因为我们在准备训练数据的时候,会尽量凑满max_seq_length,没凑满的会padding(有一定比例的不填满,确保training和test的语料的一致性)。】
  10. 词向量的维度和hidden_size的关系?二者不一定相等,一般embedding的width要远小于hidden_size的大小。所以,在初始化embedding的时候,一般参数为两个matrix,一个的shape为[vocab, embedding_width],是每一个word对应的词向量;另一个shape为[embedding_width, hidden_size],用于将embedding转换成width为hidden_size的维度,方便后面的多个transformer layers。两个matrix都是可训练的。

Tokenizer

tokenizer的大概构成?

tokenizer由两个部分构成:BasicTokenizer和WordpieceTokenizer。BasicTokenizer将给定的文本按照空格

参数

vocabulary大小:选择一个多大的词库

hidden_size:

准备数据

提供的corpus文件格式要求?

每一行是一个sentence,多行构成一个document,每个document之间通过空行进行分隔。