目录
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部分。
2. Structure
(下面的介绍主要贴上李宏毅老师的ppt截图,写的很好,我就不重新画了,hiahiahia~~~)
2.1 self-attention
流程:
- 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具体计算过程
-
X经过编码得到I;
-
I通过三个权值矩阵,分别生成q1, q2, q3, q4(记为Q),k1, k2, k3, k4(记为K), v1, v2, v3, v3(记为V);
Q:用于匹配特征
K:被匹配的特征
V:被提取的特征 -
拿每个q去对每个k做attention(除以根号d是为了消除维度大小对点积的影响)。
以q1为例:
1) q1跟k1, k2, k3, k4分别作点积,得到 α 11 \alpha11 α11, α 12 \alpha12 α12, α 13 \alpha13 α13, α 14 \alpha14 α14;
2) α 11 \alpha11 α11, α 12 \alpha12 α12, α 13 \alpha13 α13, α 14 \alpha14 α14经过softmax得到\dot{x},得到, α ′ 11 \alpha'11 α′11, α ′ 12 \alpha'12 α′12, α ′ 13 \alpha'13 α′13, α ′ 14 \alpha'14 α′14(帽子符号不知道咋打,用’替代吧-_-||);
3) α ′ 11 \alpha'11 α′11, α ′ 12 \alpha'12 α′12, α ′ 13 \alpha'13 α′13, α ′ 14 \alpha'14 α′14再分别跟v1, v2, v3, v4相乘求和,得到b1;
同理,得到b2, b3, b4
总而言之,self-attention其实就是一堆矩阵的运算,所以可用GPU加速。
2.2 multi-head
多头机制过程:
1. 编码后的I,跟多个权值矩阵运算,生成多个q, k, v
2. 多个头就能生成多个b
3. 再把这些b concat起来,跟一个全连接层相乘(concat之后维度变多了,这样做起到一个降维效果,保持维度一致),得到最后的b。
(multi-head机制可以理解为,用不同的头去提取不同的信息,类似与CNN中的不同卷积核)
2.3 Positional encoding and Positional embeddings
从2.1节中可以看出,self-attention的计算中,每个b的计算是并行处理的,每个b的同时得出的,这样子就少了位置信息。(每个位置都是同时计算的)。
因此Transformers的作者就引入了位置信息,BERT虽然是Transformers的Encoder部分,但是两者的位置信息计算方法是不同的。
Transformers中利用positional encoding计算:
BERT使用学习的Positional Embeddings
打印bert结构,可以看到位置参数为512 * 768 = 393216,即每个位置用一个768维的向量表示。
3. Pre-training and finetune
3.1 pre-training
pre-training主要有两个机制:Masked LM 和 Next Sentence Prediction(NSP)
- Masked LM
- 句子中的词汇有15%的可能性被mask掉
- 预测被mask掉的词汇
- Next Sentence Prediction
- 输入两个句子,判断两个句子是否关联
- [CLS]为分类向量符,[SEP]句子分隔符
3.2 fine-tune
(a)输入两个句子,利用[CLS]输出的特征,接个分类器,判断两个句子的关系;
(b)单个句子分类,输入一个句子,也是利用[CLS]输出的特征,接个分类器,判断该句子的类别。具体应用如情感分类,又如淘宝评论是好评还是差评等;
(c)问答任务,其实就是阅读理解,输入一个问题,和一段文本,从文本中找出该问题的答案。具体做法是,找到答案在文本中的起始位置和结束位置;
(d)单个句子的词性判断,具体应用如命名实体识别等。
4. Example and practise
这一部分主要通过代码的实际操作,来加深对BERT的理解。
主要环境:keras,keras_bert
4.1 下载bert的预训练中文模型
4.2 single sentence
假设输入的是:广州
变量说明:
token_ids:就是每个字在字典中(vocab.txt)的位置;
segment_ids: 表示输入的句子是属于第一个句子还是第二个句子,第一个句子则用0表示,第二个句子用1表示;
[CLS]和[SEP]:对于输入,bert会在文本前插入[CLS]分类符,尾部加入[SEP]分隔符,这两个符号在字典中也有对应的索引。
4.3 two sentences
假设输入的是两个句子:“广州” 和 “你好”
同理,可得:
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的计算过程,把文本转换成了特征。有了特征之后,就可以利用这些特征去完成各自需要的任务了。
结束。