一.Transformer原理
中间那层就是transformer模型,他做的处理就是一个变压器,首先将input进行编码,然后解码后发给output,如下图所示
这个结构也可以叫做Multi-Head Attention结构。
下面详细看一下它的结构
query代表了decoder隐层序列,key代表了encoder隐层序列,value代表了encoder隐层的权重序列。那么Q,K,V则分别代表了三者包含多个样本时的matrix。
权重的计算方式有很多种,论文中使用的是“dot-product”,也就是使用t时刻encoder和decoder的隐层序列的点积作为t时刻的权重,因为这样做时间空间都很
二.bert模型
BERT 的创新点在于它将双向 Transformer 用于语言模型,
双向训练的语言模型对语境的理解会比单向的语言模型更深刻。
BERT是预测文中扣掉的词,可以充分利用到上下文的信息,这使得模型有更强的表达能力,这也是BERT中Bidirectional的含义。
bert主要是用了transformer的encoder模型,对输入的文本进行处理,因为encoder是输入整个文本因此可以处理上下文信息
- Masked LM (MLM)
在将单词序列输入给 BERT 之前,每个序列中有 15% 的单词被 [MASK] token 替换。 然后模型尝试基于序列中其他未被 mask 的单词的上下文来预测被掩盖的原单词。
这样就需要:
在 encoder 的输出上添加一个分类层
用嵌入矩阵乘以输出向量,将其转换为词汇的维度
用 softmax 计算词汇表中每个单词的概率
BERT 的损失函数只考虑了 mask 的预测值,忽略了没有掩蔽的字的预测。这样的话,模型要比单向模型收敛得慢,不过结果的情境意识增加了。
- Next Sentence Prediction (NSP)
在 BERT 的训练过程中,模型接收成对的句子作为输入,并且预测其中第二个句子是否在原始文档中也是后续句子。
在训练期间,50% 的输入对在原始文档中是前后关系,另外 50% 中是从语料库中随机组成的,并且是与第一句断开的。
为了帮助模型区分开训练中的两个句子,输入在进入模型之前要按以下方式进行处理:
在第一个句子的开头插入 [CLS] 标记,在每个句子的末尾插入 [SEP] 标记。
将表示句子 A 或句子 B 的一个句子 embedding 添加到每个 token 上。
给每个 token 添加一个位置 embedding,来表示它在序列中的位置。
为了预测第二个句子是否是第一个句子的后续句子,用下面几个步骤来预测:
整个输入序列输入给 Transformer 模型
用一个简单的分类层将 [CLS] 标记的输出变换为 2×1 形状的向量
用 softmax 计算 IsNextSequence 的概率
在训练 BERT 模型时,Masked LM 和 Next Sentence Prediction 是一起训练的,目标就是要最小化两种策略的组合损失函数。
三.代码实现
首先先下载bert相关源代码git clone https://github.com/google-research/bert.git
然后编写bert文件
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import random
import collections
import os
import sys
import tarfile
from tensor2tensor.data_generators import generator_utils
from tensor2tensor.data_generators import problem
from tensor2tensor.data_generators import text_encoder
from tensor2tensor.data_generators import text_problems
from tensor2tensor.utils import registry
import tensorflow as tf
EOS = text_encoder.EOS
@registry.register_problem
class Bert(text_problems.Text2ClassProblem)</