()一 Bert原理介绍:
Bert是transformer的一种变体,所以这里先介绍一下transformer。tramsformer是一种基于多头注意力机制的模型,是NLP中非常重要的模型,本质上是一种Encode-Decoder结构。
上图就是transformer模型的主要结构,下面分别介绍模型结构的Encoder和Decoder部分。
(1)Encoder部分主要包括三个部分组成(a)输入部分;(b)注意力机制部分;(c)前馈神经网络部分。(a)输入部分,对于NLP中存在一个词汇表,词汇表中记录了我们常用的单词,对于词汇表以外的单词用<UNK>表示。我们可以使用one-hot编码,对输入的单词进行编码成序列长度,单词对应的位置为1,其余部分为0,这种方式会使得向量长度很长,并且存在大量的0占据内存,而且并不能表示两个词之间的联系。为了克服上述的缺点,提出 Word Embeding方式进行编码,设计权重矩阵W,将词向量与这个矩阵点成,将结果用于表示单词。相当于查找表。input Embeding主要包括(batch-size,length of sentense,word vector),Positional encoding主要采用正余弦的方式表示位置信息。pos表示单词的位置,i表示纬度。偶数维度用sin函数,奇数纬度用cos函数。这种方式可以表示位置信息主要原因在于sin(a+b)=sin(a)cos(b)+cos(a)sin(b)。
(b)主要是多头注意力机制。本质就是对于不同的单词具有不同的权重,对于单词的注意力的多少不同,计算公式如下图所示。Q,K,V三个矩阵,通过单词向量与向量Queries,Keys.Value值相乘。
注意力机制中的残差可以加深网络深度而避免梯度消失将原始数据X与注意力机制得到的结果相加。相加后经过Layer Normalization层(BN效果比较差,所以不太用),LN可以对一个样本所有单词做缩放。
(c)就是前馈神经网络
(2)Decoder部分,与Ecoder类似。mask主要是随机抹除掉某个单词,然后进行预测,不同于RNN预测是根据前面预测结果得到后面预测结果,mask主要通过上下文对空格进行预测。Multi-Head Attention 中的K,V矩阵,Q来自本身。
Bert 主要是transformer中的Encoder堆叠在一起,他的输入与transformer的输入有所不同,而且BERT的Decoder也是使用transformer中的Encoder。下面介绍一下Bert的输入表示;其中input中[CLS]和[SEP]特殊字符主要用于NSP任务,NSP是一个二分类任务,判断两个句子之间的关系,即通过[CLS]接一个而分类器。[SEP]表示句子的标点。Token Embeddings就是对上面所有单词做初始化等。Segment Embedding主要是用于确定前后句子之间的关系,前句为0,后句为1.Position Embedding 主要是通过随机初始化使得模型自己学习出来单词的位置信息。其中mask主要是选择15%单词进行,这15%中的80%替换成mask;10%原封不动;10%替换成其他。
二 Bert源码下载:
在pycharm的终端输入git clone +github上复制的url(GitHub模型地址GitHub - google-research/bert: TensorFlow code and pre-trained models for BERT)
Readme上面提供了许多预训练好的模型,如上图所示,可以直接下载。同时也有数据集的下载,完成后建立下图所示的文件夹目录
入口文件就是run_classifier.py文件,在对该文件进行运行之前要add configuration操作,步骤如下图run -> add configuration,然后如下。
图中步骤二就是run_classifier.py文件的位置,步骤三复制下面所示即可:
--task_name=MRPC --do_train=true --do_eval=true --data_dir=../GLUE/glue_data/MRPC --vocab_file=../GLUE/BERT_BASE_DIR/uncased_L-12_H-768_A-12/vocab.txt --bert_config_file=../GLUE/BERT_BASE_DIR/uncased_L-12_H-768_A-12/bert_config.json --init_checkpoint=../GLUE/BERT_BASE_DIR/uncased_L-12_H-768_A-12/bert_model.ckpt --max_seq_length=128 --train_batch_size=2 --learning_rate=2e-5 --num_train_epochs=3.0 --output_dir=../GLUE/output/
最后运行该文件就行。
注意:我一开始运行出现很多错误后分析主要原因是我是同python3.8加tensorflow2.7.0版本不对应,在requirement.txt文件中知道tensorflow需要大于1.11.0版本而且只能是tensorflow1.0系列,最后我在Anaconda中重新建立虚拟环境,并且使用python3.6加tensorflow1.12.0版本后运行畅通无阻:建立虚拟环境步骤如下:
(1)打开 Anaconda Prompt
conda create --name ftvn1 python=3.6 anaconda
(2)激活虚拟环境
activate tfvn1
(3)安装fensorflow
pip install tensorflow==1.12.0
(4)最后将项目的解释器改成新建的虚拟环境即可