Bert模型的基本原理与Fine-tuning


本文主要讲解Bert模型的基本原理与Fine-tuning。

基本原理

BERT是一种 预训练语言模型 ,即首先使用大量无监督语料进行语言模型预训练(Pre-training),再使用少量标注语料进行微调(Fine-tuning)来完成具体NLP任务(分类、序列标注、句间关系判断和机器阅读理解等)。

BERT的全称是Bidirectional Encoder Representation from Transformers,即:基于transformer的双向Encoder,所以在学习BERT之前先对Self-Attention与transformer进行学习,具体可以参考深入理解 Bert核心:Self-Attention与transformer

该模型的主要创新点在:(1)使用了MAsk机制捕捉句子中词语之间的的representation。(2)使用了Next Sentence Prediction捕捉句子级别的representation。

回顾一下transformer模型:

在这里插入图片描述

图中的(1)就是bert模型的核心组成部分,将这样的结构进行堆叠,就是BERT 模型。如下图:

在这里插入图片描述

在transformer中,每一个输入分别对应一个Embedding输出,将其称之为隐向量。在做具体NLP任务的时候,只需要从中取对应的隐向量作为输出即可。

Bert模型的两个基本预任务:

(1)Masked Language Model(MLM)

通过随机掩盖一些词(替换为统一标记符[MASK]),然后预测这些被遮盖的词来训练双向语言模型,并且使每个词的表征参考上下文信息。此处产生loss_1。

(2)Next Sentence Prediction(NSP)

为了训练一个理解句子间关系的模型,引入一个下一句预测任务。每次的训练样本是一个上下句,其中一半的样本是正样本(上下句之间的对应关系是真实的);另外一半样本是负样本(上下句之间是无关的)。此处产生loss_2。

模型的loss为:loss_1+ loss_2

此处插入一个预训练模型(GPT,BERT,ELMO)小对比。三个模型如下图所示:

在这里插入图片描述

注:图中的Trm与LSTM一样只是代表一个单元。那些复杂的连线表示的是词与词之间的依赖关系,BERT中的依赖关系既有前文又有后文,而GPT的依赖关系只有前文。

GPT是单向模型,预测时只能预测下一个词;BERT和ELMO是双向模型,其中,而BERT是预测文中扣掉的词,可以充分利用到上下文的信息,这使得模型有更强的表达能力,这也是BERT中Bidirectional的含义。BERT和ELMO都是双向,但二者的目标函数不同。

ELMO的目标函数为:
P ( w i ∣ w 1 , ⋯ w i − 1 ) 和 P ( w i ∣ w i + 1 , ⋯ w n ) P(w_i|w_1,\cdots w_{i-1})和 P(w_i|w_{i+1},\cdots w_n) P(wiw1,w

具体使用方法可以看我的博客:https://blog.csdn.net/weixin_40015791/article/details/90410083 下面也会简单介绍一下:在bert开源代码中的run_classifier.py中找到 processors = { "cola": ColaProcessor, "mnli": MnliProcessor, "mrpc": MrpcProcessor, "xnli": XnliProcessor, "intentdetection":IntentDetectionProcessor, "emotion":EmotionProcessor, #新加上这一行 } 然后在该文件中增加一个class: class EmotionProcessor(DataProcessor): """Processor for the MRPC data set (GLUE version).""" def get_train_examples(self, data_dir): """See base class.""" return self._create_examples( self._read_tsv(os.path.join(data_dir, "fine_tuning_train_data.tsv")), "train") #此处的名字和文件夹中的训练集的名字要保持一致 def get_dev_examples(self, data_dir): """See base class.""" return self._create_examples( self._read_tsv(os.path.join(data_dir, "fine_tuning_val_data.tsv")), "dev") def get_test_examples(self, data_dir): """See base class.""" return self._create_examples( self._read_tsv(os.path.join(data_dir, "fine_tuning_test_data.tsv")), "test") def get_labels(self): """See base class.""" return ["0", "1","2","3","4","5","6"] #七分类则从0到6 def _create_examples(self, lines, set_type): """Creates examples for the training and dev sets.""" examples = [] for (i, line) in enumerate(lines): if i == 0: continue guid = "%s-%s" % (set_type, i) if set_type == "test": label = "0" text_a = tokenization.convert_to_unicode(line[0]) else: label = tokenization.convert_to_unicode(line[0]) text_a = tokenization.convert_to_unicode(line[1]) examples.append( InputExample(guid=guid, text_a=text_a, text_b=None, label=label)) return examples 最后直接调用即可,运行的命令如下: python run_classifier.py \ --task_name=emotion \ --do_train=true \ --do_eval=true \ --data_dir=data \ #把数据解压到同一级的文件夹中,此处是该文件夹名字data --vocab_file=chinese_L-12_H-768_A-12/vocab.txt \ #中文数据要微调的原始bert模型 --bert_config_file=chinese_L-12_H-768_A-12/bert_config.json \ --init_checkpoint=chinese_L-12_H-768_A-12/bert_model.ckpt \ --max_seq_length=128 \ --train_batch_size=32 \ --learning_rate=2e-5 \ --num_train_epochs=3.0 \ --output_dir=output #生成文件所在的文件夹 大概9个小时,最后文件夹中会有三个文件 后缀分别为index/meta/00000-of-00001,分别将这个改成bert_model.ckpt.index/bert_model.ckpt.meta/bert_model.ckpt.data-00000-of-00001,再在同一个文件夹中放入chinese_L-12_H-768_A-12中的vocab.txt和bert_config.json 即最后该文件夹中有5个文件。然后像调用chinese_L-12_H-768_A-12一样将文件夹名改成自己的文件夹名即可。 bert-serving-start -model_dir output -num_worfer=3 即可调用微调后的语言通用模型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值