Bert说明

1 模型结构

1.1 说明

  • Bert的结构 = Embedding层 + transformer encoder层 x N个

  • Bert的输入文本序列,根据具体任务不同,即可以是一句话,也可以是两句话,下文以两句话为例进行说明。两句话的文本结构如下:[CLS] + 上句 + [SEP] + 下句 + [SEP] 。

  • Bert的特殊token

    1. [CLS] 分类token,输入序列的第一个token,起分类作用
    2. [SEP] 标明上句或下句结束的token
    3. [MASK] 被遮住的token
  • 超参数说明

    1. V 词袋长度,即词的个数
    2. L 最大序列长度,[CLS] + 上句 + [SEP] + 下句 + [SEP] 的最大长度
    3. E Embedding维度,即一个token用E维向量表示,也等于transformer encoder层的隐层维度
    4. F feedforward全连接层的维度
    5. H multi-head的head个数
    6. M transformer encoder层的个数
  • 为方便,下文不考虑batch_size,只以1个输入序列为例进行说明,且该序列的长度即等于最大序列长度L。该序列用X表示。同时,也不考虑**函数层和dropout层。

1.2 Embedding层

Bert说明

  • 任何一个token的embedding向量 = word embedding + segment embedding + position embedding

    1. word embedding : 词汇表里的每一个词对应一个向量,即上图的Token embedding。矩阵的大小 (V, E)
    2. segment embedding : 上句或下句对应一个向量。矩阵的大小 (2, E)
    3. position embedding : 输入序列里的每一个位置对应一个向量。矩阵的大小 (L, E)
  • 经过Embedding层,X大小由(L) 变为 (L, E)

1.3 transformer encoder层

Bert说明

  • 由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,即。

    1. Q = Linear(X) Q的大小(L, E/H)
    2. K = Linear(X) K的大小(L, E/H)
    3. V = Linear(X) V的大小(L, E/H)
  • softmax(QKTE/H)Vsoftmax(\frac{QK^T}{\sqrt{E/H}})V 。经由该公式得到每个head的输出,输出大小为(L, E/H)。每个head的结果拼接起来,大小为(L, H)。

  • softmax(QKTE/H)softmax(\frac{QK^T}{\sqrt{E/H}}) 即Attention权重。

  • 经过self-attention层,X大小由(L, E) 变为 (L, E)

1.3.2 feedforward层
  • 其实就是两个全连接层
    1. X1 = Linear(X) X1的大小(L, F)
    2. X2 = Linear(X1) X2的大小(L, E)
  • 经过feedforward层,X大小由(L, E) 变为 (L, E)
1.3.3 add&norm层
  • Y = 标准化(X + 网络结构(X))
  • 相当于做个残差连接,再标准化。即
    1. self-attion的输入X + self-attention的输出,再做标准化
    2. 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里,再按以下规则处理:

    1. 80%的概率 变为[MASK]
    2. 10%的概率 替换成其他的token
    3. 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的强大效果来源于
    1. 在一个超大量超全面的语料库上拼命的做预训练,得到一个通用的模型。再根据具体的任务,具体的数据,做fine-tuning即可有不错的效果。
    2. self-attention结构,每个token可以看到上下文的所有token,不像LSTM每个token只能看到一个方向的token。

有不错的效果。
2. self-attention结构,每个token可以看到上下文的所有token,不像LSTM每个token只能看到一个方向的token。