Bert说明
Bert说明
1 模型结构
1.1 说明
-
Bert的结构 = Embedding层 + transformer encoder层 x N个
-
Bert的输入文本序列,根据具体任务不同,即可以是一句话,也可以是两句话,下文以两句话为例进行说明。两句话的文本结构如下:[CLS] + 上句 + [SEP] + 下句 + [SEP] 。
-
Bert的特殊token
- [CLS] 分类token,输入序列的第一个token,起分类作用
- [SEP] 标明上句或下句结束的token
- [MASK] 被遮住的token
-
超参数说明
- V 词袋长度,即词的个数
- L 最大序列长度,[CLS] + 上句 + [SEP] + 下句 + [SEP] 的最大长度
- E Embedding维度,即一个token用E维向量表示,也等于transformer encoder层的隐层维度
- F feedforward全连接层的维度
- H multi-head的head个数
- M transformer encoder层的个数
-
为方便,下文不考虑batch_size,只以1个输入序列为例进行说明,且该序列的长度即等于最大序列长度L。该序列用X表示。同时,也不考虑**函数层和dropout层。
1.2 Embedding层
-
任何一个token的embedding向量 = word embedding + segment embedding + position embedding
- word embedding : 词汇表里的每一个词对应一个向量,即上图的Token embedding。矩阵的大小 (V, E)
- segment embedding : 上句或下句对应一个向量。矩阵的大小 (2, E)
- position embedding : 输入序列里的每一个位置对应一个向量。矩阵的大小 (L, E)
-
经过Embedding层,X大小由(L) 变为 (L, E)
1.3 transformer encoder层
- 由self-attention层 + feedforward层 + add&norm层构成
- multi-head的每个head平均处理 E/H 个维度,每个head的处理结果再拼接起来,经过add&norm层,再传给feed-forward层,再经过add&norm层输出给下一个encoder层。
- 最后一个encoder层的输出即bert的输出。
1.3.1 self-attention层
-
每个head经由3个全连接层,输入X,生成Q, K, V,即。
- Q = Linear(X) Q的大小(L, E/H)
- K = Linear(X) K的大小(L, E/H)
- V = Linear(X) V的大小(L, E/H)
-
。经由该公式得到每个head的输出,输出大小为(L, E/H)。每个head的结果拼接起来,大小为(L, H)。
-
即Attention权重。
-
经过self-attention层,X大小由(L, E) 变为 (L, E)
1.3.2 feedforward层
- 其实就是两个全连接层
- X1 = Linear(X) X1的大小(L, F)
- X2 = Linear(X1) X2的大小(L, E)
- 经过feedforward层,X大小由(L, E) 变为 (L, E)
1.3.3 add&norm层
- Y = 标准化(X + 网络结构(X))
- 相当于做个残差连接,再标准化。即
- self-attion的输入X + self-attention的输出,再做标准化
- feedforward的输入X + feedforward的输出,再做标准化
- 经过add&norm层,X大小由(L, E) 变为 (L, E)
2 预训练
2.1 说明
- bert的预训练包含两个任务:mask词的预测,和下句预测。在进行预训练时,将这两个任务的损失相加,作为最终的损失。
- 一个可能的输入序列如下:[CLS] my dog [MASK] cute [SEP] he likes play ##ing [SEP]
2.2 mask词预测
-
一个序列,除了特殊的token,随机mask 15% 的token,被mask的token里,再按以下规则处理:
- 80%的概率 变为[MASK]
- 10%的概率 替换成其他的token
- 10%的概率 保持不变
-
bert输出接全连接层去预测该词是哪一个词,即X由bert的输出 (L, E) 变为 (L, V)。mask损失只计算被mask的token的损失。
2.3 下句预测
- 在语料库里,对输入序列的下句进行选择,保证下句有50%的概率真的是上句的下句,50%的概率不是上句的下句。
- 将[CLS]的bert输出接全连接层,做2分类预测,计算损失。
3 fine-tuning
- 如果是分类任务,将[CLS]的输出,接全连接层,做分类预测即可;如果是类似序列标注这种任务,将每一个token的输出,接全连接层,做分类预测即可。只要稍微改造下输入输出的数据格式,bert可做大部分NLP任务。
- Bert的强大效果来源于
- 在一个超大量超全面的语料库上拼命的做预训练,得到一个通用的模型。再根据具体的任务,具体的数据,做fine-tuning即可有不错的效果。
- self-attention结构,每个token可以看到上下文的所有token,不像LSTM每个token只能看到一个方向的token。
有不错的效果。
2. self-attention结构,每个token可以看到上下文的所有token,不像LSTM每个token只能看到一个方向的token。