BERT模型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BERT模型相关的知识,希望对你有一定的参考价值。

参考技术A BERT有两部分:pre-training和fine-tuning。在pre-training阶段,会在没有标注数据且不同预训练任务上训练模型;在fine-tuning阶段,BERT会根据预训练模型的参数初始化,然后在下游任务的标注数据进行fine-tuned。

BERT是一个多层双向的transformer encoder模型。是的,BERT中的transformer只有encoder,没有decoder!!!

BERT模型中使用的是WordPiece embeddings,最后一层隐藏层的向量会作为每个token的表示。另外,有3个特殊字符如下:

还需要说明的是,BERT模型中sentence并不是语义层面的句子,可以是连续的文本。sequence指的是token 序列,可以是单个sentence也可以是合在一起的 two sentences。

相比之前的预训练模型,BERT在预训练阶段做了两个无监督任务:MLM(masked LM)和next sentence prediction(NSP)。

通过源码能看到:

我没明白为什么传统模型无法双向训练,而用masked LM可以解决双向训练的问题:

某 文章 的解释是:

masked LM的做法:

在masked LM任务中只会预测masked token,其他token不做预测。

有一些任务比如问答(QA)和自然语言推理(NLI)都是对两句话关系的理解,但是语言模型无法捕捉这种信息。为了让训练的模型能获取句子之间的关系,在预训练的时候多加了一个二值化的NSP任务。具体做法:

对这部分我的疑问是:

原文中不理解的地方:

用Bert模型计算句子的vector

1. Bert模型

Bert模型是2018年google开源出来的NLP的模型,具体实现请参考:https://github.com/google-research/bert

2. Bert模型计算句子的vector

2.1 通过模型获取句子的encoder层

 model = modeling.BertModel(
        config=bert_config,
        is_training=False,
        input_ids=input_ids,
        input_mask=input_mask,
        token_type_ids=input_type_ids,
        use_one_hot_embeddings=use_one_hot_embeddings)
model.get_all_encoder_layers()

2.2 拼接层级

all_layers = [model.get_all_encoder_layers()[layer_index] for (i, layer_index) in enumerate(layer_indexes)]
encoder_layer = tf.concat(all_layers, -1)

这时候生成的是以句子最大长度的x ,768*n层 纬度的矢量,比如最大句子长度128,层数是-1,-2,-4,-9(4层)

Tensor("concat:0", shape=(?, 128, 3072), dtype=float32)

2.3 计算句子的vector

因为bert模型返回的是句子长度128维的矢量,但我们每个句子都有自己的长度,所以我们需要找到真实长度所对应的矢量,在传递给模型的参数的时候有一个mask,代表128维的句子长度里的有效字的位置用1来标示

点乘mask 找到有效的纬度的矢量

r = X * tf.expand_dims(mask, axis=-1)

简单的平均算法求句子的vector,将有效纬度的矢量相加,在每一层上求均值

tf.reduce_sum(t, axis=1) / (
                    tf.reduce_sum(mask, axis=1, keepdims=True) + 1e-10)

最后输出的是以层为纬度(3072)的句子的vector

Tensor("concat:0", shape=(?, 3072), dtype=float32)

这样就能简单的计算获取到了一个句子的vector

以上是关于BERT模型的主要内容,如果未能解决你的问题,请参考以下文章

BERT关系抽取之R-BERT模型

图解BERT模型结构输入输出

如何将微调过的 bert 模型的输出作为输入提供给另一个微调过的 bert 模型?

用Bert模型计算句子的vector

预训练语言模型(GPT,BERT)

[Python人工智能] 三十三.Bert模型 keras-bert库构建Bert模型实现文本分类