首页 > 其他分享 >预训练模型-从BERT原理到BERT调包和微调

预训练模型-从BERT原理到BERT调包和微调

时间:2023-04-15 23:23:53浏览次数:40  
标签:BERT 训练 模型 微调 调包 token Embedding 句子

 一、BERT原理

BERT取名来自 Bidirectional Encoder Representations from Transformers。架构为:预训练 + fine-tuning(对于特定的任务只需要添加一个输出层)。 1、引言        通过预训练语言模型可显著提高NLP下游任务。限制模型潜力的主要原因在于现有模型使用的都是单向的语言模型,无法充分了解到单词所在的上下文结构。        受完形填空的启发,BERT通过使用 “Masked Language Model” 的预训练目标来缓解单向语言模型的约束。        首先 “Masked Language Model” 会随机屏蔽(masked)15%的token,然后让模型根据上下文来预测被Mask的token(被Mask的变成了标签)。具体,将masked token 位置输出的最终隐层向量送入softmax,来预测masked token。       此外, “Next sentence prediction” 的任务预训练文本对。将 token-level 提升到 sentence-level,以应用不同种类的下游任务。   2、BERT模型        BERT:pre-training 和 fine-tuning,两阶段的步骤。
  • pre-training 阶段,BERT 在无标记的数据上进行无监督学习;
  • fine-tuning 阶段,BERT利用预训练的参数初始化模型,并利用下游任务标记好的数据进行有监督学习,并对所有参数进行微调。
所有下游任务都有单独的 fine-tuning 模型,即使是使用同样的预训练参数。下图是对 BERT 的一个概览: 0 2.1、模型架构        BERT 是由多层双向的 Transformer Encoder 结构组成,区别于 GPT 的单向的 Transformer Decoder 架构。 0        BERT_BASE (L=12, H=768, A=12, Total Parameters=110M) and BERTLARGE (L=24, H=1024, A=16, Total Parameters=340M)。   2.2、输入       为了能应对下游任务,BERT 给出了 sentence-level 级别的 Representation,包括句子和句子对。在 BERT 中 sequence 并不一定是一个句子,也有可能是任意的一段连续的文本;而句子对主要是因为类似 QA 问题。       BERT 的输入: 0        分为三块:Token Embeddings、Segment Embeddings 和 Position Embeddings
  •        Token Embeddings 采用的 WordPiece Embedding,共有 30000 个 token。每个 sequence 会以一个特殊的 classification token [CLS] 开始,同时这也会作为分类任务的输出;句子间会以 special seperator token [SEP] 进行分割。
  •        WordPiece Embedding:n-gram 字符级 Embedding,采用 BPE 双字节编码,可以将单词拆分,比如 “loved” “loving” ”loves“ 会拆分成 “lov”,“ed”,“ing”,“es”。
  •        Segment Embedding也可以用来分割句子,但主要用来区分句子对。Embedding A 和 Embedding B 分别代表左右句子,如果是普通的句子就直接用 Embedding A。
  •        Position Embedding 是用来给单词定位的,学习出来的embedding向量。这与Transformer不同,Transformer中是预先设定好的值。
       BERT 最终的 input 是三种不同的 Embedding 直接相加。   2.3、预训练Pre-training        BERT 采用两种无监督任务来进行预训练,两个任务同时训练,所以 BERT 的损失函数是两个任务的损失函数相加:  1) token-level 级别的 Masked LM;   2) sentence-level 级别的 Next Sentence Prediction。   2.3.1、任务一:Masked LM        为解决双向模型的数据泄漏的问题,Masked LM:随机屏蔽一些token 并通过上下文预测这些 token。在实验中,BERT 会随机屏蔽每个序列中的 15% 的 token,并用 [MASK] token 来代替。        这会带来一个问题:[MASK] token 不会出现在下游任务中。为了和后续任务保持一致,采用以下三种方式来代替 [MASK] token:如:my dog is hairy
  • 80% 的 [MASK] token 会继续保持 [MASK];—my dog is [MASK]
  • 10% 的 [MASK] token 会被随机的一个单词取代;my dog is apple
  • 10% 的 [MASK] token 会保持原单词不变(但是还是要预测)my dog is hairy
       最终 Masked ML 的损失函数是只由被 [MASK] 的部分来计算:
  • 在 encoder 的输出上添加一个前馈神经网络,将其转换为词汇的维度
  • softmax 计算词汇表中每个单词的概率
BERT 的损失函数只考虑了 mask 的预测值(CBOW)。   2.3.2、Next Sentence Prediction        语言模型只能捕捉 token-level 级别的关系,为了捕捉 sentence-level 级别的关系,训练了一个 sentence-level 的分类任务。 具体来说,训练的输入是句子A和B (句子级负采样):
  • B有一半的几率是A的下一句,即正例;
  • B有一半的几率是随机取一个句子作为负例。
通过 classification token 连接 Softmax 输出B是不是A的下一句。     为了帮助模型区分开训练中的两个句子,输入在进入模型之前要按以下方式进行处理:在第一个句子的开头插入 [CLS] 标记,在每个句子的末尾插入 [SEP] 标记。Segemet Embeding来表示不同的句子。        在训练 BERT 模型时,Masked LM 和 Next Sentence Prediction 是一起训练的,目标就是要最小化两种策略的组合损失函数。   2.4、微调Fine-tuning        由于预训练的 Transformer 已经完成了句子和句子对的 Representation,所以 BERT 的 Fine-tuning 非常简单。       针对不同的下游任务,可以将具体的输入和输出是适配到 BERT 中,并且采用端到端的训练去微调模型参数。BERT 可以用于各种NLP任务,只需在核心模型中添加一个层,例如:
  • 1. 在分类任务中,例如情感分析等,只需要在 Transformer 的输出之上加一个分类层
  • 2. 在QA任务中,问答系统需要接收有关文本序列的 question,并且需要在序列中标记 answer。 可以使用 BERT 学习两个标记 answer 开始和结尾的向量来训练Q&A模型。
  • 3. 在命名实体识别(NER)中,系统需要接收文本序列,标记文本中的各种类型的实体(人员,组织,日期等)。 可以用 BERT 将每个 token 的输出向量送到预测 NER 标签的分类层。

  • a、b 是 sentence-level 级别的任务,类似句子分类,情感分析等等,输入句子或句子对,在 [CLS] 位置接入 Softmax 输出 Label;      
  • c是token-level级别的任务,比如 QA 问题,输入问题和段落,在 Paragraph 对应输出的 hidden vector 后接上两个 Softmax 层,分别训练出 Span 的 Start index 和 End index(连续的 Span)作为 Question 的答案;      
  • d也是token-level级别的任务,比如命名实体识别问题,接上 Softmax 层即可输出具体的分类。
0   0   0 0 0 生成 0   3. 结论        BERT采用Pre-training和Fine-tuning两阶段训练任务(源于GPT),在Pre-training阶段使用多层双向Transformer Encoder进行训练,并采用Masked LM 和 Next Sentence Prediction两种训练任务解决 token-level 和 sentence-level 的问题,为下游任务提供了一个通用的模型框架;在 Fine-tuning 阶段会针对具体 NLP 任务进行微调以适应不同种类的任务需求,并通过端到端的训练更新参数从而得到最终的模型。   BERT优点:         Transformer Encoder因为有Self-attention机制,因此BERT自带双向功能因为双向功能以及多层Self-attention机制的影响,使得BERT必须使用Cloze版的语言模型Masked-LM来完成token级别的预训练为了获取比词更高级别的句子级别的语义表征。        BERT加入了Next Sentence Prediction来和Masked-LM一起做联合训练为了适配多任务下的迁移学习,BERT设计了更通用的输入层和输出层微调成本小   BERT缺点:
  • [MASK]标记在实际预测中不会出现,训练时用过多[MASK]影响模型表现;
  • 每个batch只有15%的token被预测,所以BERT收敛得比left-to-right模型要慢(它们会预测每个token);
  • BERT对硬件资源的消耗巨大。

二、BERT答疑

1、三个Embedding怎么来的 在BERT中,Token,Position,Segment Embeddings 都是通过学习来得到的,pytorch代码中它们是这样的: self.word_embeddings = Embedding(config.vocab_size, config.hidden_size) self.position_embeddings = Embedding(config.max_position_embeddings, config.hidden_size) self.token_type_embeddings = Embedding(config.type_vocab_size, config.hidden_size) BERT 能够处理对输入句子对的分类任务。这类任务就像判断两个文本是否是语义相似的。句子对中的两个句子被简单的拼接在一起后送入到模型中。 那BERT如何去区分一个句子对中的两个句子呢?答案就是segment embeddings. 0 https://www.cnblogs.com/d0main/p/10447853.html#token-embeddings   2、不考虑多头的原因,self-attention中词向量不乘QKV参数矩阵,会有什么问题? Self-Attention的核心是用文本中的其它词来增强目标词的语义表示,从而更好的利用上下文的信息。 self-attention中,sequence中的每个词都会和sequence中的每个词做点积去计算相似度,也包括这个词本身。   3、为什么BERT选择mask掉15%这个比例的词,可以是其他的比例吗? BERT采用的Masked LM,会选取语料中所有词的15%进行随机mask。 论文表示受到完形填空任务的启发,但其实与CBOW也有异曲同工之妙。 从CBOW的角度,有一个比较好的解释是:在一个大小为 的窗口中随机选一个词,类似CBOW中滑动窗口的中心词,区别是这里的滑动窗口是非重叠的。 那从CBOW的滑动窗口角度,10%~20%都是还ok的比例。   4、为什么BERT在第一句前会加一个[CLS]标志?

BERT在第一句前会加一个CLS]标志,最后一层该位对应向量可以作为整句话的语义表示,从而用于下游的分类任务等。与文本中已有的其它词相比,这个无明显语义信息的符号会更“公平”地融合文本中各个词的语义信息,从而更好的表示整句话的语义

5、Self-Attention 的时间复杂度是怎么计算的? O(n^2 d) 相加的   6、Transformer在哪里做了权重共享,为什么可以做权重共享? Transformer在两个地方进行了权重共享: (1)Encoder和Decoder间的Embedding层权重共享; (2)Decoder中Embedding层和FC层权重共享。 解码的词,要有embedding,同时也可作为分类器权重。,Embedding层可以说是通过onehot去取到对应的embedding向量,FC层可以说是相反的,通过向量(定义为 x)去得到它可能是某个词的softmax概率,取概率最大。 FC层的每一行量级相同的前提下,理论上和 x 相同的那一行对应的点积和softmax概率会是最大的(内积)。 通过这样的权重共享可以减少参数的数量,加快收敛。   7、BERT非线性的来源在哪里? 前馈层的gelu激活函数和self-attention,self-attention是非线性的,感谢评论区指出。   8. BERT参数 https://blog.csdn.net/weixin_43922901/article/details/102602557 Bert采用的vocab_size=30522,hidden_size=768,max_position_embeddings=512 LN参数,gamma和beta的维度均为768。因此总参数为768 * 2 + 768 * 2 * 2 * 12(层数)   模型参数Bert模型的版本如下: BERT-Base, Uncased: 12-layer, 768-hidden, 12-heads, 110M parameters BERT-Large, Uncased: 24-layer, 1024-hidden, 16-heads, 340M parameters

 三、BERT调包和微调

BERT有两个约束条件。
  • 1. 所有的句子必须被填充或截断成一个固定的长度。
  • 2. 最大的句子长度是512个tokens。
填充是通过一个特殊的"[PAD]"token来完成的,它在BERT词汇表中的索引0。下面的插图演示了填充到8个token的 "MAX_LEN"。 0 "注意力遮盖"只是一个1和0的数组,表示哪些标记是padding,哪些不是。 这个掩码告诉BERT中的"自我关注"机制,不要将这些pad标记纳入它对句子的解释中。 (还有点类似Decoder,不过这是为了对其句子用,而不是为了自回归)   不过,最大长度确实会影响训练和评估速度。例如,用特斯拉K80。 MAX_LEN = 128 --> 训练一个 epoch 需要 5:28 MAX_LEN = 64 --> 训练一个 epoch 需要 2:57。   现在我们准备好执行真正的 tokenization 了。tokenizer.encode_plus函数为我们结合了多个步骤。
  1. 将句子分割成token。
  2. 添加特殊的[CLS]和[SEP]标记。
  3. 将这些标记映射到它们的ID上。
  4. 把所有的句子都垫上或截断成相同的长度。
  5. 创建注意力Masl,明确区分真实 token 和[PAD]token。
  以下是HuggingFace目前提供的类列表,供微调。
  • BertModel
  • BertForPreTraining
  • BertForMaskedLM
  • BertForNextSentencePrediction(下句预测)
  • BertForSequenceClassification - 我们将使用的那个。
  • BertForTokenClassification
  • BertForQuestionAnswering
from transformers import BertForSequenceClassification, AdamW, BertConfig

# Load BertForSequenceClassification, the pretrained BERT model with a single 
# linear classification layer on top. 
model = BertForSequenceClassification.from_pretrained(
    "bert-base-uncased", # Use the 12-layer BERT model, with an uncased vocab.
    num_labels = 2, # The number of output labels--2 for binary classification.
                    # You can increase this for multi-class tasks.   
    output_attentions = False, # Whether the model returns attentions weights.
    output_hidden_states = False, # Whether the model returns all hidden-states.
)

# Tell pytorch to run this model on the GPU.
model.cuda()

参考

标签:BERT,训练,模型,微调,调包,token,Embedding,句子
From: https://www.cnblogs.com/justLittleStar/p/17322240.html

相关文章

  • 如何使用Alpaca-LoRA来微调ChatGPT这样的模型?
    原文标题:HowtouseAlpaca-LoRAtofine-tuneamodellikeChatGPT原文地址:https://replicate.com/blog/fine-tune-alpaca-with-lora?continueFlag=4ecae39885197a5c008faabbefb5c824如何使用Alpaca-LoRA来微调ChatGPT这样的模型?低秩自适应(LoRA)是一种微调模型的技术,它比以......
  • 每日学习记录20230323_Bert视频学习
    20230323:Bert视频学习B站视频RNN这个东西不能并行运算,所以翻译的时候需要用Transformer,这样输出结果是同时被计算出来的.并且Transformer有注意力机制进行并行计算Transformer输入如何编码?输出结果是什么?Attention的目的?怎样组合在一起?Transformer最核心的机制是S......
  • 每日学习记录20230322_Bert安装和使用
    20230322:Bert安装与使用Bert安装与使用安装教程:地址需要python版本大于等于3.5,tensorflow版本大于等于1.10.1,但是我经过测试发现,3.7.6版本不行,报错说缺少glib23,只能是使用这个教程的方法.R的一个function:file.path,用于生成路径的一个function.file.path("","p......
  • 每日学习记录20230321_Bert
    20230321:BertBert词嵌入(wordembedding):词嵌入是词的表示.是一种词的类型表示,具有相似意义的词具有相似的表示,是将词汇映射到实数向量的方法总称。之所以希望把每个单词都变成一个向量,目的还是为了方便计算,比如“猫”,“狗”,“爱情”三个词。对于我们人而言,我们可以知道......
  • 每日学习记录20230410_Bert
    20230410:BertHuggingface今天运行python-c'fromtransformersimportTFBertForTokenClassification'的时候有一个报错:Couldnotloaddynamiclibrary'libcudart.so.11.0'.查了一下发现是需要装CUDA软件,也就是英伟达调用GPU的软件,使用:condainstallcudatoolkit命......
  • 每日学习记录20230406_bert_and_torch
    20230407:tensorflowtransformertf.name_scope:这个函数会规定对象和操作属于那个范围,但是不会对“对象”的“作用域”产生任何影响,也就是不是全局变和局部变量的概念.这个东西有很多种用法:withtf.name_scope("loss"):#这个名字是随意指定,看你想干什么xentropy......
  • 机器学习(四):4层BP神经网络(只用numpy不调包)用于训练鸢尾花数据集|准确率96%
    题目:设计四层BP网络,以g(x)=sigmoid(x)为激活函数,神经网络结构为:[4,10,6,3],其中,输入层为4个节点,第一个隐含层神经元个数为10个节点;第二个隐含层神经元个数为6个节点,输出层为3个节点利用训练数据iris-train.txt对BP神经网络分别进行训练,对训练后的模型统计识别正确率,并计算......
  • 基于OCR进行Bert独立语义纠错实践
    摘要:本案例我们利用视频字幕识别中的文字检测与识别模型,增加预训练Bert进行纠错本文分享自华为云社区《Bert特调OCR》,作者:杜甫盖房子。做这个项目的初衷是发现图比较糊/检测框比较长的时候,OCR会有一些错误识别,所以想对识别结果进行纠错。一个很自然的想法是利用语义信息进行纠错,其......
  • 基于OCR进行Bert独立语义纠错实践
    摘要:本案例我们利用视频字幕识别中的文字检测与识别模型,增加预训练Bert进行纠错本文分享自华为云社区《Bert特调OCR》,作者:杜甫盖房子。做这个项目的初衷是发现图比较糊/检测框比较长的时候,OCR会有一些错误识别,所以想对识别结果进行纠错。一个很自然的想法是利用语义信息进行纠错......
  • BERT-文本分类demo
    title:Bert文本分类一.模型准备首先在huggingface上下载对应的模型,也可以通过安装transformer,来将tensorflow版模型改为pytorch版。最后得到:config.json、pytorch_model.bin和vocab.txt。1.config.json:顾名思义,该文件就是BERT模型的配置文件,里面记录了所有用于训练的......