本文内容列表
BERT简介
BERT全称 Bidirectional Encoder Representations from Transformers,是一种新的语言模型。自Google在2018年10月底公布BERT在11项NLP任务中的卓越表现后,BERT引起了社区极大的关注与讨论,被认为是 NLP 领域的极大突破。
BERT是一种预训练语言表示的方法,在大量文本语料上训练了一个通用的“语言理解”模型,然后用这个模型去执行各类下游子任务。它是第一个用在预训练NLP上的无监督、深度双向系统。
Google已开放源码,并提供了预训练模型的下载地址,这些模型已经在大规模数据集上进行了预训练。
git地址: google-research/bert
当然
git上还有其他版本的实现,可自行百度。
关于BERT的理论部分,可参照其他博客,该文后面主要对BERT的上手实践进行记录。。
BERT源码分析
1、从git上克隆代码
使用如下命令:
git clone https://github.com/google-research/bert
2、下载预训练模型
git上给出了以下预训练模型,可根据需要进行下载:
- BERT-Large, Uncased(Whole Word Masking):24-layer, 1024-hidden, 16-heads, 340M parameters
- BERT-Large, Cased (Whole Word Masking: 24-layer, 1024-hidden, 16-heads, 340M parameters
- BERT-Base, Uncased: 12-layer, 768-hidden, 12-heads, 110M parameters
- BERT-Large, Uncased24-layer, 1024-hidden, 16-heads, 340M parameters
- BERT-Base, Cased:12-layer, 768-hidden, 12-heads , 110M parameters
- BERT-Large, Cased: 24-layer, 1024-hidden, 16-heads, 340M parameters
- BERT-Base, Multilingual Cased (New, recommended): 104 languages, 12-layer, 768-hidden, 12-heads, 110M parameters
- BERT-Base, Multilingual Uncased (Orig, not recommended) (Not recommended, use Multilingual Cased instead): 102 languages, 12-layer, 768-hidden, 12-heads, 110M parameters
- BERT-Base, Chinese: Chinese Simplified and Traditional, 12-layer, 768-hidden, 12-heads, 110M parameters
其中,最后一个是针对中文的预训练模型。
由于接下来的工作是对中文进行处理,因此下载最后一个模型,文件名为 chinese_L-12_H-768_A-12.zip。将其解压至bert文件夹,包含以下三种文件:
- 配置文件(bert_config.json):用于指定模型的超参数
- 词典文件(vocab.txt):用于WordPiece 到 Word id的映射
- Tensorflow checkpoint(bert_model.ckpt):包含了预训练模型的权重(实际包含三个文件)
3、代码结构
BERT的本质上是一个两段式的NLP模型。第一阶段:Pre-training,利用无标记的语料训练一个语言模型;第二阶段:Fine-tuning,利用预训练好的语言模型,完成具体的NLP下游任务。
我们在下载的预训练模型的基础上,进行
Fine-tuning,因此着重介绍微调的代码使用。
下图是bert的源码结构:

其中, run_classifier.py和run_squad.py这两个文件是用来做fine-tuning的。
extract_features.py文件从名称来看可知是用来提取特征向量的,后面文章再具体介绍。
4、 run_classifier.py文件(中文文本相似度任务fine-tuning)
接下来,以 中文文本相似度 任务为例,介绍进行
fine-tuning的流程。
打开run_classifier.py文件,查看其文件结构,可以如下看到几个类,下图是run_classifier.py文件中所包含的几个数据处理类:

其中,几个****Processor的类,都继承于同一个父类DataProcessor(object),该父类提供了 4 个抽象方法,如下图:

由名称我们可知:前三个方法是获取 训练、验证、测试的输入数据,第四个方法是获取labels。
对于我们处理自己的数据,就需要自定义新的数据类,并重写这四个方法,从而实现数据的获取过程。
1. 自定义数据类
具体的实现方法可以参考其他几个类的实现过程。
现有类分析
假设我们数据类取名为SimProcessor,具体如何实现4个方法呢,我们不妨来看看其中一个数据类,如XnliProcessor,以get_train_examples()函数和get_labels()函数为例分析:
def get_train_examples(self, data_dir): # 获取训练数据
"""See base class."""
lines = self._read_tsv(
os.path.join(data_dir, "multinli",
"multinli.train.%s.tsv" % self.language)) # 读取训练文件,后缀为.tsv
examples = [] # 空列表
for (i, line) in enumerate(lines): # 逐行读取
if i == 0:
continue
guid = "train-%d" % (i)
text_a = tokenization.convert_to_unicode(line[0]) # 句子A
text_b = tokenization.convert_to_unicode(line[1]) # 句子B
label = tokenization.convert_to_unicode(line[2]) # label
if label == tokenization.convert_to_unicode(

最低0.47元/天 解锁文章
3612





