BERT模型实战之多⽂本分类(附源码)
BERT模型也出来很久了,之前看了论⽂学习过它的⼤致模型(可以参考前些⽇⼦写的笔记),但是⼀直有杂七杂⼋的事拖着没有具体去实现过真实效果如何。今天就趁机来动⼿写⼀写实战,顺便复现⼀下之前的内容。这篇⽂章的内容还是以⽐较简单⽂本分类任务⼊⼿,数据集选取的是新浪新闻cnews,包括了[‘体育’, ‘财经’, ‘房产’, ‘家居’, ‘教育’, ‘科技’, ‘时尚’, ‘时政’, ‘游戏’, ‘娱乐’]总共⼗个主题的新闻数据。那么我们就开始吧!
Transformer模型
BERT模型就是以Transformer基础上训练出来的嘛,所以在开始之前我们⾸先复习⼀下⽬前NLP领域可以说是最⾼效的‘变形⾦
刚’Transformer。由于⽹上Transformer介绍解读⽂章满天飞了都,这⾥就不浪费太多时间了。
本质上来说,Transformer就是⼀个只由attention机制形成的encoder-decoder结构。关于attention的具体介绍可以参考之前这篇。理解Transformer模型可以将其进⾏解剖,分成⼏个组成部分:
1. Embedding (word + position)
2. Attention mechanism (scaled dot-product + multi-head)
3. Feed-Forward network
4. ADD(类似于Resnet⾥的残差操作)
5. Norm(加快收敛)
6. Softmax
7. Fine-tuning
前期准备
1.下载BERT
我们要使⽤BERT模型的话,⾸先要去github上下载相关源码:
git clone github/google-research/bert.git
下载成功以后我们现在的⽂件⼤概就是这样的
2.下载bert预训练模型
Google提供了多种预训练好的bert模型,有针对不同语⾔的和不同模型⼤⼩的。Uncased参数指的是将数据全都转成⼩写的(⼤多数任务使⽤Uncased模型效果会⽐较好,当然对于⼀些⼤⼩写影响严重的任务⽐如NER等就可以选择Cased)
对于中⽂模型,我们使⽤。下载后的⽂件包括五个⽂件:
bert_model.ckpt:有三个,包含预训练的参数
<:词表
bert_config.json:保存模型超参数的⽂件
3. 数据集准备
前⾯有提到过数据使⽤的是新浪新闻分类数据集,每⼀⾏组成是 【标签+ TAB + ⽂本内容】
Start Working
BERT⾮常友好的⼀点就是对于NLP任务,我们只需要对最后⼀层进⾏微调便可以⽤于我们的项⽬需求。我们只需要将我们的数据输⼊处理成标准的结构进⾏输⼊就可以了。
DataProcessor基类
⾸先在run_classifier.py⽂件中有⼀个基类DataProcessor类:
class DataProcessor(object):
"""Base class for data converters for sequence classification data sets."""
def get_train_examples(self, data_dir):
"""Gets a collection of `InputExample`s for the train set."""
raise NotImplementedError()
def get_dev_examples(self, data_dir):
"""Gets a collection of `InputExample`s for the dev set."""
raise NotImplementedError()
def get_test_examples(self, data_dir):
"""Gets a collection of `InputExample`s for prediction."""
raise NotImplementedError()
def get_labels(self):
"""Gets the list of labels for this data set."""
raise NotImplementedError()
@classmethod
def_read_tsv(cls, input_file, quotechar=None):
"""Reads a tab separated value file."""
with tf.gfile.Open(input_file,"r")as f:
reader = ader(f, delimiter="\t", quotechar=quotechar)
lines =[]
for line in reader:
lines.append(line)
return lines
在这个基类中定义了⼀个读取⽂件的静态⽅法_read_tsv,四个分别获取训练集,验证集,测试集和标签的⽅法。接下来我们要定义⾃⼰的数据处理的类,我们将我们的类命名为MyTaskProcessor
编写MyTaskProcessorpython怎么读取py文件
MyTaskProcessor继承DataProcessor,⽤于定义我们⾃⼰的任务
class MyTaskProcessor(DataProcessor):
"""Processor for my task-news classification """
def__init__(self):
self.labels =['体育','财经','房产','家居','教育','科技','时尚','时政','游戏','娱乐']
def get_train_examples(self, data_dir):
return self._create_examples(
self._read_tsv(os.path.join(data_dir,'')),'train')
def get_dev_examples(self, data_dir):
return self._create_examples(
self._read_tsv(os.path.join(data_dir,'')),'val')
def get_test_examples(self, data_dir):
return self._create_examples(
self._read_tsv(os.path.join(data_dir,'')),'test')
def get_labels(self):
return self.labels
def_create_examples(self, lines, set_type):
"""create examples for the training and val sets"""
examples =[]
for(i, line)in enumerate(lines):
guid ='%s-%s'%(set_type, i)
text_a = vert_to_unicode(line[1])
label = vert_to_unicode(line[0])
examples.append(InputExample(guid=guid, text_a=text_a, label=label))
return examples
注意这⾥有⼀个self._read_tsv()⽅法,规定读取的数据是使⽤TAB分割的,如果你的数据集不是这种形式组织的,需要重写⼀个读取数据的⽅法,更改“_create_examples()”的实现。
编写main以及训练
⾄此我们就完成了对我们的数据加⼯成BERT所需要的格式,就可以进⾏模型训练了。
def main(_):
tf.logging.set_verbosity(tf.logging.INFO)
processors ={
"cola": ColaProcessor,
"mnli": MnliProcessor,
"mrpc": MrpcProcessor,
"xnli": XnliProcessor,
"mytask": MyTaskProcessor,
}
python run_classifier.py \
--task_name=mytask \
--do_train=true \
-
-do_eval=true \
--data_dir=$DATA_DIR/ \
--vocab_file=$BERT_BASE_ \
--bert_config_file=$BERT_BASE_DIR/bert_config.json \
--init_checkpoint=$BERT_BASE_DIR/bert_model.ckpt \
--max_seq_length=128 \
--train_batch_size=32 \
--learning_rate=2e-5 \
--num_train_epochs=3.0 \
--output_dir=mytask_output
其中DATA_DIR是你的要训练的⽂本的数据所在的⽂件夹,BERT_BASE_DIR是你的bert预训练模型存
放的地址。task_name要求和你的DataProcessor类中的名称⼀致。下⾯的⼏个参数,do_train代表是否进⾏fine tune,do_eval代表是否进⾏evaluation,还有未出现的参数do_predict代表是否进⾏预测。如果不需要进⾏fine tune,或者显卡配置太低的话,可以将do_trian去掉。max_seq_length代表了句⼦的最长长度,当显存不⾜时,可以适当降低max_seq_length。
BERT prediction
上⾯⼀节主要就是介绍了怎么去根据我们实际的任务(多⽂本分类)去fine-tune bert模型,那么训练好适⽤于我们特定的任务的模型后,接下来就是使⽤这个模型去做相应地预测任务。预测阶段唯⼀需要做的就是修改 – do_predict=true。你需要将测试样本命名为
test.csv,输出会保存在输出⽂件夹的test_result.csv,其中每⼀⾏代表⼀个测试样本对应的预测输出,每⼀列代表对应于不同类别的概率。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论