1. what is BERT?

啥是bert呢?

  • BERT(Bidirectional Encoder Representation from Transformers):即 Transformers的编码器。

啥是Transformers呢?

  • seq2seq model with “self-attention”:即拥有自注意力机制的seq2seq模型。

啥是seq2seq model呢?

  • seq2seq是RNN的变种,是一种N VS M(就是输入跟输出的维度可以不同的意思)的模型,这种结构又叫Encoder-Decoder模型,也可以称之为seq2seq模型,常用于机器翻译等。

Transformers的结构图如下所示,而BERT就是左边的encoder部分。
NLP之不简单笔记:啥是BERT

2. Structure

(下面的介绍主要贴上李宏毅老师的ppt截图,写的很好,我就不重新画了,hiahiahia~~~)

2.1 self-attention

NLP之不简单笔记:啥是BERT
流程:

  • step1:输入x1, x2, x3, x4 ,记为X
  • step2:经过编码得到a1, a2, a3, a4,记为I
  • step3:a1, a2, a3, a4通过self-attention得到输出b1, b2, b3, b4,记为O

self-attention具体计算过程
NLP之不简单笔记:啥是BERT

  1. X经过编码得到I;

  2. I通过三个权值矩阵,分别生成q1, q2, q3, q4(记为Q),k1, k2, k3, k4(记为K), v1, v2, v3, v3(记为V);
    Q:用于匹配特征
    K:被匹配的特征
    V:被提取的特征

  3. 拿每个q去对每个k做attention(除以根号d是为了消除维度大小对点积的影响)。
    以q1为例:
    1) q1跟k1, k2, k3, k4分别作点积,得到α11\alpha11α12\alpha12α13\alpha13α14\alpha14
    NLP之不简单笔记:啥是BERT

    2)α11\alpha11α12\alpha12α13\alpha13α14\alpha14经过softmax得到\dot{x},得到,α11\alpha'11α12\alpha'12α13\alpha'13α14\alpha'14(帽子符号不知道咋打,用’替代吧-_-||);
    NLP之不简单笔记:啥是BERT

    3)α11\alpha'11α12\alpha'12α13\alpha'13α14\alpha'14再分别跟v1, v2, v3, v4相乘求和,得到b1;
    NLP之不简单笔记:啥是BERT
    同理,得到b2, b3, b4
    NLP之不简单笔记:啥是BERT
    总而言之,self-attention其实就是一堆矩阵的运算,所以可用GPU加速。
    NLP之不简单笔记:啥是BERT

2.2 multi-head

多头机制过程:

1. 编码后的I,跟多个权值矩阵运算,生成多个q, k, v

NLP之不简单笔记:啥是BERT
2. 多个头就能生成多个b
NLP之不简单笔记:啥是BERT
3. 再把这些b concat起来,跟一个全连接成相乘(concat之后维度变多了,这样做起到一个降维效果,保持维度一致),得到最后的b。

NLP之不简单笔记:啥是BERT
(multi-head机制可以理解为,用不同的头去提取不同的信息,类似与CNN中的不同卷积核)

2.3 Positional encoding and Positional embeddings

从2.1节中可以看出,self-attention的计算中,每个b的计算是并行处理的,每个b的同时得出的,这样子就少了位置信息。(每个位置都是同时计算的)。

因此Transformers的作者就引入了位置信息,BERT虽然是Transformers的Encoder部分,但是两者的位置信息计算方法是不同的。

Transformers中利用positional encoding计算:
NLP之不简单笔记:啥是BERT

BERT使用学习的Positional Embeddings
NLP之不简单笔记:啥是BERT
打印bert结构,可以看到位置参数为512 * 768 = 393216,即每个位置用一个768维的向量表示。
NLP之不简单笔记:啥是BERT

3. Pre-training and finetune

3.1 pre-training

pre-training主要有两个机制:Masked LM 和 Next Sentence Prediction(NSP)

  • Masked LM
  1. 句子中的词汇有15%的可能性被mask掉
  2. 预测被mask掉的词汇
    NLP之不简单笔记:啥是BERT
  • Next Sentence Prediction
  1. 输入两个句子,判断两个句子是否关联
  2. [CLS]为分类向量符,[SEP]句子分隔符
    NLP之不简单笔记:啥是BERT

3.2 fine-tune

NLP之不简单笔记:啥是BERT
(a) 输入两个句子,利用[CLS]输出的特征,接个分类器,判断两个句子的关系;
(b)单个句子分类,输入一个句子,也是利用[CLS]输出的特征,接个分类器,判断该句子的类别。具体应用如情感分类,又如淘宝评论是好评还是差评等;
©问答任务,其实就是阅读理解,输入一个问题,和一段文本,从文本中找出该问题的答案。具体做法是,找到答案在文本中的起始位置和结束位置;
(d)单个句子的词性判断,具体应用如命名实体识别等。

4. Example and practise

这一部分主要通过代码的实际操作,来加深对BERT的理解。
主要环境:keras,keras_bert

4.1 下载bert的预训练中文模型

NLP之不简单笔记:啥是BERT

4.2 single sentence

假设输入的是:广州
NLP之不简单笔记:啥是BERT
变量说明:
token_ids:就是每个字在字典中(vocab.txt)的位置;
segment_ids: 表示输入的句子是属于第一个句子还是第二个句子,第一个句子则用0表示,第二个句子用1表示;
[CLS][SEP]:对于输入,bert会在文本前插入[CLS]分类符,尾部加入[SEP]分隔符,这两个符号在字典中也有对应的索引。
NLP之不简单笔记:啥是BERT
NLP之不简单笔记:啥是BERT

NLP之不简单笔记:啥是BERT

4.3 two sentences

假设输入的是两个句子:“广州” 和 “你好”
同理,可得:
NLP之不简单笔记:啥是BERT

4.4 总结

以输入“广州”为例进行说明:
(1)在输入文本中,插入[CLS]和[SEP]符;
(2)转换为token_ids和segment_ids;
(3)token_ids和segment_ids再转换为token_embeddings、seg_embeddings,再结合位置信息postion_embeddings,三者的维度一致,进行相加,得到上面2.1节所说输入a1, a2, a3, a4(即I);
(4)I经过self-attention和multi-head得到输出b1, b2, b3, b4,在经过ADD、NORM、FEED-FORWARD操作,得到特征1,2,3,4,如下图所示黄色部分;
(5)1,2,3,4特征分别为[CLS]、广、州、[SEP]对应的特征。

这就是BERT的计算过程,把文本转换成了特征。有了特征之后,就可以利用这些特征去完成各自需要的任务了。

NLP之不简单笔记:啥是BERT
结束

相关文章: